<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/">
  <channel>
    <language>ru</language>
    <title>DIY</title>
    <description>Рубрика практической направленности — с помощью статей отсюда вы можете собственными руками попробовать написать игру или собрать интересную вещицу.</description>
    <link>https://tproger.ru/tag/diy</link>
    <atom:link href="https://tproger.ru/tag/diy/feed" rel="self" type="application/rss+xml"/>
    <lastBuildDate>Sun, 04 Oct 2026 01:04:26 GMT</lastBuildDate>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>12</sy:updateFrequency>
    <image>
      <title>DIY</title>
      <link>https://tproger.ru</link>
      <url>https://tproger.ru/apple-touch-icon.png</url>
    </image>
    <item>
      <title>Своя self-hosted двухсерверная VPN-архитектура. Подробный путь разработки и ошибки, с которыми вы можете столкнуться</title>
      <link>https://tproger.ru/articles/svoya-self-hosted-dvuhservernaya-vpn-arhitektura-podrobnyj-put-r</link>
      <comments>https://tproger.ru/articles/svoya-self-hosted-dvuhservernaya-vpn-arhitektura-podrobnyj-put-r?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Роман Фролов]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/svoya-self-hosted-dvuhservernaya-vpn-arhitektura-podrobnyj-put-r</guid>
      <description><![CDATA[<p>Проект представляет из себя быстрый способ воссоздать архитектуру состоящую из 2 серверов (локальный + удаленный) с определенными сервисами, которые решают специфические задачи. Проект сделан прежде всего для меня, а также для людей которые хотят свой готовый self-hosted сервер из коробки с полной системой обслуживания</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/svoya-self-hosted-dvuhservernaya-vpn-arhitektura-podrobnyj-put-r">Своя self-hosted двухсерверная VPN-архитектура. Подробный путь разработки и ошибки, с которыми вы можете столкнуться</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Тестирование]]></category>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Ruby]]></category>
      <category><![CDATA[unix]]></category>
      <category><![CDATA[IDE]]></category>
      <category><![CDATA[Музыка]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[HTML]]></category>
      <category><![CDATA[DIY]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[Навыки]]></category>
      <category><![CDATA[VPN]]></category>
      <category><![CDATA[Telegram]]></category>
      <category><![CDATA[Сервисы]]></category>
      <category><![CDATA[Docker]]></category>
      <category><![CDATA[Cloudflare]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Redis]]></category>
      <category><![CDATA[QA]]></category>
      <category><![CDATA[Мессенджер]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[NFT]]></category>
      <category><![CDATA[Машин]]></category>
      <category><![CDATA[1C]]></category>
      <category><![CDATA[DeFi]]></category>
      <category><![CDATA[Grafana]]></category>
      <category><![CDATA[VPS]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sun, 26 Jul 2026 15:46:26 GMT</pubDate>
      <content:encoded><![CDATA[<p>Всё
 началось с того, что меня перестал устраивать мой подход к 
развертыванию личных сервисов. Я решил переписать всё с нуля. К тому же 
это был отличный повод получить новые навыки и попробовать инструменты, 
до которых давно не доходили руки.</p><p>Арендовать мощные VPS под 
ресурсоемкие задачи в текущих реалиях выходит неоправданно дорого. При 
этом дома у меня уже был выделенный неттоп (мини-ПК) с 16 ГБ оперативной
 памяти на базе энергоэффективного процессора Intel N95.</p><p>Пройдя 
путь от простых Bash-скриптов и сторонних туннелей до полностью 
автоматизированной инфраструктуры, я создал проект ServeHub-2. В этой 
статье я подробно разберу, как эволюционировала сеть проекта, почему 
декларативный подход победил императивный и с какими неочевидными багами
 пришлось столкнуться в процессе автоматизации.</p><h2>История настройки сетевой архитектуры</h2><h3>Использование Tuna</h3><p>В
 самом начале проекта я еще не думал о VPN как о способе пробития NAT и 
основе, на которой будет строиться вся система. Первое, к чему я пришел —
 сервис Tuna. Если кратко, это аналог Cloudflare Tunnel за условные 300 
рублей. У него очень приятный веб-интерфейс и невероятно простая 
настройка. Однако для полноценной независимой архитектуры он не подошел 
по двум причинам:</p><ul><li>Сервера Tuna находятся вне контроля пользователя.</li><li>На удаленном сервере нельзя развернуть свои сопутствующие сервисы.</li></ul><p>В целом сервис действительно удобный, но для моих задач он оказался слишком ограничивающим.</p><p>Вот
 пример конфига для tuna (все максимально просто, создаем контейнеры для
 ssh туннеля, чтобы был доступ ssh, а также основной http туннель с 
привязкой к nginx или любому другому прокси если такой есть):</p><h3>В поисках гибкости: тесты Pangolin и переход к FRP</h3><p>После Tuna я решил двигаться в сторону собственного контроля и попробовал Pangolin.
 Однако решение быстро отвалилось: для дешёвого сервера оно оказалось 
слишком «тяжёлым» и избыточным. Главные минусы — ощутимый оверхед по 
ресурсам и лишний слой принудительной веб-аутентификации перед самими 
сервисами. Это ломало нормальное взаимодействие с родными мобильными 
клиентами (вроде Element для Matrix или Bitwarden для паролей), где 
повторная авторизация в браузере просто не нужна.</p><p>На смену пришел FRP (Fast Reverse Proxy).
 Он выполнял ту же функцию проброса, но хостил я его уже на собственном 
арендованном VPS в режиме Layer 4 (TCP). Это дало абсолютную гибкость: 
внешний VPS не заглядывал внутрь пакетов и ничего не расшифровывал, а 
просто пересылал сырой поток домой. Кроме того, это отлично 
оптимизировало расходы: вместо 300 рублей за Tuna и ещё 300 рублей за 
отдельный VPN, я стал платить всего 500 рублей за один стойкий VPS, 
который мог настраивать как хочу. (к тому же можно было обойтись даже 
дешевле, так как VPS с 4 гб оперативки загружен всего лишь на 40%, 
процессор всего на 20%-40%)</p><p>FRP состоит из 2 конфигурационных 
файлов (один на удаленном сервере frp server, другой на локальном frp 
client), все также довольно просто, однако его можно использовать на 
разных слоях. У меня он брал трафик за стандартный TCP и передавал его 
на локальный сервер.</p><p>Также доп. фишка в том что основная 
конфигурация происходит именно в frpc, который, в свою очередь, передает
 часть настроек на frp на удаленном сервере.</p><p>frpc.toml:</p><p>frps.toml:</p><h3>Полноценный переезд на WireGuard (AmneziaWG) и 8 часов отладки</h3><p>Со временем архитектура эволюционировала в сторону полноценной VPN-сети на базе WireGuard, а точнее — его модификации AmneziaWG. Причин для этого шага было несколько:</p><ul><li>Безопасность: FRP всё же открывал внутренние ресурсы в публичный интернет, оставляя их доступными для сканеров портов.</li><li>Удобство маршрутизации:
 Все участники сети стали равноправными узлами в одной виртуальной 
локальной подсети. Больше не нужно было настраивать постоянные 
односторонние пробросы.</li><li>Дополнительный бонус:
 Поскольку удаленный VPS был куплен в Нидерландах, через этот же VPN я 
автоматически получил безопасный доступ ко всем зарубежным ресурсам.</li></ul><p>Для реализации схемы на удаленном VPS был развернут контейнер wg-easy с поддержкой AmneziaWG, а на домашнем мини-ПК — клиентский контейнер Amnezia (сборка из Dockerfile с использованием amnezia-tools  и модулем ядра хоста).</p><p>И
 именно здесь я поймал самый изнурительный баг проекта. После 
развертывания трафик упорно шёл только в одну сторону. Часов 8 ушло на 
диагностику iptables, маршрутов и чтение зарубежных форумов (что 
бесполезно, учитывая специфику наших блокировок). Оказалось, провайдер 
просто дропал обратный трафик стандартного WireGuard, так как пакеты шли
 без маскировки. Причина крылась в docker-compose.yml: у меня было прописано image: ghcr.io/wg-easy/wg-easy:latest. Как выяснилось, тег latest  на Docker Hub намертво прилип к старой 14-й версии, а поддержка параметров AmneziaWG появилась только в ветке 15.x. Изменение тега на конкретную версию (15.3) решило проблему за секунду.</p><p>Благодаря
 переходу конфигурация получилась максимально простой, основные отличия 
от стандартной документации выделил в коде: (в основном то, на что 
пришлось долго рыть информацию)</p><h3>Настройка Nginx</h3><p>Чтобы
 сервисы были доступны исключительно внутри подсети VPN, я задействовал 
Nginx. Доступ к приложениям был жестко ограничен на уровне конфигурации —
 веб-сервер принимает запросы только из диапазона IP-адресов 10.8.0.0/24. Любые попытки постучаться на сервер из внешнего интернета без активного VPN-туннеля автоматически сбрасываются Nginx.</p><p>Логика
 распределения завязана на proxy-протоколе: Nginx на удаленном VPS 
выступает основным входным узлом, принимает зашифрованный трафик, 
заворачивает его в заголовки с реальным IP-адресом клиента и через 
туннель перекидывает на локальный Nginx домашнего сервера. Локальный 
веб-сервер уже сам расшифровывает SSL и распределяет трафик по конечным 
Docker-контейнерам, сохраняя реальные IP в логах безопасности.</p><p>Вставлю
 один кусок кода из nginx на удаленной машине для примера, так все 
остальное примерно похоже (конфиги использовались в виде .template):</p><h3>SSL-сертификаты</h3><p>Для получения валидных SSL-сертификатов я настроил работу через автоматический Certbot по challenge-валидации DNS-01 c API Webnames. Сам домен привязан к внутреннему IP-адресу 10.8.0.1.
 Проверка через DNS позволила выпустить единый wildcard-сертификат на 
весь домен и его поддомены без необходимости держать открытым 80-й порт 
веб-сервера наружу.</p><p>Уточню, что certbot запускается автоматически 
во время выполнения Ansible плейбука, поэтому самому кроме указания 
переменных ничего делать не нужно.</p><p>В
 итоге получилась схема, при которой все сервисы доступны по красивым 
доменным именам с HTTPS, но абсолютно невидимы для внешнего интернета.</p><p>Вот настройка certbot:</p><h2>История софта</h2><p>Параллельно
 с сетевой структурой развивался и сам набор приложений. Изначально я 
хотел собрать в одном месте утилиты, которыми пользуюсь каждый день, но в
 процессе селфхостинга быстро понимаешь: нельзя просто накидать 
контейнеров и надеяться, что мини-ПК справится, а конфигурационные файлы
 не превратятся в кашу.</p><h3>Первый стек и оптимизация</h3><p>Первыми на домашнем сервере прижились медиа-сервисы: Navidrome для стриминга музыки и Audiobookshelf
 для аудиокниг и подкастов. Они легковесные, имеют отличные мобильные 
клиенты с синхронизацией прогресса и полностью закрывают мои 
потребности. Позже к ним добавился Nextcloud как единое независимое облако для файлов, контактов и семейных документов.</p><p>Затем встал вопрос безопасного хранения паролей. Сначала я смотрел в сторону оригинального Bitwarden, но в итоге я выбрал Vaultwarden
 — альтернативный сервер на Rust, полностью совместимый с API Bitwarden.
 Он потребляет считанные мегабайты оперативной памяти и работает 
идеально. Дополнительно для удобства управления всей этой распределенной
 Docker-инфраструктурой в локальный стек был добавлен Portainer. (+ Portainer Agent на удаленный сервер)</p><p>Из интересных моментов, где мне пришлось немного больше возиться, чем с остальными сервисами это nextcloud настройка:</p><h3>Ошибки проектирования: почему я удалил Matrix (Synapse)</h3><p>Не все решения прошли проверку временем. На этапе использования Tuna и FRP я развернул сервер Matrix (Synapse)
 для защищенного обмена сообщениями. Мне казалось это крутой идеей, но 
когда я окончательно перешел на AmneziaWG, целесообразность мессенджера 
внутри закрытого туннеля сошла на нет.</p><p>Synapse требовал слишком 
много ресурсов, впустую расходовал оперативку домашнего ПК и усложнял 
конфиг Nginx. При этом реальной пользы для семьи он не приносил. Для 
критических алертов инфраструктуры и повседневного общения проще и 
эффективнее оказалось использовать Telegram. (плюс алертинг настроен 
именно через него) В итоге я полностью выпилил Synapse из стека, 
освободив ресурсы.</p><p>Вместо него я добавил в связку к wg-easy локальный AdGuard Home.
 Теперь он работает прямо внутри VPN-сети: очищает весь трафик от 
рекламы и трекеров на лету, кэширует DNS-запросы и не дает истории 
веб-серфинга улетать внешним провайдерам.</p><p>Основной проблемой с 
которой я столкнулся при использовании AdGuard Home, так это то что я 
так и не понял как заставить использовать AmneziaVPN клиент AdGuard как 
основной DNS, при этом AmneziaWG работает прекрасно. Как я понимаю дело в
 том что AmneziaWG работает намного проще на уровне ip и у него нету 
никаких доп фильтров, настроек и подобного, поэтому он просто берет 
данные из конфига.</p><h3>От костылей на Bash к декларативному Ansible</h3><p>Весь
 стек на обоих серверах разворачивался через bash скрипты, что было уж 
очень плохо с точки зрения идемпотентности. Во первых из-за bash мне 
постоянно приходилось очищать сервера, так как нормальных проверок у 
меня не было и писать я их не хотел, а также было много костылей с 
импортом переменных, записями в файлы и подобным.</p><p>Так я пришел к декларативному подходу и Ansible.
 Теперь вся конфигурация описывается в виде плейбуков и ролей, 
отражающих конечное желаемое состояние серверов. Конфиденциальные данные
 перенесены в файл secrets.yml, а хрупкие конструкции 
автоматизированы через шаблоны Jinja2. Проект стал идемпотентным: если 
шаги уже выполнены, Ansible их просто пропускает.</p><p>В итоге 
получилось несколько yaml файлов для стандартной настройки системы 
(bootstrap_os.yml) и для настройки каждого из хостов (setup_local.yml и 
setup_remote.yml). В итоге теперь все что нужно чтобы полностью с нуля 
развернуть проект - скачать Ansible, несколько других зависимостей на 
свой рабочий пк и запустить один manage_deploy.sh, в котором можно будет
 выбрать сценарий как будет вести себя Ansible и спокойно дождаться 
разворачивания сервисов.</p><p>Также благодаря Ansible я удобно 
реализовал переносимость проекта. Так как я решил не использовать тома 
docker, и вместо этого храню все в папках, чтобы перенести старые данные
 проекта нужно просто скопировать папку apps-data и положить ее в нужное
 место и все само заработает после повторного развертывания проекта. В 
Ansible выделяется отдельная пауза для этого.</p><p>Вот пример основного плейбука deploy.yml:</p><h3>Тестирование мультидистрибутивности с помощью Vagrant</h3><p>Проект
 изначально затачивался под работу на трех дистрибутивах: Ubuntu, Debian
 и Arch Linux. Тестировать Ansible-плейбуки прямо на рабочей локальной 
машине (в моем случае — EndeavourOS) слишком рискованно, а создавать 
виртуальные машины руками — долго и неудобно.</p><p>Решением стал Vagrant,
 позволяющий за пару минут развернуть чистые ОС в VirtualBox из готовых 
образов. Но в процессе настройки мультивендорного стенда в режиме 
сетевого моста (public_network) всплыли две критические проблемы:</p><ol><li>Конфликт DNS:
 По умолчанию Vagrant создает NAT-интерфейс для управления нодой. При 
включении второго (публичного) интерфейса для локальной сети ломался 
дефолтный DNS-резолвер. Проблему пришлось решать принудительной очисткой
 и перезаписью файла /etc/resolv.conf через inline-скрипт автоматизации Vagrant.</li><li>Проблема с GRUB на Debian: В используемом базовом образе generic/debian12
 конфигурация GRUB сохраняла жесткую привязку к конкретному имени диска 
из окружения сборщика. При повторном развертывании плейбуков на тестовом
 стенде это приводило к сбоям загрузчика. Чтобы автоматизировать 
очистку, пришлось внедрить скрипт, который на лету определяет имя 
системного диска через lsblk и автоматически передает правильные параметры в загрузчик через утилиту debconf-set-selections.</li></ol><p>Вот код Vagrantfile: (в node.vm.provision происходит основное решение ошибок)</p><p>Надежная система бэкапов на базе BorgmaticДля создания резервных копий я внедрил Borgmatic
 (удобную надстройку над дедуплицирующим инструментом Borg Backup). Весь
 процесс автоматизирован с помощью связки системных юнитов borgmatic.service и borgmatic.timer. В бэкап уходят две ключевые директории: apps-data (конфигурации приложений и баз данных) и PersonalData (медиатека: музыка, книги, подкасты, файлы Nextcloud).</p><p>Развертывание
 системы бэкапов полностью берет на себя Ansible. Мне достаточно указать
 UUID внешнего жесткого диска — скрипт сам проверит его наличие в 
системе, примонтирует в нужную директорию, создаст зашифрованный 
репозиторий и настроит политику ротации (хранение 7 ежедневных, 4 
еженедельных и 6 ежемесячных копий). Также в Prometheus выведен 
мониторинг самого репозитория .borg для отслеживания его размера и статуса успешности архивации.</p><p>Главная
 проблема при бэкапе работающих Docker-контейнеров — риск скопировать 
базу данных в «битом» или неконсистентном состоянии, если в момент 
создания архива в нее шла активная запись. Чтобы решить эту проблему, я 
задействовал механизм хуков в конфигурации Borgmatic.</p><p>Перед началом резервного копирования автоматически срабатывает команда остановки контейнеров проекта (docker-compose down),
 а после успешного завершения (или в случае возникновения непредвиденной
 ошибки) контейнеры автоматически поднимаются обратно в фоновом режиме. 
Для удобного просмотра архивов и быстрого восстановления файлов я 
развернул веб-интерфейс Borg UI.</p><p>Конфигурация borgmatic: (использую как Jinja2 шаблон, чтобы Ansible в плейбуках сам подставил переменные)</p><h2>Наблюдаемость (Observability) уровня Enterprise</h2><p>В последних релизах (v1.2.0 и v1.3.0) фокус проекта сместился на мониторинг и работу с логами.</p><h3>Эволюция алертинга и переход на Gatus</h3><p>Изначально для мониторинга доступности я смотрел на Uptime Kuma, но отказался из-за отсутствия удобной декларативной настройки через конфиги. Затем я развернул связку Blackbox Exporter и Alertmanager
 с уведомлениями в Matrix. Но тут крылась логическая несостыковка: весь 
алертинг был завязан на локальном ПК, и в случае его аппаратного отказа я
 бы просто лишился уведомлений.</p><p>Тогда я решил вернуть Uptime Kuma,
 но развернуть его на удаленном VPS в качестве внешнего «сторожа» и 
автоматизировать его настройку через Python-скрипт с библиотекой uptime-kuma-api. Но и тут ждали «грабли» — библиотека не обновлялась три года и намертво ломалась на свежих версиях Kuma.</p><p>В итоге идеальным решением стал Gatus.
 Он изначально проектировался под управление через YAML-конфиги и 
поддерживает отправку алертов, если сервер не отвечает. Из-за специфики 
фронтенда Gatus (он не умеет работать из подкаталога типа /gatus), мне пришлось перенести его и wg-easy на полноценные субдомены gatus. и wireguard.</p><p>Для Gatus получился простой конфиг:</p><p>Для мониторинга аппаратных ресурсов удаленного и локального серверов была развернута связка node-exporter + cAdvisor. Все уведомления теперь приходят мгновенно в Telegram-бота. Чтобы 
избежать лавины одинаковых сообщений (например, при перезагрузке хоста),
 в Alertmanager настроена жесткая группировка и дедупликация событий. 
Также добавлен экспортер для AdGuard Home, выводящий статистику 
заблокированных запросов в Grafana.</p><h3>Централизованные логи: Loki + Grafana Alloy</h3><p>В релизе v1.3.0 в стек была добавлена централизованная система сбора логов Loki. Вместо устаревшего Promtail в качестве агента сбора я применил Grafana Alloy.</p><p>Он
 эффективно собирает логи со всех запущенных Docker-контейнеров, парсит 
их и передает в Loki. Теперь вся история событий, ошибок веб-сервера 
Nginx или падений внутренних приложений доступна в едином интерфейсе 
Grafana с возможностью удобной фильтрации через LogQL, что значительно 
упрощает отладку.</p><p>Конфиг Loki:</p><p>Конфиг Grafana Alloy: (локальный конфиг)</p><h2>Интерфейс: переход на Homepage</h2><p>Изначально для 
домашней страницы я написал кастомную минималистичную HTML-панель с 
Glassmorphism-дизайном. Выглядело это красиво, но добавлять новые 
сервисы вручную через постоянную правку исходного кода было крайне 
неудобно.</p><figure><img src="https://media.tproger.ru/user-uploads/139471/2026-07-15/8a8f2752-8aac-4aa5-898e-98affd01cdff.webp" alt="" /><figcaption>HTML + CSS</figcaption></figure><p>В итоге я заменил самописную страницу на полноценный комьюнити-проект Homepage.
 Это дало некоторую гибкость: вся панель настраивается через простые 
YAML-файлы и поддерживает встроенные виджеты интеграции. Пока что она 
простенькая, но возможно в будущем сделаю что-то более продвинутое.</p><figure><img src="https://media.tproger.ru/user-uploads/139471/2026-07-15/90c65d4a-1310-4a30-b1ad-9e4d3083959d.webp" alt="" /><figcaption>Homepage</figcaption></figure><h2>Заключение</h2><p>Постарался
 подробно рассказать о структуре проекта и как я к этому пришел, очень 
много я не добавил, если пост зайдет, то я обязательно более подробно 
пройдусь по некоторым моментам: как я настраивал Matrix и на каком 
моменте я решил его убрать, как собирал локальный amnezia 
контейнер-клиент, что нового я добавил в релизе 1.4.0 и другое.</p><p>Также
 я перешел с manage_deploy.sh на отдельный GUI клиент, который 
будет полностью автоматизировать процесс подготовки к deploy. (написан на Go Wails). Про это тоже возможно сделаю статью.</p><p>Вся кодовая база проекта, подробная документация, инструкции по развертыванию открыты и доступны для сообщества:</p><p>🔗 GitHub-репозиторий: <a href="https://github.com/canntstand/ServeHub-2" rel="noopener noreferrer nofollow">https://github.com/canntstand/ServeHub-2</a></p><p>Это
 моя первая статья на этом сайте и в то же время первый личный проект, которому я 
отдал так много времени (3 месяца). Буду рад вашему фидбеку в 
комментариях!</p>]]></content:encoded>
    </item>
    <item>
      <title>Как превратить любой ПК в роутер на Linux</title>
      <link>https://tproger.ru/translations/kak-prevratit-lyuboj-pk-v-router-na-linux</link>
      <comments>https://tproger.ru/translations/kak-prevratit-lyuboj-pk-v-router-na-linux?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Алексей Михайлишин]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/kak-prevratit-lyuboj-pk-v-router-na-linux</guid>
      <description><![CDATA[<p>Пошаговый гайд: собираем роутер из мини-ПК, старого ноутбука или одноплатника на Debian. Настройка hostapd, dnsmasq, nftables и bridge. Попробуйте сами.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/kak-prevratit-lyuboj-pk-v-router-na-linux">Как превратить любой ПК в роутер на Linux</a>»</p>]]></description>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Hardware]]></category>
      <category><![CDATA[Сетевые протоколы]]></category>
      <category><![CDATA[DIY]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 31 Mar 2026 00:45:02 GMT</pubDate>
      <content:encoded><![CDATA[<p>Перевод-адаптация статьи <a href="https://nbailey.ca/post/router/">How to turn anything into a router</a> Ника Бэйли.</p><p>Правительство США анонсировало политику, фактически запрещающую импорт новых потребительских роутеров. Но оказывается, роутер можно собрать буквально из любого компьютера. Автор оригинальной статьи использует мини-ПК на Linux в качестве домашнего роутера уже несколько лет: ни одного серьёзного сбоя, единственная замена — дешёвый mSATA-диск.</p><p>Мини-ПК, настольный компьютер, одноплатник, стоечный сервер, старый ноутбук — подойдёт всё, что запускает Linux и имеет пару USB-портов. В этой статье разберём полную настройку на Debian: от выбора железа до правил firewall.</p><p>— Роутер — это обычный компьютер с Linux, двумя сетевыми интерфейсами и несколькими пакетами.</p><p>— Для сборки хватит мини-ПК, старого ноутбука или одноплатника с USB-Ethernet-адаптером.</p><p>— Всё ПО — hostapd, dnsmasq, bridge-utils — входит в стандартные репозитории Debian.</p><p>— Настройка занимает около часа и не требует глубоких знаний сетей.</p><h2>Выбор железа</h2><p>Идеальный вариант — компактный пассивно охлаждаемый мини-ПК. Однако подойдёт практически что угодно. Главное условие: два Ethernet-интерфейса. Если у устройства только один — выручит обычный USB-Ethernet-адаптер. Это чуть менее надёжно, чем встроенный порт, но для домашней сети вполне достаточно.</p><p>Пример из практики автора: мини-ПК на <b>Celeron 3205U</b> (два ядра, 1,5 ГГц) без проблем выдаёт 820–850 Мбит/с по кабелю и около 300 Мбит/с по Wi-Fi. Даже такой скромный процессор с запасом тянет трафик целого дома или небольшого офиса.</p><p>Для совсем экстремальных случаев: в 2016 году автор собрал роутер из ThinkPad T60 (подобранного на мусорке), ExpressCard-PCIe-моста, безымянной Ethernet-карты и свитча Cisco 2960 за $10. Выглядело как куча хлама — но работало.</p><h2>Архитектура сети</h2><p>После настройки интерфейсы распределяются так: eth0 — WAN (внешняя сеть, интернет), eth1 — проводная LAN, wlan0 — Wi-Fi LAN.</p><p>eth1 и wlan0 объединяются в мост br0 — проводные и беспроводные устройства оказываются в одной сети. Нужно больше портов? Просто добавьте USB-Ethernet-адаптеры и включите их в мост.</p><p>Используемое ПО: <a href="https://w1.fi/hostapd/">hostapd</a> для Wi-Fi точки доступа, <a href="https://thekelleys.org.uk/dnsmasq/doc.html">dnsmasq</a> для DHCP и DNS, <a href="https://wiki.debian.org/BridgeNetworkConnections">bridge-utils</a> для объединения портов. Статья покрывает только IPv4 — IPv6 в домашней LAN по-прежнему создаёт больше проблем, чем решает.</p><h2>Установка Debian</h2><p>Установка стандартная, но стоит учесть несколько нюансов:</p><ul><li>В BIOS отключить PXE-загрузку по сети</li><li>Выставить минимальную частоту процессора, но отключить power management для USB и PCI-устройств</li><li>Включить опцию «Restore after AC Power Loss» — роутер должен запускаться сам после отключения питания</li><li>Если устройство не стартует без монитора — вставить HDMI-заглушку (dummy dongle)</li><li>Включить репозиторий non-free-firmware — большинство Wi-Fi-адаптеров без него не работает</li></ul><p>После базовой установки доставьте прошивку для своего Wi-Fi-адаптера. Для Intel:</p><p>Для Realtek:</p><p>Для совсем старого железа (Atheros и подобные):</p><h2>Установка пакетов</h2><p>Три пакета — это всё необходимое. Итого около 250 пакетов на системе:</p><h2>Переименование сетевых интерфейсов</h2><p>В современном Linux интерфейсы называются по физическому расположению: например, enp0s31f6. Чтобы не запутаться, зафиксируем привычные имена eth0, eth1 через systemd.network.</p><p>Для каждого сетевого интерфейса создайте файл /etc/systemd/network/10-persistent-ethX.link (где X — номер интерфейса):</p><p>MAC-адреса своих интерфейсов узнайте командой ip link show. Создайте по одному такому файлу для каждого Ethernet-порта.</p><h2>Настройка Wi-Fi через hostapd</h2><p>USB-Wi-Fi-адаптер будет работать как точка доступа. Это не заменит выделенный AP-девайс по качеству сигнала, но в небольшом помещении работает вполне приемлемо. Если Wi-Fi критичен — лучше подключить к LAN-порту старый роутер в режиме точки доступа.</p><p>Создайте конфиг /etc/hostapd/hostapd.conf:</p><p>По умолчанию служба hostapd замаскирована (masked). Размаскируйте и запустите:</p><h2>Настройка сетевых интерфейсов</h2><p>eth0 — внешний интерфейс (WAN, получает IP по DHCP от провайдера). br0 — внутренний мост с фиксированным адресом. Обратите внимание: у LAN-интерфейса нет шлюза по умолчанию.</p><p>Файл /etc/network/interfaces:</p><p>После этого перезагрузите устройство. Если сеть не поднялась, проверьте ошибки:</p><p>При успешной настройке вывод команды должен быть таким:</p><h2>IP Forwarding</h2><p>Без IP forwarding роутер не будет пробрасывать пакеты между интерфейсами. Создайте файл /etc/sysctl.d/10-forward.conf:</p><p>Примените изменения:</p><h2>Настройка firewall через nftables</h2><p>Правила firewall и NAT управляются через <a href="https://wiki.nftables.org/">nftables</a> — современную замену iptables. Конфиг /etc/nftables.conf:</p><p>Этот конфиг делает три вещи: включает NAT (masquerade), блокирует весь входящий трафик извне и разрешает роутеру работать как DNS, DHCP и SSH-сервер для локальной сети.</p><p>Включите nftables при загрузке:</p><p>Перед изменением правил всегда проверяйте конфиг на валидность:</p><p>В отличие от устаревшего iptables, nftables позволяет перезагружать правила без разрыва соединений:</p><h2>DHCP и DNS через dnsmasq</h2><p><a href="https://thekelleys.org.uk/dnsmasq/doc.html">dnsmasq</a> — компактная альтернатива паре isc-dhcp-server + bind9. Конфиг элементарный. Создайте /etc/dnsmasq.conf:</p><p>DHCP-диапазон: 192.168.1.50 — 192.168.1.250, аренда на 6 часов. Адреса 192.168.1.2 — 192.168.1.49 остаются для статических назначений.</p><h2>Бонус: последовательный порт (Serial/UART)</h2><p>Если на устройстве есть последовательный порт — настройте UART-консоль. В enterprise-оборудовании это стандарт, но для домашнего роутера тоже удобно: управляйте без монитора и клавиатуры через USB-UART-адаптер.</p><p>В файле /etc/default/grub добавьте или замените строки:</p><p>Активируйте getty на последовательном порту, обновите GRUB и перезагрузите:</p><h2>Проверка работы</h2><p>После настройки перезагрузите устройство дважды — убедитесь, что всё поднимается стабильно. Проверьте состояние firewall и счётчики трафика:</p><p>Ненулевые счётчики в цепочках forward и postrouting означают, что трафик проходит через роутер. Проверьте DHCP-аренды:</p><h2>Что ещё можно добавить</h2><p>Базовая конфигурация работает как полноценный домашний роутер. При желании её можно расширить:</p><ul><li>VLAN и сегментация сети</li><li>VPN (удалённый доступ и site-to-site туннели)</li><li>Динамическая маршрутизация: IGP, BGP</li><li>IDS/IPS (обнаружение и предотвращение вторжений)</li><li>Логирование отдельных правил и flow logs</li><li>Проброс портов в DMZ</li><li>IPv6</li><li>Мониторинг в реальном времени</li><li>Фильтрация и блокировка трафика</li></ul><p>Важное правило: не устанавливайте много дополнительного ПО прямо на роутер. Лучше выделить отдельную машину в DMZ или VLAN и пробрасывать на неё трафик. Роутер должен оставаться простым и надёжным.</p><h2>Итого</h2><p>Роутер — это просто компьютер с Linux, двумя сетевыми интерфейсами и тремя пакетами. Ничего магического в потребительских роутерах нет: они тоже работают под управлением Linux (обычно урезанным), просто с удобным веб-интерфейсом поверх.</p><p>Мини-ПК на базе Celeron или Atom стоит $30–60 на вторичном рынке, потребляет 5–10 Вт и работает годами без обслуживания. Это надёжнее, гибче и дешевле большинства потребительских роутеров — а заодно отличный способ разобраться, как на самом деле работает сеть.</p>]]></content:encoded>
    </item>
    <item>
      <title>Подростки все чаще влюбляются в ИИ, отказываясь от настоящих отношений</title>
      <link>https://tproger.ru/news/--podrostki-vse-chashhe-vlyublyayutsya-v-ii--otkazyvayas-ot-nastoyashhih-otnowenij</link>
      <comments>https://tproger.ru/news/--podrostki-vse-chashhe-vlyublyayutsya-v-ii--otkazyvayas-ot-nastoyashhih-otnowenij?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/--podrostki-vse-chashhe-vlyublyayutsya-v-ii--otkazyvayas-ot-nastoyashhih-otnowenij</guid>
      <description><![CDATA[<p>Подростки всё чаще влюбляются в ИИ-компаньонов: треть считает общение с ботами приятнее, чем с друзьями, и заменяет ими партнёров</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/--podrostki-vse-chashhe-vlyublyayutsya-v-ii--otkazyvayas-ot-nastoyashhih-otnowenij">Подростки все чаще влюбляются в ИИ, отказываясь от настоящих отношений</a>»</p>]]></description>
      <category><![CDATA[Опрос]]></category>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[Советы]]></category>
      <category><![CDATA[DIY]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 29 Jul 2025 04:44:56 GMT</pubDate>
      <content:encoded><![CDATA[<p>ИИ-компаньоны становятся не просто помощниками, а полноценными участниками человеческой жизни.</p><p>По данным нового исследования Common Sense Media, <b>более 70% подростков в США используют ИИ-компаньонов</b>, причем <b>треть из них — ежедневно или несколько раз в неделю</b>.</p><p>И все чаще не только для подсказок по учебе или помощи с планами. Все больше молодых людей <b>воспринимают ИИ как друга, психолога и даже партнера</b>.</p><blockquote>Подростки начинают воспринимать ИИ-компаньонов как родителей, друзей и… романтических партнеров</blockquote><h2>«Ты всегда прав»: как ИИ стал идеальным собеседником</h2><p>Подростки признаются, что <b>разговоры с ИИ иногда приносят больше удовлетворения, чем общение с людьми</b>. ИИ никогда не перебивает, не осуждает, всегда поддерживает и отвечает мгновенно. Согласно опросу:</p><ul><li><b>31% подростков считают</b>, что ИИ-компаньоны «так же хороши или даже лучше» в общении, чем реальные друзья</li><li><b>33% обсуждали с ИИ серьезные личные темы</b>, вместо того чтобы пойти к живому человеку</li><li><b>11% используют чат-ботов</b>, чтобы «набраться смелости» — постоять за себя или признаться в чувствах</li></ul><h2>Виртуальные «пары»: от комплиментов до расставаний</h2><p>Многие подростки не просто разговаривают с ботами — <b>они «встречаются» с ними</b>. Пользователи платформ вроде Replika и Character.AI настраивают ИИ-компаньонов под себя: выбирают внешность, характер, стиль общения.</p><p>Получается <b>виртуальный партнер</b>, который всегда рядом. Один из опрошенных рассказал, что его друг:</p><ul><li>Писал девушке любовные сообщения, сгенерированные ИИ</li><li>Поручил боту написать <b>текст расставания</b>, завершив двухлетние отношения</li><li>И продолжил «эмоциональное общение» — но уже только с ИИ</li></ul><blockquote>Это было почти дистопично… Как будто мы позволяем машинам заменять реальные чувства</blockquote><h2>Почему это тревожит исследователей</h2><p>Психологи бьют тревогу. <b>Подростки — в критически важный период формирования личности и социальных навыков — начинают зависеть от алгоритмов</b>, которые не бросают вызов, не учат считывать эмоции и не требуют усилий.</p><blockquote>Если подростки развивают эмпатию и самооценку в среде, где их всегда поддерживают и никогда не критикуют — в реальном мире они могут растеряться</blockquote><p>Эксперты также обнаружили: многие ИИ-компаньоны дают <b>небезопасные советы</b>, могут содержать <b>взрослый контент и почти не ограничивают возраст пользователей</b>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Как из старого смартфона сделать мини-дата-центр: экологичное решение от учёных</title>
      <link>https://tproger.ru/news/kak-iz-starogo-smartfona-sdelat-mini-data-centr--ekologichnoe-rewenie-ot-uchyonyh</link>
      <comments>https://tproger.ru/news/kak-iz-starogo-smartfona-sdelat-mini-data-centr--ekologichnoe-rewenie-ot-uchyonyh?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Татьяна Жукова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/kak-iz-starogo-smartfona-sdelat-mini-data-centr--ekologichnoe-rewenie-ot-uchyonyh</guid>
      <description><![CDATA[<p>Учёные из Тарту превращают устаревшие смартфоны в мини-дата-центры за 8 евро. Второе дыхание для Android — теперь в подводной аналитике и городских сенсорах.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/kak-iz-starogo-smartfona-sdelat-mini-data-centr--ekologichnoe-rewenie-ot-uchyonyh">Как из старого смартфона сделать мини-дата-центр: экологичное решение от учёных</a>»</p>]]></description>
      <category><![CDATA[Android]]></category>
      <category><![CDATA[DIY]]></category>
      <category><![CDATA[HR]]></category>
      <category><![CDATA[3D-принтер]]></category>
      <category><![CDATA[Дата-центр]]></category>
      <category><![CDATA[Смартфоны]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sun, 08 Jun 2025 20:10:02 GMT</pubDate>
      <content:encoded><![CDATA[<p>Смартфоны, которые давно вышли из моды, теперь могут сыграть роль в будущем устойчивых вычислений. Учёные из Института компьютерных наук Тартуского университета <a href="https://techxplore.com/news/2025-06-smartphones-life-tiny-centers.html">предложили</a> нетривиальный способ борьбы с электронным мусором: превратить старые телефоны в компактные центры обработки и хранения данных. Мини-дата-центры на Android — не шутка, а рабочая система за 8 евро.</p><p>Больше новостей в нашем тг-канале Представляешь</p><p>Идея проста: вместо утилизации или бессмысленного хранения в ящиках, устройства получают вторую жизнь как вычислительные узлы. Учитывая, что ежегодно производится более 1,2 млрд новых телефонов, а средний срок их использования — 2–3 года, такая схема позволяет радикально снизить нагрузку на природу. Тем более, что большая часть техники остаётся работоспособной даже после списания.</p><p>Прототип ученых стоил всего 725 рублей по текущему курсу. Смартфоны были лишены аккумуляторов и подключены к внешнему питанию, чтобы исключить утечки вредных веществ. Затем их объединили в пластиковом корпусе, напечатанном на 3D-принтере. Получившийся кластер успешно справился с реальными задачами — например, автономным мониторингом морской фауны под водой. Раньше для таких операций требовались водолазы и последующая ручная обработка видео. Теперь всё происходит прямо в толще воды, в реальном времени.</p><p>Сценариев использования много: от датчиков в общественном транспорте до экологического мониторинга. Подход доказывает, что даже старая электроника может быть частью современной вычислительной инфраструктуры — экологичной, дешёвой и функциональной. Приятный бонус: никакой новой добычи редкоземельных, минимальный углеродный след и абсолютный DIY-дух.</p>]]></content:encoded>
    </item>
    <item>
      <title>Raspberry Pi Pico 2 W с Wi-Fi и Bluetooth всего за $7 — начало новой DIY-эпохи</title>
      <link>https://tproger.ru/news/--raspberry-pi-pico-2-w-s-wi-fi-i-bluetooth-vsego-za--7---nachalo-novoj-diy-epohi</link>
      <comments>https://tproger.ru/news/--raspberry-pi-pico-2-w-s-wi-fi-i-bluetooth-vsego-za--7---nachalo-novoj-diy-epohi?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/--raspberry-pi-pico-2-w-s-wi-fi-i-bluetooth-vsego-za--7---nachalo-novoj-diy-epohi</guid>
      <description><![CDATA[<p>Raspberry Pi Pico 2 W с Wi-Fi и Bluetooth всего за $7 — новое решение для DIY и IoT-проектов. Оснащённый чипом RP2350, он предлагает высокую производительность, поддержку облачных подключений и библиотеки на C и MicroPython</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/--raspberry-pi-pico-2-w-s-wi-fi-i-bluetooth-vsego-za--7---nachalo-novoj-diy-epohi">Raspberry Pi Pico 2 W с Wi-Fi и Bluetooth всего за $7 — начало новой DIY-эпохи</a>»</p>]]></description>
      <category><![CDATA[Интернет]]></category>
      <category><![CDATA[Raspberry Pi]]></category>
      <category><![CDATA[DIY]]></category>
      <category><![CDATA[Wi-Fi]]></category>
      <category><![CDATA[ARM]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 25 Nov 2024 16:33:26 GMT</pubDate>
      <content:encoded><![CDATA[<p>Raspberry Pi продолжает радовать DIY-энтузиастов новыми продуктами.</p><p>Компания <a href="https://www.raspberrypi.com/news/raspberry-pi-pico-2-w-on-sale-now/">представила</a> Raspberry Pi Pico 2 W — микроконтроллер с поддержкой Wi-Fi и Bluetooth.</p><p>Устройство построено на базе нового чипа RP2350 и стоит всего $7. Это идеальное решение для проектов, связанных с Интернетом вещей (IoT).</p><h2>RP2350: мощь и доступность</h2><p>Чип RP2350 стал развитием успешного RP2040, который дебютировал в 2021 году и быстро завоевал популярность у разработчиков.</p><p>Новый процессор предлагает более высокую производительность, улучшенное энергопотребление и встроенную защиту на основе технологии TrustZone от ARM.</p><p>Также чип поддерживает аппаратную работу с плавающей запятой, что открывает больше возможностей для сложных вычислений.</p><p>RP2350 впервые появился этим летом на плате Pico 2, а также в ряде продуктов партнёров Raspberry Pi. Теперь его возможности доступны в новой беспроводной версии.</p><figure><img src="https://media.tproger.ru/user-uploads/98945/2024-11-25/79996ab2-94f2-4bee-8f42-f94c672c0b42.jpeg" alt="" /></figure><h2>IoT на новой высоте</h2><p>Raspberry Pi Pico 2 W создан для проектов, где важны подключение к облаку и взаимодействие с физическим миром.</p><p>Устройство оснащено модемом CYW43439 от Infineon, который поддерживает Wi-Fi 2.4 ГГц и Bluetooth 5.2. Для работы с устройством доступны библиотеки на языках C и MicroPython.</p><p>Благодаря компактному форм-фактору и совместимости с макетными платами, Pico 2 W идеально подходит для прототипирования.</p><p>А новый радиомодуль RM2, который будет использоваться в профессиональных продуктах, даёт возможность масштабировать решения, разработанные на этой платформе.</p><h2>Новые возможности для DIY-сообщества</h2><p>Pico 2 W — это не только инструмент для профессионалов, но и мощная утилита для любителей электроники.</p><p>Raspberry Pi продолжает работать над новыми версиями линейки Pico 2 — так, следующая волна обновлений ожидается уже в 2025 году.</p>]]></content:encoded>
    </item>
    <item>
      <title>Собери сам: представлен робот-гуманоид HumanPlus с открытым исходным кодом</title>
      <link>https://tproger.ru/news/soberi-sam--predstavlen-robot-gumanoid-humanplus-s-otkrytym-ishodnym-kodom</link>
      <comments>https://tproger.ru/news/soberi-sam--predstavlen-robot-gumanoid-humanplus-s-otkrytym-ishodnym-kodom?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/soberi-sam--predstavlen-robot-gumanoid-humanplus-s-otkrytym-ishodnym-kodom</guid>
      <description><![CDATA[<p>Ученые из Стэнфорда представили необычную новинку: гуманоидного робота HumanPlus с открытым исходным кодом и способного обучаться по обычной веб-камере</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/soberi-sam--predstavlen-robot-gumanoid-humanplus-s-otkrytym-ishodnym-kodom">Собери сам: представлен робот-гуманоид HumanPlus с открытым исходным кодом</a>»</p>]]></description>
      <category><![CDATA[Open Source]]></category>
      <category><![CDATA[Роботы]]></category>
      <category><![CDATA[DIY]]></category>
      <category><![CDATA[Tesla]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 25 Jun 2024 01:06:29 GMT</pubDate>
      <content:encoded><![CDATA[<p>Исследователи из Стэнфордского университета разработали робота, который может имитировать действия человека в реальном времени благодаря простой веб-камере.</p><p>HumanPlus (так назвали новинку) может научиться боксировать, играть на пианино, отбивать мячик для пинг-понга и печатать, просто повторяя за человеком.</p><h2>Упрощенный метод обучения</h2><p>Метод обучения, выбранный для HumanPlus, значительно проще, чем у популярных моделей, таких как Figure 01 или робот Eve от 1X, которые работают на основе понимания естественного языка.</p><p>При этом как только свежая модель изучит достаточно движений, она разовьет глубокую базу знаний, позволяющую ей выполнять задачи автономно.</p><p>Уровень автономии робота включает в себя простые задачи, такие как складывание одежды или снятие предметов с полки, поэтому не стоит ожидать увидеть его на заводе в ближайшее время.</p><h2>DIY-подход</h2><p>В отличие от своих собратьев, таких как Atlas от Boston Dynamics или Optimus от Tesla, HumanPlus представляет собой больше вариант «сделай сам».</p><p>Цена всех материалов для сборки HumanPlus превышает $100 000, если следовать точным спецификациям исследователей.</p><p>Робот построен на базе Unitree H1, с руками от Inspire-Robots, запястий от Robotis и веб-камеры Razer. Рост HumanPlus — 175 см. Число степеней свободы — 33.</p><h2>Открытый исходный код</h2><p>Отличительной особенностью новинки является открытый исходный код, что позволяет любому желающему модифицировать ее по своему усмотрению, если есть соответствующие технические навыки.</p><p>Один из исследователей, Цзипэн Фу, отметил, что оборудование для удаленного управления HumanPlus стоит всего $50, что значительно дешевле по сравнению с популярным вариантом использования гарнитуры Quest.</p>]]></content:encoded>
    </item>
    <item>
      <title>Энтузиаст за 2 недели создал собственный GPU с нуля</title>
      <link>https://tproger.ru/news/entuziast-za-2-nedeli-sozdal-sobstvennyj-gpu-s-nulya</link>
      <comments>https://tproger.ru/news/entuziast-za-2-nedeli-sozdal-sobstvennyj-gpu-s-nulya?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/entuziast-za-2-nedeli-sozdal-sobstvennyj-gpu-s-nulya</guid>
      <description><![CDATA[<p>Инженер Адам Маджмудар взялся за разработку графического процессора (GPU), не имея при этом предварительного опыта в этой области</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/entuziast-za-2-nedeli-sozdal-sobstvennyj-gpu-s-nulya">Энтузиаст за 2 недели создал собственный GPU с нуля</a>»</p>]]></description>
      <category><![CDATA[DIY]]></category>
      <category><![CDATA[GPU]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 01 May 2024 07:55:17 GMT</pubDate>
      <content:encoded><![CDATA[<p>Вдохновенный своим предыдущим проектом по созданию процессора с нуля, инженер Адам Маджмудар взялся за еще более амбициозную задачу — разработку графического процессора (GPU).</p><p>Не имея предварительного опыта в этой области, Адаму потребовалось всего две недели, чтобы завершить проект, что сам по себе является впечатляющим достижением.</p><figure><img src="https://media.tproger.ru/user-uploads/98945/2024-05-01/56284aa4-4823-4cf1-8ee4-66b4e9ff3736.jpeg" alt="" /></figure><p>Процесс создания начался с изучения основ GPU и закончился полноценным чипом, спроектированным в Verilog и проверенным с помощью программного обеспечения OpenLane EDA.</p><p>Адам описал весь процесс в соответствующем Twitter-треде, предоставив подробное описание каждого этапа разработки.</p><p>Проект был ориентирован на создание GPU для общих параллельных вычислений (GPGPU), что предусмотрело корректировку архитектуры инструкций, включающую всего 11 команд.</p><p>Это позволило оптимизировать процессор для выполнения сложных математических операций, таких как сложение и умножение матриц, что необходимо в графических задачах и машинном обучении.</p><figure><img src="https://media.tproger.ru/user-uploads/98945/2024-05-01/5859381b-f9c8-4578-9afa-f4444814f2a6.jpeg" alt="" /></figure><p>Несмотря на начальный успех, создание GPU в Verilog принесло ряд сложностей, связанных с памятью и реализацией расписания задач. Советы известного программиста Джорджа Хотца помогли Адаму преодолеть эти препятствия. Третья переработка кода решила проблемы с расписанием выполнения вычислений в вычислительных ядрах.</p><p>В итоге Адам добился работоспособности своего GPU, доказав это видео с демонстрацией работы ядра матричного сложения:</p><p>Хотя работа Адама не претендует на звание лучшей видеокарты, она отражает важность инноваций и DIY-подхода в технологической сфере.</p><p>По словам инженера, он насладился созданием визуализации своего дизайна GPU и с нетерпением ждет получения готового чипа.</p>]]></content:encoded>
    </item>
    <item>
      <title>Оригинальный тонер или «совместимка»: как продлить жизнь принтеру</title>
      <link>https://tproger.ru/articles/originalnyj-toner-ili--sovmestimka---kak-prodlit-zhizn-printeru</link>
      <comments>https://tproger.ru/articles/originalnyj-toner-ili--sovmestimka---kak-prodlit-zhizn-printeru?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Berik Seilbek]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/originalnyj-toner-ili--sovmestimka---kak-prodlit-zhizn-printeru</guid>
      <description><![CDATA[<p>Когда можно заправлять картридж, а когда лучше поменять, сколько работает фотобарабан, и почему в старые модели можно засыпать совместимый тонер, а в новые не стоит. </p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/originalnyj-toner-ili--sovmestimka---kak-prodlit-zhizn-printeru">Оригинальный тонер или «совместимка»: как продлить жизнь принтеру</a>»</p>]]></description>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Hardware]]></category>
      <category><![CDATA[Советы]]></category>
      <category><![CDATA[DIY]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 29 Mar 2024 11:50:02 GMT</pubDate>
      <content:encoded><![CDATA[<h2>Заправлять или поменять: когда на расходниках для принтера не стоит экономить</h2><p>Мало выбрать подходящий принтер или МФУ для дома или офиса. Нужно еще помнить, что периодически придется менять картридж и фотобарабан. Неправильно или не вовремя выполненная работа может привести к поломке всего устройства. Когда можно заправлять картридж, а когда лучше поменять, сколько работает фотобарабан, и почему в старые модели можно засыпать совместимый тонер, а в новые не стоит, рассказывает руководитель отдела продаж в странах СНГ российского представительства компании Pantum Денис Милентьев.</p><h2>Когда и зачем придумали перезаправлять картридж</h2><p>У любого автомобилиста есть любимая заправка, топливу с которой он доверяет. Пользователи принтеров заправляют технику, конечно, реже, но к выбору топлива, безусловно, стоит относиться не менее тщательно, чем к бензину. Тонер – это высокотехнологичный продукт с уникальной рецептурой, связанный с рядом других параметров, таких как температура нагревания для оптимального использования, и каждый производитель держит свои ноу-хау в строгом секрете.</p><p>Откуда вообще появилась идея о том, что картриджи можно перезаправлять? Все дело в том, что на большинстве бюджетных устройств картридж совмещен с фотобарабаном, ресурс которого в разы выше, чем у зарядки картриджа. И вместо того, чтобы выбрасывать довольно дорогой расходник, умельцы нашли выход: в картридже просверлить пару отверстий – через одно высыпать то, что осталось от прежнего тонера, в другой – засыпать новый. Однако, сама процедура довольно сложна и опасна для здоровья. Порошок очень мелкий, попадает в любую щель, а заодно и органы дыхания, и может негативно отразиться на состоянии человека. Если же работа выполнена не очень качественно, порошок может начать высыпаться внутрь принтера и вывести из строя само устройство. Кроме того, если новый тонер не совместим с конкретной моделью принтера, это тоже может «похоронить» технику раньше времени. И это одна из основных причин, по которым производитель снимал с гарантии принтеры с перезаправленными тонерами.</p><p>Сегодня на рынке представлено довольно много производителей тонеров для принтеров практически всех основных марок. Есть относительно дорогая продукция, которую можно использовать довольно уверенно. Особенно это касается многих устаревших моделей, которые еще нормально работают, а оригинальных картриджей для них уже не производят. Рецептура для этих устройств подобрана хорошо и зарекомендовала себя на протяжении долгого времени. Другое дело, когда речь идет об откровенном фальсификате – подделках и просто дешевом тонере сомнительного качества. Такой тонер с большой степенью вероятности быстро выведет из строя печку принтера, и дешевле будет просто заменить устройство. Нужно подчеркнуть, что, как правило, подобная модель эксплуатации характерна для дешевых черно-белых принтеров формата А4. Бывает, пользователь заранее готов к тому, что покупает бюджетный аппарат, несколько раз перезаправляет его и просто меняет – при определенных условиях это дешевле, чем покупать оригинальный картридж, который зачастую стоит как половина принтера.</p><h2>«Убийственная экономия»</h2><p>Если говорить о современных моделях, то они меняются быстрее, чем производители совместимых тонеров успевают подобрать рецептуру к актуальным устройствам, и здесь рисковать не стоит. Правда, отдельные вендоры начали разрабатывать заправляемые картриджи, оснащенные специальными технологическими отверстиями для замены тонера. Сам тонер поставляется в формате специального комплекта для дозаправки. Из мировых лидеров такой комплект для нескольких линеек разработал Pantum, есть информация, что работы в этом направлении ведут другие “гранды”, такие как Xerox.</p><p>Где точно не стоит заниматься заменой тонера? Вряд ли нужно искать «совместимку» для цветных принтеров, не важно, струйных или цветных. В отличие от черно-белых устройств, где требуется только четко печатать тексты, в цветных неоригинальная замена практически гарантирует неверную цветопередачу, а значит можно забыть о красивых фотографиях и ярких картинках. А принтеры с форматом А3, которые стоят сотни тысяч рублей, точно не стоит «кормить» неоригинальными чернилами, ремонт или замена будут стоить гораздо дороже расходников – экономить здесь явно не нужно.  Впрочем, и фотобарабан в таких принтерах, как правило, размещен отдельно от картриджа, и замена априори будет дешевле, чем в тех устройствах, где картридж объединен с фотобарабаном.</p><p>Повлиять на время жизни фотобарабана практически невозможно. У него есть свой ресурс, и когда он его выработает, заметно упадет качество печати – визуально будет заметно, что этот расходник нуждается в замене.</p><p>Ставить оригинальный картридж или поискать вариант с заправкой тонера – каждый решает сам. Важно не забывать соотносить эту экономию с риском преждевременной поломки принтера из-за не оригинального и  некачественного тонера. Если вы готовы через несколько заправок приобрести новый  принтер, то можно пойти по этому пути. Если же у вас дорогая техника, в которой качество печати и долговечность критически важны, то точно не стоит отходить от рекомендаций производителя и нужно пользоваться только качественными оригинальными расходниками.</p>]]></content:encoded>
    </item>
    <item>
      <title>Как читать перфокарты в 2023 году: собираем DIY-привод</title>
      <link>https://tproger.ru/articles/kak-chitat-perfokarty</link>
      <comments>https://tproger.ru/articles/kak-chitat-perfokarty?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Дух айтишной эмо школы]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kak-chitat-perfokarty</guid>
      <description><![CDATA[<p>Рассказали, что такое перфокарты и как читать их в XXI веке при помощи самодельного привода на фототранзисторах и светодиодах.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kak-chitat-perfokarty">Как читать перфокарты в 2023 году: собираем DIY-привод</a>»</p>]]></description>
      <category><![CDATA[История IT]]></category>
      <category><![CDATA[DIY]]></category>
      <category><![CDATA[Форматы хранения данных]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 09 Aug 2023 13:00:55 GMT</pubDate>
      <content:encoded><![CDATA[<p>За последние 30 лет хранение информации сильно изменилось: все пользуются флешками, многие из нас наверняка застали DVD и CD-диски, а те, кто постарше — ещё и дискеты. Но начиналось всё с перфокарт.</p><p>Впервые перфокарты начали использовать ещё в начале XIX века. В 1804 году в Жаккардовых ткацких станках перфокарты использовали, чтобы управлять составлением узоров на тканях.</p><p>Для ЭВМ перфокарты ввели в 1928 году, и с тех пор они почти не менялись, и использовали их вплоть до 1980-х годов, пока не заменили магнитными лентами.</p><p>Несмотря на то, что перфокарты были доступны в течение 50 лет, сегодня их уже не прочитать, потому что для современных ПК нет подходящих приводов, хотя столь же устаревший Floppy-привод для дискет всё ещё можно найти в интернет-магазинах.</p><p>В этой статье мы расскажем, как собрать собственный ридер для перфокарт. Это — адаптированный перевод оригинального гайда <a href="https://www.instructables.com/DIY-Paper-TapePunch-Card-Maker-and-Reader/">DIY Paper Tape/Punch Card Maker and Reader</a> с сайта Instructables.</p><h2>Что понадобится для сборки привода</h2><ol><li>Плоский кабель.</li><li>Провода.</li><li>Два 1х10 соединителя с пинами, male-разъём.</li><li>Пара деревяшек.</li><li>10 фоторезисторов.</li><li>10 LED-светодиода диаметров по 3 мм.</li><li>Одна большая перфоплата или две платы 4х20.</li><li>Паяльник и припой.</li><li>Стриппер для снятия изоляции с проводов.</li><li>Резистор на 10 Ом.</li><li>Плата Parallax Propeller Activity Board.</li><li>Плоттер или принтер.</li></ol><h2>Начинаем паять ридер для перфокарт</h2><p>Припаяйте фоторезисторы к перфоплате в один ряд. С другой стороны соедините выводы фоторезисторов между собой.</p><figure><img src="https://media.tproger.ru/uploads/2023/08/3b5c2f27-2a58-4e57-afc9-64e3b69229e3-autoconverted.jpeg" alt="" /></figure><figure><img src="https://media.tproger.ru/uploads/2023/08/06e7453f-6f86-4901-96d3-624eefa7bc2e-autoconverted.jpeg" alt="" /></figure><p>Возьмите плоский кабель с 10 линиями, зачистите провода с обоих концов на 3 мм и залудите их. Припаяйте их к 1х10-коннектору.</p><p>Первые 9 проводов должны быть припаяны к перфоплате, а не к фоторезисторам. Выводы не должны касаться их.</p><p>Последний десятый вывод будет питать фоторезисторы. Припаяйте его к другой стороне перфокарты от первых девяти выводов.</p><figure><img src="https://media.tproger.ru/uploads/2023/08/20cbfef2-1573-4d4b-a0cd-e8a4de5fac4d-autoconverted.jpeg" alt="" /></figure><p>Возьмите другой кусок перфокарты и припяйте к ней светодиоды так же, как вы припаяли фоторезисторы. Обратите внимание: полярность каждого светодиода должна совпадать с полярностью следующего.</p><figure><img src="https://media.tproger.ru/uploads/2023/08/30723c0c-af2c-436b-b39c-c3331f9885ad-autoconverted.jpeg" alt="" /></figure><p>Возьмите ленточный кабель и припаяйте один провод к стороне платы с LED, а другой провод — к другой стороне. К концу кабеля прикрепите male-коннектор на 2 пина.</p><figure><img src="https://media.tproger.ru/uploads/2023/08/a672ca80-fd21-48e2-b226-875f682248b7-autoconverted.jpeg" alt="" /></figure><p>Возьмите 1х10-коннектор и припаяйте 9 резисторов сопротивлением 10 кОм по одному к каждому выводу. Другой вывод каждого резистора должен быть соединён к следующему резистору. Последний резистор припаивается к 10 выводу.</p><p>Для светодиодов понадобится резистор не менее 100 Ом, который будет ограничивать ток, чтобы не перегрузить LED.</p><p>Собираем наше устройство воедино:</p><figure><img src="https://media.tproger.ru/uploads/2023/08/e4f81e49-fa42-4456-8e47-f5b3c364997f-autoconverted.jpeg" alt="" /></figure><h2>Готовим деревянный корпус для ридера</h2><p>Подготовьте деревянный корпус для считывателя перфокарт: наметьте отверстия для фоторезисторов и LED. Между двумя половинами устройства должен быть паз высотой в 1.5 миллиметра: он понадобится для того, чтобы вставлять в него будущую перфокарту.</p><figure><img src="https://media.tproger.ru/uploads/2023/08/6b000520-371e-4e3e-b00b-319bd12688d8-autoconverted.jpeg" alt="" /></figure><p>Подсоедините платы с фоторезисторами и LED к корпусу и приклейте их.</p><figure><img src="https://media.tproger.ru/uploads/2023/08/fc2950cf-6543-4af1-a7b2-eab4532cd0d2-autoconverted.jpeg" alt="" /></figure><h2>Программируем чтение перфокарт в Propeller</h2><p>Propeller Tool — это инструмент, который позволяет программировать микроконтроллеры Propeller 1 и 2. В нём мы напишем код, который поможет нашему устройству читать перфокарты.</p><figure><img src="https://media.tproger.ru/uploads/2023/08/c8428603-ed51-49ae-b605-b7b0aaa61327.png" alt="" /></figure><h2>Создаём свою перфокарту</h2><p>В качестве основы для перфокарты нужно взять плотный картон. Отлично подойдёт обложка старой картонной папки.</p><p>Для того, чтобы нанести перфорацию на картон, используйте программу Silhouette Studio. В ней можно либо запрограммировать резку по картону, если у вас есть плоттер. Если у вас простой принтер, то можно разметить перфорацию, а затем вырезать её самому.</p><figure><img src="https://media.tproger.ru/uploads/2023/08/82ed8112-c23a-4186-a7c7-268b67d90e90.png" alt="" /></figure><p>Придётся попотеть с тем, чтобы подобрать размеры перфокарты. Он зависит от того, какие у вас получились габариты паза в ридере перфокарт и как расположены LED и фоторезисторы. Приблизительная ширина перфокарты из гайда — 5 сантиметров.</p><figure><img src="https://media.tproger.ru/uploads/2023/08/3699221e-dde8-491d-a399-96345aec8cfe-autoconverted.jpeg" alt="" /></figure><h2>Читаем перфокарту</h2><p>Подключите плату Parallax Propeller к компьютеру и запустите её. Все светодиоды должны загореться. Если Propeller показывает странные сообщения, убедитесь, что выводы фоторезисторов подключены в правильном направлении.</p><figure><img src="https://media.tproger.ru/uploads/2023/08/296a2aea-9985-44c9-80b1-136e169b5b16-autoconverted.jpeg" alt="" /></figure><p>Проведите первокарту через паз ридера. Наше сообщение гласит:</p><figure><img src="https://media.tproger.ru/uploads/2023/08/565fd0bd-323e-4f44-98c9-ad84584bcecb.png" alt="" /></figure><h2>Заключение</h2><p>Если вам понравился этот гайд, посмотрите другие статьи <a href="https://www.instructables.com/member/Tymkrs/">этого автора</a> — у него много крутых проектов. ? Или прочтите другие материалы по <a href="https://tproger.ru/tag/diy/">DIY</a> на Tproger:</p><ol><li><a href="https://tproger.ru/articles/kak-svarit-svoyo-kraftovoe-pivo-s-arduino/">Как сварить своё крафтовое пиво с Arduino</a></li><li><a href="https://tproger.ru/articles/noutbuk-na-raspberry-pi-v-myshke/">Проект на Raspberry Pi — полноценный ноутбук в компьютерной мышке</a></li><li><a href="https://tproger.ru/articles/smart-home-on-arduino-and-alisa/">Как сделать умный дом своими руками на Arduino и Яндекс.Алиса — пошаговая инструкция</a></li></ol>]]></content:encoded>
    </item>
    <item>
      <title>Как сварить своё крафтовое пиво с Arduino</title>
      <link>https://tproger.ru/articles/kak-svarit-svoyo-kraftovoe-pivo-s-arduino</link>
      <comments>https://tproger.ru/articles/kak-svarit-svoyo-kraftovoe-pivo-s-arduino?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Рафаил Агазода]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kak-svarit-svoyo-kraftovoe-pivo-s-arduino</guid>
      <description><![CDATA[<p>Рассказываем о двух проектах на Arduino для пивоварения, и как программисты могут применить свои навыки для создания своего крафтового пива.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kak-svarit-svoyo-kraftovoe-pivo-s-arduino">Как сварить своё крафтовое пиво с Arduino</a>»</p>]]></description>
      <category><![CDATA[Arduino]]></category>
      <category><![CDATA[DIY]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 05 Jul 2023 08:46:41 GMT</pubDate>
      <content:encoded><![CDATA[<p>Лето — это супер. Летом тепло, солнечно и хорошо. Но что, если вас одолела жара? Можно включить кондиционер, сходить на речку и искупаться или… освежиться стаканчиком пива. 😉</p><p>Однако было бы слишком скучно дойти до магазина и просто купить холодную бутылочку. В этой статье мы предлагаем усложнить задачу, но сделать её гораздо интереснее. Мы расскажем, как стать настоящим пивоваром с помощью Arduino – платой микроконтроллера, которая поможет вам построить собственную домашнюю пивоварню и автоматизировать процесс.</p><p>Рассказываем о двух проектах с открытым исходным кодом на Arduino для пивоварения, и как программисты могут применить свои навыки для создания своего крафтового пива.</p><h2>Open ArdBir</h2><p>Open ArdBir – это платформа с открытым исходным кодом для автоматизированного приготовления пива. Весь процесс пивоварения управляется через Arduino.</p><p>Arduino Uno на OpenArdBir помогает пивовару, управляя всем процессом, через контроллер PID+PWM. Вбивать все необходимые команды можно через поддерживаемые клавиатуру и 20×4 ЖК-дисплей.</p><p>Все входные данные о процессе варения поступают через температурный датчик. Также контролировать процесс можно через:</p><ol><li>PWM-выход для SSR-реле, управляющего нагревательным элементом.</li><li>Цифровой выход для реле, управляющего рециркуляционным насосом.</li><li>Цифровой выход для привода пьезо-сигнализатора.</li></ol><p>Контроллер автоматизирует все фазы: от кипячения и добавления хмеля до охлаждения и образования вихря. Освоить Open ArdBir могут как начинающие, так и опытные домашние пивовары.</p><p>Настроить систему можно всего лишь с помощью четырёх кнопок и ЖК-дисплея, которые предоставляют всю необходимую информацию на всех этапах.</p><p>Вот, как настроил Open ArdBir пивовар на YouTube:</p><p>Возможности ArdBir:</p><ol><li>Автоматический и ручной режимы.</li><li>Настройка газового или электрического нагрева.</li><li>Настройка PID/PWM.</li><li>Выбор единиц измерения.</li><li>Полностью настраиваемые параметры кипячения и добавления хмеля.</li><li>Алгоритм контроля температуры PID.</li><li>Управление мощностью нагрева.</li><li>Установка и хранение рецептов.</li><li>Отложенный старт.</li><li>Поддержка нескольких языков: итальянского, английского, испанского, португальского, русского и норвежского.</li></ol><h2>Beerduino</h2><p>Это проект, который <a href="http://demin.org/avtomatika-dlya-pivovarni-beerduino-na-baze-arduino-mega.html">создал</a> программист Михаил Дёмин. Однажды он увидел видео, на котором кто-то делает пиво, и сам загорелся этой идеей. После долгих дней написания кода у него получился Beerduino – контроллер, который позволяет варить пиво в домашних условиях.</p><p>Для сборки Beerduino понадобятся:</p><ol><li>Ардуино Мега + Шилд + Экран 3,2 дюйма ssd1289 или ili9341.</li><li>Твердотельное реле для управления ТЭНом SSR-40DA (или схема на симисторах).</li><li>Твердотельное реле для управления насосом SSR-10DA, D3808HK (для насоса на переменном токе) или SSR-10DD (на постоянном токе).</li><li>Термодатчик ds18b20.</li><li>Блок питания 7.5-9В 1А.</li><li>Разъемы для подключения термодатчика и насоса GX12-3 и GX12-2.</li><li>Пластиковый бокс.</li><li>Пьезо-динамик.</li><li>Резистор на 4.7кОм.</li></ol><h2>Заключение</h2><p>Пивоварение с использованием Arduino открывает перед домашними пивоварами новые возможности: можно создать системы для автоматизации варки до создания комплексных систем управления всем процессом пивоварения.</p><p>Используйте свои навыки, чтобы варить собственное крафтовое пиво по уникальным рецептам или создайте собственную систему управления пивоварней.</p><p>Надеемся, статья вас заинтересовала, и в скором времени весь мир услышит о легендарном пиве “Типичный Программист”. 🙂 Во всяком случае, пригласите нас на дегустацию!</p>]]></content:encoded>
    </item>
    <item>
      <title>Умелец с Реддита сделал USB-клавиатуру в форме пениса</title>
      <link>https://tproger.ru/news/umelec-s-reddita-sdelal-usb-klaviaturu-v-forme-polovogo-organa</link>
      <comments>https://tproger.ru/news/umelec-s-reddita-sdelal-usb-klaviaturu-v-forme-polovogo-organa?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Павел Федоренко]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/umelec-s-reddita-sdelal-usb-klaviaturu-v-forme-polovogo-organa</guid>
      <description><![CDATA[<p>На Реддите появился тред, в котором автор похвастался изобретением — клавиатурой-пенисом. Он напечатал его на 3D-принтере.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/umelec-s-reddita-sdelal-usb-klaviaturu-v-forme-polovogo-organa">Умелец с Реддита сделал USB-клавиатуру в форме пениса</a>»</p>]]></description>
      <category><![CDATA[3D-принтер]]></category>
      <category><![CDATA[Pet-проекты]]></category>
      <category><![CDATA[DIY]]></category>
      <category><![CDATA[Hardware]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 07 Mar 2023 00:56:59 GMT</pubDate>
      <content:encoded><![CDATA[<p>Девайс напечатан на 3D-принтере и имеет форму пениса.</p><figure><img src="https://media.tproger.ru/uploads/2023/03/0629ea4a-6ad8-41d6-a398-8f6e5590df18.jpeg" alt="" /></figure><p>Он обладает несколькими кнопками, нажимая на которые можно выбирать буквы и составлять слова. Но самое интересное, что устройство сделано так, чтобы управлять им можно было с помощью языка.</p><figure><img src="https://media.tproger.ru/uploads/2023/03/1d1dcbf5-e3c9-4ac7-86f6-6bdd859c3b59.jpeg" alt="" /></figure><p>Также автор этого чуда составил комбинации клавиш, которые можно получится «ввести». Правда, там пока нет цифр, но автор говорит, что «можно заменить на них некоторые из букв».</p><p>Теперь можно прочувствовать каждую букву всей душой.</p>]]></content:encoded>
    </item>
    <item>
      <title>Взять и поднять частное облако — поможет Sovereign</title>
      <link>https://tproger.ru/articles/vzjat-i-podnjat-chastnoe-oblako-pomozhet-sovereign</link>
      <comments>https://tproger.ru/articles/vzjat-i-podnjat-chastnoe-oblako-pomozhet-sovereign?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Типичный программист]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/vzjat-i-podnjat-chastnoe-oblako-pomozhet-sovereign</guid>
      <description><![CDATA[<p>Как использовать комплекс open source решений для построения частного облачного хранилища (и не только). Возможности, компоненты и отзывы.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/vzjat-i-podnjat-chastnoe-oblako-pomozhet-sovereign">Взять и поднять частное облако — поможет Sovereign</a>»</p>]]></description>
      <category><![CDATA[Open Source]]></category>
      <category><![CDATA[DIY]]></category>
      <category><![CDATA[Облачные технологии]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 08 Jul 2022 08:57:22 GMT</pubDate>
      <content:encoded><![CDATA[<p>Это — комплекс <i>open source</i> решений для построения облачного хранилища (и не только). Обсудим его возможности, компоненты и отзывы в ИТ-сообществе.</p><figure><img src="https://media.tproger.ru/user-uploads/23823/2024-01-05/d7026222-9ec0-4ad4-8e30-d2b5d9cf3a0d.jpg" alt="" /><figcaption>/ Unsplash.com / Shane</figcaption></figure><h2>Почему мы об этом говорим</h2><p>Многие иностранные хостинги ушли с российского рынка или приостановили работу. Оплатить услуги компаний, которые остались, также стало сложнее из-за ограничений западных платежных систем. Бизнес решает проблему несколькими способами. Некоторые оплачивают облако через сервисы посредников, число которых растет как грибы после дождя. Однако многие из них берут комиссию в десятки процентов, плюс существует риск столкнуться с мошенниками.</p><p>Часть компаний переходит в облака отечественных провайдеров. Например, свое облачное хранилище предлагаем мы в T1 Cloud. За последние месяцы спрос на хранение и обработку данных вырос более чем на 40%. Наплыв пользователей оказался настолько резким, что некоторые локальные операторы в срочном порядке ищут способы нарастить инфраструктурные ресурсы.</p><p>Третье решение — частное облако на базе <i>open</i><i> </i><i>source</i>. Одним из известных стеков для этих целей является Nextcloud. Его инструментарий позволяет не только хранить данные, но и вести проекты, организовывать конференции. Не менее функциональным решением является Sovereign. С его помощью можно развернуть частное облако для корпоративных и личных целей.</p><h2>Что предложит Sovereign</h2><p>Это — набор сценариев Ansible, покрывающих десятки кейсов: от хранения данных и мессенджеров до обеспечения ИБ и мониторинга.</p><h3>Хранение данных</h3><p>Хранилище построено на основе открытого приложения ownCloud для синхронизации и совместной работы с файлами. Его представил инженер Франк Карличек, один из соавторов KDE еще в 2010 году. К слову, платформа Nextcloud является форком ownCloud и во многом повторяет её.</p><p>Приложение ownCloud позволяет хранить файлы с помощью обычных каталогов или использовать WebDAV. Оно поддерживает синхронизацию между клиентами и имеет встроенный текстовый редактор с подсветкой синтаксиса и фолдингом, что может быть удобно для разработчиков. Также есть интеграции с CalDAV и CardDAV для синхронизации календарей и списков контактов.</p><p>Что касается бэкапов, то за них отвечает Tarsnap. Инструмент платный, что не очень удобно в условиях санкций. Однако вместо него можно подключить другой сервис или настроить резервное копирование в облако российского провайдера.</p><h3>Безопасность</h3><p>В стек входит VPN-сервер на базе OpenVPN. Можно настроить двухфакторную аутентификацию по RFC6238 с поддержкой Google Authenticator и аппаратных токенов. Для борьбы со спамом авторы предлагают использовать Rspamd, для предотвращения вторжений — <a href="http://www.fail2ban.org/">fail2ban</a>, а для обнаружения руткитов — rkhunter. Управление брандмауэром реализовано с помощью Uncomplicated Firewall (ufw), который, по сути, является фронтендом для iptables.</p><h3>Мониторинг</h3><p>Компонент Monit следит, чтобы все элементы системы работали корректно и предупреждает о нештатных ситуациях. В свою очередь, модуль collectd собирает системную аналитику.</p><figure><img src="https://media.tproger.ru/user-uploads/23823/2024-01-05/ff94f071-50fe-4840-a7a3-2a3f506fa6c6.jpg" alt="" /><figcaption>/ Unsplash.com / drmakete lab<br /></figcaption></figure><p>В Sovereign также встроена платформа полнотекстового поиска Solr, безопасный IMAP-сервер Dovecot и Apache для веб-хостинга личных блогов. Исчерпывающий список сервисов можно найти в описании к <a href="https://github.com/sovereign/sovereign#services-provided">репозиторию на GitHub</a>. Там же выложена инструкция по настройке Sovereign. Сделать это можно на удаленном сервере или на локальной машине. Руководство покрывает все шаги — от установки пакетов до настройки DNS и мониторинга.</p><p>Что касается системных требований, то они достаточно консервативные. Для работы необходим сервер (например, VPS) с 512 МБ оперативной памяти. Разработчики рекомендуют использовать Debian 8.3 или альтернативный Linux-дистрибутив. Дополнительно необходим аккаунт в Tarsnap или любом другом бэкап-сервисе. Приобретать SSL-сертификаты не нужно — Let’s Encrypt предоставит их автоматически после развертки сервера.</p><h2>Можно ли улучшить стек</h2><p>За несколько лет вокруг Sovereign сформировалось обширное сообщество — на GitHub проект собрал больше 10 тыс. звезд. Однако отношение к многофункциональным платформам для настройки частных хранилищ неоднозначное. Есть мнение, что они экономят время и позволяют развернуть комплексную систему за считаные часы и даже минуты. С другой стороны, они пытаются решить слишком много проблем разом. В итоге страдает пользовательский опыт, а управлять зоопарком инструментов сложно.</p><p>В связи с этим энтузиасты предлагают разного рода улучшения для устоявшегося стека. Так, один из резидентов Hacker News в тематическом треде отметил, что предпочитает использовать для self-hosting решений Docker вместо Ansible из-за большей гибкости и простоты. Хотя здесь не все однозначно — настройка контейнерной среды тоже может вызывать трудности, все зависит от опыта.</p><p>Также Sovereign подразумевает настройку собственного почтового сервера. Но есть мнение, что они быстро «тонут» в спаме. Здесь помогут дополнительные защитные меры — сервис RBL, серые списки, фильтрующие входящий спам на уровне SMTP, и утилита SpamAssassin.</p><h2>Главное, не перепутать</h2><p>Sovereign является технологическим стеком для развертки корпоративного или личного частного облака. Но существует более масштабная инициатива с аналогичным названием — Sovereign Cloud Stack (SCS). Она не имеет отношения к персональным файловым хранилищам. Это — европейский проект, в рамках которого развивают открытые стандарты для контейнерной и облачной инфраструктуры.</p><p>Идейно Sovereign Cloud Stack связан с другой европейской инициативой — Gaia-X. Её цель — создать открытую инфраструктуру данных на базе децентрализованной облачной системы. Инженеры разрабатывают правила безопасного обмена информацией. Одним из первых на практике их опробует Национальный метрологический институт Германии в рамках программы по цифровизации средств проверки метрологических устройств.</p>]]></content:encoded>
    </item>
    <item>
      <title>Nintendo анонсировала конструктор игр с обучением основам программирования</title>
      <link>https://tproger.ru/news/nintendo-anonsirovala-konstruktor-igr-s-obucheniem-osnovam-programmirovanija</link>
      <comments>https://tproger.ru/news/nintendo-anonsirovala-konstruktor-igr-s-obucheniem-osnovam-programmirovanija?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/nintendo-anonsirovala-konstruktor-igr-s-obucheniem-osnovam-programmirovanija</guid>
      <description><![CDATA[<p>Игра для Switch учит основам программирования через визуальный интерфейс: существа-нодоны работают как функции, а связи между ними задают логику.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/nintendo-anonsirovala-konstruktor-igr-s-obucheniem-osnovam-programmirovanija">Nintendo анонсировала конструктор игр с обучением основам программирования</a>»</p>]]></description>
      <category><![CDATA[Разработка игр]]></category>
      <category><![CDATA[DIY]]></category>
      <category><![CDATA[Игры для программистов]]></category>
      <category><![CDATA[Игра]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 06 May 2021 15:11:01 GMT</pubDate>
      <content:encoded><![CDATA[<p>Компания Nintendo анонсировала новую игру для портативной консоли Switch — Game Builder Garage. С её помощью игроки смогут сами создавать игры, попутно обучаясь основам программирования.</p><p>По своей сути, новый проект является идейным потомком WarioWare DIY, Super Mario Maker и Toy-Con Garage — они также позволяли «разрабатывать» самодельные игры на приставках Nintendo.</p><figure><img src="https://media.tproger.ru/uploads/2021/05/1-7.png" alt="" /></figure><p>Новый проект объясняет пользователям азы программирования через визуальный интерфейс. Им необходимо взаимодействовать с отдельными существами — нодонами — которые являются чем-то вроде функций.</p><figure><img src="https://media.tproger.ru/uploads/2021/05/2-2.png" alt="" /></figure><p>Каждый нодон отвечает за отдельное действие или элемент: от таймера до кнопки или аудиоэффекта. Связывая их между собой, игроки будут создавать свою игру.</p><p>Релиз Game Builder Garage намечен на 11 июня. Цена игры в России — 2699 рублей.</p><p>Источник: <a href="https://www.nintendo.ru/-/-Nintendo-Switch/Game-Builder-Garage-1964648.html">Nintendo</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Представлена полностью настраиваемая клавиатура. Можно буквально собрать её с нуля</title>
      <link>https://tproger.ru/news/predstavlena-polnostju-nastraivaemaja-klaviatura-mozhno-bukvalno-sobrat-ejo-s-nulja</link>
      <comments>https://tproger.ru/news/predstavlena-polnostju-nastraivaemaja-klaviatura-mozhno-bukvalno-sobrat-ejo-s-nulja?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Сергей Почекутов]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/predstavlena-polnostju-nastraivaemaja-klaviatura-mozhno-bukvalno-sobrat-ejo-s-nulja</guid>
      <description><![CDATA[<p>Проект Launch Configurable Keyboard открывает механические и электрические схемы, прошивки и программное обеспечение для управления.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/predstavlena-polnostju-nastraivaemaja-klaviatura-mozhno-bukvalno-sobrat-ejo-s-nulja">Представлена полностью настраиваемая клавиатура. Можно буквально собрать её с нуля</a>»</p>]]></description>
      <category><![CDATA[DIY]]></category>
      <category><![CDATA[Pet-проекты]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 12 Feb 2021 04:02:18 GMT</pubDate>
      <content:encoded><![CDATA[<p>Компания System76, которая специализируется на производстве ноутбуков, ПК и серверов на Linux, <a href="https://github.com/system76/launch">опубликовала на GitHub проект Launch Configurable Keyboard</a>. Это клавиатура, которую пользователь может собрать сам и настроить под свои предпочтения. В открытый доступ выложены механические и электрические схемы, прошивки и программное обеспечение, используемое для управления.</p><p>Для производства предлагается использовать алюминий. Все порты и отверстия спроектированы так, чтобы замена клавиш и подключение кабелей были лёгкими и безопасными. Для увеличения угла наклона на 15 градусов используется съёмная планка, которую можно прикрепить с помощью магнитов. Предусмотрены дополнительные возможности для замены клавиш, переназначения управляющих кнопок и формирования индивидуальной раскладки.</p><p>Клавиатура подключается к компьютеру с помощью кабеля USB-C — USB-C или USB-C — USB-A. У самого устройства есть ещё два порта USB-C и два порта USB-A, соответствующих спецификации USB 3.2 Gen 2 со скоростью до 10 Гбит/с. Каждая клавиша оснащена собственным светодиодом, которым можно управлять отдельно через прошивку.</p><figure><img src="https://media.tproger.ru/uploads/2021/02/launch-chassis.jpg" alt="" /></figure>]]></content:encoded>
    </item>
    <item>
      <title>Видео: создан тренажёр для слепой печати, бьющий током за ошибки</title>
      <link>https://tproger.ru/news/video-sozdan-trenazhjor-dlja-slepoj-pechati-bjushhij-tokom-za-oshibki</link>
      <comments>https://tproger.ru/news/video-sozdan-trenazhjor-dlja-slepoj-pechati-bjushhij-tokom-za-oshibki?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/video-sozdan-trenazhjor-dlja-slepoj-pechati-bjushhij-tokom-za-oshibki</guid>
      <description><![CDATA[<p>Энтузиаст собрал из обычной клавиатуры станцию для слепой печати: за медленный набор и опечатки она наказывает пользователя разрядом тока.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/video-sozdan-trenazhjor-dlja-slepoj-pechati-bjushhij-tokom-za-oshibki">Видео: создан тренажёр для слепой печати, бьющий током за ошибки</a>»</p>]]></description>
      <category><![CDATA[DIY]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[YouTube]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 05 Feb 2021 12:33:04 GMT</pubDate>
      <content:encoded><![CDATA[<p>На YouTube-канале 3DprintedLife появилось <a href="https://youtu.be/yxUM_wt-jB4">видео</a> с демонстрацией одного очень интересного проекта. В нём автор показывает процесс создания тренажёра для слепой печати на базе обыкновенной клавиатуры. Главной особенностью устройства является система наказаний за ошибки.</p><p>Так, в случае, если пользователь пишет слишком медленно или нажимает не на ту клавишу, то тренажёр бьёт его током. Для реализации этой части устройства, Эндрю ДеГонг, автор проекта, использовал «шокер» от бьющей током авторучки.</p><p>Мозг клавиатуры — Raspberry Pi. Именно этот малыш отвечает за анализ поведения пользователя. Распознаванием ошибок при печати занимается нейросеть, созданная автором проекта при помощи библиотеки TensorFlow от Google. В качестве тренировочных данных использовались примеры его правильной печати.</p><p>По итогу у Эндрю ДеГонга получился девайс, который имеет несколько тренировочных режимов. При этом если пользователь начинает смотреть на клавиатуру, то светодиоды сообщают ему о том, что клавиатура видит читинг и не одобряет его. Познакомиться с файлами проекта можно в его <a href="https://github.com/DDeGonge/LearnToTypeBot">GitHub-репозитории</a>, а само видео доступно ниже:</p><p>Источник: <a href="https://youtu.be/yxUM_wt-jB4">YouTube/3DprintedLife</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Из 17-летнего iPod сделали современный плеер с доступом к Spotify</title>
      <link>https://tproger.ru/news/iz-17-letnego-ipod-sdelali-sovremennyj-pleer-s-dostupom-k-spotify</link>
      <comments>https://tproger.ru/news/iz-17-letnego-ipod-sdelali-sovremennyj-pleer-s-dostupom-k-spotify?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/iz-17-letnego-ipod-sdelali-sovremennyj-pleer-s-dostupom-k-spotify</guid>
      <description><![CDATA[<p>Разработчик Гай Дьюпон собрал в корпусе iPod 4-го поколения плеер на Raspberry Pi Zero W с Wi-Fi, Bluetooth и Spotify. Проект назван sPot.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/iz-17-letnego-ipod-sdelali-sovremennyj-pleer-s-dostupom-k-spotify">Из 17-летнего iPod сделали современный плеер с доступом к Spotify</a>»</p>]]></description>
      <category><![CDATA[Apple]]></category>
      <category><![CDATA[Raspberry Pi]]></category>
      <category><![CDATA[DIY]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 29 Jan 2021 09:38:34 GMT</pubDate>
      <content:encoded><![CDATA[<p>В сети появилось <a href="https://youtu.be/ZxdhG1OhVng">видео</a>, в котором разработчик Гай Дьюпон показал превращение старенького iPod во вполне современный девайс с Wi-Fi и проигрыванием музыки из Spotify. Правда, стоит отметить, что в его проекте осталось не так уж и много от оригинального iPod 4-го поколения.</p><p>Энтузиаст по большей части использовал лишь корпус от iPod. Внутрь него он засунул Wi-Fi и Bluetooth-модули, цветной дисплей, аккумулятор на 1000 мАч. Также Дьюпон использовал Raspberry Pi Zero W за 10 долларов, на который он установил специальную версию Spotify в стиле оригинального интерфейса плеера от Apple.</p><p>Проект было решено назвать sPot. А его исходный код разработки вместе с инструкцией автор обещал добавить в <a href="https://github.com/dupontgu/retro-ipod-spotify-client">репозиторий проекта</a> чуть позднее.</p><figure><img src="https://media.tproger.ru/uploads/2021/01/1-31.jpg" alt="" /><figcaption>Вот так выглядит сам sPot и его интерфейс</figcaption></figure><p>Источник: <a href="https://www.youtube.com/watch?v=ZxdhG1OhVng&amp;feature=youtu.be">YouTube / Guy Dupont</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Проект на Raspberry Pi — полноценный ноутбук в компьютерной мышке</title>
      <link>https://tproger.ru/articles/noutbuk-na-raspberry-pi-v-myshke</link>
      <comments>https://tproger.ru/articles/noutbuk-na-raspberry-pi-v-myshke?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Александр Ланский]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/noutbuk-na-raspberry-pi-v-myshke</guid>
      <description><![CDATA[<p>Энтузиаст с канала Electo уместил Raspberry Pi в компьютерную мышь, добавив встроенное питание, выдвижную клавиатуру и миниатюрный экран.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/noutbuk-na-raspberry-pi-v-myshke">Проект на Raspberry Pi — полноценный ноутбук в компьютерной мышке</a>»</p>]]></description>
      <category><![CDATA[Hardware]]></category>
      <category><![CDATA[Raspberry Pi]]></category>
      <category><![CDATA[DIY]]></category>
      <category><![CDATA[Pet-проекты]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 05 Jan 2021 11:43:38 GMT</pubDate>
      <content:encoded><![CDATA[<p>Недавно стала популярна модель компьютера Raspberry Pi 400 — устройство в корпусе клавиатуры. Вам остаётся подключить питание, мышь и монитор — устройство готово к работе. Этот проект на Raspberry Pi напоминает классические компьютеры эпохи ZX Spectrum в виде блока с клавиатурой.</p><figure><img src="https://media.tproger.ru/uploads/2021/01/neat-lg-30ca40811ecee7f931167680e6b0412b.jpg" alt="" /></figure><p>Энтузиаст с канала <a href="https://www.youtube.com/channel/UCJcjk44Wjpxf6yX5_XtCqAA">Electo</a> решил продолжить идею интеграции компьютера в периферию. Но на этот раз корпусом будет служить не клавиатура, а компьютерная мышь. Автор решил пойти ещё дальше и добавил к устройству встроенное питание, небольшую выдвижную клавиатуру и даже миниатюрный экран. Получилось вот что:</p><p>Автономность делает это устройство полноценным ноутбуком, пускай и не таким функциональным и производительным, как его аналоги. Автор рассказывает, что изначально целью проекта на Raspberry Pi было уместить все компоненты в корпусе классической мышки, но позже пришлось моделировать собственную конструкцию и печатать корпус на 3D-принтере.</p><p>В качестве микрокомпьютера здесь выступает Raspberry Pi Zero W. Не самая мощная модель из линейки Raspberry (одноядерный процессор 1 ГГц и 512 МБ LPDDR2), но зато весьма компактная. Экран имеет диагональ всего 1.5 дюйма. Очевидной сложностью в использовании является тот факт, что при перемещении курсора вам нужно следить не только за самим курсором, но и за перемещением всего экрана. Однако к этому легко можно привыкнуть, достаточно правильно настроить чувствительность мыши.</p><p>Производительности Pi Zero достаточно для запуска классических для микрокомпьютеров приложений. Но вот с запуском Minecraft Pi Edition устройство иногда не справляется. Но автору всё же удалось начать строить себе дом в этой игре.</p><p>Детальнее про этот проект на Raspberry Pi и про его сборку можно узнать в <a href="https://www.youtube.com/watch?v=hUHn_u4RbIk">этом видео</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Фоновая подсветка монитора, светящееся облако и led-панели: 5 проектов с использованием адресных светодиодов</title>
      <link>https://tproger.ru/digest/5-proektov-s-ispolzovaniem-adresnyh-svetodiodov</link>
      <comments>https://tproger.ru/digest/5-proektov-s-ispolzovaniem-adresnyh-svetodiodov?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Александр Ланский]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/digest/5-proektov-s-ispolzovaniem-adresnyh-svetodiodov</guid>
      <description><![CDATA[<p>Проекты разной сложности на адресных ARGB-светодиодах, лентах и матрицах: фоновая подсветка монитора, светящееся облако и led-панели.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/digest/5-proektov-s-ispolzovaniem-adresnyh-svetodiodov">Фоновая подсветка монитора, светящееся облако и led-панели: 5 проектов с использованием адресных светодиодов</a>»</p>]]></description>
      <category><![CDATA[Hardware]]></category>
      <category><![CDATA[Arduino]]></category>
      <category><![CDATA[DIY]]></category>
      <category><![CDATA[Pet-проекты]]></category>
      <category><![CDATA[Подборки]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 04 Jan 2021 12:33:55 GMT</pubDate>
      <content:encoded><![CDATA[<p>Уже привыкли видеть адресные светодиоды во всяких подсветках стен, комнат, столах и системных блоках? Мы решили доказать, что их потенциал куда больше. В этой подборке собрали крутые проекты с использованием адресных светодиодов, лент и матриц.</p><p>Примечание Адресные светодиоды (ARGB) отличаются от обычных тем, что имеют в себе цифровую микросхему, которая управляет цветами светодиода и соединяется с другими такими же микросхемами. Таким образом, если последовательно соединить адресные светодиоды, то можно будет управлять отдельно каждым светодиодом в этой цепочке, а не всеми сразу (как было бы с обычными RGB-светодиодами).</p><h2>Светодиодное облако</h2><p>Конструкция так же проста, как и эффектна. На каркас в форме шара наклеивается кусками вата, внутри каркаса размещаются адресные светодиоды. Их можно заменить на обычную RGB-ленту или даже гирлянду. Но используя ARGB-светодиоды, можно запрограммировать их на эффект молний или просто для одновременного свечения нескольких цветов.</p><h2>Фоновая подсветка монитора Ambilight</h2><p>Ещё в 2002 г. компания Philips разработала технологию динамической фоновой подсветки. Заключается она в том, что по вертикальным краям телевизора были размещены лампы, которые подсвечивали стену цветом, соответствующему цветам на экране. В тёмное время такая подсветка размывает резкий переход от яркого экрана к тёмной стене, благодаря чему глазам становится намного проще смотреть. Помимо этого, ambilight визуально расширяет границы экрана.</p><p>DIY-щик Alex Gyver подробно рассказывает про эту технологию и объясняет, как самостоятельно собрать собрать такую подсветку:</p><h2>LED-панели</h2><p>Среди светодиодных панелей особенно популярными стали модели от компании <a href="https://nanoleaf.ru/">Nanoleaf</a>. Они представляют из себя сегменты различных форм (треугольники, квадраты, шестиугольники), которые соединяются между собой и наклеиваются на стены и потолки. Мягкое свечение и приятные цветовые режимы добавят красочности в любой интерьер. Но цены на такие наборы из 9 классических треугольных панелей начинаются от 15 000 ₽.</p><p>Собрать подобное освещение можно и самому. Так сделал автор канала Nerdforge. Он решил использовать ленту адресных светодиодов и панели в форме шестиугольников:</p><p>Корпус панелей распечатан на 3D-принтере, а в роли рассеивателя — матовый акриловый лист. Микроконтроллером тут выступает ESP32 — прокачанная версия Wi-Fi модуля ESP8266. Имеется удалённое управление со смартфона через приложение Blynk.</p><h2>Механические светящиеся цветки</h2><p>Jiri Praus создаёт удивительные механизированные цветки, которые раскрываются от прикосновения и светятся заданными им цветами:</p><p>Однако процесс сборки не лёгок: фрезеровка основания, спаянные по каркасу конструкции и тонкие цветочные лепестки, распечатанные на 3D принтере. Эти лепестки раскрываются с помощью системы рычагов и сервопривода. В качестве микроконтроллера тут стоит ESP32, а значит, что цветки можно объединить в одну сеть и удалённо управлять с телефона или компьютера.</p><h2>Настольная светодиодная лампа</h2><p>Ещё один популярный проект от Alex Gyver — настольная лампа с множеством режимов:</p><p>Роль корпуса в устройстве исполняет матовый плафон, который отлично рассеивает свечение. Вместо адресной светодиодной ленты тут используется матрица светодиодов. Контроллер — ESP8266, который позволяет удалённо настраивать и переключать режимы работы лампы через специальное приложение на телефоне. На верхушке лампы имеется сенсорная кнопка, благодаря которой также можно переключать режимы.</p>]]></content:encoded>
    </item>
    <item>
      <title>3D-принтер в виде ёлочной игрушки, которая может печатать другие ёлочные игрушки</title>
      <link>https://tproger.ru/articles/3d-printer-v-vide-jolochnoj-igrushki-kotoraja-mozhet-pechatat-drugie-jolochnye-igrushki</link>
      <comments>https://tproger.ru/articles/3d-printer-v-vide-jolochnoj-igrushki-kotoraja-mozhet-pechatat-drugie-jolochnye-igrushki?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Александр Ланский]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/3d-printer-v-vide-jolochnoj-igrushki-kotoraja-mozhet-pechatat-drugie-jolochnye-igrushki</guid>
      <description><![CDATA[<p>Энтузиаст seanhodgins собрал миниатюрный фотополимерный принтер в виде шара: подсветку ЖК-экрана для этого пришлось заменить на ультрафиолетовую.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/3d-printer-v-vide-jolochnoj-igrushki-kotoraja-mozhet-pechatat-drugie-jolochnye-igrushki">3D-принтер в виде ёлочной игрушки, которая может печатать другие ёлочные игрушки</a>»</p>]]></description>
      <category><![CDATA[Hardware]]></category>
      <category><![CDATA[Arduino]]></category>
      <category><![CDATA[DIY]]></category>
      <category><![CDATA[Новый Год]]></category>
      <category><![CDATA[3D-принтер]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 10 Dec 2020 14:59:58 GMT</pubDate>
      <content:encoded><![CDATA[<p>Новый год становится всё ближе, а это значит, что пора задумываться о новогодней ёлке и её украшении. Энтузиаст <a href="https://www.instructables.com/member/seanhodgins/">seanhodgins</a> решил упростить себе жизнь и не закупаться ёлочными игрушками. На ёлку он повесил всего один небольшой шар. Фишка в том, что это не просто ёлочная игрушка, а полноценный фотополимерный 3D-принтер. Он-то и сможет заполнить оставшееся пустое пространство ёлки различными украшениями. Подробнее можно узнать на <a href="https://www.instructables.com/Christmas-Ornament-That-3D-Prints-Christmas-Orname/">Instructables</a>.</p><h2>Комплектующее</h2><ul><li>Модуль <a href="https://learn.adafruit.com/adafruit-feather-m0-adalogger/overview">Adafruit Feather M0 Adalogger</a>. Он будет служить в роли микроконтроллера. На борту есть слот под MicroSD карту, на которую будут записываться данные для печати.</li><li>ЖК-дисплей 240х240 пикселей. Через него будет засвечиваться фотополимер.</li><li>Драйвер шагового двигателя.</li><li>Шаговый двигатель. Автор использовал двигатель с DVD-привода.</li><li>Плата с УФ-светодиодами.</li><li>Прочие детали: винты, джамперы, алюминиевая пластина, кнопка (будет запускать процесс печати).</li><li>Непосредственно корпус принтера. Он, в свою очередь, так же распечатан на 3D-принтере (уже на FDM). Файлы для печати корпуса можно найти на <a href="https://www.thingiverse.com/thing:3311150">Thingiverse</a>.</li></ul><h2>Подготовка УФ-экрана</h2><p>Классические ЖК-экраны используют подсветку белого цвета. Для принтера это не годится, ведь фотополимер обычно рассчитан на УФ-излучения. Поэтому нужно аккуратно удалить штатную подсветку ЖК-дисплея и присоединить вместо неё плату с УФ-светодиодами. Закрашивая отпределённые пиксели на экране, можно контролировать засвечивание тех или иных точек на слое смолы (через белые пиксели будет проходить УФ-свет, через чёрные — нет).</p><h2>Сборка 3D-принтера</h2><p>Распечатайте все детали корпуса. Печатать лучше на максимальном качестве, ведь 3D-принтеры не любит неточности.</p><p>Подключать шаговый двигатель к микроконтроллеру нужно через драйвер.</p><figure><img src="https://media.tproger.ru/uploads/2020/12/FP37H7LJQ2O5FHK.jpg" alt="" /></figure><p>Дно кюветы (резервуар с фотополимерной смолой) нужно закрыть прозрачным пластиком.</p><p>Удостоверившись в правильном подключении, соберите все части корпуса воедино. После сборки можно прошивать микроконтроллер и загружать файл печати на карту MicroSD. Для нарезки STL-файлов можно использовать NanoDLP. Полученные изображения нужно конвертировать в 24-битный формат BMP. Каждое изображение нужно поместить в отдельную папку на карте.</p><p>Чтобы первый слой печати легко схватывался, а потом также легко удалялся, на основание платформы нужно приклеить алюминиевую пластину. Перед печатью нужно налить немного смолы в кювету и опустить в неё платформу. Далее нажмите кнопку запуска.</p><p>В этом принтере нет концевика (датчика, который сигнализируют о том, что платформа подошла к краю). Поэтому принтер просто опускает ось до упора, а потом немного приподнимает её. Дальше начнётся сам процесс печати.</p><p>Вот такую чудесную малютку напечатала ёлочная игрушка:</p><figure><img src="https://media.tproger.ru/uploads/2020/12/F2TVK5VJQ2O5FHO.jpg" alt="" /></figure><p>Это <a href="https://github.com/IdleHandsProject/msla_christmas_ornament">open source проект</a>, поэтому каждый из вас может модернизировать устройство или создать на его основе нечто другое. Например, этому 3D-принтеру явно не хватает элементов управления, через которые можно было бы выбирать необходимую модель для печати.</p><figure><img src="https://media.tproger.ru/uploads/2020/12/FGP10W4JQ2O5FHN.jpg" alt="" /></figure>]]></content:encoded>
    </item>
    <item>
      <title>Кладём сети, создаём фейковые точки, блокируем доступ — ESP8266 Deauther</title>
      <link>https://tproger.ru/articles/esp8266-deauther</link>
      <comments>https://tproger.ru/articles/esp8266-deauther?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Александр Ланский]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/esp8266-deauther</guid>
      <description><![CDATA[<p>Прошивка Deauther 2.0 превращает Wi-Fi модуль в инструмент сканирования сетей и атак на них; защититься помогает стандарт связи 802.11w.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/esp8266-deauther">Кладём сети, создаём фейковые точки, блокируем доступ — ESP8266 Deauther</a>»</p>]]></description>
      <category><![CDATA[Hardware]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[Arduino]]></category>
      <category><![CDATA[DIY]]></category>
      <category><![CDATA[Информационная безопасность]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 18 Nov 2020 15:12:46 GMT</pubDate>
      <content:encoded><![CDATA[<p>Часто при использовании ESP8266 разработчики останавливаются на умных лампочках и погодных станциях. Однако возможности модуля намного шире. Например — <a href="https://github.com/SpacehuhnTech/esp8266_deauther">Deauther 2.0</a>. Автор создал этот проект, чтобы привлечь внимание к уязвимости стандарта связи <a href="https://ru.wikipedia.org/wiki/IEEE_802.11">802.11</a>.</p><p>Deauther — это прошивка для Wi-Fi модуля ESP8266. Благодаря ей вы получаете устройство, которое может сканировать сети и точки доступа, производить атаки на сети и отключать от них клиентов. Чтобы предотвратить деаутентификацию, нужно как минимум использовать стандарт <a href="https://en.wikipedia.org/wiki/IEEE_802.11w-2009">802.11w</a>. Он распространён среди устройств, но не так популярен среди точек доступа.</p><p>Это устройство может собрать каждый, достаточно лишь приобрести сам модуль. Это могут быть платы серии ESP, NodeMCU, Wemos, Adafruit HUZZAH и другие. Также автор продаёт кастомные платы различных форм-факторов, которые легко можно найти в интернет-магазинах. Например, крайняя плата справа может быть замаскирована под рабочий повер-банк.</p><figure><img src="https://media.tproger.ru/uploads/2020/11/DSTIKE_Deauther_Board-scaled.jpg" alt="" /></figure><p>Управлять устройством можно 3 способами:</p><ul><li>через встроенные элементы ввода. В этом случае на плате должны размещаться несколько кнопок (или хотя бы энкодер) и миниатюрный экран;</li><li>удалённо через браузер. Вы подключаетесь к созданной устройством точке доступа, и в браузере открываете панель управления. Кроме базовых возможностей, тут есть гибкая настройка устройства и сетевых параметров;</li><li>через последовательный порт. Модуль подключается по USB к любому устройству с serial-монитором (телефон, планшет, ПК).</li></ul><p>Алгоритм использования устройства такой:</p><ol><li>Сканируете сеть или клиентов. В первом случае будут найдены точки доступа, во втором — устройства с Wi-Fi;</li><li>Выбираете необходимые найденные сети/устройства;</li><li>В меню выбираете желаемый тип атаки;</li><li>Устройство самостоятельно производит атаку.</li></ol><p>Вот пример работы Deauther. Устройство собрано в виде наручных часов:</p><p>Deauther может производить 3 типа атаки:</p><ol><li>Deauth: атака деаутентификацией. Устройство посылает поддельные пакеты на точку доступа для отсоединения клиента от сети. Так как канал не зашифрован, точка доступа думает, что клиент действительно хочет отключиться от сети и закрывает соединение;</li><li>Beacon: при этом режиме атаки создаётся большое количество поддельных точек доступа-пустышек, которые могут дублировать целевую сеть;</li><li>Probe: запутывает Wi-Fi трекеры.</li></ol>]]></content:encoded>
    </item>
    <item>
      <title>Аниме и плата Arduino? Сложно поверить, но такое существует — RGBDuino</title>
      <link>https://tproger.ru/articles/about-rgbduino</link>
      <comments>https://tproger.ru/articles/about-rgbduino?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Александр Ланский]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/about-rgbduino</guid>
      <description><![CDATA[<p>По форм-фактору плата похожа на Arduino Uno: тот же ATmega328, аналоговые и цифровые порты, ICSP, кнопка RESET и USB-UART мост CH341.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/about-rgbduino">Аниме и плата Arduino? Сложно поверить, но такое существует — RGBDuino</a>»</p>]]></description>
      <category><![CDATA[Hardware]]></category>
      <category><![CDATA[Arduino]]></category>
      <category><![CDATA[DIY]]></category>
      <category><![CDATA[Pet-проекты]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 05 Nov 2020 15:33:53 GMT</pubDate>
      <content:encoded><![CDATA[<p>Плат Arduino очень много. Они отличаются форм-фактором, техническими характеристиками и возможностями. И как только вам покажется, что вы уже видели все возможные, странные и необычные версии плат, как появляется RGBDuino:</p><figure><img src="https://media.tproger.ru/uploads/2020/11/57.jpg" alt="" /></figure><p>По форм-фактору плата похожа на Arduino Uno. Тут стоит всё тот же ATmega328, есть аналоговые/цифровые порты, некоторые с поддержкой ШИМ. Остался порт ICSP, кнопка RESET и USB-UART мост CH341.</p><p>Но эта плата обзавелась и некоторыми доработками:</p><ul><li>microUSB порт вместо громоздкого USB type B;</li><li>дополнительная тактовая кнопка, которая соединяет Pin 2 и GND;</li><li>к каждому цифровому порту подсоединён синий светодиод;</li><li>в углу платы расположился пьезо-излучатель, через который можно воспроизводить звук. Подсоединён на Pin 8;</li><li>рядом с пьезо-излучателем есть переключатель, который может отключать его от микроконтроллера;</li><li>два распаянных адресных RGB светодиода, подсоединённых на Pin 12 и 13;</li><li>необычный дизайн, который точно привлечёт ваше внимание.</li></ul><p>В остальном же RGBDuino копирует Arduino Uno и может без проблем использоваться в тех же проектах, где и обычная Uno.</p><p>Помимо такого дизайна есть ещё один:</p><figure><img src="https://media.tproger.ru/uploads/2020/11/K7ePSk5Yqjo.jpg" alt="" /></figure><p>Какой вам больше понравился? Поделитесь этим в комментариях.</p>]]></content:encoded>
    </item>
    <item>
      <title>Светодиодный куб на Raspberry Pi, показывающий загруженность процессора</title>
      <link>https://tproger.ru/articles/cpu-usage-led-cube</link>
      <comments>https://tproger.ru/articles/cpu-usage-led-cube?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Александр Ланский]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/cpu-usage-led-cube</guid>
      <description><![CDATA[<p>Куб из трёх матриц адресных светодиодов 64×64 отображает температуру и загрузку ядер: цвет фона отвечает за температуру, толщина круга — за нагрузку.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/cpu-usage-led-cube">Светодиодный куб на Raspberry Pi, показывающий загруженность процессора</a>»</p>]]></description>
      <category><![CDATA[Hardware]]></category>
      <category><![CDATA[Raspberry Pi]]></category>
      <category><![CDATA[DIY]]></category>
      <category><![CDATA[Pet-проекты]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 30 Oct 2020 10:20:12 GMT</pubDate>
      <content:encoded><![CDATA[<p>Энтузиаст, вдохновившись проектами светодиодных кубов, решил собрать <a href="https://there.oughta.be/an/led-cube">собственную версию</a>. Этот куб отображает информацию касательно температуры процессора и загруженности его ядер.</p><p>Цвет фона обозначает температуру, а толщина круга — загруженность.</p><p>Куб состоит из 3 пластин, представляющих из себя матрицу адресных светодиодов разрешением 64×64 каждая. Управляются эти панели микрокомпьютером Raspberry Pi 2 через специальный шилд Adafruit RGB Matrix Bonnet (он обеспечивает питание и управление светодиодной панелью).  Куб связывается с ПК через Wi-Fi. Для этого к Raspberry Pi подключается USB Wi-Fi приёмник, а на компьютере в фоновом режиме запускается скрипт на Python.</p><p>Анимация создана на OpenGL шейдере, который обрабатывается прямо на Raspberry Pi. Корпус и подставка, как полагается, были напечатаны на 3D-принтере.</p>]]></content:encoded>
    </item>
    <item>
      <title>Делаем аппаратный менеджер паролей на базе Arduino</title>
      <link>https://tproger.ru/articles/arduino-password-manager</link>
      <comments>https://tproger.ru/articles/arduino-password-manager?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Александр Ланский]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/arduino-password-manager</guid>
      <description><![CDATA[<p>Данные для авторизации на бумаге могут попасть к похитителю, а человеческий фактор мешает создавать сложные пароли. seawarrior181 собрал менеджер на Arduino.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/arduino-password-manager">Делаем аппаратный менеджер паролей на базе Arduino</a>»</p>]]></description>
      <category><![CDATA[Hardware]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[Arduino]]></category>
      <category><![CDATA[DIY]]></category>
      <category><![CDATA[Pet-проекты]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 28 Oct 2020 14:29:36 GMT</pubDate>
      <content:encoded><![CDATA[<p>Многие люди до сих пор хранят данные для авторизации в бумажном виде. Очевидно, если кто-то украдёт ваш блокнот, то он получит доступ ко всем вашим аккаунтам — хуже не придумаешь. Ещё одна проблема — человеческий фактор, который не позволяет в полной мере придумывать действительно сложные пароли, которые нельзя будет взломать брут форсом или перебором по словарю. Пользователь seawarrior181 собрал аппаратный менеджер паролей, который решает эти проблемы. Данные всех аккаунтов хранятся внутри устройства, а встроенный генератор поможет создать пароль, который нельзя будет подобрать перебором слов.</p><p>Устройство называется PasswordPump. Оно может хранить в себе до 254 учётных записей (название учётной записи + логин + пароль). Данные хранятся на двух съёмных микросхемах памяти в зашифрованном виде, благодаря шифрованию военного уровня AES128.</p><p>При желании можно сделать бэкап в текстовый файл или на резервные микросхемы памяти (не зря они съёмные).</p><h2>Аппаратный менеджер паролей — как он работает?</h2><p>Это устройство подключается к ПК через USB кабель. Чтобы получить доступ к устройству (ко всем сохранённым аккаунтам в нём), нужно ввести мастер-пароль. После этого в списке вы должны выбрать нужную учётную запись, а на компьютере поставить курсор в форму ввода. Менеджер паролей сам введёт в ПК данные для авторизации.</p><p>Добавлять учётные записи в устройство можно нативно или через монитор последовательного порта на ПК.</p><h2>Сборка устройства</h2><p>PasswordPump базируется на плате Arduino Pro Micro. Единственный элемент ввода в устройстве — энкодер. Он позволяет считывать повороты ручки и нажатия на неё (прямо как в колёсике мышки). Информация выводится на небольшой OLED дисплей с разрешением 128×32 пикселей. Ещё понадобится RGB-светодиод (он будет показывать текущее состояние устройства), две микросхемы EEPROM-памяти, печатная плата и некоторый обвес. Вот все необходимые детали:</p><figure><img src="https://media.tproger.ru/uploads/2020/10/FCWWELWJU31TFXO.jpg" alt="" /></figure><p>Вот так выглядит схема устройства и его прототип, собранный на макетной плате:</p><figure><img src="https://media.tproger.ru/uploads/2020/10/FRZ6UAXJU31TB0A.jpg" alt="" /></figure><figure><img src="https://media.tproger.ru/uploads/2020/10/F75LJB8JU31TB14.jpg" alt="" /></figure><p>Автор выбрал модель Arduino Micro, потому что она базируется на чипе ATmega32u4 с аппаратной поддержкой USB-соединения. Это значит, что микроконтроллер можно использовать как HID-устройство. В данном случае — это клавиатура. Устройство имитирует нажатие клавиш, тем самым вводя данные для авторизации.</p><p>Исходный код для микроконтроллера можно найти <a href="https://github.com/seawarrior181/PasswordPump">здесь</a>.</p><p>После распайки всех элементов на плате, микроконтроллер нужно подключить к ПК и прошить через Arduino IDE. Но автор советует перепрошивать МК отдельно через программатор, так как в таком случае будет перезаписан и загрузчик, из-за чего в памяти освободится немного места, которого очень мало для этого скетча.</p><h2>Возможности менеджера паролей</h2><p>Про базовые возможности уже было рассказано выше — в менеджере паролей можно защищённо хранить данные учётных записей и передавать их на ПК. Но это далеко не все возможности PasswordPump:</p><ul><li>автоматическая очистка памяти и возврат к заводским настройкам после 10 неудачных попыток ввода мастер-пароля;</li><li>учётные данные шифруются с помощью AES128, а мастер-пароль хэшируется с помощью SHA256;</li><li>зашифрованные учётные записи и мастер-пароль <a href="https://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D0%BB%D1%8C_(%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B3%D1%80%D0%B0%D1%84%D0%B8%D1%8F)">посолены</a>;</li><li>устройство не уязвимо для стандартных атак на пароли;</li><li>все данные учётных записей могут быть выгружены в текстовый документ для создания резервной копии в виде файла;</li><li>автоматическая блокировка устройства после 1 часа бездействия (нужно будет повторно ввести мастер-пароль);</li><li>генерация пароля из случайных букв, цифр и символов;</li><li>добавление учётных записей через монитор последовательного порта или на самом устройстве с помощью поворотного энкодера;</li><li>редактирование и удаление существующих учётных записей через ПК или само устройство;</li></ul><p>Можно помочь автору в фиксе багов и добавлении новых возможностей в <a href="https://github.com/seawarrior181/PasswordPump">репозитории проекта</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Как сделать умный дом своими руками на Arduino и Яндекс.Алиса — пошаговая инструкция</title>
      <link>https://tproger.ru/articles/smart-home-on-arduino-and-alisa</link>
      <comments>https://tproger.ru/articles/smart-home-on-arduino-and-alisa?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Александр Ланский]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/smart-home-on-arduino-and-alisa</guid>
      <description><![CDATA[<p>Рассказываем, как поэтапно можно создать умный дом на Arduino, которым можно будет управлять через Яндекс.Алису. В частости, создадим умную лампочку.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/smart-home-on-arduino-and-alisa">Как сделать умный дом своими руками на Arduino и Яндекс.Алиса — пошаговая инструкция</a>»</p>]]></description>
      <category><![CDATA[Hardware]]></category>
      <category><![CDATA[Arduino]]></category>
      <category><![CDATA[DIY]]></category>
      <category><![CDATA[Яндекс]]></category>
      <category><![CDATA[Алиса]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 25 Aug 2020 11:04:28 GMT</pubDate>
      <content:encoded><![CDATA[<p>Уже больше года Яндекс развивает систему управления умным домом через Алису. Благодаря ей вы сможете включать свет, переключать каналы телевизора, заваривать кофе, изменять цвет подсветки, будить умные пылесосы и контролировать температуру в помещении.</p><p>Чтобы создать такую продвинутую экосистему умных устройств, совсем не обязательно штурмовать магазины электроники. Яндекс предоставляет <a href="https://yandex.ru/dev/dialogs/alice/doc/smart-home/start-docpage/">API</a> для интеграции ваших собственных решений через платформу навыков.</p><p>В этой статье расскажем, как с помощью микроконтроллера и обычного реле сделать умную лампочку и управлять ей с помощью Алисы.</p><h2>Как работает такой умный дом?</h2><p>Чтобы создать умный дом своими руками, потребуется навык <a href="https://dialogs.yandex.ru/store/skills/3229e372-domovenok-kuzya">Домовёнок Кузя</a>. Через него можно не только контролировать умный дом, но и интегрировать виртуальные устройства напрямую в Яндекс.Алису. Это значит, что вам не придётся постоянно открывать навык, чтобы просто выключить лампочку. С микроконтроллером навык будет связываться через <a href="https://ru.wikipedia.org/wiki/Webhook">веб-хуки</a>.</p><p>Для веб-хуков отлично подходит платформа <a href="https://blynk.io/">Blynk</a> — панель управления устройствами на Arduino и Raspberry Pi. Там вы сможете без труда создать графический интерфейс, через который можно будет управлять устройством по Wi-Fi (а ещё по Ethernet, USB, GSM и Bluetooth).</p><h2>Какие устройства можно интегрировать в умный дом?</h2><p>Через навык можно взаимодействовать с обширным количеством устройств: лампочки, розетки, шторы, замки, роботы-пылесосы, термостаты, очистители воздуха, кондиционеры и  чайники. Кроме этого, можно переключать каналы на телевизоре (через универсальный пульт) и менять цвета RGB-ламп.</p><p>Все устройства имеют базовую пару функций: включение и выключение (открытие и закрытие для штор и замков). Некоторые из устройств могут работать с диапазоном значений (яркость лампы, температура поддержки тепла для чайника).</p><h2>Аппаратная и программная часть</h2><p>Для того, чтобы собрать умный дом своими руками, мы будет использовать Wi-Fi модуль ESP8266. Процесс разработки на нём почти не отличается от традиционной разработки на Arduino.</p><p>Для начала нужно скачать приложение Blynk из GooglePlay или AppStore и зарегистрироваться в нём. После этого нужно создать новый проект и выбрать соответствующий микроконтроллер. Перед вами появится пустая панель, на которой можно размещать элементы управления. Это могут быть кнопки, иконки, слайдеры, индикаторы, выпадающие списки и многое другое.</p><p>После создания проекта на вашу почту придёт токен доступа. Его нужно будет указать в скетче и веб-хуках.</p><p>К элементам управления можно подвязать физический пин микроконтроллера или же виртуальный порт. При взаимодействии с каким-либо элементом, его новое значение будет сразу отправляться на микроконтроллер.</p><p>Примечание Виртуальные порты в Blynk можно представить как переменные, которые синхронизируются между устройством и сервером.</p><p>На <a href="https://examples.blynk.cc/">этом сайте</a> можно найти много примеров кода для Blynk под разные платформы микроконтроллеров. Ниже приведён скетч, который будет управлять пином. Тот, в свою очередь, будет управлять реле, к которому будет подключена лампа:</p><p>Для этого скетча в панели управления Blynk нужно добавить элемент «Button». В его настройках OUTPUT выставить V0, а режим работы переключить в <i>Switch</i>.</p><figure><img src="https://media.tproger.ru/uploads/2020/08/button-settings-example-autoconverted-1.jpeg" alt="" /></figure><p>Теперь к указанному порту можно подключать реле. Если всё правильно, то при нажатии на кнопку в панели управления реле будет открываться и закрываться.</p><p>Голосовое управление светом не мешает управлению им аппаратно. К микроконтроллеру можно подключить физическую кнопку или выключатель, которые тоже будут включать и выключать свет. Если это необходимо, то изменять состояние виртуального порта можно методом Blynk.virtualWrite(port, value). Тогда изменения будут отображаться и на панели управления.</p><p>Примечание При работе с механическими кнопками и выключателями не забывайте про <a href="https://arduinomaster.ru/datchiki-arduino/ustranenie-drebezg-kontaktov-knopki/">дребезг контактов</a>.</p><p>Всё работает? Тогда можете переходить к следующему этапу.</p><h2>Получение веб-хуков</h2><p>От Blynk вам потребуется не панель управления, а контроль виртуальных портов через GET-запросы. Вот так выглядит веб-хук на изменение состояния порта:</p><p>Чтобы включить виртуальный порт, &lt;value&gt; нужно указать как 1, чтобы выключить — как 0.</p><p>Помимо этого, значение с порта можно получить таким запросом:</p><h2>Настройка навыка «Домовёнок Кузя»</h2><p>Перейдите на <a href="https://alexstar.ru/smarthome">сайт навыка</a> и авторизуйтесь там через Яндекс. Далее жмите на <i>Добавить правило HTTP (GET)</i>. Перед вами откроется форма настройки правила.</p><p><i>Активационная фраза</i> — название запроса, которое будет отображаться в списке (например «свет на кухне, включение»). Если вы не планируете контролировать умный дом конкретно изнутри навыка, то больше фраза нигде не понадобится. Поле <i>Ответ Кузи</i> тоже оставляйте пустым. В поле <i>URL</i> вставляете соответствующий веб-хук на включение света (виртуального порта). Остальные параметры можно не изменять. После этого нужно сделать идентичное правило на выключение света.</p><figure><img src="https://media.tproger.ru/uploads/2020/08/get-query-example.png" alt="" /></figure><p>Дальше нужно перейти во вкладку виртуальных устройств и добавить устройство «Лампа». Тут нужно дать название устройству, по которому его будет идентифицировать Алиса. Например: свет, бра, подсветка, лампа или торшер. <i>Место расположения</i> — комната, в которой будет установлено устройство. Это нужно на тот случай, если в нескольких комнатах будут одинаковые по названию элементы. К тому же, одной голосовой командой можно включать и выключать все устройства в определённой комнате.</p><p>В <i>Правило на включение/выключение</i> из списка выбираете соответствующие запросы. В лампе имеется возможность управления яркостью. Для этого нужно создать ещё одно правило, но значение параметра value установить как {value}. Тогда в запрос будет подставляться число от 0 до 100, которое будет обозначать требуемую яркость. Вам лишь остаётся обработать это значение в скетче.</p><figure><img src="https://media.tproger.ru/uploads/2020/08/virtual-device-example.png" alt="" /></figure><p>Примечание Если вы планируете изменять яркость, то параметр <i>value</i> в веб-хуке на включение нужно изменить с 1 на 100.</p><h2>Настройка Алисы</h2><p>В приложении Яндекс перейдите в раздел Устройства→Управление устройствами. Нажмите на кнопку «Добавить»→«Другое устройство». В открывшемся списке найдите навык «Домовёнок Кузя».</p><p>Авторизуйтесь в нём. Возможно, нужно будет ввести код объединения устройств, указанный в панели управления умным домом. Потом нажмите на Обновить список устройств.</p><p>На этом этом этапе вы уже создали умный дом своими руками. Теперь система полностью готова к голосовому контролю. К ней имеет доступ лишь ваш аккаунт. В настройках виртуальных устройств можно расширить доступ на другие аккаунты.</p><p><i>— Алиса, включи свет.</i></p>]]></content:encoded>
    </item>
    <item>
      <title>Интересные проекты на Arduino: делаем электронную аудиокассету и запускаем с неё игры на 8-битном ПК</title>
      <link>https://tproger.ru/articles/arduino-cassette-for-spectrum</link>
      <comments>https://tproger.ru/articles/arduino-cassette-for-spectrum?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Александр Ланский]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/arduino-cassette-for-spectrum</guid>
      <description><![CDATA[<p>Раньше ПК могли использовать аудиокассеты как накопители. В этом проекте на Arduino энтузиаст воссоздал такую кассету с MicroSD картой.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/arduino-cassette-for-spectrum">Интересные проекты на Arduino: делаем электронную аудиокассету и запускаем с неё игры на 8-битном ПК</a>»</p>]]></description>
      <category><![CDATA[Hardware]]></category>
      <category><![CDATA[Arduino]]></category>
      <category><![CDATA[DIY]]></category>
      <category><![CDATA[Pet-проекты]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 13 Aug 2020 15:10:00 GMT</pubDate>
      <content:encoded><![CDATA[<p>Наверняка хотя бы у кого-то ещё остались старые кассеты с до боли знакомыми песнями. 20–30 лет назад это был один из основных типов носителей для аудио. Ведь они были компактными, дешёвыми в производстве и простыми в эксплуатации.</p><p>Однако у программистов того времени кассеты ассоциируются не только с ностальгическими песнями, но и с 8-битными компьютерами. У большинства из них был встроенный (или хотя бы подключаемый) кассетный магнитофон. Через него можно было загружать и сохранять данные, например программы, игры или файлы. Одна кассета вмещала несколько, а то и десяток программ, в зависимости от их размера. К тому же, на одной магнитной ленте размещались 2 или 4 дорожки — это в несколько раз увеличивало объём кассеты.</p><figure><img src="https://media.tproger.ru/uploads/2020/08/GameList.jpeg" alt="" /></figure><p>Список игр на вкладыше кассеты.</p><p>К сожалению, до нашего времени дошло скудное количество таких носителей. Часть из них были повреждены, другие потеряны или просто утилизированы. Поэтому энтузиаст JamHamster задумал проект на Arduino: <a href="https://www.hackster.io/news/this-arduino-cassette-tape-makes-loading-zx-spectrum-software-incredibly-easy-c44a6b0731e7">собрать устройство</a>, которое могло бы имитировать кассету, но хранило бы данные не на магнитной ленте, а на карте памяти MicroSD. И, само собой, у него вышло!</p><figure><img src="https://media.tproger.ru/uploads/2020/08/CasseteOnArduino.jpg" alt="" /></figure><p>Электронная кассета на Arduino</p><p>Гаджет полностью помещается в корпус стандартной аудиокассеты. Мозгами проекта, как положено, стала плата Arduino Nano. Из интерфейсов управления: 5 кнопок и маленький OLED-дисплей. В «кассету» подключается карта памяти, на которую записывается нужная информация. Само собой, это не .exe файлы, и даже не .txt, а специальные аудиодорожки, которые содержат в себе код программ. Через меню на встроенном экране выбирается нужный файл, после чего кассета вставляется в магнитофон.</p><p>Для тех случаев, когда в компьютере нет встроенного магнитофона, в устройстве есть аудиовыход. Через него гаджет подключается напрямую к компьютеру и передает сигнал.</p><figure><img src="https://media.tproger.ru/uploads/2020/08/Scheme.png" alt="" /></figure><p>Схема внутреннего строения одной из версий кассет</p><p>Кассетой это устройство называется не только из-за своего корпуса. С него действительно можно «считать» звук привычным способом. Для этого там есть магнитная пишущая головка, сигнал которой считывается уже другой головкой, но в магнитофоне. Выходной мощности микроконтроллера для этого недостаточно, поэтому сигнал сначала усиливается миниатюрным усилителем PAM8403 (2 x 3Вт).</p><p>В кассету встроен аккумулятор, поэтому во время работы никакие внешние провода не потребуются. <a href="https://github.com/jamhamster/TZX-Cassette-Mod/blob/master/TZX%20Cassette%20Mod%20v0.1.pdf">Вот страничка</a> со всеми необходимыми схемами, списками деталей и описанием конструкции.</p><p>Сам автор отмечает, что создание проекта на Arduino оказалась сложнее, чем ожидалось. Основная трудность заключалась в компоновке всех элементов в столь маленьком корпусе. Например, ему пришлось отпаять некоторые разъёмы модулей и сместить их на проводах. Кое-где автор отпилил уголки плат, потому что те упирались друг в друга. А гнездо для аудиовыхода вообще пришлось делать вручную, чтобы оно влезло по высоте. Одним словом — сплошной геморрой. Но оно того стоило:</p>]]></content:encoded>
    </item>
    <item>
      <title>Диджей взломал протез руки и подключил к синтезатору, чтобы играть напрямую: что из этого вышло?</title>
      <link>https://tproger.ru/video/dj-hacked-his-arm-prosthesis</link>
      <comments>https://tproger.ru/video/dj-hacked-his-arm-prosthesis?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Александр Ланский]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/video/dj-hacked-his-arm-prosthesis</guid>
      <description><![CDATA[<p>Бертольт Мейер, диджей с 15-летним опытом, изучил конструкцию своего протеза, чтобы управлять синтезатором напрямую через датчики.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/video/dj-hacked-his-arm-prosthesis">Диджей взломал протез руки и подключил к синтезатору, чтобы играть напрямую: что из этого вышло?</a>»</p>]]></description>
      <category><![CDATA[Музыка]]></category>
      <category><![CDATA[DIY]]></category>
      <category><![CDATA[Pet-проекты]]></category>
      <category><![CDATA[Видео]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 15 Apr 2020 07:02:50 GMT</pubDate>
      <content:encoded><![CDATA[<p>Бертольт Мейер уже 15 лет работает диджеем, даёт концерты и записывает композиции. Он использует достаточно технологичный протез части руки с проработанной моторикой, но по его словам, работать с синтезаторами всё ещё неудобно.</p><p>Однажды у него появилась идея: каким-то образом управлять синтезатором напрямую через датчики в его протезе. Сначала он изучил конструкцию протеза — в устройстве есть два электрода, которые соединены с мышцами. С этих электродов можно снимать напряжение и отсылать его на специальный вход синтезатора.</p><p>Через какое-то время у него уже был рабочий прототип. Музыкант написал производителю синтезаторов — они ответили ему, передали нужные схемы и даже спроектировали итоговое устройство. Благодаря этому устройству через протез Бертольт может управлять несколькими параметрами синтезатора, например глубиной эффекта и тональностью звучания.</p><p>На видео музыкант подробно рассказывает о принципе работы протеза, о схеме устройства и о том, как это всё это можно связать с синтезатором.</p><p>Послушать музыку, которую Бертольт играет только через протез, можно с 07:25.</p>]]></content:encoded>
    </item>
    <item>
      <title>Видеокарта из металлолома и синей изоленты</title>
      <link>https://tproger.ru/video/videocard-diy</link>
      <comments>https://tproger.ru/video/videocard-diy?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Александр Ланский]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/video/videocard-diy</guid>
      <description><![CDATA[<p>Автор объясняет, как работает монитор с VGA-интерфейсом, и собирает примитивную видеокарту на логических элементах, триггерах и счётчиках.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/video/videocard-diy">Видеокарта из металлолома и синей изоленты</a>»</p>]]></description>
      <category><![CDATA[Hardware]]></category>
      <category><![CDATA[DIY]]></category>
      <category><![CDATA[Видео]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 18 Mar 2020 17:04:28 GMT</pubDate>
      <content:encoded><![CDATA[<p>Задумывались ли вы над тем, каким образом компьютер отрисовывает изображение на мониторе? Как по одному проводу каждую секунду передаётся сотня миллионов пикселей? В этом видео автор рассказывает, как работает монитор с VGA интерфейсом, и попутно собирает примитивную видеокарту на базовых цифровых микросхемах: логических элементах, триггерах и счётчиках.</p><p>В этом видео автор показывает, как собрать схему горизонтальной и вертикальной синхронизации, которая нужна для корректной отрисовки изображения.</p><p>Во <a href="https://www.youtube.com/watch?v=uqY3FMuMuRo">второй части</a> автор заканчивает сборку схемы и показывает, как видеокарта отрисовывает картинку.</p><h2>Немного теории</h2><p>0:12 Распиновка VGA интерфейса.</p><p>0:47 Коротко о том, как монитор отрисовывает изображение.</p><p>1:42 На этой диаграмме видно, в какие именно промежутки времени нужно посылать сигналы горизонтальной и вертикальной синхронизации.</p><h2>Что такое тайминги монитора и от чего они зависят</h2><p>2:44 Нужно узнать конкретные значения периода синхроимпульсов. По запросу «VGA signal timing» можно легко найти <a href="http://www.tinyvga.com/vga-timing">таблицы</a>, в которых приводится зависимость разрешения монитора от таймингов синхроимпульсов. Тайминги — определённые временные участки синхроимпульсов либо задержки между ними. <a href="http://www.tinyvga.com/vga-timing">На сайте</a> приведены все популярные разрешения мониторов с соответствующими таймингами. Конечно, даже самые примитивные видеокарты поддерживают несколько разрешений, но наша задача — сделать хоть какую-то.</p><p>3:41 У каждого разрешения своя частота отрисовки пикселей. Для конкретной частоты нужен кварцевый резонатор той же частоты. Если кварца выбранной частоты нет, можно замедлить частоту отрисовки пикселей, отсылая несколько пикселей за раз. Тогда с кварцем в 12 МГц можно будет работать с монитором, у которого пиксельная частота, например, 36 МГц. Но в отличие от частоты, тайминги должны оставаться неизменными.</p><p>Тайминги зависят как от частоты кварца, так и от разрешения монитора. Возьмём разрешение 800×600. У этого разрешения пиксельная частота равна 40 МГц. Чтобы запустить схему с частотой в 10 МГц, нужно компенсировать частоту количеством отрисовываемых пикселей. Поэтому схема должна работать с разрешением 200×600. Условно за один такт будет отправляться 4 пикселя, поэтому монитор должен определить исходное разрешение как 800×600.</p><h2>Горизонтальная синхронизация</h2><h3>Счётчик горизонтальной синхронизации</h3><p>5:49 Начать стоит со схемы, которая будет считать количество пикселей. Схеме нужно понимать, где будет 0-й пиксель, где — 50-й, а где — 200-й (конец отрисовки строки). В данном случае схема должна считать от 0 до 264 (учитывая синхроимпульс). После этого нужен будет второй счётчик, считающий количество строк и, соответственно, выдающий уже вертикальный синхроимпульс, который будет означать начало отрисовки нового кадра.</p><p>В схеме будет использоваться двоичный четырёхразрядный счётчик <a href="https://www.microshemca.ru/74161/">74LS161</a>. Чтобы досчитать до 264, потребуется 9 бит. Почему именно 9? Чтобы определить максимальное число, до которого досчитает счётчик, нужно возвести двойку в степень его разрядности. 2^8 = 256 — мало, 2^9 = 512 — достаточно, 2^10 = 1024 — излишне много. Так как у одного счётчика на борту всего 4 разряда, то потребуется три микросхемы.</p><p>6:28 Сначала у счётчиков нужно объединить контакты питания и «земли». Обнуляться счётчики должны одновременно, поэтому стоит объединить и контакты сброса. Так как три счётчика должны работать как единый, то и тактироваться они должны синхронно. Поэтому контакты тактирования всех трёх счётчиков нужно объединить. У счётчиков есть контакты входа данных, но они не потребуются.</p><p>7:05 Чтобы счётчики работали, нужно подать высокий уровень сигнала на разрешающий контакт PE. Так как контакты входа данных не используются, то и контакт Load будет бесполезен. Но стоит обратить внимание на то, что у него отрицательный активный уровень сигнала. Поэтому, чтобы этот контакт не активировался, на него тоже нужно подать высокий уровень сигнала.</p><p>7:17 У счётчиков есть второй разрешающий контакт — TE. У первого счётчика его нужно подключить к высокому уровню — счётчик будет увеличиваться при каждом такте. Но остальные два не всегда должны считать — они должны инкрементироваться только при переполнении предыдущего счётчика. Сигнал переполнения счётчика можно снять с контакта Ripple-Carry. Значение второго счётчика будет увеличиваться на единицу при каждом переполнении первого. Поэтому нужно подключить контакт Ripple-Carry первого счётчика к разрешающему контакту TE второго счётчика, а Ripple-Carry второго — к TE третьего.</p><p>После всех этих манипуляций получится 12-разрядный счётчик (хоть нужны всего первые 9 разрядов).</p><p>7:54 Чтобы посмотреть на работу схемы, можно подключить к выходу каждого счётчика светодиод (желательно через токоограничивающий резистор). Если сейчас подключить питание, то ничего не произойдёт, потому что у схемы нет источника тактирования. Если подключить кварцевый генератор на 10 МГц, то светодиоды будут переключаться так быстро, что будет казаться, что они просто беспрерывно горят. Лучше тактировать схему от генератора.</p><p>8:54 Демонстрация работы счётчика на частоте 1 КГц. Но даже на такой частоте переключения светодиодов достаточно быстрые, поэтому можно понизить частоту до 100 Гц.</p><p>9:22 Работа счётчика на 10 Гц.</p><h3>Распознавание тактов</h3><p>10:00 Следующая задача — заставить схему реагировать тогда, когда значение счётчика (т. е. число на выходе) будет равняться 200, 210, 242, 264. После последнего значения счётчик должен обнуляться. Для начала число 200. В бинарном коде оно выглядит как 011001000. Чтобы определить это число, нужно поставить инверторы на все выходы счётчика, на которых должен быть ноль, а выходы этих инверторов вместе с остальными контактами подключить к 8-входовому элементу И-НЕ. В таком случае на выходе логического элемента ноль будет только тогда, когда с выхода счётчика будет поступать число 200.</p><p>Но у этого элемента 8 входов, а выходов со счётчика 9. Решить эту проблему можно не подключая старший бит — он равняется 0 (схема не будет успевать досчитывать до того момента, когда этот бит станет 1).</p><p>11:27 Таким же образом нужно будет определить все остальные числа, просто подключая инверторы к нужным битам. Но остаётся число 264. У него в 9 разряде есть единица (в отличие от всех остальных). В этом случае вместо первого бита нужно будет подключить последний.</p><h3>Схема декодирования тактов</h3><p>12:25 Чтобы определить все числа, вам не нужно по 8 инверторов на каждое из них — достаточно инвертировать каждый бит по отдельности, и соответственно каждому числу параллельно подсоединить входы И-НЕ элементов (на инвертированные и неинвертированные биты соответственно).</p><p>12:50 Инвертировать сигналы будет микросхема <a href="https://www.microshemca.ru/7404-S6/">74LS04</a>, которая содержит 6 отдельных инверторов. Этих микросхем понадобится две. Нужно подключить все выходы счётчика к входам инверторов. Не стоит забывать и про питание микросхемы.</p><p>13:15 Теперь пришла очередь И-НЕ элементов. Для них будет использоваться микросхема <a href="https://www.microshemca.ru/7430/">74LS30</a>, у которой как раз 8 входов. Для начала число 264 — оно будет сбрасывать счётчик. Стоит помнить, что для этого числа первый бит не подключается. Дальше всё просто: где должен быть 0 — подключаете бит к входу логического элемента через инвертор, где 1 — напрямую.</p><p>14:50 Чтобы проверить схему, к выходу И-НЕ элемента можно подключить светодиод. У такого элемента отрицательный активный сигнал. Если подключить генератор и отправить 264 такта, то после последнего светодиод потухнет — это и будет сбросом счётчика. Теперь схема сможет автоматически обнулять счётчик при достижении числа 264.</p><p>15:43 То же самое теперь нужно сделать с оставшимися 3 И-НЕ элементами и числами 242, 210 и 200. В отличие от числа 264, у этих должен быть подключён первый бит, а отключён — последний.</p><p>17:40 Чтобы проверить работу 4 элементов, на вход счётчика нужно последовательно послать сначала 200 тактов, потом ещё 10, 32 и 22. С такой комбинацией светодиоды, подключённые ко выходам элементов, должны последовательно затухать на один такт.</p><p>Но после 264-го такта счётчик всё ещё не обнуляется — для этого нужно выход соответствующего логического элемента подсоединить к контакту сброса одного из счётчиков. Схема циклична.</p><h3>Разрешающие сигналы отрисовки и синхроимпульсов</h3><p>18:36 Теперь задача стоит в том, чтобы дать схеме понять, когда именно отображать пиксели (между 0-м и 200-м тактом), а когда давать синхроимпульс (между 210-м и 242-м тактом). Для этого будет использоваться RS-триггер с инверсными входами (потому что у выхода логического элемента активный низкий уровень).</p><p>19:15 На вход триггера SET нужно подавать сигнал после 264-го такта (за такт до отображения пикселей), а при достижении 200-го такта — сбрасывать триггер (подавать сигнал на вход RESET). В таком случае пиксели нужно отрисовывать только тогда, когда триггер будет установлен. Второй RS-триггер будет подавать синхроимпульс (между 210-м и 242-м тактом). Так как у синхроимпульса активный низкий уровень, то сигнал нужно снимать с инверсного выхода триггера.</p><p>19:47 Чтобы сделать два таких RS-триггера, потребуется 4 элемента 2И-НЕ — <a href="https://www.microshemca.ru/7400/">LS7400</a>. Подключаем питание и перекрёстно соединяем выходы И-НЕ с их входами (согласно схеме). Первый триггер нужно устанавливать при достижении 264-го такта, поэтому подключаем его к выходу соответствующего логического элемента (того самого, который сбрасывает счётчик). Аналогично подключаем сброс триггера к элементу, соответствующему числу 200.</p><p>20:33 Если подключить к выходу триггера светодиод, то можно увидеть, как он горит в промежутке от 0-го до 200-го такта и не горит в промежутке от 200-го до 264-го такта.</p><p>Таким же способом нужно сделать и второй триггер. Устанавливаться он будет от элемента 210-го такта, а сбрасываться — от 242-го. Если подключить светодиод к выходу второго триггера, то можно увидеть, как он загорается в некотором промежутке, пока не горит первый светодиод.</p><p>21:08 Теперь схема знает, в какие именно моменты нужно отображать пиксели, а в какие — давать горизонтальный синхроимпульс. Но задача стоит в том, чтобы попасть в тайминги, приведённые в таблице. Для начала нужно подключить кварцевый генератор к входу тактирования счётчика. Теперь отрисовывать одну строку схема будет всего 26,4 мкс. Чтобы замерить такой незначительный интервал, потребуется осциллограф.</p><p>22:20 Замер таймингов счётчика.</p><h2>Вертикальная синхронизация</h2><h3>Счётчик вертикальной синхронизации</h3><p>24:11 Если все временные интервалы совпадают, то горизонтальная синхронизация работает как нужно. Теперь соберём схему вертикальной синхронизации. Её работа почти идентична горизонтальной, за исключением того, что схема будет считать не пиксели, а линии. При каждом обнулении счётчика горизонтальной развёртки, счётчик вертикальной будет увеличиваться на единицу. Так же, как и в первом случае, схема должна различать интервалы между 0-й и 600-й строкой, чтобы отображать строки, и интервалы между 601-й и 605-й, чтобы давать вертикальный синхроимпульс. После 628-й строки счётчик должен обнулиться.</p><h3>Декодирование тактов</h3><p>25:03 Чтобы определить нужные такты, потребуются всё те же элементы 8И-НЕ. Но есть проблема: у элементов всего 8 входов, а чтобы передать числа нужных тактов, потребуется 10 бит. Но 8-й и 9-й биты можно не подключать. Ведь если 8-й бит будет единицей, то число будет уже 728, а схема не успеет досчитать до него — счётчик сбросится уже на 628-м такте. По этой же причине 9-й бит тоже может быть не подключён.</p><p>26:07 Из-за особенностей чисел тут потребуется всего 5 инверторов.</p><p>26:33 Создавать второй счётчик будем так же, как первый. Разница лишь в том, что у второго будут использоваться 10 бит вместо 9. Эти 10 бит нужно подать на соответствующие входы инверторов.</p><p>26:57 Как и в прошлом случае, те разряды, которые должны быть равны 1, нужно подключить напрямую к входам логического элемента, а те, которые должны быть равны 0 — через инвертор. Выход элемента, соответствующего числу 628, нужно соединить со сбросом счётчика.</p><h3>Разрешающие сигналы отрисовки и синхроимпульсов</h3><p>27:30 Для этой схемы тоже понадобится 2 RS-триггера. Первый будет разрешать отображение строк, второй — подавать вертикальный синхроимпульс. Вход SET первого триггера нужно подключить к сигналу сброса счётчика, а вход RESET к выходу 600-го такта. Вход SET второго триггера нужно подключить к выходу элемента 601-го такта, а RESET — к выходу 605-го.</p><p>28:06 Тактировать второй счётчик от генератора не нужно. Вход тактирования этого счётчика нужно подсоединить к контакту сброса первого счётчика. Теперь первый считает количество пикселей (горизонтальная синхронизация), а второй — количество строк (вертикальная синхронизация).</p><h2>Проверка схемы</h2><p>28:55 Проверка таймингов вертикальной и горизонтальной синхронизации.</p><p>Частота вертикальной синхронизации намного меньше, чем у горизонтальной. Это стоит учесть при настройке осциллографа.</p><p>30:50 Если все тайминги соответствуют таблице, то эту схему уже можно будет подключить к монитору через VGA интерфейс. Сейчас нужны будут только три контакта: горизонтальная синхронизация (13), вертикальная синхронизация (14) и общий. Все общие контакты разъёма нужно объединить в один. Если схема собрана правильно, то монитор автоматически настроится на разрешение 800×600.</p><p>Для желающих собрать: полную схему со списком элементов можно посмотреть на <a href="https://eater.net/vga">этом сайте</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Готовимся к Новому году: простая гирлянда на Arduino</title>
      <link>https://tproger.ru/video/diy-arduino-fairy-lights</link>
      <comments>https://tproger.ru/video/diy-arduino-fairy-lights?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Александр Ланский]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/video/diy-arduino-fairy-lights</guid>
      <description><![CDATA[<p>Светодиодная лента и Arduino помогут самостоятельно сделать простую и недорогую новогоднюю гирлянду и потренироваться в работе с Arduino.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/video/diy-arduino-fairy-lights">Готовимся к Новому году: простая гирлянда на Arduino</a>»</p>]]></description>
      <category><![CDATA[Для начинающих]]></category>
      <category><![CDATA[Hardware]]></category>
      <category><![CDATA[Arduino]]></category>
      <category><![CDATA[DIY]]></category>
      <category><![CDATA[Новый Год]]></category>
      <category><![CDATA[Видео]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sat, 30 Nov 2019 10:04:34 GMT</pubDate>
      <content:encoded><![CDATA[<p>К Новому Году везде начинают продавать гирлянды, но мы не ищем лёгких путей и предлагаем вам сделать гирлянду самостоятельно. Это просто, интересно и недорого, а заодно позволит вам потренироваться в работе с Arduino. Итак, начнём.</p><p>Примечание Для создания подобной гирлянды вам потребуются минимальные знания в Arduino. Однако если вы в себе не уверены — ничего страшного:</p><h2>Что понадобится</h2><ul><li>Arduino Uno;</li><li>адресная светодиодная лента на WS2811;</li><li>источник питания для ленты.</li></ul><h2>Светодиодная лента</h2><p>Светодиодная лента — это группа из светодиодов, размещённых на гибком и клейком основании. Лента может быть длиной от 30 см до 5 м.</p><p>Существует два типа лент: с синхронизированными светодиодами и адресными. Для гирлянды понадобится второй тип. В этой ленте к каждому светодиоду подключён специальный чип. Эти чипы соединены последовательно. Всего лишь по одному проводу, подключенному к первому чипу, можно управлять цветом отдельно каждого светодиода в ленте.</p><figure><img src="https://media.tproger.ru/user-uploads/23823/2024-01-05/c05017a2-cc52-49e8-84ee-82f5a41bd349.jpg" alt="" /><figcaption>Традиционная адресная светодиодная лента</figcaption></figure><p>У таких адресных светодиодных лент множество форм-факторов. Есть <a href="https://ru.aliexpress.com/item/32956009458.html?spm=a2g0o.productlist.0.0.497f1c8bAuu1pS&amp;s=p&amp;algo_pvid=d1d2ff77-b60f-42af-a262-7bb42df4f767&amp;algo_expid=d1d2ff77-b60f-42af-a262-7bb42df4f767-4&amp;btsid=d56eb5c9-340d-48b5-a7b8-9201644a17a3&amp;ws_ab_test=searchweb0_0,searchweb201602_6,searchweb201603_53">традиционные формы</a> лент или же <a href="https://ru.aliexpress.com/item/32656808174.html?spm=a2g0v.12010615.8148356.41.549c3fe8HBPSyr">матрицы</a>. Есть ленты с отдельными светодиодами, которые лучше всего подойдут на роль гирлянды. Вот некоторые их них:</p><ul><li><a href="https://ru.aliexpress.com/item/32444693593.html?spm=a2g0v.12010615.8148356.9.744d3fcdFQv0gh">раздельные адресные светодиоды</a>;</li><li><a href="https://ru.aliexpress.com/item/32729167249.html?spm=a2g0v.12010615.8148356.3.7f923932yzsYqP">светодиоды в виде бочонков</a>;</li><li>полусферические светодиоды (<a href="https://ru.aliexpress.com/item/32729371934.html?spm=a2g0v.12010615.8148356.67.31055fb1Ky9HvP">вариант 1</a>, <a href="https://ru.aliexpress.com/item/32729723401.html?spm=a2g0v.12010615.8148356.35.77c75444QwHCwE">вариант 2</a>);</li><li><a href="https://ru.aliexpress.com/item/32764921826.html?spm=a2g0v.12010615.8148356.71.77c75444QwHCwE">светодиоды в виде ёлочных шишек</a>;</li><li><a href="https://ru.aliexpress.com/item/32454404975.html?spm=a2g0v.12010615.8148356.3.514c2c246VcZYz">светодиоды в раздельных сферах</a>;</li><li><a href="https://ru.aliexpress.com/item/32947126792.html?spm=a2g0v.12010610.8148356.31.76053a1cZQfIUg">светодиоды наподобие гирлянды</a>.</li></ul><p>Для примера будет использоваться последний тип адресной ленты:</p><figure><img src="https://media.tproger.ru/user-uploads/23823/2024-01-05/ae153be6-edd1-4b41-859f-bd88fb207d05.jpg" alt="" /></figure><h2>Контроллер</h2><p>В гирлянде контроллером ленты будет Arduino Uno. Но для этих целей подойдёт всё, что под руку попадётся: различные платы Arduino, МК серии ESP, STM, AVR, PIC, микрокомпьютеры Raspberry Pi. Единственное, о чём ещё следует помнить, это о логическом уровне контроллера. Некоторые из них работают на 3-вольтовой логике, и нужно будет использовать конвертер уровней.</p><p>Тока, выдаваемого с Arduino Uno, не хватит на запитывание ленты. Поэтому нужно использовать внешний источник питания на 5В (обратите внимание, некоторые ленты могут запитываться от 12В). Потребляемый ток напрямую зависит от длины ленты, поэтому нужно внимательно подбирать источник питания в зависимости от ваших целей. Минусовые контакты источника питания и контроллера нужно объединить. Плюс от источника питания нужно подключить напрямую к плюсовому контакту ленты. Сигнальный же контакт ленты нужно подключить к любому порту Uno.</p><figure><img src="https://media.tproger.ru/user-uploads/23823/2024-01-05/aaf6425f-a268-4973-932c-8a53f3fc88f8.png" alt="" /><figcaption>Схема подключения ленты к контроллера и источнику питания</figcaption></figure><p>Для управления лентой понадобится специальная библиотека. В <a href="http://arduino.on.kg/Adafruit_NeoPixel">этой статье</a> детально описывается установка библиотеки Adafruit NeoPixel.</p><p>После скачивания <a href="https://github.com/adafruit/Adafruit_NeoPixel/archive/master.zip">zip-файла</a>, нужно установить его в Arduino IDE. Переходите в Скетч→Подключить библиотеку→Добавить .ZIP библиотеку и выберите нужный файл.</p><h2>Зажигаем!</h2><p>Вначале стоит проверить схему на работоспособность. Для этих целей подойдёт следующий код:</p><p>Если все компоненты исправны и схема собрана корректно, то вы увидите примерно такую картину:</p><figure><img src="https://media.tproger.ru/user-uploads/23823/2024-01-05/60dd6b6f-c918-4f2e-a46f-efe5ff5296b0.jpg" alt="" /></figure><p><a href="https://media.tproger.ru/uploads/2019/11/image001.jpg"></a><br />Если же немного изменить код, то можно заставить светодиоды загораться один за другим:</p><p>Такая гирлянда подойдёт как для наружного применения, так и для традиционного размещения на ёлке.</p>]]></content:encoded>
    </item>
    <item>
      <title>Умная техника своими руками: поэтапное создание смарт-часов на ESP8266</title>
      <link>https://tproger.ru/video/smartwatch-on-esp8266</link>
      <comments>https://tproger.ru/video/smartwatch-on-esp8266?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Александр Ланский]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/video/smartwatch-on-esp8266</guid>
      <description><![CDATA[<p>Первые умные часы Pulsar выпустила Hamilton Watch ещё в 1972 году, а собрать свои с выводом времени и даты помогает микроконтроллер ESP8266.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/video/smartwatch-on-esp8266">Умная техника своими руками: поэтапное создание смарт-часов на ESP8266</a>»</p>]]></description>
      <category><![CDATA[Hardware]]></category>
      <category><![CDATA[Arduino]]></category>
      <category><![CDATA[DIY]]></category>
      <category><![CDATA[Видео]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 14 Nov 2019 13:06:41 GMT</pubDate>
      <content:encoded><![CDATA[<p>Ещё в 1972 году компания Hamilton Watch разработала первые умные часы под маркой Pulsar. Изначально у таких часов было довольно мало вычислительной мощности. Её хватало только на калькуляторы, игровые устройства и тому подобные незамысловатые гаджеты. Но с развитием технологий мощность начала стремительно увеличиваться. Современные смарт-часы — это полноценные компьютеры. Некоторые могут работать автономно, а другие функционируют только в сопряжении со смартфоном.</p><p>В этой статье будет описан принцип создания собственных смарт-часов на базе популярного микроконтроллера ESP8266.</p><h2>Определение функциональности часов</h2><p>В этой статье мырассмотрим часы, которые смогут выводить текущее время и дату, отображать погоду в вашем городе и позволят удалённо управлять Wi-Fi реле. Это означает, что прямо с часов вы сможете управлять любым прибором, подключённым к розетке, будь то музыкальный центр или электрочайник.</p><p>Чтобы получать текущее время, необязательно использовать модуль реального времени. Если смарт-часы будут иметь доступ к интернету, то понадобится ближайший <a href="https://ru.wikipedia.org/wiki/NTP">NTP-сервер</a>. С его помощью можно достаточно точно узнать текущее время. Чтобы контролировать Wi-Fi реле в часах, будет использоваться Blynk.</p><p><a href="https://blynk.io/">Blynk</a> — это облачный сервис, позволяющий с помощью приложения для Android или iOS контролировать устройства на Arduino, Raspberry Pi или же, в данном случае, ESP8266.</p><h2>Подбор элементов</h2><p>В часах элементами управления будут 3 тактовые кнопки. Экран тут используется доступный — двухцветный OLED 0’96. Для питания нужен аккумулятор, а для зарядки — специальный контроллер. В этих часах используется литий-ионный аккумулятор и соответствующий для него контроллер TP4056.</p><p>Не стоит забывать, что ESP8266 работает на 3-вольтовой логике. Для получения необходимого напряжения питания можно использовать любой доступный стабилизатор напряжения на 3,3 В. Остаётся лишь немного деталей: разъём для зарядки, переключатель, несколько светодиодов, набор резисторов и пара конденсаторов.</p><figure><img src="https://media.tproger.ru/user-uploads/23823/2024-01-05/f22e6ec5-f111-4864-a9f4-129fd6171709.jpg" alt="" /><figcaption>Необходимые для сборки часов элементы</figcaption></figure><h2>Создание и распайка печатной платы</h2><p>Если хотите, чтобы итоговый вариант часов был надёжным и компактным, лучше всего распаять часы на печатной плате. Для создания рисунка печатной платы подойдут, к примеру, <a href="https://cxem.net/software/sprint_layout.php">Sprint Layout</a> или же <a href="https://easyeda.com/">EasyEDA</a>.</p><figure><img src="https://media.tproger.ru/user-uploads/23823/2024-01-05/be7a1027-2176-4e26-b7a7-6196211f10c3.jpg" alt="" /></figure><p>Вы можете создать печатную плату в домашних условиях либо заказать её у специализирующихся сервисов — те же EasyEDA или <a href="https://jlcpcb.com/">JLCPCB</a>. К этим смарт-часам в свободном доступе уже есть <a href="https://github.com/theTechnowright/DIY-Smartwatch-using-ESP8266/blob/master/ESP8266_SmartWatch.zip">Gerber PCB файлы печатной платы</a>.</p><p>После получения/создания платы стоит распаять на ней все компоненты. Монтаж SMD компонентов удобнее делать паяльной пастой и паяльным феном. Но такую работу можно будет выполнить и обычным паяльником с тонким жалом.</p><figure><img src="https://media.tproger.ru/user-uploads/23823/2024-01-05/6b2a047f-1477-4f69-b02b-2b0d4f91f7ee.jpg" alt="" /></figure><h2>Подготовка прошивки часов</h2><p>После того, как все компоненты будут распаяны, можно приступить к программной части. Вначале следует разобраться с API для получения погоды. К примеру, можно использовать Weather API Yahoo.</p><p>Примечание С января 2019 года процесс работы с Weather API Yahoo немного изменился. Однако API всё ещё в бесплатном доступе. О том, как получить доступ, детально расписано на их странице.</p><p>После получения ссылки с API можно приступить к прошивке микроконтроллера. Сам скетч для Arduino можно взять <a href="https://github.com/theTechnowright/DIY-Smartwatch-using-ESP8266/blob/master/ESP8266__SmartWatch.ino">здесь</a>.</p><p>В первую очередь подставьте ваш код аутентификации Blynk в char auth[]. Этот код будет выслан вам на почту сразу после создания нового приложения в Blynk.</p><p>Затем введите SSID и пароль от вашей точки доступа Wi-Fi в char* ssid и char* password соответственно.</p><p>Скопированную из Weather API ссылку необходимо вставить в const String url.</p><p>В BLYNK_CONNECTED() можно вставить код аутентификации Blynk другого ESP модуля, управляющего электрическим прибором (если такой имеется). Этот процесс можно увидеть в видео о <a href="https://www.youtube.com/watch?v=kPblG4l4gEs">создании Wi-Fi реле</a>. И под конец не забудьте в TimeChangeRule указать параметры вашего часового пояса (в методе tellTime()).</p><h2>Прошивка микроконтроллера</h2><p>Теперь в Arduino IDE нужно установить все необходимые библиотеки:</p><ol><li><a href="https://github.com/PaulStoffregen/Time">Time.h и TimeLib.h</a>.</li><li><a href="https://github.com/JChristensen/Timezone">Timezone.h</a>.</li><li><a href="https://github.com/ThingPulse/esp8266-oled-ssd1306">SSD1306.h и SSD1306Wire.h</a>.</li><li><a href="https://github.com/arduino-libraries/NTPClient">NTPClient.h</a>.</li><li><a href="https://github.com/ekstrand/ESP8266wifi">ESP8266WiFi.h и WifiUDP.h</a>.</li><li><a href="https://github.com/blynkkk/blynk-library/releases/latest">Последняя версия Blynk</a>.</li></ol><p>Чтобы прошить ESP8266, нужно подключить его к мосту USB-UART. Все необходимые контакты уже выведены на торец печатной платы. Обратите внимание, что RX контакт одного подключается к TX контакту другого и наоборот. Более подробно о прошивке микроконтроллеров серии ESP8266 можно почитать тут:</p><p>Потом в Arduino IDE нужно будет выбрать текущую плату и COM-порт. Зажав кнопку flash на микроконтроллере, начните прошивку. После удачной прошивки остаётся лишь присоединить аккумулятор и ремешок.</p><p>Включите часы. Должна высветиться надпись «Connected to Wi-Fi». Если это так, то микроконтроллер прошит, а значит, ваши смарт-часы готовы.</p><figure><img src="https://media.tproger.ru/user-uploads/23823/2024-01-05/da673d3e-11ac-4585-a457-e15845449dbb.jpg" alt="" /></figure><p>При нажатии на среднюю кнопку на часах будет отображаться текущая дата, время и температура. Две боковые кнопки управляют двумя подключёнными к Wi-Fi реле электрическими приборами.</p>]]></content:encoded>
    </item>
    <item>
      <title>Новая жизнь дискет: что такое флопотрон и как его сделать</title>
      <link>https://tproger.ru/articles/floppotron-what-is-it-and-how-to-make</link>
      <comments>https://tproger.ru/articles/floppotron-what-is-it-and-how-to-make?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Александр Ланский]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/floppotron-what-is-it-and-how-to-make</guid>
      <description><![CDATA[<p>Павел Задрожняк создал музыкальный инструмент Floppotron. Вторая версия включала 64 флоппи-дисковода, 8 жёстких дисков и 2 сканера.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/floppotron-what-is-it-and-how-to-make">Новая жизнь дискет: что такое флопотрон и как его сделать</a>»</p>]]></description>
      <category><![CDATA[Hardware]]></category>
      <category><![CDATA[DIY]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sun, 27 Oct 2019 11:32:08 GMT</pubDate>
      <content:encoded><![CDATA[<p>Многие ли помнят флоппи-диски? История похоронила гибкие носители ещё в 90-х. Единственное, что осталось от них — это дизайн иконки «Сохранить». Дискеты не могли идти в ногу с технологиями — объёмы программ и данных стремительно увеличивались. 2,88 МБ данных, которые помещались на стандартные 3,5-дюймовые дискеты, стало не хватать. Потребители перешли на оптические носители. Спустя десятилетия пользователи забыли о дискетах, а флоппи-дисководы стали чем-то вроде посуды в серванте. Но только не для польского инженера Павла Задрожняка. В далёком 2011 году он собрал устройство, состоящее из двух флоппи-приводов и назвал его соответствующе — «Floppotron». На нём он «сыграл» Имперский Марш. Ролик завирусился и Павел двинулся дальше.</p><p>В 2016 году инженер представил миру вторую версию своего музыкального инструмента. Его комплектация стала более внушительной: 64 флоппи-дисковода, 8 жёстких дисков и 2 сканера. На своём YouTube-канале Павел исполнил более сотни популярных песен.</p><p>Он вдохновил многих людей. Кто-то собирал несложные флопотроны из нескольких приводов, а кто-то пробовал извлекать звуки из более нестандартных для флопотрона устройств. Например, канал <a href="https://www.youtube.com/channel/UCDwMh0pu1iSXeKx7qmqjIQA/videos">Device Orchestra</a> создаёт мелодии с помощью платёжных терминалов, зубных электрощёток и даже паровых очистителей.</p><figure><img src="https://media.tproger.ru/user-uploads/23823/2024-01-05/bdd9fe56-885b-4739-934b-74fbecef8b17.jpg" alt="" /><figcaption>Floppotron v2 — детище польского инженера Павла Задрожняка</figcaption></figure><h2>Принцип звучания</h2><p>В флоппи-приводах, сканерах или же платёжных терминалах источник звука один — шаговый двигатель. В случае с флоппи-приводом он перемещает считывающую головку. При работе двигателя издаётся звук. Изменяя скорость шагового двигателя можно изменять частоту извлекаемого звука, т. е. ноты. Как правило, последовательность этих нот достаётся из midi-файла.</p><h2>Управление флоппи-приводом</h2><p>У привода два разъёма — один для питания («mini-molex») и второй для управления (FDD). Запитывается дисковод сразу от 5В и 12В. Отличным решением будет использовать компьютерный блок питания. При работе с ним не забудьте замкнуть контакт PS_ON с контактом COM, чтобы <a href="https://sdelaicomp.ru/remont-pk/kak-vklyuchit-blok-pitaniya-bez-kompyutera.html">включить его</a>. Однако, подойдёт любой другой БП с такими же напряжениями. Главное, чтобы хватало выходного ампеража.</p><p>Разъём «mini-molex» имеет два контакта земли посередине и контакты 12В и 5В по бокам. Контакт 12В расположен слева и нередко с его стороны имеется «ключ», не дающий присоединить штекер не той стороной.</p><p>Хоть разъем FDD имеет пугающее количество контактов, оттуда понадобится всего два — 18 и 20.</p><p>18 контакт называется «Stepper Direction», и по нему устанавливается направление движения пишущей головки. 20 контакт называется «Step Pulse» и он уже непосредственно «толкает» шаговый двигатель.</p><p>Помимо этого нужно разрешить работу двигателя. Для этого нужно замкнуть на землю 12 контакт разъёма «Drive Select B». Это можно сделать либо джампером (перемычкой) между этим контактом и нижним (11 — землёй), либо непосредственно присоединить 12 контакт к проводу земли. Варвары же могут попросту загнуть этот контакт вниз, чтобы тот соприкасался с нижним контактом.</p><figure><img src="https://media.tproger.ru/user-uploads/23823/2024-01-05/f81adcb9-e58c-47ab-a1f4-776a057a7fd0.jpg" alt="" /><figcaption>Схема подключения к флоппи-приводу</figcaption></figure><h2>Контроллер</h2><p>Управлять флопотроном можно со всего, что только можно запрограммировать: Arduino, Raspberry, STM. Подойдут даже обычные микроконтроллеры AVR или PIC. Главное, чтобы контроллер работал на 5-вольтовой логике, иначе нужно будет использовать конвертер логических уровней. В этой статье будет использоваться самая популярная модель платформы Arduino — Uno.</p><h2>Коммутация</h2><p>Для простого флопотрона кроме самих флоппи-дисководов и контроллера понадобятся только соединительные провода. Всего к приводу должно идти 5 проводов: 2 управляющих, 12В, 5В и земля.</p><figure><img src="https://media.tproger.ru/user-uploads/23823/2024-01-05/e3558d98-a1e7-487a-9642-b31f5feec720.jpg" alt="" /><figcaption>Подключение проводов к флоппи-приводу</figcaption></figure><p>Обратный конец управляющий проводов будет подключаться к Uno. Остальные же провода (т. е. шины питания) нужно будет подключить к блоку питания. Если дисководов не слишком много, отличным решением будет подключить их через клеммный зажим. Провода от дисководов будут вкручиваться с одной стороны, провода от блока питания — с другой. В таком случае всегда можно будет без труда запитать новые дисководы, ничего при этом не распаивая.</p><figure><img src="https://media.tproger.ru/user-uploads/23823/2024-01-05/8827c111-874f-43ff-bbf6-cfdc661ab5b0.jpg" alt="" /><figcaption>Один из способов подключения питания флоппи-приводов</figcaption></figure><p>Дополнительными проводами нужно отвести шину питания 5В и землю и подключить их к пинам платы Uno.</p><figure><img src="https://media.tproger.ru/user-uploads/23823/2024-01-05/82cb086b-ea49-48be-82c7-1e1e486fa227.jpg" alt="" /><figcaption>Коммутация проводов с платой Uno</figcaption></figure><h2>Программная часть</h2><p>Если вы решили использовать Arduino, то в первую очередь нужно установить Arduino IDE. Также стоит помнить, что для работы с клонами Arduino нужно установить соответствующий драйвер CH340G. Обо всём этом можно почитать <a href="https://tproger.ru/curriculum/arduino-quick-start/">в нашей статье</a>.</p><p>Вначале стоит проверить флоппи-приводы на работоспособность. Для этого можно запрограммировать контроллер на какие-нибудь простые операции. Например такие:</p><p>Этот скетч должен заставить флоппи-привод, подключённый к первому каналу (2 и 3 пин), двигать считывающую головку равномерно по всей рабочей длине. Как только головка подходит к концу, направление движения инвертируется и цикл повторяется.</p><p>После того, как вы проверите все приводы, можно приступить к созданию программной части для флопотрона или просто использовать уже готовое решение.</p><p>Moppy — продвинутый контроллер для флопотрона. Он состоит из двух частей: прошивки для Arduino, которая непосредственно управляет флоппи-приводами, и компьютерной программы, которая посылает команды на контроллер по USB-кабелю.</p><p>Скачиваем последний релиз программы. Первый архив содержит скетч для Arduino, второй — программу для ПК.</p><p>Примечание Для работы прошивки нужна библиотека «TimerOne». Её можно найти в Менеджере Библиотек. Для этого откройте Скетч→Подключить Библиотеку→Управлять Библиотеками. Через поисковую строку открывшегося Менеджера Библиотек можно найти необходимую библиотеку «TimerOne».</p><p>После установки библиотеки прошивка готова к работе. Осталось выбрать порт, к которому подключена Uno, и прошить её.</p><p>Первый привод подключается к 2 и 3 пину платы («Stepper Direction» и «Step Pulse» соответственно). Следующий привод к 4 и 5, потом к 6 и 7 и так далее. К Uno можно подключить до 9 приводов (до пина A5). После подключения всех флоппи-приводов можно включать блок питания.</p><h2>Воспроизведение</h2><p>В папке с программой для ПК нужно запустить файл bin/MoppyControlGUI.bat. В открывшемся интерфейсе важны только два окна: окно выбора файла и окно выбора порта.</p><p>Остаётся лишь выбрать порт, к которому подключена Uno, загрузить midi-файл и нажать на кнопку воспроизведения. Однако, это не весь функционал Moppy. В этой программе, к примеру, можно воспроизводить звук напрямую от midi-устройств.</p><p>Хоть флоппи-приводы и способны извлекать из себя звук, их громкости хватает не всегда. Эту проблему можно решить двумя способами. Первый — дублирование одного midi-канала несколькими приводами. В таком случае флопотрон обретёт тембр для каждого канала. Второй же способ более экономичен — каждый привод можно поставить на какой-нибудь резонатор. Подойдёт обычная картонная коробка. В таком случае громкость даже от одного привода значительно увеличится.</p><h2>Откуда брать midi-файлы?</h2><p>Есть несколько источников:</p><ul><li>Найти готовый midi-файл нужной песни. Однако, шанс того, что файл сразу подойдёт для флопотрона, очень мал. Скорее всего, его нужно будет редактировать.</li><li>Специальные программы для midi-файлов. Например MidiEditor. В ней вы сможете как создать новый файл, так и отредактировать существующий (поменять местами или объединить дорожки).</li><li>Нотный редактор. Например Guitar Pro. Для него есть множество готовых композиций, которые с лёгкостью можно экспортировать в midi-файл. Обратите внимание, что каждый канал в midi-файле соответствует отдельному подключённому флоппи-приводу. Обычно к одной нотной дорожке в Guitar Pro подвязываются сразу два канала. Привязку каналов к дорожкам, естественно, можно редактировать.</li><li>Использовать готовые midi-файлы, созданные специально для флопотрона. Например в <a href="https://github.com/coon42/Floppy-Music--midis-">этом репозитории</a>, или в документах <a href="https://vk.com/floppy_fun">этой группы</a>.</li></ul>]]></content:encoded>
    </item>
    <item>
      <title>Американский физик собрал Lamborghini из деталей, напечатанных на 3D-принтере</title>
      <link>https://tproger.ru/news/3d-printed-lamborghini</link>
      <comments>https://tproger.ru/news/3d-printed-lamborghini?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Екатерина Никитина]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/3d-printed-lamborghini</guid>
      <description><![CDATA[<p>Американский физик собрал полностью функциональный Lamborghini из напечатанных на 3D-принтере деталей, поставил двигатель LS1 V8 и вложил примерно $20 000.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/3d-printed-lamborghini">Американский физик собрал Lamborghini из деталей, напечатанных на 3D-принтере</a>»</p>]]></description>
      <category><![CDATA[3D-принтер]]></category>
      <category><![CDATA[Hardware]]></category>
      <category><![CDATA[DIY]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sun, 13 Oct 2019 08:55:06 GMT</pubDate>
      <content:encoded><![CDATA[<p>Американский физик собрал Lamborghini из запчастей, напечатанных на 3D-принтере. Автомобиль полностью функциональный, он работает на двигателе LS1 V8 от Chevrolet Corvette.</p><p>Учёный вложил в проект примерно 20 тысяч долларов. А всё началось с того, что его 11-летний сын «покатался» на Lamborghini Aventador в игре Forza на Xbox и спросил, можно ли построить такой же.</p>]]></content:encoded>
    </item>
    <item>
      <title>Современные гаджеты, которые можно сделать своими руками</title>
      <link>https://tproger.ru/digest/modern-gadgets-diy</link>
      <comments>https://tproger.ru/digest/modern-gadgets-diy?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Александр Ланский]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/digest/modern-gadgets-diy</guid>
      <description><![CDATA[<p>Умное зеркало и другие современные устройства реально собрать в домашней мастерской: подборка гаджетов, доступных для самостоятельной сборки.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/digest/modern-gadgets-diy">Современные гаджеты, которые можно сделать своими руками</a>»</p>]]></description>
      <category><![CDATA[Hardware]]></category>
      <category><![CDATA[Arduino]]></category>
      <category><![CDATA[Raspberry Pi]]></category>
      <category><![CDATA[DIY]]></category>
      <category><![CDATA[3D-принтер]]></category>
      <category><![CDATA[Подборки]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 19 Aug 2019 13:17:24 GMT</pubDate>
      <content:encoded><![CDATA[<p>Технологии всегда были лицом прогресса. С каждым годом появляется всё больше новых технических возможностей, о которых лет десять назад никто даже не мог подумать. В сегодняшней подборке — современные устройства и гаджеты, собрать которые можно в условиях домашней мастерской, даже не будучи Илоном Маском.</p><h2>Умное зеркало</h2><p>Современная тенденция делать всё «умным» не обошла и такой привычный элемент быта, как зеркало. Такой гаджет нередко встречается в фильмах о будущем или каких-нибудь футуристических иллюстрациях. Однако такое зеркало довольно легко изготовить, и по себестоимости оно сравнимо с ценой бюджетного смартфона. В интернете достаточно различных инструкций по изготовлению этого гаджета, но все они сводятся к одной и той же конструкции.</p><p>Вам понадобится рамка со стеклом. На лицевую сторону стекла нужно наклеить зеркальную плёнку — от её качества зависит, насколько отражаемое изображение будет чистым. К обратной же стороне стекла крепится источник изображения — от экрана маленького смартфона до 40-дюймового телевизора. Совсем не обязательно, чтобы экран занимал всю площадь зеркала — маленький экран удобно расположить где-нибудь в углу. Важный момент по выбору экрана. Использовать стоит OLED-, а не LED-экраны, ведь у второго есть подсветка, которая будет видна даже в тех местах, где нет изображения.</p><p>Следующий пункт — электронная начинка. Самым популярным решением является одноплатный компактный компьютер Raspberry Pi. С ним просто работать и он с лёгкостью помещается в рамку зеркала. Достаточно установить любую ОС и соответствующее ПО. Но такое решение не единственное — можно подключить экран зеркала к вашему ПК или даже использовать начинку какого-нибудь планшета.</p><p>Неплохо было бы встроить в боковые стенки колонки, подключить микрофон и установить какого-нибудь ассистента. Вам это ничего не напоминает? <a href="https://media.tproger.ru/uploads/2019/08/chx-greene-s530-82.jpg"></a></p><h2>3D-принтер</h2><p>3D-принтер — очень полезный, выгодный и технологичных инструмент. В руках умельца он превращается в мини-фабрику по производству всего, что душа пожелает. Однако есть в нём кое-что отпугивающее — цена. Не все хотят отдавать за такую вещь десятки тысяч рублей.</p><p>Большинство FDM-принтеров (принтеров с технологией послойного наплавления) разных ценовых категорий имеют схожую конструкцию, разница лишь в качестве. Такую конструкцию можно сделать и самому, при этом не опорожнив свой кошелёк.</p><figure><img src="https://media.tproger.ru/uploads/2019/08/Buiild-a-1.jpg" alt="" /></figure><p>Вот <a href="https://www.youtube.com/watch?v=Yzv7WhZaNEI">ещё один принтер</a>, сделанный в основном из содержимого DVD-приводов.</p><h2>Умные очки</h2><p>Да-да, и они тоже. Речь пойдёт не об очках виртуальной или дополненной реальности, а именно об умных очках. Тех, что можно увидеть на каждой второй фотографии Сергея Брина. Первая модель Google Glass стоила 1500$. Однако можно сделать умные очки с базовой функциональностью тех же Google Glass, но по гораздо меньшей цене.</p><p>У всех очков такого типа идентичная конструкция: миниатюрный экран, который направлен на отражающее под углом зеркало. Это зеркало проецирует изображение на прозрачную плоскость, которая тоже находится под углом. С помощью такого оптического приёма изображение видно чётко, но в тоже время экран не мешает обзору.</p><p>Варианты электронной начинки разные — многие ставят Arduino Nano, Bluetooth-модуль и 0.96<b>″</b> дисплей. У такого экрана разрешение скудное — 96×64 точек, что достаточно для каких-то простых целей, но текст на нём уже не прочитать (только если в одну-две строки). Неплохим решением является установка микроконтроллера ESP32 (прокачанная версия популярного WiFi-модуля ESP8266). Там и модули WiFi и Bluetooth уже встроены, вычислительной мощности больше, чем у Nano, да и сам он просто технологичней. Тут по той же причине, что в умном зеркале, стоит ставить именно OLED-дисплей.</p><p>Также в очки можно будет поставить элемент управления — сенсорную панель на дужке, которая будет распознавать жесты влево-вправо. Можно даже разместить спереди камеру и делать снимки/видео на подключаемую карту памяти или же сохранять их напрямую на подключенный телефон.</p><p>Неплохим решением будет перенести на такие очки пару простых игрушек, например Ping Pong, Tetris, Space Invaders или даже и что-то поновее вроде Flappy Bird. Если встроить в очки акселерометр и подвязать его под управление в играх, то можно будет совмещать процесс игры с полезной разминкой шеи.</p><p>При грамотно разработанной схеме и хорошо написанном ПО для смартфона (с синхронизацией с поисковыми системами и внедрённым ассистентом) получится довольно неплохой бюджетный аналог современных умных очков.</p><h2>Роботизированная рука</h2><p>Несмотря на специфичность такого устройства, оно может найти применение в разных сферах. Роботизированную руку можно запрограммировать на полив цветов или кормление рыб в аквариуме. Можно модернизировать руку под 3D-ручку и у вас получится специфичный 3D-принтер. В зависимости от надёжности конструкции можно даже превратить руку в ЧПУ.</p><p>В промышленной сфере роботизированные руки можно заметить почти на всех производственных предприятиях. Это неспроста— современные роботизированные руки могут достигать больших скоростей, сохраняя при этом точность. Для домашнего пользования роботизированную руку, как и всё в этом списке, можно с лёгкостью смастерить и самому. На просторах интернета достаточно исчерпывающих инструкций по созданию таких рук на разное количество осей. Вот, к примеру, <a href="https://howtomechatronics.com/tutorials/arduino/diy-arduino-robot-arm-with-smartphone-control/">одна из них</a>.</p><figure><img src="https://media.tproger.ru/uploads/2019/08/robo-arm.jpg" alt="" /></figure><p>Эта рука имеет 5 осей. Управляется она платой Arduino Uno. Контролировать руку можно через мобильное приложение, с которым устройство связывается с помощью Bluetooth-модуля. Все детали руки печатаются на 3D-принтере. Кроме электроники и напечатанных деталей понадобится лишь набор сервоприводов и болты.</p><p>В приложении на смартфоне можно не только управлять рукой, но и создавать некие «программы» (последовательность движений руки), которые она может выполнять самостоятельно. Само приложение создаётся в <a href="http://appinventor.mit.edu/">Mit App Invertor</a> — визуальном <a href="https://scratch.mit.edu/">Scratch</a>-подобном конструкторе Android-приложений.</p><p>Если вам интересны подобные механизмы, можно заглянуть на сайт <a href="http://www.eezyrobots.it/">EEZYrobots</a>. Дизайнер и конструктор Carlo Franciscone разработал уже почти десяток роботов разного назначения: дельта-роботы, роботизированные руки, роботы-художники.</p><h2>Умные часы</h2><p>Умные часы, в отличие от других пунктов этого списка, уже много лет являются обыденным аксессуаром многих людей. Но несмотря на это, многие DIY-щики продолжают создавать собственные конструкции умных часов.</p><p>Некоторые делают простенькие часы на Arduino Nano или ESP8266 и ставят 0.96<b>″</b> дисплей. Вот <a href="https://www.instructables.com/id/DIY-Smartwatch-Using-ESP8266/">один из примеров</a>.</p><figure><img src="https://media.tproger.ru/uploads/2019/08/FBOIR0NJNULE68P.LARGE_.jpg" alt="" /></figure><p>Даже такие часы справляются с базовыми задачами подобных гаджетов. Однако их можно подвязать, скажем, к умному дому и в разы облегчить себе жизнь.</p><p>Список комплектующих не слишком велик: микроконтроллер ESP8266, дисплей, аккумулятор и пара радиокомпонентов. Всё это впаивается на двухстороннюю печатную плату. На неё же цепляется ремешок самих часов. Но некоторые делают часы технологичней, как <a href="https://habr.com/ru/post/404737/">эти</a>, например.</p><figure><img src="https://media.tproger.ru/uploads/2019/08/4e11649380fb457b9ebce97f267e32ac.jpg" alt="" /></figure><p>Комплектация и параметры таких часов уже напоминают промышленные аналоги. Тут устанавливается чип nRF52832, который намного мощней микроконтроллеров Arduino и по некоторым параметрам схож с чипом ESP8266EX. У nRF есть встроенный Bluetooth-модуль и поддержка NFC. Дисплей тут тоже немного лучше — 128×128 точек и 8 цветов.</p><p>На плате есть акселерометр и гироскоп. С их помощью можно легко создавать приложения по типу шагомеров. Флэш-память тут внешняя, на 32 МБ. Аккумулятор ёмкостью 110 мАч. Напряжение на аккумуляторе тоже контролируется, для этого тут есть специальный контроллер Linear LTC2941.</p><p>В часы прошивается «операционная система» <a href="https://www.nordicsemi.com/eng/Products/Bluetooth-low-energy/nRF5-SDK">nRF5-SDK</a>, сюда же встраивается JS-движок <a href="https://github.com/jerryscript-project/jerryscript">JerryScript</a>. С его помощью можно писать свои приложения, циферблаты для часов и различные утилиты.</p><h2>Светодиодные панели</h2><p>Наверняка многие замечали подобные панели у стримеров или у кого-нибудь в офисе. Такое освещение запросто может превратить любое помещение в клуб. Только вот их стоимость достигает 2000 рублей за панель, что часто отбивает желание у желающих обзавестись ими.</p><p>Разработчик с ником <a href="https://www.patreon.com/nerdforge">Nerdforge</a> решил сделать панели самостоятельно — и это того стоило. Делать их он решил в форме шестиугольников. Корпус панели можно распечатать на 3D-принтере или же вырезать из акриловых листов. Переднюю панель так же можно либо вырезать из акрила, либо напечатать. В случае печати можно даже поэкспериментировать в рельефным рисунком.</p><p>В качестве источника света тут используется адресная светодиодная лента. Отличие такой ленты от обычной RGB-ленты в том, что в адресной по одному цифровому каналу можно управлять цветом и яркостью отдельно каждого светодиода.</p><p>Управлять такими панелями можно двумя способами: использовать специальный контроллер адресной ленты, который управляется ИК-/РЧ-пультом (или же даже просто кнопками на самом контроллере), или управлять с приложения на смартфоне.</p><p>Автор выбрал именно второй вариант. Для него, правда, понадобятся ещё некоторые компоненты, в частности контроллер и WiFi-/Bluetooth-модуль. Nerdforge использовал ESP32, хотя можно было воспользоваться даже самой простой ESP-01. Не стоит забывать, что в таком случае контроллер будет выдавать сигналы на 3-вольтовой логике, а адресная лента в свою очередь работает с 5-вольтовой логикой. Автор использовал конвертер уровней.</p><p>Приложение, управляющее панелями, создано на платформе <a href="https://blynk.io/">blynk.io</a> — среде разработки графических Android-приложений для контроллеров Arduino, ESP, Raspberry Pi и других.</p><h2>Робот, играющий в шахматы</h2><p>Шахматы — довольно древняя игра. Её история насчитывает около полутора тысяч лет. Однако шахматные соревнования датируются лишь серединой XIX века. С внедрением компьютеров в массы люди начали пытаться создавать программы, играющие в шахматы. И если ещё в 70-х компьютеры были очень слабы в этой дисциплине, то уже в 1997 году компьютер <a href="https://ru.wikipedia.org/wiki/Deep_Blue">Deep Blue</a> от IBM выиграл матч из 6 партий у чемпиона мира по шахматам Гарри Каспарова.</p><p>Но играть на компьютере — это одно дело, а вести партию настоящими, «живыми» шахматами — дело совсем другое. По этой причине инженеры начали придумывать роботов, которые бы играли с ними в реальной жизни. Вот один из них под названием <a href="https://habr.com/ru/post/392065/">Chess Bot</a>.</p><figure><img src="https://media.tproger.ru/uploads/2019/08/chess-bot.jpg" alt="" /></figure><p>Такой робот представляет из себя коробку, сверху которой игровое поле и манипулятор, передвигающий шахматы. В роли зрения у робота — смартфон со специальным приложением. Это приложение берёт на себя сразу несколько дел. Во-первых, оно работает со специальным <a href="https://chessengines.blogspot.com/2013/04/magnum-40-uci-chess-engine-new-version.html">шахматным движком</a>. Именно он решает, какой следующий ход делать. Во-вторых, приложение использует компьютерное зрение для распознавания положения фигур на доске. В-третьих, приложение управляет самим манипулятором, который передвигает шахматы, хотя эту часть работы можно было перенести в контроллер. Он тут, к слову, традиционный — Arduino. Сервоприводы тут тоже самые стандартные — SG-90. Такие часто применяются в робототехнике, где не нужна высокая точность и сила.</p><p>Сложно, наверное, сделать робота, который просто так бы распознавал и различал фигуры на доске. Но здесь этого и не нужно. Робот знает начальное положение шахмат, а потом визуально отслеживает перемещение каждой из фигур. Если в какой-то момент чёрная точка пропала с одного места и появилась на другом, значит, соперник сделал ход.</p><p>Приложение также может озвучивать некоторые ситуации вроде «Я поставил вам шах!» и «Спасибо за игру!» (или давать ехидные комментарии, тут уж на ваш вкус).</p><p>Однако, есть и менее традиционные роботы. Как вам такой?</p>]]></content:encoded>
    </item>
    <item>
      <title>Kano выпустила модульный компьютер для обучения программированию</title>
      <link>https://tproger.ru/news/kano-module-touchscreen-computer</link>
      <comments>https://tproger.ru/news/kano-module-touchscreen-computer?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Никита Нельсон]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/kano-module-touchscreen-computer</guid>
      <description><![CDATA[<p>Владелец сможет самостоятельно собрать компьютер из отдельных деталей. Kano позволит наглядно понять структуру ЭВМ и попрактиковаться в программировании.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/kano-module-touchscreen-computer">Kano выпустила модульный компьютер для обучения программированию</a>»</p>]]></description>
      <category><![CDATA[Обучение программированию]]></category>
      <category><![CDATA[DIY]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sat, 15 Sep 2018 18:16:17 GMT</pubDate>
      <content:encoded><![CDATA[<p>Лондонская компания Kano представила Computer Kit Touch — компьютер с сенсорным экраном, который владелец должен собрать своими руками. По мнению разработчиков, это покажет новичку принцип работы ЭВМ, поможет изучить её детали и компоненты, а после научиться работать с кодом. Стоимость продукта колеблется в районе 280 $.</p><h3>Комплектация и использование Kano Computer Kit Touch</h3><p>В комплектацию модели входят:</p><ul><li>основной модуль Raspberry Pi 3;</li><li>сенсорный HD-монитор диагональю 10,1 дюйма;</li><li>блок питания;</li><li>клавиатура с сенсорной панелью;</li><li>SD-карта;</li><li>динамик;</li><li>аккумулятор;</li><li>чехол;</li><li>соединяющие провода для сборки.</li></ul><p>Следуя <a href="https://static.kano.me/assets/images/product-page/computer-kit-touch/download-block/ckt-book-en.pdf?_ga=2.234816858.594824557.1537026712-1367985716.1537026712">руководству</a> по сборке, пользователь соединяет составные части будущего компьютера самостоятельно, при этом клавиатура и экран уже собраны. Далее следует процесс настройки. Компьютер работает на операционной системе Kano OS и предлагает большое количество приложений для обучения программированию.</p><p>Ключевой разработкой Kano является сенсорный экран. Проектирование приложений и ПО должно учитывать интерфейс, через который пользователь взаимодействует с системой. Демонстрируя работу современных вычислительных машин, Kano Computer Kit Touch предоставляет пользователю около 150 часов занятий, которые включают изучение языков Python, JavaScript и Unix, а также позволяют экспериментировать с готовыми кодами игр Minecraft, Pong или Snake.</p><p>Пока компьютеры учат людей разбираться в коде, человечество тоже старается передать ИИ свои некоторые навыки. К примеру, Мэттью Газдаял (Matthew Guzdial) и Марк Ридл (Mark Riedl) из технологического института Джорджии <a href="https://tproger.ru/news/ai-making-videogames/">обучили</a> нейросеть создавать видеоигры на основе метода мимикрии. Данный способ заключается в подражании искусственного интеллекта человеку.</p>]]></content:encoded>
    </item>
    <item>
      <title>Google обновила Vision Kit и Voice Kit из серии AIY Projects: новая «начинка», упрощенная настройка</title>
      <link>https://tproger.ru/news/google-updated-aiy-projects</link>
      <comments>https://tproger.ru/news/google-updated-aiy-projects?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Тимур Кондратьев]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/google-updated-aiy-projects</guid>
      <description><![CDATA[<p>Обновлённые наборы Google Vision Kit и Voice Kit получили Raspberry Pi Zero WH, предустановленное ПО и упрощённую сборку; Vision Kit оснащён новой камерой.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/google-updated-aiy-projects">Google обновила Vision Kit и Voice Kit из серии AIY Projects: новая «начинка», упрощенная настройка</a>»</p>]]></description>
      <category><![CDATA[Машинное обучение]]></category>
      <category><![CDATA[Google]]></category>
      <category><![CDATA[Распознавание]]></category>
      <category><![CDATA[DIY]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 16 Apr 2018 21:15:56 GMT</pubDate>
      <content:encoded><![CDATA[<p>DIY-наборы аппаратного обеспечения для работы с технологиями машинного обучения AIY Projects от Google получили «железное» обновление. Об этом компания <a href="https://developers.googleblog.com/2018/04/aiy-projects-updated-kits-for-2018.html">написала</a> в своем блоге.</p><p>Сервис AIY Projects, <a href="https://tproger.ru/news/raspberry-pi-voice-kit-google-aiy/">запущенный</a> весной 2017 года, ставит своей целью сделать технологии искусственного интеллекта доступными для сторонних разработчиков. Как рассказали представители Google в блоге, особенную популярность наборы для самостоятельной сборки умных устройств снискали у студентов, обучающихся по системе STEM — основное внимание в ней уделяется прикладному применению технических наук.</p><h3>Подробнее об обновлениях AIY-наборов</h3><h4>Обновление Vision Kit</h4><p>Новые комплекты <a href="https://tproger.ru/news/google-vision-kit/">Vision Kit</a> — камеры с компьютерным зрением на основе нейронной сети TensorFlow, которая учится распознавать людей и объекты, — получили обновленный одноплатный компьютер Raspberry Pi Zero WH, упрощенную инструкцию по сборке, SD-карту с загруженным ПО, а также новую камеру Raspberry Pi Camera v2.</p><h4>Что нового в Voice Kit</h4><p>Обновленная умная колонка <a href="https://tproger.ru/news/raspberry-pi-voice-kit-google-aiy/">Voice Kit</a>, управляемая голосом, теперь тоже базируется на новом Raspberry Pi Zero WH. Также комплект поставки включает в себя USB-кабель и предустановленное ПО для того, чтобы разработчик сразу же мог приступить к сборке и настройке устройства.</p><figure><img src="https://media.tproger.ru/uploads/2018/04/voice-kit-package.jpg" alt="" /></figure><h3>Новое приложение-компаньон для Android</h3><p>Кроме обновлений DIY-наборов компания представила приложение Google AIY Projects, призванное облегчить настройку устройства «по воздуху». Пока <a href="https://play.google.com/store/apps/details?id=com.google.android.apps.aiy">доступна</a> только версия для Android, но разработчики обещают вскоре добавить поддержку iOS и Chrome OS.</p><p>Компания также <a href="https://aiyprojects.withgoogle.com/">обновила</a> сайт и документацию, а также показала площадку AIY-моделей — набор заранее обученных нейросетей, работающих с любыми AIY-наборами.</p><p>Voice Kit и Vision Kit появятся в американских магазинах до конца апреля 2018 года, однако компания работает над доставкой комплектов по всему миру.</p><p>Тенденции развития технологий говорят о перспективе Интернета вещей (IoT). Поэтому крупные компании стремятся закрепить позиции в этой растущей сфере: так, например, Google представила собственную систему централизованного управления IoT-устройствами — <a href="https://tproger.ru/news/cloud-iot-core-stable-release/">IoT Core</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Британец собрал 8-битный процессор из подручных средств</title>
      <link>https://tproger.ru/news/konstantino-processor</link>
      <comments>https://tproger.ru/news/konstantino-processor?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Ирина Трофимова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/konstantino-processor</guid>
      <description><![CDATA[<p>Энтузиаст самостоятельно собрал 8-битный процессор. Сейчас он может воспроизвести тему из Mario.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/konstantino-processor">Британец собрал 8-битный процессор из подручных средств</a>»</p>]]></description>
      <category><![CDATA[Hardware]]></category>
      <category><![CDATA[Процессор]]></category>
      <category><![CDATA[DIY]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 12 Feb 2018 15:56:32 GMT</pubDate>
      <content:encoded><![CDATA[<p>На сегодняшний день самыми востребованными компьютерами являются модели с 64-разрядной архитектурой. Однако не устарели и другие устройства. Энтузиасты создали компьютеры с 8-битной архитектурой. Такие устройства похожи на созданный в 1970-х годах процессор Intel 8008.</p><p>8-битные процессоры сильно уступают современным по производительности, но посильные им задачи выполняются отлично. Пользователь YouTube Пауло Константино собрал вполне работающий процессор, который, однако, выглядит, как скопление проводов. Основой послужила монтажная плата, которая предоставляет возможности создавать как простые, так и довольно сложные схемы.</p><p>Константино потратил 2 дня на разработку схемы на бумаге и чуть более семи дней на сборку. Чтобы процессор работал как настоящий, создатель использовал различные переключатели при монтаже.</p><p>Отсутствие клавиатуры не дает процессору возможности полностью показать себя — сейчас он может только воспроизвести тему из Mario. В планах разработчика подключить периферийное устройство, чтобы облегчить процесс программирования.</p><h3>Чтобы понять, как работает процессор, надо его собрать</h3><p>Другой подобный, но более масштабный проект — 16-битный компьютер Megaprocessor, <a href="http://www.megaprocessor.com/">созданный</a> Джеймсом Ньюманом, инженером из Великобритании. Компьютер оснащен четырьмя регистрами общего назначения. В процессоре используется 16-разрядный блок АЛУ и 16-разрядный сумматор, объем памяти — 256 байт. Арифметический блок, устройства ввода/вывода и другие подобные схемыразмещаются на отдельных внешних панелях. Megaprocessor имеет в своем распоряжении 10 000 светодиодов, которые наглядно показывают этапы вычислений.</p><p>Вся система состоит из 40 000 транзисторов, из которых более 27 000 отводится на память. Вес устройства, работающего на частоте 20 килогерц — около 500 килограммов.</p><p>Джеймс Ньюман принял решение о создании Megaprocessor, чтобы в полной мере понять, как работает процессор, и наглядно, с помощью светодиодов, отобразить потоки данных.</p><p>Чтобы показать принцип работы устройства, создатель использовал игру «Тетрис». Все вычислительные процессы можно наглядно увидеть с помощью индикаторов в режиме реального времени.</p><p>Проект получился недешевым — Ньюман потратил более 40 000 фунтов стерлингов. Энтузиаст до сих пор продолжает работу над Megaprocessor. Изначально создатель хотел закончить проект за год, но прошло более 5 лет, и Ньюман продолжает улучшать и развивать его.</p>]]></content:encoded>
    </item>
    <item>
      <title>Подросток из Франции разработал VR-гарнитуру, потратив 100 долларов</title>
      <link>https://tproger.ru/news/hand-made-vr-headset-for-100-dollars</link>
      <comments>https://tproger.ru/news/hand-made-vr-headset-for-100-dollars?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Екатерина Никитина]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/hand-made-vr-headset-for-100-dollars</guid>
      <description><![CDATA[<p>Вместе с товарищами из кружка робототехники он закупил недорогие комплектующие, сам написал программное обеспечение и выложил алгоритм разработки VR-гарнитуры в открытый доступ.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/hand-made-vr-headset-for-100-dollars">Подросток из Франции разработал VR-гарнитуру, потратив 100 долларов</a>»</p>]]></description>
      <category><![CDATA[Виртуальная реальность]]></category>
      <category><![CDATA[Hardware]]></category>
      <category><![CDATA[DIY]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sun, 21 Jan 2018 14:10:54 GMT</pubDate>
      <content:encoded><![CDATA[<p>Шестнадцатилетний подросток из небольшой французской деревеньки вместе с товарищами из кружка робототехники собрал VR-гарнитуру и выложил инструкцию на GitHub. Макс влюбился в виртуальную реальность благодаря сериалу «Мастера меча онлайн», но не мог себе позволить Oculus Rift, поэтому уговорил друзей и руководителя кружка взяться за проект <a href="https://github.com/relativty/fastVR-sdk/blob/master/img/fastVR_demo.gif">собственного VR-шлема</a>.</p><p>На комплектующие ушло всего 100 долларов — ребята заказывали наиболее дешевые компоненты.</p><figure><img src="https://media.tproger.ru/uploads/2018/01/2018-01-21.-VR-headset-components.jpg" alt="" /></figure><p>Программное обеспечение подросток написал самостоятельно и выложил в открытый доступ.</p>]]></content:encoded>
    </item>
    <item>
      <title>Google представила Vision Kit, новое устройство из серии AIY Projects</title>
      <link>https://tproger.ru/news/google-vision-kit</link>
      <comments>https://tproger.ru/news/google-vision-kit?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Вячеслав Шарунов]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/google-vision-kit</guid>
      <description><![CDATA[<p>Vision Kit из линейки AIY Projects выполняет компьютерное зрение на самом устройстве; комплект включает VisionBonnet, объективы и другие детали.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/google-vision-kit">Google представила Vision Kit, новое устройство из серии AIY Projects</a>»</p>]]></description>
      <category><![CDATA[Машинное обучение]]></category>
      <category><![CDATA[Google]]></category>
      <category><![CDATA[Распознавание]]></category>
      <category><![CDATA[DIY]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 04 Dec 2017 17:09:33 GMT</pubDate>
      <content:encoded><![CDATA[<p>Весной 2017 года компания Google <a href="https://tproger.ru/news/raspberry-pi-voice-kit-google-aiy/">запустила</a> сервис <a href="https://aiyprojects.withgoogle.com/">AIY Projects</a>. Цель проекта — сделать технологии искусственного интеллекта компании доступными для использования в самостоятельных проектах сторонних разработчиков. Первым релизом проекта <a href="https://tproger.ru/news/ai-for-diy/">стал</a> Voice Kit, который снискал огромную популярность. На сей раз Google <a href="https://www.blog.google/topics/machine-learning/introducing-aiy-vision-kit-make-devices-see/">анонсирует</a> Vision Kit.</p><h3>Коротко о Vision Kit</h3><p>Как отмечается в пресс-релизе, это первый проект с поддержкой встроенного <a href="https://ru.wikipedia.org/wiki/%D0%9D%D0%B5%D0%B9%D1%80%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BF%D1%80%D0%BE%D1%86%D0%B5%D1%81%D1%81%D0%BE%D1%80">нейронного процессора</a>, обеспечивающего компьютерное зрение без предварительного анализа собранных данных в облаке. Вся работа происходит непосредственно на самом устройстве.</p><figure><img src="https://media.tproger.ru/uploads/2017/12/visionkit-assembly-trip.width-1000.jpg" alt="" /></figure><h4>Комплект поставки Vision Kit</h4><p>Как и Voice Kit, выпущенный в мае 2017 года, Vision Kit представляет собой DIY-проект. В комплект входят картонный корпус, печатная плата VisionBonnet, RGB-кнопка запуска, пьезодинамик, комплект объективов, монтажная гайка штатива и другие соединительные компоненты. Для полноценной работы также потребуются <a href="https://tproger.ru/news/raspberry-pi-zero-w/">Raspberry Pi Zero W</a>, камера Raspberry Pi, SD-карта и блок питания, которые необходимо приобретать отдельно.</p><figure><img src="https://media.tproger.ru/uploads/2017/12/vision-kit-exploded.width-1000.jpg" alt="" /></figure><p>Главной компонентой комплекта поставки является плата VisionBonnet для Raspberry Pi. Она оснащена процессором <a href="https://tproger.ru/news/intel-unveiled-myriad-x/">Intel Movidius MA2450</a> — маломощным процессором для обработки изображений, способным работать с моделями нейронных сетей прямо на устройстве.</p><figure><img src="https://media.tproger.ru/uploads/2017/12/AIY-visionkit-bonnet-watermark-full-res.width-1000.jpg" alt="" /></figure><h4>Комплект ПО</h4><p>Предоставляемое программное обеспечение включает в себя три модели нейронных сетей на основе TensorFlow для различных приложений компьютерного зрения. Первая использует <a href="https://tproger.ru/news/google-mobilenets-visual-recognition/">MobileNets</a> и способна распознавать тысячу обычных объектов, вторая — лица и их выражения, а третья может классифицировать их.</p><p>В комплект ПО включён инструмент для компиляции собственных моделей. Это позволит обучать модели с помощью TensorFlow на своей рабочей машине или в любом облачном сервисе. Google также предоставляет Python API, который даст вам возможность изменять цвета кнопки запуска, настраивать звуки из динамика и получить доступ к четырем выводам <a href="https://ru.wikipedia.org/wiki/GPIO">GPIO</a>.</p><h3>Как получить Vision Kit?</h3><p>Комплект Vision Kit будет доступен для покупки в магазинах с декабря 2017 года. Предзаказ открыт на сайте Micro Center.</p>]]></content:encoded>
    </item>
    <item>
      <title>Google опубликовала набор данных для распознавания речи</title>
      <link>https://tproger.ru/news/ai-for-diy</link>
      <comments>https://tproger.ru/news/ai-for-diy?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Вячеслав Шарунов]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/ai-for-diy</guid>
      <description><![CDATA[<p>Открытый набор Google содержит 65 000 словосочетаний из 30 слов для обучения моделей распознавания речи; пользователи могут добавить собственный голос.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/ai-for-diy">Google опубликовала набор данных для распознавания речи</a>»</p>]]></description>
      <category><![CDATA[Машинное обучение]]></category>
      <category><![CDATA[Google]]></category>
      <category><![CDATA[Распознавание]]></category>
      <category><![CDATA[DIY]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sun, 27 Aug 2017 17:46:14 GMT</pubDate>
      <content:encoded><![CDATA[<p>Любители «сделай сам» или <a href="https://tproger.ru/tag/diy/">DIY</a> (Do It Yourself) получили новый бонус от Google. Сотрудники компании <a href="http://research.googleblog.com/2017/08/launching-speech-commands-dataset.html">открыли доступ</a> к набору данных для распознавания речи при помощи машинного обучения. Разработанный двумя командами, TensorFlow и AIY, набор состоит из 65 000 словосочетаний, составленных из 30 слов и предназначенных для обучения различных моделей машинного обучения.</p><p>Изначальной <a href="https://tproger.ru/news/raspberry-pi-voice-kit-google-aiy/">идеей</a> проектов AIY являлась поддержка людей, занимающихся DIY и желающих ближе познакомиться с наработками в области ИИ. В планах группы запуск серии гайдов по применению машинного обучения. Первым релизом как раз и стал выпуск <a href="https://aiyprojects.withgoogle.com/voice#assembly-guide-2-assemble-the-hardware">Voice Kit</a>. Он содержит инструкцию по сбору смарт-колонки в виде картонного короба, в основе которого лежит Raspberry Pi, а также необходимый для программирования SDK.</p><figure><img src="https://media.tproger.ru/uploads/2017/08/together-1.jpg" alt="" /></figure><p>По заявлению инженера-программиста Google Пита Уордена, инфраструктура, использованная при создании данных, была <a href="https://github.com/petewarden/open-speech-recording">в свободном доступе</a>. Поэтому и AIY придерживается таких же принципов свободного распространения, что должно позволить охватить большую аудиторию. Уорден отметил:</p><blockquote>Чем аудитория больше, тем больше появится версий продукта, что позволит охватить большее количество языков.</blockquote><p>Google верит, что со временем количество акцентов и вариаций языков в активе проекта только увеличится. В отличии от других наборов данных, пользователи могут сами добавлять свой голос в речевые команды. Сайт проекта предлагает внести свой вклад в улучшение работы Voice Kit, просто записав 135 простых слов наподобие «птица», «стоп», «вперёд», последовательности цифр и имена людей.</p><p>В данный момент, к сожалению, существующие модели проекта не могут распознать голоса каждого пользователя. Объясняется это тем, что некоторые языковые группы мало представлены в обучающей выборке алгоритмов. Именно отстутствие локальных диалектов или сленгов является причиной непонимания голосовых команд от некоторых групп людей.</p><p>Так, сотрудники Стэнфорда <a href="https://venturebeat.com/2017/08/08/stanford-ai-researchers-make-socially-inclusive-nlp-using-urban-dictionary-and-twitter/">установили</a>, что программа для распознавания языков Equilid, обученная на твитах и сленговых словарях, более точно идентифицирует голосовые команды, чем при обучении на книгах и научных текстах, поскольку так она использует тот же язык, что и люди в обычной жизни. Результаты Equilid оказались даже более точными, чем у <a href="https://github.com/CLD2Owners/cld2">Compact Language Detector 2</a> от Google.</p>]]></content:encoded>
    </item>
    <item>
      <title>Проект не для начинающих: пишем свой текстовый редактор с поиском и подсветкой синтаксиса на C</title>
      <link>https://tproger.ru/articles/text-editor-series</link>
      <comments>https://tproger.ru/articles/text-editor-series?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Иван Бирюков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/text-editor-series</guid>
      <description><![CDATA[<p>Серия из 184 шагов показывает создание текстового редактора на C без зависимостей: проект включает поиск, подсветку синтаксиса и исходники на GitHub.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/text-editor-series">Проект не для начинающих: пишем свой текстовый редактор с поиском и подсветкой синтаксиса на C</a>»</p>]]></description>
      <category><![CDATA[DIY]]></category>
      <category><![CDATA[Язык Си]]></category>
      <category><![CDATA[Для продолжающих]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sun, 25 Jun 2017 18:57:19 GMT</pubDate>
      <content:encoded><![CDATA[<p>Предлагаем вашему вниманию серию англоязычных статей, опубликованную в <a href="http://viewsourcecode.org/snaptoken/">блоге Джереми Рутена</a>. В ней подробно разбирается процесс разработки собственного текстового редактора на языке C.</p><p>Проект занимает примерно тысячу строк кода и не использует никаких зависимостей. Для удобства и лучшего понимания весь процесс разбит на 184 шага. По прохождении каждого этапа вы сможете скомпилировать проект и увидеть все изменения. Исходный код каждого шага доступен <a href="https://github.com/snaptoken/kilo-tutorial">на GitHub</a>.</p><p>Статьи написаны простым, понятным даже начинающим программистам языком. Все термины либо объясняются в статье, либо снабжены ссылками на другие Интернет-ресурсы.</p><p>Реализация этого проекта однозначно будет вам полезна: во-первых, вы сможете освоить или подтянуть знания по языку C, а во-вторых, разберётесь в основных принципах работы текстовых редакторов.</p><p>Итак, вот список статей:</p><ol><li><a href="http://viewsourcecode.org/snaptoken/kilo/01.setup.html">Настройка</a>.</li><li><a href="http://viewsourcecode.org/snaptoken/kilo/02.enteringRawMode.html">Переход в «сырой» режим</a>.</li><li><a href="http://viewsourcecode.org/snaptoken/kilo/03.rawInputAndOutput.html">«Сырой» ввод и вывод</a>.</li><li><a href="http://viewsourcecode.org/snaptoken/kilo/04.aTextViewer.html">Отображение текста</a>.</li><li><a href="http://viewsourcecode.org/snaptoken/kilo/05.aTextEditor.html">Редактор текста</a>.</li><li><a href="http://viewsourcecode.org/snaptoken/kilo/06.search.html">Поиск</a>.</li><li><a href="http://viewsourcecode.org/snaptoken/kilo/07.syntaxHighlighting.html">Подсветка синтаксиса</a>.</li><li><a href="http://viewsourcecode.org/snaptoken/kilo/08.appendices.html">Примечания</a>.</li></ol><p>Если вам хочется написать ещё какой-нибудь проект самостоятельно, советуем обратить внимание на <a href="https://tproger.ru/articles/os-creation-series/">серию статей</a>, посвящённую созданию ОС на ассемблере и Rust.</p>]]></content:encoded>
    </item>
    <item>
      <title>Разработка простого блога на Node.js и Cosmic JS</title>
      <link>https://tproger.ru/translations/simple-blog-node-js</link>
      <comments>https://tproger.ru/translations/simple-blog-node-js?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Дмитрий Юрченко]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/simple-blog-node-js</guid>
      <description><![CDATA[<p>Создадим несложный блог с использованием платформ Node.js и Cosmic JS в сочетании с открытой системой шаблонов Mustache.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/simple-blog-node-js">Разработка простого блога на Node.js и Cosmic JS</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[DIY]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 15 Jun 2017 20:30:56 GMT</pubDate>
      <content:encoded><![CDATA[<p>В этой статье мы разберём создание простого блога с помощью Node.js и Cosmic JS.</p><ol><li><a href="https://tproger.ru/#part1">Начало</a></li><li><a href="https://tproger.ru/#part2">Разработка блога</a></li><li><a href="https://tproger.ru/#part3">Добавление переменных шаблона домашней страницы</a></li><li><a href="https://tproger.ru/#part4">Заключение</a></li></ol><p>Также вы можете посмотреть наш <a href="https://tproger.ru/translations/building-messenger/">материал</a> по созданию мессенджера с использованием Node.js.</p><h2>Начало создания блога</h2><p>Убедитесь, что у вас установлена платформа для разработки Node.js, если нет, то посетите <a href="https://nodejs.org/en/">веб-сайт Node.js</a>, чтобы скачать последнюю версию.</p><p>Теперь установите пакетный менеджер Yarn, который понадобится для установки зависимостей будущего блога:</p><p>Потом создайте папку для блога. Выполните в терминале следующие команды:</p><p>На следующем этапе создайте файл package.json, чтобы импортировать все зависимости для блога и добавьте в него следующие строки:</p><p>В этом файле объявлены зависимости, которые необходимо установить для разработки и запуска блога:</p><ol><li>Модуль Cosmic JS Node, чтобы получать данные с Cosmic JS Bucket.</li><li>Веб-фреймворк Express.</li><li>ПакетHogan для обработки шаблонов.</li><li>МодульNodemon для удобства разработки — он автоматически перезагружает приложение, когда в нем произошли изменения.</li></ol><p>Выполните следующую команду, чтобы установить зависимости:</p><h2>Разработка блога</h2><p>Далее нужно сформировать главную страницу блога. Создайте файл под названием app.js и добавьте в него следующие строки:</p><p>Поясним, что происходит здесь:</p><ol><li>Производится импорт модулей Express, Cosmic JS и т.д.</li><li>Присоединяются верхний и нижний колонтитулы.</li><li>При запросе («/») происходит вызов Cosmic JS Bucket для вывода постов и возвращается шаблон index.html.</li><li>Добавляются данные на страницу в виде глобального хранилища данных — cosmic. Эта структура данных делает вашу реализацию шаблона  интуитивной.</li></ol><h2>Добавление переменных шаблона домашней страницы</h2><p>Эта часть процесса является наиболее интересной, потому что она показывает мощь Cosmic JS в сочетании с системой шаблонов <a href="http://mustache.github.io/">Mustache</a>.</p><p>Создайте папку под названием views:</p><p>Создайте файл index.html в этой папке и добавьте в него следующие строки:</p><p>Что здесь происходит:<br />1. Формируется заголовок (header) с переменными Mustache.<br />2. Извлекаются данные Cosmic с помощью переменной Mustache {{cosmic}}, которая имеет все необходимое для компоновки динамических данных нашей страницы.<br />3. Проход по {{}}cosmic.objects.type.posts и вывод постов в блоге.</p><p>Мне нравится в этом подходе то, что логика шаблона отделена от остального кода, за исключением некоторых запросов и циклов. Данный подход изолирует код шаблона от кода основного приложения.</p><h2>Заключение</h2><p>Эта сокращенная версия блога доступна для загрузки на странице <a href="https://cosmicjs.com/apps/simple-blog">Cosmic JS Apps</a>. Полная версия блога включает в себя страницу со всеми постами, а также страницу с постами каждого автора. Просмотрите <a href="https://github.com/cosmicjs/simple-blog">полную версию кода</a> на GitHub и разверните блог с помощью нескольких кликов на панели инструментов Cosmic JS, установив блог в Cosmic JS Bucket.</p><p>Если вы также планируете заняться оптимизацией своего блога, обратите внимание на <a href="https://tproger.ru/articles/4-servisa-po-sostavleniju-semanticheskogo-jadra/">сервисы по составлению семантического ядра</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Создаем многопользовательскую браузерную игру. Часть вторая. Разбираем игровой фреймворк</title>
      <link>https://tproger.ru/translations/multiplayer-browser-game-2</link>
      <comments>https://tproger.ru/translations/multiplayer-browser-game-2?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Егор Мадьяров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/multiplayer-browser-game-2</guid>
      <description><![CDATA[<p>Вторая часть руководства по браузерной игре объясняет лаги, клиентское прогнозирование, экстраполяцию, игровые фреймворки и добавление звука.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/multiplayer-browser-game-2">Создаем многопользовательскую браузерную игру. Часть вторая. Разбираем игровой фреймворк</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[Разработка игр]]></category>
      <category><![CDATA[DIY]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 09 Jun 2017 09:05:00 GMT</pubDate>
      <content:encoded><![CDATA[<p>Рассказывает Алвин Лин, разработчик программного обеспечения из Нью-Йорка</p><p>В этой статье я продолжаю тему <a href="https://tproger.ru/translations/multiplayer-browser-game-1/">создания многопользовательской браузерной игры</a>. Здесь я с технической точки зрения попытаюсь в общих чертах объяснить, как задержка может влиять на игру и как с этим справиться. Я вкратце расскажу о паре фреймворков и объясню, как добавить в игру звук.</p><h2>Задержка и запаздывание</h2><p>Итак, давайте разберемся, что же такое задержка? Если вы раньше играли в онлайн-игры, то скорее всего сталкивались с тем, что при нажатии на клавишу или попытке что-то сделать какое-то время в игре ничего не происходит. Такое явление называют «лагом», и оно очень мешает при игре в многопользовательские шутеры.</p><p>Задержка происходит из-за физической отдаленности вашего компьютера от сервера, к которому вы подключены. В <a href="https://tproger.ru/translations/multiplayer-browser-game-1/">прошлой статье</a> я рассказывал про определение полномочного сервера. Лаг — это промежуток времени между отправкой данных на сервер и получением подтверждения от сервера.</p><figure><img src="https://media.tproger.ru/uploads/2017/06/creating-game-part-2-1.png" alt="" /></figure><p>Чтобы справиться с лагом, существует концепция клиентского прогнозирования — экстраполяция. Это понятие предполагает прорисовку действия на стороне клиента <i>до того</i>, как его распознает сервер. Таким образом достигается эмуляция плавного хода игры. Фактически клиент предугадывает состояние сервера после подтверждения действия.</p><p>Этот подход особенно легко реализовать для передвижения игроков, если вы используете детерминистическую модель игрового мира. Если все в вашей игровой вселенной происходит согласно прогнозируемой и рассчитанной физике, то клиентская сторона может делать взвешенные предположения о корректности входных данных. Таким образом, прорисовка передвижения игрока может начаться до того, как будет получено подтверждение от сервера.</p><figure><img src="https://media.tproger.ru/uploads/2017/06/creating-game-part-2-2.png" alt="" /></figure><h2>Фреймворки</h2><figure><img src="https://media.tproger.ru/uploads/2017/06/creating-game-part-2-3.png" alt="" /></figure><p>Теперь перейдем к рассмотрению фреймворков, первым из которых будет <a href="https://web.archive.org/web/20170115121557/http://incheon.gg:80/">incheon.gg</a>. Это довольно классный фреймворк, который позволяет делать многое в играх с дискретной и непрерывной физикой, при этом он берет на себя большую часть логики синхронизации клиента и сервера. Очень рекомендую использовать этот фреймворк для начала, если вы не хотите реализовывать сетевое взаимодействие самостоятельно. У него очень грамотная и понятная документация.</p><h3>Как я написал собственный фреймворк</h3><p>На одной из конференций в технологическом институте Рочестера, в которой я принимал участие, наша команда представила многопользовательскую игру. Моей задачей было написание фреймворка для игры.</p><p>Я давно занимаюсь многопользовательскими играми. Этот фреймворк — квинтэссенция опыта, полученного мной за эти годы. В отличие от incheon.gg, мой фреймворк больше заточен под игры с открытым миром, и в нем нет вышеупомянутой сетевой функциональности. Он больше подходит тем, кто хочет изучить архитектуру игры путем написания каждой части кода самостоятельно.</p><p>Хотя я все еще работаю над ним, можно сказать, что мой фреймворк близок к архитектуре Node.js, на котором он написан, и позволяет кастомизировать игру. Если вы новичок в разработке игр или в Node.js и только что прочитали первую часть этого цикла, то я бы порекомендовал вам взглянуть на этот код и разобраться, что к чему.</p><p><a href="https://github.com/omgimanerd/game-framework">Репозиторий</a> на GitHub содержит переделанную, снабженную комментариями, приведенную в порядок версию модели, которую я демонстрировал в первой части. Далее я подробно расскажу о каждой части этого фреймворка. Предлагаю скопировать этот архив, если вы хотите узнать больше.</p><figure><img src="https://media.tproger.ru/uploads/2017/06/creating-game-part-2-5.png" alt="" /></figure><p>Начнем с <a href="https://github.com/omgimanerd/game-framework/blob/master/package.json">package.json</a> — основы основ любого проекта на Node.js. Основные зависимости у меня — <a href="http://expressjs.com/">express</a>, <a href="https://www.npmjs.com/package/hashmap">hashmap</a>, <a href="https://www.npmjs.com/package/morgan">morgan</a>, <a href="https://pugjs.org/api/getting-started.html">pug</a> и <a href="https://www.npmjs.com/package/socket.io">socket.io</a>. Для этого проекта мне будут нужны только socket.io и hashmap. Morgan — это просто полезный инструмент для записи информации, express — широко используемый веб-фреймворк, pug — шаблонизатор. При желании вы можете заменить их на те инструменты, с которыми вам удобнее работать. Пакет hashmap используют для того, чтобы связать id сокета каждого клиента с игровым экземпляром, в то время как socket.io необходим для обеспечения общения в режиме реального времени.</p><p>Перейдем к bower.json, который содержит две зависимости на стороне клиента: <a href="https://jquery.com/">jquery</a> и <a href="https://howlerjs.com/">howler.js</a>. Ни одна из них нам особо не понадобится, но jquery может упростить вам работу, а howler.js — классная библиотека, которая добавляет в игру звук. Позже я расскажу, как использую howler.js.</p><p>В папке lib есть файлы, которые со стороны сервера управляют и сохраняют состояние игры и ее элементов. <a href="https://github.com/omgimanerd/game-framework/blob/master/lib/Entity2D.js">Entity2D.js</a> и <a href="https://github.com/omgimanerd/game-framework/blob/master/lib/Entity3D.js">Entity3D.js</a> — классы <a href="http://eli.thegreenplace.net/2013/10/22/classical-inheritance-in-javascript-es5">ES5</a>, которые включают элементы с базовой физикой. Если хотите пойти дальше, можете добавить в класс более детальную физику, гравитацию и т.д.</p><p>Обратите внимание, как реализовано независимое обновление частоты смены кадров, о которой говорилось в первой части. Обновления позиции и скорости происходят благодаря deltaTime, что приводит к плавной игре. <a href="https://github.com/omgimanerd/game-framework/blob/master/lib/Player.js">Player.js</a> — просто расширение <a href="https://github.com/omgimanerd/game-framework/blob/master/lib/Entity2D.js">Entity2D.js</a>, которое управляет входными данными пользователя помимо базовой физики.</p><p><a href="https://github.com/omgimanerd/game-framework/blob/master/lib/Game.js">Game.js</a> немного интереснее.</p><p>Помимо этого базового конструктора, здесь есть методы, которые помогают в подключении и отключении игроков. По сути, этот класс только выполняет обновление и передает состояние сервера.</p><p>Game.prototype.update() обновляет каждый элемент в игре, а Game.prototype.sendState() передает состояние игры каждому клиенту, подключенному к серверу. Единственное, что нужно отметить (и что отличает мою реализацию от других) — я отфильтровываю подключенных в данный момент игроков и отправляю каждому информацию отдельно. Однако вы можете реализовать это по-своему. Я решил сделать именно так, поскольку так мне легче работать на стороне клиента.</p><p>Поговорим о папке public. Она содержит статические файлы JavaScript, которые выполняются со стороны клиента.</p><figure><img src="https://media.tproger.ru/uploads/2017/06/creating-game-part-2-6.png" alt="" /></figure><p>Помните, в первой части я говорил о том, что было бы неплохо выполнить рефакторинг кода? Это всего лишь один из способов это сделать. Создание набора модулей, каждый из которых отвечает за определенную часть функционала — хорошая идея, которая отличает продуманный дизайн ПО.</p><p><a href="https://github.com/omgimanerd/game-framework/blob/master/public/js/game/Drawing.js">Drawing.js</a> — это объект контекста Canvas, который прорисовывает все последовательности в спрайтах. Файл <a href="https://github.com/omgimanerd/game-framework/blob/master/public/js/game/Game.js">Game.js</a> использует <a href="https://developer.mozilla.org/en-US/docs/Web/API/window/requestAnimationFrame">window.requestAnimationFrame()</a>, чтобы запустить у клиента цикл для отправки входных данных пользователя на игровой сервер, а также для исполнения полученных состояний игры.</p><p>Этот фрагмент кода показывает, как работает вышеупомянутая функция. Вот ссылка на документацию <a href="https://developer.mozilla.org/en-US/docs/Web/API/window/requestAnimationFrame">requestAnimationFrame</a>, если вы не знаете, для чего она нужна. Util.bind() создает функцию, которая связывает контекст объекта Game с функцией update(), чтобы он мог быть вызван с помощью requestAnimationFrame(). Это странный прием, который касается технических особенностей JavaScript, поэтому я не буду обсуждать его. Вы легко можете добиться того же результата при помощи анонимной функции.</p><p>Файл <a href="https://github.com/omgimanerd/game-framework/blob/master/public/js/game/Input.js">Input.js</a> я очень часто использую в своих играх (с некоторыми изменениями). Он связывает обработчики определенных событий, чтобы отслеживать входные данные от клавиатуры/мыши, и сохраняет их для быстрого доступа. Когда я выделяю эту функцию и сохраняю ее в одном классе, мне не приходится беспокоиться о том, чтобы получать входные данные пользователя в любом другом месте.</p><p>Хотя Sound.js не используется в демо-модели игры, я немного расскажу о нем здесь. Этот файл содержит некоторые функции потрясающей библиотеки howler.js, которые я использую для воспроизведения звуков в моих играх. После инициализации он создает Howl-объекты для каждого звука, который будет использоваться в игре. Звуки затем могут воспроизводиться с использованием Sound.prototype.play(). Лично я сделал так, что все звуковые файлы должны храниться в папке sound внутри общедоступного каталога, но это можно легко изменить и переделать так, как вы считаете нужным. Я настоятельно рекомендую просмотреть <a href="https://github.com/goldfire/howler.js">документацию howler.js</a>.</p><p>Двигаемся дальше. Папка shared содержит только один файл — <a href="https://github.com/omgimanerd/game-framework/blob/master/shared/Util.js">Util.js</a>.</p><figure><img src="https://media.tproger.ru/uploads/2017/06/creating-game-part-2-7.png" alt="" /></figure><p><a href="https://github.com/omgimanerd/game-framework/blob/master/shared/Util.js">Util.js</a> — еще один из тех файлов, которые я часто использую в своих проектах. Он содержит множество вспомогательных функций, которые используются как на стороне клиента, так и на стороне сервера. Папка shared служит для статики, поэтому я могу подключить скрипт из файла HTML и использовать его с помощью require() на стороне сервера, когда мне это потребуется. Вы можете перемещать этот файл, если хотите, просто такая организация удобна для меня.</p><p>Кроме этого, я использую папку shared для хранения игровых констант, к которым необходимо иметь доступ как серверу, так и клиенту. Например, у меня есть класс, который выглядит следующим образом:</p><p>Этот код позволяет легко обрабатывать класс на стороне клиента или сервера. Папка views не очень интересна и содержит шаблон для демонстрации модели.</p><p>Я использую шаблонизатор <a href="https://pugjs.org/api/getting-started.html">pug</a>, но вы легко можете подключить любой другой. И, наконец, в корневой папке у нас есть файл <a href="https://github.com/omgimanerd/game-framework/blob/master/server.js">server.js</a>. Это довольно стандартный сервер Node.js, использующий веб-фреймворк <a href="http://expressjs.com/">express</a>.</p><p>В первой части я рассказывал про обработчик событий сокета, и это переработанный, упорядоченный код, где я использую методы, которые были определены в <a href="https://github.com/omgimanerd/game-framework/blob/master/lib/Game.js">классе Game</a> ранее. Цикл setInterval() просто запускает обновление игры и передачу состояния снова и снова с частотой примерно 60 кадров в секунду.</p><h2>Что дальше</h2><p>Теперь я рекомендую вам поработать с этим фреймворком и разобраться в нем. Переделайте его под себя, напишите свой собственный код, распечатайте его и сожгите — в общем, делайте, что хотите. Попробуйте обновить физику или написать собственный анимационный движок. Надеюсь, в процессе вы узнаете что-то новое и сделаете что-нибудь крутое.</p><p>Спасибо, что прочитали!</p>]]></content:encoded>
    </item>
    <item>
      <title>Создаем многопользовательскую браузерную игру. Часть первая. Клиент-серверная архитектура</title>
      <link>https://tproger.ru/translations/multiplayer-browser-game-1</link>
      <comments>https://tproger.ru/translations/multiplayer-browser-game-1?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Егор Мадьяров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/multiplayer-browser-game-1</guid>
      <description><![CDATA[<p>Первая часть руководства создаёт многопользовательскую браузерную игру на JavaScript и Node.js: веб-сокеты связывают клиент и сервер, а Canvas отображает игру.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/multiplayer-browser-game-1">Создаем многопользовательскую браузерную игру. Часть первая. Клиент-серверная архитектура</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[Разработка игр]]></category>
      <category><![CDATA[DIY]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 07 Jun 2017 15:08:07 GMT</pubDate>
      <content:encoded><![CDATA[<p>Рассказывает Алвин Лин, разработчик программного обеспечения из Нью-Йорка</p><p>В 2014 году я впервые побывал на CodeDay в Нью-Йорке. И хотя CodeDay не совсем хакатон, это было моё первое знакомство с подобными мероприятиями. Там мы с моим другом Кеннетом Ли <a href="https://tankanarchy.herokuapp.com/">написали</a> многопользовательскую игру в танчики. Так как несколько моих друзей спрашивали меня о том, как я её написал, я решил описать процесс её создания.</p><p>В этом посте я вкратце опишу ход своих рассуждений и покажу, как воссоздать архитектуру, а также дам некоторые советы, если вы захотите сделать игру сами. Этот пост рассчитан на тех, кто владеет основами JavaScript и <a href="https://nodejs.org/en/">Node.js.</a> Если вы с ними не знакомы, то есть много замечательных <a href="https://nodeschool.io/">онлайн-ресурсов</a>, где можно их изучить.</p><p>Прим. перев.  На нашем сайте есть много познавательных материалов как по <a href="https://tproger.ru/tag/javascript/">JavaScript</a>, так и по <a href="https://tproger.ru/tag/node-js/">Node.js</a> — обязательно найдёте что-нибудь подходящее.</p><p>Бэкенд игры написан на Node.js с использованием веб-сокетов, которые позволяют серверу и клиенту общаться в режиме реального времени. Со стороны клиента игра отображается в HTML5-элементе Canvas. Для начала нам, конечно же, понадобится Node.js. В этой статье описана работа с версией 6.3.1, но вы можете использовать любую версию выше 0.12.</p><p>Прим. перев.  Если вы не знакомы с веб-сокетами, рекомендуем прочитать <a href="https://tproger.ru/translations/what-are-web-sockets/">наш вводный материал</a>.</p><h2>Создание проекта</h2><p>Для начала установите зависимости. Создайте папку проекта, перейдите в неё и запустите следующий код:</p><p>Для быстрой настройки сервера целесообразно использовать фреймворк <a href="http://expressjs.com/ru/">Express</a>, а для обработки веб-сокетов на сервере — пакет <a href="https://socket.io/">socket.io</a>. В файл server.js поместите следующий код:</p><p>Это довольно типичный код для сервера на связке Node.js + Express. Он устанавливает зависимости и основные маршруты сервера. Для этого демонстрационного приложения используется только один файл index.html и папка static. Создайте их в корневой папке проекта. Файл index.html довольно простой:</p><p>Ваш пользовательский интерфейс может содержать куда больше элементов, поэтому для более крупных проектов CSS-стили лучше помещать в отдельный файл. Для простоты я оставлю CSS в коде HTML. Обратите внимание, что я включил в код скрипт socket.io.js. Он автоматически заработает в рамках пакета socket.io при запуске сервера.</p><p>Теперь нужно настроить веб-сокеты на сервере. В конец файла server.js добавьте:</p><p>Пока что в игре нет никаких функций, поэтому в обработчик веб-сокетов ничего добавлять не нужно. Для тестирования допишите следующие строки в конец файла server.js:</p><p>Эта функция будет отправлять сообщение с именем message и содержимым hi всем подключенным веб-сокетам. Позже не забудьте удалить эту часть кода, так как она предназначена только для тестирования.</p><p>В папке static создайте файл с именем game.js. Вы можете написать короткую функцию для регистрации сообщений от сервера, чтобы убедиться в том, что вы их получаете. В файле static/game.js пропишите следующее:</p><p>Запустите сервер командой node server.js и в любом браузере перейдите по ссылке http://localhost:5000. Если вы откроете окно разработчика (нажать правую кнопку мыши → Проверить (Inspect)), то увидите, как каждую секунду приходит новое сообщение:</p><figure><img src="https://media.tproger.ru/uploads/2017/05/tank_anarchy.png" alt="" /></figure><p>Как правило, socket.emit(name, data) отправляет сообщение с заданным именем и данными серверу, если запрос идет от клиента, и наоборот, если запрос идет от сервера. Для получения сообщений по конкретному имени используется следующая команда:</p><p>С помощью socket.emit() вы можете отправить любое сообщение. Можно также передавать объекты JSON, что для нас очень удобно. Это позволяет мгновенно передавать информацию в игре от сервера к клиенту и обратно, что является основой многопользовательской игры.</p><p>Теперь пусть клиент отправляет некоторые состояния клавиатуры. Поместите следующий код в конец файла static/game.js:</p><p>Это стандартный код, который позволяет отслеживать нажатие клавиш W, A, S, D. После этого добавьте сообщение, которое оповестит сервер о том, что в игре появился новый участник, и создайте цикл, который будет сообщать серверу о нажатии клавиш.</p><p>Эта часть кода позволит отправлять на сервер информацию о состоянии клавиатуры клиента 60 раз в секунду. Теперь необходимо прописать эту ситуацию со стороны сервера. В конец файла server.js добавьте следующие строки:</p><p>Давайте разберёмся с этим кодом. Вы будете хранить информацию о всех подключенных пользователях в виде объектов JSON. Так как у каждого подключённого к серверу сокета есть уникальный id, клавиша будет представлять собой id сокета подключённого игрока. Значение же будет другим объектом JSON, содержащим координаты x и y.</p><p>Когда сервер получит сообщение о том, что присоединился новый игрок, он добавит новый вход в объект игроков при помощи id сокета, который будет в этом сообщении. Когда сервер получит сообщение о движении, то обновит информацию об игроке, который связан с этим сокетом, если он существует.</p><p>io.sockets.emit() — это запрос, который будет отправлять сообщение и данные ВСЕМ подключённым сокетам. Сервер будет отправлять это состояние всем подключённым клиентам 60 раз в секунду.</p><p>На данном этапе клиент ещё ничего не делает с этой информацией, поэтому добавьте со стороны клиента обработчик, который будет отображать данные от сервера в Canvas.</p><p>Этот код обращается к id Canvas (#canvas) и рисует там. Каждый раз, когда от сервера будет поступать сообщение о состоянии, данные в Canvas будут обнуляться, и на нём в виде зеленых кружков будут заново отображаться все игроки.</p><p>Теперь каждый новый игрок сможет видеть состояние всех подключенных игроков на Canvas. Запустите сервер командой node server.js и откройте в браузере два окна. При переходе по ссылке http://localhost:5000 вы должны будете увидеть нечто похожее:</p><p>Вот и всё! Если у вас возникли проблемы, посмотрите архив с <a href="https://github.com/omgimanerd/how-to-build-a-multiplayer-browser-game">исходным кодом</a>.</p><h2>Некоторые тонкости</h2><p>Когда будете разрабатывать более функциональную игру, целесообразно разделить код на несколько файлов.</p><p>Такие многопользовательские игры — отличный пример архитектуры MVC (модель-представление-контроллер). Вся логическая часть должна обрабатываться на сервере, а всё, что должен делать клиент — это отправлять входные пользовательские данные на сервер и отображать информацию, которую получает от сервера.</p><p>Однако в этом демо-проекте есть несколько недостатков. Обновление игры связано со слушателем сокета. Если бы я хотел повлиять на ход игры, то мог бы написать в консоли браузера следующее:</p><p>Теперь данные о движении будут отправляться на сервер в зависимости от характеристик компьютера более 60 раз в секунду. Это приведёт к тому, что игрок будет передвигаться невероятно быстро. Так мы переходим к концепции определения полномочного сервера.</p><p>Ни на каком этапе клиент не должен контролировать какие-либо данные на сервере. Например, никогда не нужно размещать на сервере код, который позволит клиенту определять своё положение/здоровье на основе данных, которые передаются через сокет, так как пользователь сможет легко подделать сообщение, исходящее из сокета, как показано выше.</p><p>Когда я создавал свою первую многопользовательскую игру, я написал код так, что игрок мог стрелять тогда, когда отправлялось сообщение о стрельбе, которое со стороны клиента было связано с нажатием кнопки мыши. Умелый игрок мог воспользоваться этим, вставив строчку на JavaScript, очень похожую на ту, что упоминалась выше, чтобы заполучить почти неограниченную скорость стрельбы.</p><p>Лучшая аналогия, которую я могу привести, заключается в том, что клиенты должны посылать на сервер только информацию о своих намерениях, которые затем будут обрабатываться и использоваться для изменения состояния игроков, если они валидны.</p><p>В идеале циклы обновлений как у клиента, так и на сервере не должны зависеть от сокетов. Попытайтесь сделать так, чтобы обновления игры находились за пределами блока socket.on(). В противном случае вы можете получить много странных нелогичных действий из-за того, что обновление игры будет связано с обновлением сокета.</p><p>Кроме того, старайтесь избегать такого кода:</p><p>В этом отрезке кода обновление координаты х для игрока связано с частотой смены кадров в игре. SetInterval() не всегда гарантирует соблюдение интервала, вместо этого напишите нечто подобное:</p><p>Это не так изящно, зато обеспечит более плавную и последовательную работу. Усложните демо-проект и попробуйте сделать так, чтобы обновление осуществлялось согласно времени, а не частоте смены кадров. Если не захотите на этом останавливаться, попытайтесь создать на сервере физический движок, который будет управлять движениями игроков.</p><p>Также можно сделать так, чтобы из игры удалялись отключенные игроки. Когда сокет отключается, автоматически отправляется сообщение о разъединении. Это можно прописать так:</p><p>Также попытайтесь создать собственный физический движок. Это сложно, но весело. Если захотите попробовать, то рекомендую прочитать книгу «<a href="http://natureofcode.com/book/">The Nature of Code</a>», в которой есть много полезных идей.</p><p>Если хотите посмотреть на гораздо более продвинутый пример, <a href="https://tankanarchy.herokuapp.com/">вот игра</a>, которую я сделал, а также <a href="https://github.com/penumbragames/tankanarchy">исходный код</a>, если вы хотите узнать, как это было написано. На этом всё. Спасибо, что прочитали!</p>]]></content:encoded>
    </item>
    <item>
      <title>Пишем скрипт для поиска книг на изображениях с помощью Python и OpenCV</title>
      <link>https://tproger.ru/translations/finding-books-python-opencv</link>
      <comments>https://tproger.ru/translations/finding-books-python-opencv?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Дмитрий Юрченко]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/finding-books-python-opencv</guid>
      <description><![CDATA[<p>Скрипт на Python и OpenCV ищет четыре книги среди посторонних объектов на фотографии; для работы с компьютерным зрением также нужен NumPy.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/finding-books-python-opencv">Пишем скрипт для поиска книг на изображениях с помощью Python и OpenCV</a>»</p>]]></description>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Распознавание]]></category>
      <category><![CDATA[DIY]]></category>
      <category><![CDATA[Для продолжающих]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 24 May 2017 12:12:52 GMT</pubDate>
      <content:encoded><![CDATA[<p>Из этой статьи вы узнаете, как создать Python-скрипт для подсчёта количества книг на изображении с помощью <a href="http://opencv.org/">OpenCV</a>.</p><p>Прим. перев.  Также советуем обратить внимание на наше руководство по <a href="https://tproger.ru/translations/making-a-python-bot-for-memes/">созданию бота для мессенджера на Python</a> и посмотреть видеокурс, в котором рассказывается о <a href="https://tproger.ru/video/python-plays-gta-v/">написании автопилота для GTA V</a> — там тоже используется OpenCV.</p><h2>Что мы будем делать?</h2><p>Взглянем на изображение, на котором будем искать книги:</p><figure><img src="https://media.tproger.ru/uploads/2017/05/1-3.jpg" alt="" /></figure><p>Мы видим, что на изображении находятся четыре книги, а также отвлекающие вещи, такие как кружка кофе, чашка Starbucks, несколько магнитов и конфета.</p><p>Наша цель заключается в том, чтобы найти четыре книги на изображении, при этом не определив никакой другой предмет как книгу.</p><h2>Какие библиотеки нам понадобятся?</h2><p>Чтобы написать систему для поиска и обнаружения книг на изображениях, мы будем использовать <a href="https://pypi.python.org/pypi/opencv-python">OpenCV</a> для работы с компьютерным зрением и обработки изображений. Нам также необходимо установить <a href="https://pypi.python.org/pypi/numpy">NumPy</a> для корректной работы OpenCV.</p><p>Команды для установки:</p><h2>Поиск книг на изображениях с помощью Python и OpenCV</h2><p>Прим. перев.  Вы можете заметить, что исходный код в нашей статье отличается от кода в оригинале. Автор, вероятно, использовал установку необходимых библиотек через репозитории. Мы предлагаем использовать pip, что гораздо проще. Во избежание появления ошибок рекомендуем использовать версию кода, приведенную в нашей статье.</p><p>Откройте свой любимый редактор кода, создайте новый файл с именем find_books.py и начнем:</p><p>Начнем с импорта библиотеки OpenCV. Загрузка изображения с диска обрабатывается функцией cv2.imread. Здесь мы просто загружаем его с диска, а затем преобразуем цветовую гамму из RGB в оттенки серого.</p><p>Мы также немного размываем изображение, чтобы уменьшить высокочастотные шумы и повысить точность нашего приложения. После выполнения кода изображение должно выглядеть так:</p><figure><img src="https://media.tproger.ru/uploads/2017/05/1-4.jpg" alt="" /></figure><p>Мы загрузили изображение с диска, преобразовали его в оттенки серого и немного размыли.</p><p>Теперь давайте определим края (т.е. контуры) объектов на изображении:</p><p>Теперь наше изображение выглядит следующим образом:</p><figure><img src="https://media.tproger.ru/uploads/2017/05/1-5.jpg" alt="" /></figure><p>Мы нашли контуры объектов на изображениях. Однако, как вы видите, некоторые из контуров не закрыты — между контурами существуют промежутки. Чтобы убрать промежутки между белыми пикселями изображения, мы применим операцию «закрытия»:</p><p>Теперь пробелы в контурах закрыты:</p><figure><img src="https://media.tproger.ru/uploads/2017/05/1-6.jpg" alt="" /></figure><p>Следующим шагом является фактическое обнаружение контуров объектов на изображении. Для этого мы будем использовать функцию cv2.findContours:</p><p>Рассмотрим геометрию книги.</p><p>Книга представляет собой прямоугольник. У прямоугольника четыре вершины. Поэтому, если мы рассмотрим контур и обнаружим, что он имеет четыре вершины, то мы можем предположить, что это книга, а не другой предмет на изображении.</p><p>Чтобы проверить, является ли контур книгой или нет, нам нужно выполнить цикл по каждому контуру:</p><p>Для каждого из контуров мы вычисляем периметр, используя cv2.arcLength, а затем аппроксимируем (сглаживаем) контур, используя cv2.approxPolyDP.</p><p>Причина, по которой мы аппроксимируем контур, заключается в том, что он может не быть идеальным прямоугольником. Из-за зашумления и теней на фото вероятность того, что у книги будет ровно 4 вершины, невелика. Аппроксимируя контур, мы решаем эту проблему.</p><p>Наконец, мы проверяем, что у аппроксимируемого контура действительно четыре вершины. Если это так, то мы рисуем контур вокруг книги, а затем увеличиваем счётчик общего количества книг.</p><p>Завершим этот пример, показывая полученное изображение и количество найденных книг:</p><p>На данном этапе наше изображение будет выглядеть так:</p><figure><img src="https://media.tproger.ru/uploads/2017/05/1-7.jpg" alt="" /></figure><p>Терминал показывает, что мы успешно нашли четыре книги на изображении, игнорируя другие предметы:</p><figure><img src="https://media.tproger.ru/uploads/2017/05/1-8.jpg" alt="" /></figure><h2>Подведем итоги</h2><p>В этой статье вы научились находить книги на изображениях, используя простые методы обработки изображений и компьютерного зрения с помощью Python и OpenCV.</p><p>Наш подход состоял в том, чтобы:</p><ol><li>Загрузить изображение с диска и преобразовать его в оттенки серого.</li><li>Немного размыть изображение.</li><li>Применить детектор контуров Canny для обнаружения объектов на изображении.</li><li>Закрыть любые промежутки в контурах.</li><li>Найти контуры объектов на изображении.</li><li>Применить контурную аппроксимацию, чтобы определить, был ли контур прямоугольником и, следовательно, книгой.</li></ol><p>Вы можете скачать исходный код скрипта и изображение, которое используется в этой статье.</p>]]></content:encoded>
    </item>
    <item>
      <title>/dev/null не нужен: пишем бота на Python, который будет присылать свежие мемасики</title>
      <link>https://tproger.ru/translations/making-a-python-bot-for-memes</link>
      <comments>https://tproger.ru/translations/making-a-python-bot-for-memes?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Дмитрий Юрченко]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/making-a-python-bot-for-memes</guid>
      <description><![CDATA[<p>Python-бот для Facebook Messenger собирает свежие мемы, мотивационные сообщения и шутки с помощью Facebook, Heroku и Reddit.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/making-a-python-bot-for-memes">/dev/null не нужен: пишем бота на Python, который будет присылать свежие мемасики</a>»</p>]]></description>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[DIY]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 18 May 2017 14:46:08 GMT</pubDate>
      <content:encoded><![CDATA[<p>Сегодня мы создадим бота для Facebook Messenger, который будет присылать нам свежие мемы, мотивационные сообщения и шутки. В этой статье есть большая часть информации, которую нужно знать для создания своего бота.</p><p>Вот так будет выглядеть финальная версия нашего приложения:</p><figure><img src="https://media.tproger.ru/uploads/2017/05/Screen-e1494960621556.png" alt="" /></figure><h2>Технический стек</h2><p>Нам понадобятся:</p><ul><li><a href="http://flask.pocoo.org/">Flask</a> — фреймворк для разработки бэкенда. Поскольку он легкий, это позволит нам сосредоточиться на логике, а не на структуре папок;</li><li><a href="https://id.heroku.com/login">Heroku</a> — хостинг для бесплатного размещения нашего кода;</li><li><a href="https://www.reddit.com">Reddit</a> — как источник данных, потому что новые сообщения там появляются каждую минуту.</li></ul><h2>Создание приложения Reddit</h2><p>Мы будем использовать Facebook, Heroku и Reddit. Во-первых, убедитесь, что у вас есть учетная запись в каждом из этих сервисов. Затем <a href="https://www.reddit.com/prefs/apps/">нужно создать</a> приложение Reddit:</p><figure><img src="https://media.tproger.ru/uploads/2017/05/1-9.png" alt="" /></figure><p>Нажмите кнопку «create an app…» и следуйте инструкциям на экране:</p><figure><img src="https://media.tproger.ru/uploads/2017/05/2-5.png" alt="" /></figure><p>Два нижних поля не будут использоваться, поэтому оставьте их пустыми. В поле с описанием приложения лучше написать что-то связанное с проектом. Когда приложение начнёт делать много запросов, представители Reddit могут проверить, для чего оно.</p><p>Теперь, когда ваше приложение создано, вам нужно сохранить client_id и client_secret в безопасном месте:</p><figure><img src="https://media.tproger.ru/uploads/2017/05/3-6.png" alt="" /></figure><p>Первая часть нашего проекта выполнена. Теперь нам нужно настроить базу для нашего приложения Heroku.</p><h2>Создание приложения на Heroku</h2><p>Перейдите на сайт <a href="https://dashboard.heroku.com/login">Heroku</a> и создайте новое приложение:</p><figure><img src="https://media.tproger.ru/uploads/2017/05/4-4.png" alt="" /></figure><p>На следующей странице дайте своему приложению уникальное имя. Нажмите «Heroku CLI» и загрузите последнюю версию интерфейса командной строки Heroku для вашей операционной системы. Следуйте инструкциям на экране и вернитесь, как только интерфейс будет загружен.</p><figure><img src="https://media.tproger.ru/uploads/2017/05/5-3.png" alt="" /></figure><h2>Создание базового приложения Python</h2><p>Приведенный ниже код взят с <a href="https://tsaprailis.com/2016/06/02/How-to-build-and-deploy-a-Facebook-Messenger-bot-with-Python-and-Flask-a-tutorial/">сайта Константиноса Цапраилиса</a>.</p><p>Мы будем редактировать файл в соответствии с нашими потребностями. Бот Facebook будет работать следующим образом:</p><ol><li>Facebook отправляет запрос на наш сервер всякий раз, когда пользователь пишет сообщение на нашей странице Facebook.</li><li>Мы отвечаем на запрос Facebook и сохраняем идентификатор пользователя и сообщение, которое было отправлено на нашу страницу.</li><li>Мы отвечаем на сообщение пользователя через Graph API, используя сохранённый идентификатор пользователя и идентификатор сообщения.</li></ol><p>Подробный разбор приведенного выше кода доступен на <a href="https://tsaprailis.com/2016/06/02/How-to-build-and-deploy-a-Facebook-Messenger-bot-with-Python-and-Flask-a-tutorial/">веб-сайте</a> Константиноса Цапраилиса. В этом посте я сосредоточусь главным образом на интеграции Reddit и использовании базы данных Postgres на Heroku.</p><p>Прежде чем двигаться дальше, разместим вышеприведённый код Python на Heroku. Для этого вам нужно создать локальный репозиторий Git. Выполните следующие шаги:</p><p>Выполните вышеприведенные команды в терминале и поместите вышеуказанный код Python в файл app.py. Потом поместите в Procfile следующее:</p><p>Теперь мы должны сообщить Heroku, какие библиотеки Python будет использовать наше приложение. Эти библиотеки должны быть перечислены в файле requirements.txt:</p><p>Выполните следующую команду в терминале. Вы получите такой результат:</p><p>Теперь мы создадим Git-репозиторий, который затем может быть помещен на серверы Heroku. Для его создания мы должны выполнить следующие шаги:</p><ol><li>Войти в Heroku.</li><li>Создать новый репозиторий.</li><li>Сохранить состояние проекта в репозиторий.</li><li>Отправить его на Heroku.</li></ol><p>Для этого введите следующие команды в терминал:</p><p>Сохраните адрес из строки «remote: …» — это адрес вашего Heroku-приложения. Он понадобится нам на следующем этапе.</p><h2>Создание приложения Facebook</h2><p>Для создания приложения нам нужна его страница на <a href="https://www.facebook.com/pages/create">Facebook</a>. Таково требование Facebook — у каждого приложения должна быть страница.</p><p>Теперь нам нужно зарегистрировать новое приложение. Перейдите на страницу создания приложения и следуйте инструкциям ниже:</p><figure><img src="https://media.tproger.ru/uploads/2017/05/6-3.png" alt="" /></figure><p>Затем перейдите в свой файл app.py и замените PAT в строке 9 на Page Access Token, который мы сохранили выше.</p><p>Cохраните все и отправьте код в Heroku.</p><p>Теперь, если вы перейдете на страницу Facebook и отправите сообщение на эту страницу, вы получите своё собственное сообщение в ответ. Это подтвердит, что мы всё сделали верно. Если сообщение не пришло, проверьте логи Heroku, которые дадут вам некоторое представление об ошибке. Вы можете получить доступ к логам следующим образом:</p><blockquote>Примечание: бот будет отвечать только на ваши сообщения, потому что он ещё не одобрен Facebook. Однако вы можете добавить нескольких тестировщиков. Для этого следуйте указаниям на странице разработчика.</blockquote><h2>Получение данных с Reddit</h2><p>Мы будем использовать данные из следующих источников:</p><ul><li><a href="https://reddit.com/r/GetMotivated/">GetMotivated</a>;</li><li><a href="https://reddit.com/r/Jokes/">Jokes</a>;</li><li><a href="https://reddit.com/r/Memes/">Memes</a>;</li><li>ShowerThoughts;</li></ul><p>Установим praw — Python-библиотеку сайта Reddit. Это легко сделать, введя следующую команду в терминале:</p><p>Теперь протестируем некоторые прелести Reddit в оболочке Python. В документации чётко показано, как получить доступ к Reddit и его сообществам. Сейчас самое подходящее время, чтобы использовать client_id и client_secret, которые мы создали в первой части статьи.</p><p>Не забудьте добавить в свой собственный client_id и client_secret вместо ****.</p><p>В приложении используется limit = None. Это позволит получать как можно больше сообщений. Изображения мы будем использовать только из GetMotivated и Memes, а текстовые сообщения только из Jokes и ShowerThoughts.</p><p>Теперь, когда мы знаем, как получить доступ к Reddit, используя библиотеку Python, мы можем продолжить и интегрировать его в app.py.</p><p>Добавим несколько дополнительных библиотек в наш файл requirements.txt, чтобы он выглядел примерно так:</p><p>Просто отправить пользователю изображение или текст, взятый из Reddit, было бы нетрудно. В функции send_message мы могли бы сделать что-то вроде этого:</p><p>Но нам нужен идентификатор для каждого изображения или текста, отправляемого пользователю, чтобы не отправлять одну и ту же запись дважды. Чтобы решить эту проблему, мы будем использовать PostgresSQL и идентификаторы постов Reddit (у каждого поста на Reddit есть уникальный id).</p><p>Мы будем использовать отношение «многие-ко-многим». Создадим две таблицы:</p><ul><li>пользователи;</li><li>посты.</li></ul><p>Сначала определим их в нашем коде, а затем уже разберёмся, как это будет работать:</p><p>Таким образом, в таблице будет два поля. Имя будет идентификатором, отправленным с запросом Facebook Messenger Webhook. Посты будут связаны с другой таблицей — «Посты». В таблице сообщений есть имя и URL-адрес. «Имя» будет заполнено идентификатором поста Reddit, а URL — адресом этого поста.</p><p>Итак, теперь наш окончательный код будет работать так:</p><ol><li>Мы запрашиваем список сообщений из определенного сообщества Reddit:reddit.subreddit(subreddit_name).hot(limit=None)</li><li>Проверяем, был ли конкретный пост отправлен пользователю ранее.</li><li>Если сообщение уже было отправлено, мы будем продолжать запрашивать посты от Reddit, пока не найдем новую запись.</li><li>Если сообщение не было отправлено пользователю, мы отправляем сообщение и выходим из цикла.</li></ol><p>Итоговый код app.py выглядит так:</p><p>Отправьте его в Heroku:</p><p>Осталось последнее. Нам нужно сказать Heroku, что мы будем использовать базу данных. Для этого введите в терминале следующую команду:</p><p>Так мы создадим базу данных, которой достаточно для нашего проекта. Теперь нам нужно инициализировать её правильными таблицами. Для этого мы сначала должны запустить оболочку Python на нашем сервере Heroku:</p><p>Затем в оболочке Python ввести следующие команды:</p><p>Наше приложение готово! Поздравляю!</p><h3>Некоторые интересные особенности кода</h3><p>Во-первых, в коде используется функция быстрых ответов интерфейса Facebook Messenger Bot API. Это позволяет нам отправлять некоторые предварительно отформатированные данные, которые пользователь может быстро выбрать. Они будут выглядеть примерно так:</p><figure><img src="https://media.tproger.ru/uploads/2017/05/13-1.png" alt="" /></figure><p>С каждым запросом на публикацию в API Facebook мы отправляем дополнительные данные:</p><p>Еще одна интересная особенность кода заключается в том, как мы определяем, является ли сообщение текстом, изображением или видеозаписью. В сообществе GetMotivated некоторые изображения не имеют расширения «.jpg» или «.png» в их URL, поэтому мы полагаемся на:</p><p>Вы могли заметить эту строку кода в файле app.py:</p><p>Она гарантирует, что если новые записи не будут найдены для конкретного пользователя (у каждого сообщества есть максимальное количество «горячих» сообщений), приложению будет, что отправить. В противном случае мы получим ошибку.</p><p>Следующая функция проверяет, существует ли пользователь с определенным именем или нет. Если он существует, она выбирает этого пользователя из базы данных и возвращает его. Если он не существует, она создает его, а затем возвращает вновь созданного пользователя:</p><p>Исходный код приложения также доступен <a href="https://github.com/yasoob/fb-messenger-bot">на Github</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Пишем сокращатель ссылок при помощи AWS Lambda за 2 часа</title>
      <link>https://tproger.ru/translations/aws-lambda-url-shortener</link>
      <comments>https://tproger.ru/translations/aws-lambda-url-shortener?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Богдан Федоренко]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/aws-lambda-url-shortener</guid>
      <description><![CDATA[<p>С помощью AWS Lambda можно создать собственный сокращатель URL: его внедрение, тестирование и развёртывание заняли менее двух часов.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/aws-lambda-url-shortener">Пишем сокращатель ссылок при помощи AWS Lambda за 2 часа</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[DIY]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sun, 14 May 2017 14:45:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Рассказывает Ян Куи</p><p>Интересное требование возникло на работе, когда мы обсуждали потенциальную необходимость запуска собственного сокращателя URL, потому что механизм <a href="https://developer.apple.com/library/content/documentation/General/Conceptual/AppSearch/UniversalLinks.html">универсальных ссылок</a> (в iOS 9 и выше) требует JSON-манифест на https://domain.com/apple-app-site-association.</p><p>Поскольку ОС не следует переадресациям, этот манифест должен быть размещен в корневом домене URL-сокращателя.</p><p>Из-за ограничения на AppsFlyer он не может сокращать URL, когда в приложении настроены универсальные ссылки. Мы могли бы перейти на другого поставщика, но это означало бы большую нагрузку для клиентских приложений.</p><p>Возник вопрос «Стоит ли создавать свой сокращатель ссылок?», который затем плавно перешел в «Насколько тяжело создать расширяемый сокращатель ссылок в 2017 году?».</p><p>Оказалось, что совсем не трудно, так как на то, чтобы внедрить, протестировать и развернуть, у меня ушло менее двух часов.</p><figure><img src="https://media.tproger.ru/uploads/2017/05/0-eBQwpVbKVcRdYdZF-.png" alt="" /></figure><h2>Lambda во имя победы</h2><p>Для нашего сокращателя нам необходимы следующие вещи:</p><ol><li>Конечная точка GET/{shortUrl}, которая будет перенаправлять на оригинальный URL.</li><li>Конечная точка POST/, которая будет принимать оригинальный URL и возвращать сокращенный.</li><li>index.html — страница, где каждый мог бы легко создать короткий URL.</li><li>Конечная точка GET/apple-app-site-association, которая обслуживает статичный JSON-ответ.</li></ol><p>Все эти вещи могут быть достигнуты с помощью API Gateway и Lambda.<br />Прим. перев.  Чтобы иметь представление о всём спектре сервисов, предоставляемых платформой Amazon Web Services (AWS), советуем прочитать <a href="https://tproger.ru/translations/aws-in-plain-russian/">нашу шпаргалку</a>.</p><p>У меня получилась следующая структура проекта:</p><ul><li>используется шаблон aws-nodejs фреймворка <a href="https://serverless.com/">Serverless</a>;</li><li>каждая конечная точка имеет соответствующую функцию обработки;</li><li>файл index.html в статичной папке;</li><li>тесты написаны таким образом, что могут использоваться <a href="http://theburningmonk.com/2017/02/yubls-road-to-serverless-architecture-part-2/">как в качестве интеграционных тестов, так и в качестве приемочных</a>;</li><li>скрипт build.sh, облегчающий работу;</li><li>интеграционные тесты ./build.sh int-test {env} {region} {aws_profile};</li><li>приемочные тесты ./build.sh acceptance-test {env} {region} {aws_profile};</li><li>разворачивание ./build.sh deploy {env} {region} {aws_profile}.</li></ul><figure><img src="https://media.tproger.ru/uploads/2017/05/aws-shortener.png" alt="" /></figure><h2>Конечная точка GET/apple-app-site-association</h2><p>Так как JSON статичный, есть смысл вычислить HTTP-ответ заранее и возвращать его каждый раз:</p><h2>Конечная точка POST/</h2><p>Для алгоритма сокращения URL можно найти простое и элегантное <a href="https://stackoverflow.com/questions/742013/how-to-code-a-url-shortener/742047#742047">решение</a> на StackOverflow. Вам нужен только автоматически увеличивающийся ID, вроде того, что вы обычно получаете с помощью RDBMS.</p><p>Однако я заметил, что DynamoDB будет более подходящей базой данных по следующим причинам:</p><ul><li>это управляемый сервис, поэтому не надо волноваться об инфраструктуре;</li><li><a href="https://ru.wikipedia.org/wiki/Капитальные_расходы">капитальные</a> расходы лучше <a href="https://ru.wikipedia.org/wiki/Операционные_затраты">операционных</a>;</li><li>есть возможность масштабировать пропускную способность чтения и записи, чтобы соответствовать уровню использования и обрабатывать любые скачки трафика.</li></ul><p>Но в DynamoDB нет такого понятия, как автоматически увеличивающийся ID, который необходим для алгоритма. Вместо него вы можете использовать <a href="https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/WorkingWithItems.html#WorkingWithItems.AtomicCounters">атомарный счетчик</a> для симуляции автоматического увеличения за счет дополнительной единицы записи за запрос.</p><figure><img src="https://media.tproger.ru/uploads/2017/05/url-short.png" alt="" /></figure><h2>Конечная точка GET/{shortUrl}</h2><p>Как только мы установили соответствие в таблице DynamoDB, конечная точка перенаправления стала простым взятием оригинального URL и возвращением его как части заголовка Location.</p><p>И не забудьте возвращать соответствующий статусу код HTTP, в данном случае 308 (обязательное перенаправление).</p><h2>Страница GET/index</h2><p>Наконец, для страницы index мы будем возвращать HTML (и другой тип контента вместе с HTML).</p><p>Я решил поместить HTML-файл в статичную папку, которая загружается и кэшируется в первый раз, когда вызывается функция.</p><h2>Подготовка к работе</h2><p>К счастью, у меня было много опыта <a href="http://theburningmonk.com/2017/03/slides-for-my-aws-user-group-talk-aws-lambda-from-the-trenches/">работы с AWS Lambda</a>, поэтому я знаю, что для URL-сокращателя нам необходимо:</p><ul><li>настроить автомасштабируемые параметры для таблицы DynamoDB (для которой у нас есть внутренняя система управления автоматическим масштабированием);</li><li>включить кэширование для API Gateway на производственном уровне.</li></ul><h2>Будущие улучшения</h2><p>Если поместить один и тот же URL несколько раз, то вы будете получать разные короткие ссылки. Для оптимизации нужно возвращать одну и ту же ссылку, используя кэш.</p><p>Чтобы это сделать, вы можете:</p><ol><li>Добавить GSI в таблице DynamoDB к longUrl для поддержки эффективного обратного поиска.</li><li>В функции shortUrl выполнять GET вместе с GSI для поиска существующих коротких URL.</li></ol><p>Более подходящим вариантом будет добавление GSI, нежели создание новой таблицы. Это поможет избежать транзакций между несколькими таблицами.</p>]]></content:encoded>
    </item>
    <item>
      <title>«Хочу как Дуров»: пишем простой мессенджер</title>
      <link>https://tproger.ru/translations/building-messenger</link>
      <comments>https://tproger.ru/translations/building-messenger?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Михаил Ильин]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/building-messenger</guid>
      <description><![CDATA[<p>Рабочий мессенджер с обменом сообщениями в реальном времени создаётся на Node.js, MongoDB и AngularJS и может быть встроен в проект как виджет.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/building-messenger">«Хочу как Дуров»: пишем простой мессенджер</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[DIY]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 11 May 2017 14:09:40 GMT</pubDate>
      <content:encoded><![CDATA[<p>В последнее время растёт популярность приложений для обмена сообщениями. Пользователи предпочитают мессенджеры, потому что они позволяют взаимодействовать в режиме реального времени. В этой статье мы разберём процесс создания простого приложения для обмена мгновенными сообщениями. Не будем сильно углубляться в нюансы разработки: мы напишем рабочий мессенджер, который в дальнейшем можно будет улучшить.</p><p>Статья подойдёт состоявшимся программистам и тем, кто только интересуется, <a href="https://tproger.ru/articles/kak-stat-programmistom/">как войти в IT</a>.</p><h2>Используемые технологии и инструменты</h2><ol><li>Стек MEAN (Mongo, Express, Angular, Node).</li><li>Сокеты для прямого обмена сообщениями.</li><li>AJAX для регистрации и входа.</li></ol><h2>Подготовка</h2><p>Структура будущего приложения выглядит примерно так:</p><figure><img src="https://media.tproger.ru/uploads/2017/05/1-bdJ5lKSWXS_-40D9TJ9dNA-1.jpeg" alt="" /></figure><p>Установите <a href="https://nodejs.org/en/download/package-manager/">Node.js</a> и <a href="https://docs.mongodb.com/manual/administration/install-community/">MongoDB</a>. Кроме того, нам понадобится библиотека <a href="https://angularjs.org/">AngularJS</a>, скачайте её и скопируйте в папку lib каталога Client.</p><p>Чтобы сделать пользовательский интерфейс приложения привлекательнее, вы можете воспользоваться любой CSS-библиотекой. Скачайте её и скопируйте в lib.</p><blockquote>Примечание: созданный мессенджер можно будет интегрировать в качестве виджета в любой проект.</blockquote><h2>Серверная часть</h2><h3>Шаг 1. Запуск проекта</h3><p>Перейдите в каталог Server и выполните команду:</p><p>Она запустит новый проект.</p><p>Укажите все необходимые сведения. В результате будет создан файл package.json примерно следующего вида:</p><h3>Шаг 2. Установка зависимостей</h3><ul><li>socket.io — JavaScript-библиотека, которая предоставляет двустороннюю связь клиента и сервера в режиме реального времени;</li><li>express — фреймворк Node.js, предоставляющий набор функций для разработки мобильных и веб-приложений. Позволяет отвечать на HTTP-запросы, используя промежуточное ПО, а также отображать HTML-страницы.</li></ul><p>Выполнение этих команд установит необходимые зависимости и добавит их в package.json:</p><p>Выглядеть они будут примерно так:</p><h3>Шаг 3. Создание сервера</h3><p>Создадим сервер, который обслуживает порт 3000 и возвращает HTML-файл при вызове. Для инициализации нового соединения сокету нужно передать HTTP-объект. Событие connection будет прослушивать входящие сокеты, каждый сокет будет выпускать событие disconnect, которое будет вызвано при отключении клиента. Мы будем использовать следующие функции:</p><ul><li>socket.on(...) — ожидает событие, и когда оно происходит, то выполняет функцию обратного вызова.</li><li>io.emit(...) — используется для отправки сообщения всем подключенным сокетам.</li></ul><p>Синтаксис следующий:</p><p>Создайте сервер с именем server.js. Он должен:</p><ul><li>Выводить сообщение в консоль при подключении пользователя.</li><li>Слушать событие chat message и транслировать полученное сообщение на все подключенные сокеты.</li><li>Когда пользователь отключается, выводить сообщение в консоль.</li></ul><p>В результате ваш сервер будет выглядеть примерно так:</p><h2>Клиентская часть</h2><p>Создайте файлы index.html в каталоге Client, style.css в каталоге CSS и app.js в каталоге js.</p><h3>Client/index.html</h3><p>Пусть это будет простой HTML-код, который получает и отображает наши сообщения.</p><p>Включите скрипты socket.io-client и angular.js в ваш HTML:</p><p>socket.io служит для нас клиентом. Он по умолчанию подключается к хосту, обслуживающему страницу.</p><p>В результате index.html должен выглядеть примерно так:</p><h3>CSS/style.css</h3><p>Чтобы придать нашей странице внешний вид окна чата, добавим немного стилей. Вы можете использовать любую CSS-библиотеку. Получим следующее:</p><h3>js/app.js:</h3><p>Создайте Angular-приложение и инициализируйте соединение сокета. Для этого нужны следующие функции:</p><ul><li>socket.on(...) — слушает определенное событие, и, когда оно происходит, выполняет функцию обратного вызова.</li><li>socket.emit(...) — используется для отправки сообщения конкретному событию.</li></ul><p>Синтаксис следующий:</p><p>Теперь, когда будет набран текст сообщения и нажата кнопка, вызовите функцию отправки сообщения. Когда сокет получит сообщение, отобразите его.</p><p>В результате app.js будет выглядеть примерно так:</p><h2>Запуск приложения</h2><p>Перейдите в папку с server.js и запустите команду:</p><p>Сервер начнет работу на порте 3000. Чтобы в этом убедиться, перейдите по ссылке в браузере:</p><p>Ваш собственный мессенджер готов!</p><h2>Что можно улучшить?</h2><p>Можно создать базу данных для хранения информации о пользователях и истории сообщений. Лучше, если она будет масштабируемой, потому что в дальнейшем это позволит добавить больше функций.</p><p>Установите Mongoose или MongoDB для работы с базами данных Mongo:</p><p>или:</p><p>Можете ознакомиться с документацией по их использованию: <a href="http://mongoosejs.com/docs/index.html">mongoose</a> и <a href="https://docs.mongodb.com/getting-started/node/client/">mongodb</a>.</p><p>Схема должна получиться примерно следующего вида:</p><p>Собеседникам могут быть присвоены следующие статусы:</p><ul><li>Friend — собеседник является другом.</li><li>Pending — собеседник пока не принял запрос.</li><li>Blocked — собеседник заблокирован.</li></ul><p>Предположим, что собеседник отклонил запрос на приватную беседу. В таком случае отправитель должен иметь возможность снова направить запрос.</p><p>Неплохо было бы реализовать для пользователя функционал сохранения сообщений в дополнительные коллекции. Пусть каждый её объект содержит сообщение, отправителя, получателя и время. Спроектируйте вашу базу данных в соответствии с конкретными потребностями и методами обработки сообщений.</p><p>Также вы можете создать REST API для обслуживания клиента. Например, конечную точку, отправляющую домашнюю страницу, из которой пользователи могут выполнять другие запросы.</p><p>Некоторые из возможных конечных точек API:</p><p>Вот какой мессенджер получился у автора статьи:</p><figure><img src="https://media.tproger.ru/uploads/2017/05/1-Qxpy7GN8132veIMzUfWOLA.png" alt="" /></figure><figure><img src="https://media.tproger.ru/uploads/2017/05/1-HRqQTX-ACCAlU2UQ9PNaGg.png" alt="" /></figure><p><a href="https://github.com/sudheeshshetty/Chat">Исходный код</a> приложения можно найти на GitHub.</p>]]></content:encoded>
    </item>
    <item>
      <title>На пути к Deep Blue: пошаговое руководство по созданию простого ИИ для игры в шахматы</title>
      <link>https://tproger.ru/translations/simple-chess-ai-step-by-step</link>
      <comments>https://tproger.ru/translations/simple-chess-ai-step-by-step?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Дмитрий Юрченко]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/simple-chess-ai-step-by-step</guid>
      <description><![CDATA[<p>Пошаговый пример на JavaScript показывает создание простого шахматного ИИ с библиотеками chess.js и chessboard.js для генерации ходов и доски.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/simple-chess-ai-step-by-step">На пути к Deep Blue: пошаговое руководство по созданию простого ИИ для игры в шахматы</a>»</p>]]></description>
      <category><![CDATA[Алгоритмы и структуры данных]]></category>
      <category><![CDATA[Разработка игр]]></category>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[DIY]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 10 May 2017 11:03:21 GMT</pubDate>
      <content:encoded><![CDATA[<p>Рассмотрим некоторые базовые концепции, которые помогут нам создать простой искусственный интеллект, умеющий играть в шахматы:</p><ul><li>перемещение;</li><li>оценка шахматной доски;</li><li>минимакс;</li><li>альфа-бета-отсечение.</li></ul><p>На каждом шаге мы будем улучшать наш алгоритм с помощью одного из этих проверенных временем методов шахматного программирования. Вы увидите, как каждый из них влияет на стиль игры алгоритма.</p><p>Готовый алгоритм можно найти на <a href="https://github.com/lhartikk/simple-chess-ai">GitHub</a>.</p><h2>Шаг 1. Генерация ходов и визуализация шахматной доски</h2><p>Мы будем использовать библиотеки <a href="https://github.com/jhlywa/chess.js">chess.js</a> для генерации ходов и <a href="https://github.com/oakmac/chessboardjs/">chessboard.js</a> для визуализации доски. Библиотека для генерации ходов реализует все правила шахмат. Исходя из этого, мы можем рассчитать все ходы для данного состояния доски.</p><figure><img src="https://media.tproger.ru/uploads/2017/05/2.png" alt="" /></figure><p>Использование этих библиотек поможет нам сосредоточиться только на самой интересной задаче — создании алгоритма, который находит лучший ход. Мы начнем с написания функции, которая возвращает случайный ход из всех возможных ходов:</p><p>Хотя этот алгоритм не очень солидный шахматист, но это хорошая отправная точка, поскольку его уровня достаточно, чтобы сыграть с нами:</p><figure><img src="https://media.tproger.ru/uploads/2017/05/1.gif" alt="" /></figure><p>Посмотреть, что получилось на данном этапе, вы можете на <a href="https://jsfiddle.net/lhartikk/m14epfwb/4/">JSFiddle</a>.</p><h2>Шаг 2. Оценка доски</h2><p>Теперь попробуем понять, какая из сторон сильнее в определенном положении. Самый простой способ добиться этого — посчитать относительную силу фигур на доске, используя следующую таблицу:</p><figure><img src="https://media.tproger.ru/uploads/2017/05/3.png" alt="" /></figure><p>С помощью функции оценки мы можем создать алгоритм, который выбирает ход с наивысшей оценкой:</p><p>Единственным ощутимым улучшением является то, что теперь наш алгоритм съест фигуру, если это возможно:</p><figure><img src="https://media.tproger.ru/uploads/2017/05/4.gif" alt="" /></figure><p>Посмотреть, что получилось на данном этапе, вы можете на <a href="https://jsfiddle.net/lhartikk/m5q6fgtb/1/">JSFiddle</a>.</p><h2>Шаг 3. Дерево поиска и минимакс</h2><p>Затем мы создадим дерево поиска, из которого алгоритм может выбрать лучший ход. Это делается с помощью алгоритма «минимакс».</p><p>Прим. перев. В одной из наших статей мы уже имели дело с <a href="https://tproger.ru/translations/tic-tac-toe-minimax/">минимаксом</a> — учились создавать ИИ, который невозможно обыграть в крестики-нолики.</p><p>В этом алгоритме рекурсивное дерево всех возможных ходов исследуется до заданной глубины, а позиция оценивается на «листьях» дерева.</p><p>После этого мы возвращаем либо наименьшее, либо наибольшее значение потомка в родительский узел, в зависимости от того, чей просчитывается ход (то есть мы стараемся минимизировать или максимизировать результат на каждом уровне).</p><figure><img src="https://media.tproger.ru/uploads/2017/05/4.jpg" alt="" /></figure><p>С минимаксом наш алгоритм начинает понимать основную тактику шахмат:</p><figure><img src="https://media.tproger.ru/uploads/2017/05/2.gif" alt="" /></figure><p>Посмотреть, что получилось на данном этапе, вы можете на <a href="https://jsfiddle.net/k96eoq0q/1/">JSFiddle</a>.</p><p>Эффективность минимакса в значительной степени зависит от достижимой глубины поиска. Именно это мы улучшим на следующем шаге.</p><h2>Шаг 4. Альфа-бета-отсечение</h2><p><a href="https://ru.wikipedia.org/wiki/Альфа-бета-отсечение">Альфа-бета-отсечение</a> — это метод оптимизации алгоритма «минимакс», который позволяет игнорировать некоторые ветви в дереве поиска. Это позволяет нам намного глубже оценить дерево поиска, используя те же ресурсы.</p><p>Альфа-бета-отсечение основано на ситуации, когда мы можем прекратить оценивать часть дерева поиска, если найдем шаг, который приведет к худшей ситуации, чем та, к которой приводил ранее обнаруженный шаг.</p><p>Альфа-бета-отсечение не влияет на результат минимакса, оно только ускоряет его.</p><p>Этот алгоритм будет более эффективным, если мы сначала проверим те пути, которые ведут к хорошим ходам:</p><figure><img src="https://media.tproger.ru/uploads/2017/05/5-1.jpg" alt="" /></figure><p>С альфа-бета-отсечением мы получаем значительное улучшение минимакса, как показано в следующем примере:</p><figure><img src="https://media.tproger.ru/uploads/2017/05/6.png" alt="" /></figure><p>Посмотреть, что получилось на данном этапе, вы можете на <a href="https://jsfiddle.net/Laa0p1mh/3/">JSFiddle</a>.</p><h2>Шаг 5. Улучшенная функция оценки</h2><p>Первоначальная функция оценки довольно наивна, поскольку мы просто подсчитываем очки фигур, которые находятся на доске. Чтобы улучшить её, мы начнём учитывать положение фигур. Например, конь в центре доски «дороже», потому что он имеет больше доступных ходов и, следовательно, более активен, чем конь на краю доски.</p><p>Мы будем использовать слегка скорректированную версию квадратных таблиц, первоначально описанных в вики Chess Programming.</p><figure><img src="https://media.tproger.ru/uploads/2017/05/7.png" alt="" /></figure><p>Применив это улучшение, мы получим алгоритм, который неплохо играет в шахматы, по крайней мере, с точки зрения простого игрока:</p><figure><img src="https://media.tproger.ru/uploads/2017/05/3.gif" alt="" /></figure><p>Посмотреть, что получилось на данном этапе, вы можете на <a href="https://jsfiddle.net/q76uzxwe/1/">JSFiddle</a>.</p><h2>Заключение</h2><p>Сила даже простого шахматного алгоритма состоит в том, что он не совершает глупых ошибок. Тем не менее, ему по-прежнему не хватает стратегического взгляда на ситуацию.</p><p>С помощью методов, которые представлены здесь, мы смогли запрограммировать шахматный алгоритм, который может неплохо играть в шахматы. В финальном алгоритме реализация ИИ занимает всего 200 строк кода — это означает, что базовые принципы довольно просты. Вы можете посмотреть <a href="https://github.com/lhartikk/simple-chess-ai">окончательную версию</a> программы на GitHub.</p><p>Вот некоторые дополнительные улучшения, которые мы могли бы внести в алгоритм:</p><ul><li>упорядочивание ходов;</li><li>ускорение генерации ходов;</li><li>оценка эндшпиля.</li></ul><p>Если вы хотите узнать о шахматных алгоритмах больше, зайдите на Chess Programming Wiki.</p>]]></content:encoded>
    </item>
    <item>
      <title>На Raspberry Pi теперь можно реализовать голосовое управление при помощи Voice Kit в рамках сервиса Google AIY Projects</title>
      <link>https://tproger.ru/news/raspberry-pi-voice-kit-google-aiy</link>
      <comments>https://tproger.ru/news/raspberry-pi-voice-kit-google-aiy?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Саша Ушатинская]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/raspberry-pi-voice-kit-google-aiy</guid>
      <description><![CDATA[<p>Набор Voice Kit из проекта Google AIY Projects расширяет Raspberry Pi голосовым интерфейсом, используя микрофоны, динамик и плату расширения.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/raspberry-pi-voice-kit-google-aiy">На Raspberry Pi теперь можно реализовать голосовое управление при помощи Voice Kit в рамках сервиса Google AIY Projects</a>»</p>]]></description>
      <category><![CDATA[Google]]></category>
      <category><![CDATA[Raspberry Pi]]></category>
      <category><![CDATA[DIY]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 05 May 2017 16:30:11 GMT</pubDate>
      <content:encoded><![CDATA[<p>Google запустила сервис <a href="https://aiyprojects.withgoogle.com/">AIY Projects</a>, цель которого — сделать технологии искусственного интеллекта компании доступными для использования в самостоятельных проектах различных разработчиков. В планах у Google выпуск нескольких DIY-наборов аппаратного обеспечения, первым из которых стал <a href="https://aiyprojects.withgoogle.com/voice/">Voice Kit</a>. Он позволяет создать голосовой пользовательский интерфейс и расширяет функционал платы Raspberry Pi, которая активно используется в изготовлении умных устройств.</p><h3>Обзор комплекта Voice Kit</h3><figure><img src="https://media.tproger.ru/uploads/2017/05/1-3.png" alt="" /></figure><p>Распространяемое аппаратное обеспечение Voice Hardware Accessory on Top (HAT) позволяет осуществлять захват и воспроизведение аудио: плата расширения соединяется с динамиком и звуковой платой с двумя микрофонами, а также содержит контакты GPIO для подключения низковольтных компонентов и гнездовой разъем для блока питания.</p><p>Комплект включает в себя инструкции по сборке голосового интерфейса, который может как запускаться непосредственно на устройстве, так и подключаться к облачным сервисам: Google недавно <a href="https://tproger.ru/news/google-cloud-speech-api/">открыла доступ</a> к технологии распознавания речи Cloud Speech API и <a href="https://tproger.ru/news/introducing-google-assistant-sdk/">представила</a> набор инструментов Google Assistant SDK.</p><h3>Взаимосвязь с Raspberry Pi</h3><p>Отношение здесь прямое: Voice Kit — совместный проект Google и Raspberry Pi, комплект тестировался на плате Pi 3 версии B и <a href="https://www.raspberrypi.org/blog/free-aiy-projects-voice-kit-magpi-57/">распространяется</a> с 57-м выпуском журнала MagPi. Вот официальный видеообзор:</p><p>Идея сделать серию комплектов «собери ИИ сам» появилась после общения с разработчиками, которые выкладывают на <a href="https://www.hackster.io/">Hackster</a> множество проектов, создаваемых на базе технологий Google.</p><p>Сообщество энтузиастов очень велико, и уже вчера, сразу после выхода журнала и начала распространения DIY-набора среди подписчиков и по книжным магазинам (в основном, в США и Великобритании), в Сети стали появляться посты с благодарностями. Кто-то собирается добавить голосовое управление к уже имеющимся роботам:</p><p>А кто-то просто вывел коробочку на прогулку:</p><p>Этот парень собирается отдать комплект бесплатно по репосту (отправка в любую точку мира, можно успеть поучаствовать до 11:00 по московскому времени 06.05):</p><h3>Что еще интересного?</h3><p>На Voice Kit, кроме прочего, можно запустить <a href="https://developer.android.com/things/index.html">Android Things</a>, что позволяет легко создавать опытные образцы IoT-устройств и затем масштабировать их до готовых коммерческих продуктов. Скачать превью для разработчиков можно на <a href="https://developer.android.com/things/preview/index.html">официальном сайте</a>.</p><p>В ближайшее время, видимо, предстоит наблюдать гонку «интеллектуального аппаратного обеспечения» — напомним, что недавно Microsoft в попытке обойти конкурентов в сфере цифровых ассистентов <a href="https://tproger.ru/news/raspberry-pi-3-cortana-support/">обеспечила</a> поддержку голосового интерфейса Cortana для Raspberry Pi 3, выпустив обновление Windows 10 IoT Core.</p>]]></content:encoded>
    </item>
    <item>
      <title>Пишем веб-приложение для распознавания лиц за час</title>
      <link>https://tproger.ru/translations/face-recognition-app-in-an-hour</link>
      <comments>https://tproger.ru/translations/face-recognition-app-in-an-hour?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Дмитрий Юрченко]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/face-recognition-app-in-an-hour</guid>
      <description><![CDATA[<p>Amazon Rekognition распознаёт лица и объекты на фотографиях; пример получает снимки с веб-камеры iMac и выполняет распознавание через AWS API.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/face-recognition-app-in-an-hour">Пишем веб-приложение для распознавания лиц за час</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[Ruby]]></category>
      <category><![CDATA[Компьютерное зрение]]></category>
      <category><![CDATA[Распознавание]]></category>
      <category><![CDATA[DIY]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 04 May 2017 13:33:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Рассказывает Деван Сабаратнам, разработчик с 30-летним стажем</p><p>В минувшие выходные, пролистывая Amazon Web Services, я заметил новый сервис под названием <a href="https://aws.amazon.com/ru/rekognition/">«Rekognition»</a>. Я предположил, что это опечатка (recognition — англ. распознавание), но она привлекла мое внимание. Я заинтересовался: что это за сервис? Amazon привык добавлять новые сервисы в свою платформу с пугающей регулярностью, и этот я пропустил.</p><p>Я узнал, что в конце 2016 года Amazon выпустила свой собственный сервис для распознавания изображений на базе глубокого обучения на их платформе. Он может распознавать не только лица, но и объекты на фото. Так как сервис довольно новый, подробностей о нём было немного, но мне захотелось немедленно попробовать его. В общем, в течение часа я написал пример веб-страницы, которая может получать фотографии с моей веб-камеры и выполнять элементарное распознавания лица на нем.</p><p>Прим. перев.  Чтобы не теряться в многочисленных сервисах Amazon, советуем вам прочитать <a href="https://tproger.ru/translations/aws-in-plain-russian/">нашу шпаргалку</a> по AWS.</p><p>Раньше я занимался технологией распознавания лиц, используя сторонние библиотеки, а также <a href="https://www.microsoft.com/cognitive-services/en-us/face-api">Microsoft Face API</a>, но все попытки создания подобного приложения не увенчались успехом. Но, просматривая документацию «Rekognition», я понял, что AWS API на самом деле очень прост в использовании. Я немедленно принялся за работу.</p><h2>Цель</h2><p>Мне была нужна простая веб-страница, которая позволила бы делать фотографию с помощью камеры моего iMac и выполнять распознавание на фотографии. В частности, я хотел бы определять пользователя, сидящего перед компьютером.</p><p>Сервис Amazon Rekognition позволяет создавать одну или несколько коллекций. Коллекция — это набор лицевых векторов для фотографий, которые вы хотите сохранить.</p><blockquote>Примечание: Сервис сохраняет не фотографии, а их JSON-представление.</blockquote><p>После создания коллекции вы можете сфотографировать предмет, сравнить его свойства c сохранёнными и вернуть ближайшее соответствие. Звучит просто, не так ли? По правде говоря, разработка фронтенда веб-страницы для получения данных с камеры заняла больше времени, чем написание бэкенда для распознавания.</p><p>В общем, веб-страница позволяет создавать или удалять коллекцию лицевых данных на Amazon, загружать новые данные, полученные из фотографии, в свою коллекцию и сравнивать новые фотографии с существующей коллекцией, чтобы найти совпадение. А в качестве дополнительной фичи я также добавил в эту демку службу <a href="https://aws.amazon.com/ru/polly/">Amazon Polly</a>, чтобы после распознавания фотографии страница приветствовала пользователя.</p><figure><img src="https://media.tproger.ru/uploads/2017/04/1.png" alt="" /></figure><h3>Фронтенд</h3><p>Я не знал, какую библиотеку использовать для захвата изображения с помощью камеры iMac. В итоге я нашел на GitHub библиотеку <a href="https://github.com/amw/jpeg_camera">JPEG Camera</a>, которая позволяет использовать HTML5 Canvas или Flash для съёмки фото. Я решил использовать её и настроил под себя написанный на JavaScript образец.</p><h3>Бэкенд</h3><p>Для бэкенда я использовал Ruby-библиотеку <a href="http://www.sinatrarb.com">Sinatra</a>, которая может выполнять всю тяжёлую работу с помощью AWS. Я часто использовал Sinatra (на самом деле <a href="http://padrinorb.com">Padrino</a>) в своих проектах и настоятельно рекомендую эту платформу.</p><blockquote>Примечание: Amazon Rekognition предлагает сначала загружать исходные фотографии, которые использует его API, в Amazon S3, а затем обрабатывать их. Я хотел избежать этого ненужного шага и вместо этого отправлять изображения непосредственно в API, что мне в итоге удалось сделать.</blockquote><p>Я сумел сделать то же самое с их приветствием Polly . Вместо того, чтобы сохранять аудио в MP3-файл и проигрывать его, у меня получилось закодировать данные MP3 непосредственно в тег &lt;audio&gt; на странице и воспроизвести их оттуда.</p><h3>Код</h3><p>Я разместил весь код этого проекта на <a href="https://github.com/CyberFerret/FaceRekognition-Demo">моей странице</a> на GitHub. Не стесняйтесь использовать и изменять его. Ниже я постараюсь объяснить код более подробно.</p><h2>Пишем приложение</h2><p>Прежде всего, вам понадобится учетная запись <a href="https://aws.amazon.com/ru/">Amazon AWS</a>. Я не буду вдаваться в подробности, поскольку это несложно, а в случае затруднений можно легко найти информацию в Интернете.</p><h3>Создание пользователя AWS IAM</h3><p>Как только вы создали учетную запись AWS, первое, что нам нужно сделать, — создать пользователя Amazon IAM (Identity &amp; Access Management), который имеет права на использование службы Rekognition. Мы также зададим права для Amazon Polly.</p><p>В консоли Amazon нажмите на кнопку «Сервисы» в верхнем левом углу, затем выберите «IAM». В меню слева выберите «Пользователи». Вы должны увидеть список существующих пользователей IAM, которых вы создали в консоли, если вы делали это в прошлом.</p><figure><img src="https://media.tproger.ru/uploads/2017/04/2.png" alt="" /></figure><p>Нажмите кнопку «Добавить пользователя», расположенную в верхней части списка, чтобы добавить нового пользователя IAM.</p><figure><img src="https://media.tproger.ru/uploads/2017/04/3.png" alt="" /></figure><p>Дайте пользователю имя и убедитесь, что вы отметили пункт «Programmatic Access», так как вы будете использовать этот IAM в вызове API.</p><figure><img src="https://media.tproger.ru/uploads/2017/04/4.png" alt="" /></figure><p>Далее приведены настройки разрешений. Убедитесь, что вы щелкаете по третьему квадратику на экране с надписью «Attach existing policies directly». Затем в поле поиска «Filter: Policy Type» введите «rekognition». Выберите «AmazonRekognitionFullAccess» из списка, поставив рядом с ним галочку.</p><p>Затем измените фильтр поиска на «polly» и поместите галочку рядом с «AmazonPollyFullAccess».</p><p>Теперь у этого IAM есть права, достаточные для Amazon Rekognition и Amazon Polly. Нажмите «Next: Review» в правом нижнем углу.</p><figure><img src="https://media.tproger.ru/uploads/2017/04/5.png" alt="" /></figure><p>На странице просмотра вы должны увидеть 2 политики использования, дающие вам полный доступ к Rekognition и Polly. Если вы их не видите, вернитесь и повторите предыдущий шаг. Затем нажмите кнопку «Создать пользователя» в правом нижнем углу.</p><figure><img src="https://media.tproger.ru/uploads/2017/04/6.png" alt="" /></figure><p>Эта страница важна. Запишите ключи AWS Key и AWS Secret, которые вы указали на этой странице, поскольку нам необходимо включить их в наше приложение ниже.</p><p>Это единственный раз, когда вам будут показаны эти ключи, поэтому сохраните их и файл CSV с этой страницы в надёжном месте.</p><h3>Загрузка кода</h3><p>Теперь загрузите пример кода с <a href="https://github.com/CyberFerret/FaceRekognition-Demo">моей страницы GitHub</a>, чтобы вы могли изменить его по мере необходимости. Загрузите код в виде ZIP-файла, либо склонируйте его в вашу рабочую папку.</p><p>Первое, что вам нужно сделать, — это создать файл с именем .env в рабочей папке и ввести эти две строки, заменив в них ключи Amazon IAM на свои:</p><p>Теперь, если у вас установлен Ruby (не Ruby on Rails), то для установки зависимостей запустите команду:</p><p>Для запуска приложения введите эту команду:</p><p>Она должна запустить веб-браузер на порте 4567, чтобы вы могли увидеть веб-страницу и начать тестирование:</p><h3>Использование приложения</h3><p>Сама веб-страница довольно проста. Вы должны увидеть потоковое изображение в верхней части экрана, которое представляет собой канал с вашей веб-камеры.</p><p>Сперва создайте коллекцию, щелкнув по ссылке в самом нижнем левом углу страницы. Это создаст пустую коллекцию на серверах Amazon для хранения ваших изображений. Обратите внимание: имя по умолчанию для этой коллекции — faceapp_test, но вы можете изменить его в коде faceapp.rb (строка 17).</p><p>Затем, чтобы начать добавление лиц в свою коллекцию, попросите нескольких людей сесть перед вашим компьютером или телефоном и убедиться, что их лицо находится только в рамке для фотографий (несколько лиц сделают сканирование неудачным). Когда всё будет готово, введите их имя в текстовое поле и нажмите кнопку «Добавить в коллекцию». Должно появиться сообщение о том, что данные о лице были добавлены в базу данных.</p><p>После того, как вы создали несколько лиц в своей базе данных, вы можете попросить случайного человека сесть перед камерой и нажать «Сравнить изображение». Если этот человек уже добавлен в коллекцию, на экране должно появиться его имя.</p><p>Обратите внимание, что обычный способ работы Amazon Rekognition заключается в том, чтобы загружать фотографию в Amazon S3 Bucket, а затем обрабатывать его оттуда, но я хотел обойти этот шаг и фактически отправить данные фотографии непосредственно в Rekognition как поток байтов, закодированный в Base64. К счастью, aws-sdk для Ruby позволяет использовать оба метода.</p><h3>Разбор кода</h3><p>Прежде всего, давайте взглянем на HTML-страницу:</p><p>Структура страницы проста: всего несколько блоков, кнопок и ссылок. Обратите внимание, что мы используем jQuery, а также Moment.js для настраиваемого приветствия. Следует обратить внимание на код faceapp.js, который выполняет все сложные задачи и ссылки на библиотеку камер JPEG.</p><p>Вы также можете заметить теги &lt;audio&gt; в нижней части файла — это аудио-приветствие, которое мы отправляем пользователю.</p><p>Теперь разберем JS-файл приложения:</p><p>Это настраивает библиотеку JPEG Camera, чтобы отображать канал на экране и обрабатывать загрузку изображений.</p><p>Функция add_to_collection() захватывает изображение с камеры, а затем выполняет запись в конечную точку /upload вместе с именем пользователя в качестве параметра. Функция проверяет, действительно ли вы ввели имя, которое нужно в качестве уникального идентификатора этих данных.</p><p>Функция загрузки проверяет вызов и выводит сообщение об успешном завершении или ошибке.</p><p>Функция compare_image() вызывается, когда вы нажимаете кнопку «Сравнить изображение». Она захватывает кадр из камеры и передает POST-данные в /compare. Эта конечная точка вернет либо ошибку, либо структуру JSON, содержащую id (имя) найденного лица, а также процент схожести.</p><p>Если лицо совпадёт с данными из коллекции, функция отправит имя найденного лица в /speech. Эта конечная точка вызывает службу Amazon Polly, чтобы преобразовать приветствие в файл MP3, который можно воспроизвести пользователю.</p><p>Служба Amazon Polly возвращает приветствие в виде бинарного потока MP3, поэтому мы берем этот поток ввода-вывода, шифруем его в формате Base64 и помещаем в качестве закодированной исходной ссылки в теги &lt;audio&gt; на нашей веб-странице. Затем мы можем вызвать .play() для воспроизведения MP3 через динамики пользователя с помощью HTML5 Web Audio API.</p><p>Прим. перев.  Вы можете узнать о Web Audio побольше, прочитав <a href="https://tproger.ru/translations/web-audio-intro/">нашу серию статей</a> по этой теме.</p><p>Наконец, в JS-файле приложения есть функция greetingTime(). Она решает, стоит ли говорить «доброе утро / день / вечер» в зависимости от времени суток пользователя.</p><p>Теперь взглянем на код Ruby:</p><p>Здесь задан блок настройки конфигурации аутентификации AWS и имени коллекции по умолчанию, которое мы будем использовать (вы можете его свободно менять).</p><p>Остальная часть кода — это конечные точки, которые Sinatra будет слушать. Он прослушивает GET в /, чтобы отобразить фактическую веб-страницу конечному пользователю, а также слушает вызовы POST к /upload, /compare и /speech, которым JS-файл отправляет данные. Только 3–4 строки кода для каждой из этих конечных точек фактически выполняют задачи распознавания лиц и речи. Подробнее о них можно узнать из <a href="https://docs.aws.amazon.com/sdkforruby/api/Aws/Rekognition/Client.html">документации AWS SDK</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Как создать свой язык программирования: теория, инструменты и советы от практика</title>
      <link>https://tproger.ru/translations/how-to-create-programming-language</link>
      <comments>https://tproger.ru/translations/how-to-create-programming-language?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Саша Ушатинская]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/how-to-create-programming-language</guid>
      <description><![CDATA[<p>Программист Вильям В. Вольд полгода разрабатывал язык Pinecone с переменными, функциями и пользовательскими структурами данных и делится опытом и советами.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/how-to-create-programming-language">Как создать свой язык программирования: теория, инструменты и советы от практика</a>»</p>]]></description>
      <category><![CDATA[Языки программирования]]></category>
      <category><![CDATA[DIY]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 11 Apr 2017 18:59:46 GMT</pubDate>
      <content:encoded><![CDATA[<p>Рассказывает программист Вильям В. Вольд</p><p>На протяжении последних шести месяцев я работал над созданием языка программирования (ЯП) под названием Pinecone. Я не рискну назвать его законченным, но использовать его уже можно — он содержит для этого достаточно элементов, таких как переменные, функции и пользовательские структуры данных. Если хотите ознакомиться с ним перед прочтением, предлагаю посетить <a href="https://pinecone-lang.herokuapp.com/index.html">официальную страницу</a> и <a href="https://github.com/william01110111/Pinecone">репозиторий на GitHub</a>.</p><h2>Введение</h2><p>Я не эксперт. Когда я начал работу над этим проектом, я понятия не имел, что делаю, и всё еще не имею. Я никогда целенаправленно не изучал принципы создания языка — только прочитал некоторые материалы в Сети и даже в них не нашёл для себя почти ничего полезного.</p><p>Тем не менее, я написал абсолютно новый язык. И он работает. Наверное, я что-то делаю правильно.</p><p>В этой статье я постараюсь показать, каким образом Pinecone (и другие языки программирования) превращают исходный код в то, что многие считают магией. Также я уделю внимание ситуациям, в которых мне приходилось искать компромиссы, и поясню, почему я принял те решения, которые принял.</p><p>Текст точно не претендует на звание полноценного руководства по созданию языка программирования, но для любознательных будет хорошей отправной точкой.</p><h2>Первые шаги</h2><p>«А с чего вообще начинать?» — вопрос, который другие разработчики часто задают, узнав, что я пишу свой язык. В этой части постараюсь подробно на него ответить.</p><h3>Компилируемый или интерпретируемый?</h3><p>Компилятор анализирует программу целиком, превращает её в машинный код и сохраняет для последующего выполнения. Интерпретатор же разбирает и выполняет программу построчно в режиме реального времени.</p><p>Технически любой язык можно как компилировать, так и интерпретировать. Но для каждого языка один из методов подходит больше, чем другой, и выбор парадигмы на ранних этапах определяет дальнейшее проектирование. В общем смысле интерпретация отличается гибкостью, а компиляция обеспечивает высокую производительность, но это лишь верхушка крайне сложной темы.</p><p>Я хотел создать простой и при этом производительный язык, каких немного, поэтому с самого начала решил сделать Pinecone компилируемым. Тем не менее, интерпретатор у Pinecone тоже есть — первое время запуск был возможен только с его помощью, позже объясню, почему.</p><blockquote>Прим. перев. Кстати, у нас есть краткий обзор серии статей по созданию собственного интерпретатора — это отличное упражнение для тех, кто изучает Python.</blockquote><h3>Выбор языка</h3><p>Своеобразный мета-шаг: язык программирования сам является программой, которую надо написать на каком-то языке. Я выбрал C++ из-за производительности, большого набора функциональных возможностей, и просто потому что он мне нравится.</p><p>Но в целом совет можно дать такой:</p><ul><li>интерпретируемый ЯП крайне рекомендуется писать на компилируемом ЯП (C, C++, Swift). Иначе потери производительности будут расти как снежный ком, пока мета-интерпретатор интерпретирует ваш интерпретатор;</li><li>компилируемый ЯП можно писать на интерпретируемом ЯП (Python, JS). Возрастёт время компиляции, но не время выполнения программы.</li></ul><h3>Проектирование архитектуры</h3><p>У структуры языка программирования есть несколько ступеней от исходного кода до исполняемого файла, на каждой из которых определенным образом происходит форматирование данных, а также функции для перехода между этими ступенями. Поговорим об этом подробнее.</p><h2>Лексический анализатор / лексер</h2><figure><img src="https://media.tproger.ru/uploads/2017/04/prog-lang-1.png" alt="" /></figure><p>Первый шаг в большинстве ЯП — это <a href="https://ru.wikipedia.org/wiki/%D0%9B%D0%B5%D0%BA%D1%81%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7">лексический анализ</a>. Говоря по-простому, он представляет собой разбиение текста на токены, то есть единицы языка: переменные, названия функций (идентификаторы), операторы, числа. Таким образом, подав лексеру на вход строку с исходным кодом, мы получим на выходе список всех токенов, которые в ней содержатся.</p><p>Обращения к исходному коду уже не будет происходить на следующих этапах, поэтому лексер должен выдать всю необходимую для них информацию.</p><h3>Flex</h3><p>При создании языка первым делом я написал лексер. Позже я изучил инструменты, которые могли бы сделать лексический анализ проще и уменьшить количество возникающих багов.</p><p>Одним из основных таких инструментов является <a href="https://github.com/westes/flex">Flex</a> — генератор лексических анализаторов. Он принимает на вход файл с описанием грамматики языка, а потом создаёт программу на C, которая в свою очередь анализирует строку и выдаёт нужный результат.</p><h3>Моё решение</h3><p>Я решил оставить написанный мной анализатор. Особых преимуществ у Flex я в итоге не увидел, а его использование только создало бы дополнительные зависимости, усложняющие процесс сборки. К тому же, мой выбор обеспечивает больше гибкости — например, можно добавить к языку оператор без необходимости редактировать несколько файлов.</p><h2>Синтаксический анализатор / парсер</h2><figure><img src="https://media.tproger.ru/uploads/2017/04/prog-lang-2.png" alt="" /></figure><p>Следующая стадия — парсер. Он преобразует исходный текст, то есть список токенов (с учётом скобок и порядка операций), в <a href="https://ru.wikipedia.org/wiki/%D0%90%D0%B1%D1%81%D1%82%D1%80%D0%B0%D0%BA%D1%82%D0%BD%D0%BE%D0%B5_%D1%81%D0%B8%D0%BD%D1%82%D0%B0%D0%BA%D1%81%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%BE">абстрактное синтаксическое дерево</a>, которое позволяет структурно представить правила создаваемого языка. Сам по себе процесс можно назвать простым, но с увеличением количества языковых конструкций он сильно усложняется.</p><h3>Bison</h3><p>На этом шаге я также думал использовать стороннюю библиотеку, рассматривая <a href="https://www.gnu.org/software/bison/">Bison</a> для генерации синтаксического анализатора. Он во многом похож на Flex — пользовательский файл с синтаксическими правилами структурируется с помощью программы на языке C. Но я снова отказался от средств автоматизации.</p><h3>Преимущества кастомных программ</h3><p>С лексером моё решение писать и использовать свой код (длиной около 200 строк) было довольно очевидным: я люблю задачки, а эта к тому же относительно тривиальная. С парсером другая история: сейчас длина кода для него — 750 строк, и это уже третья попытка (первые две были просто ужасны).</p><p>Тем не менее, я решил делать парсер сам. Вот основные причины:</p><ul><li>минимизация <a href="https://ru.wikipedia.org/wiki/%D0%9F%D0%B5%D1%80%D0%B5%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BD%D1%82%D0%B5%D0%BA%D1%81%D1%82%D0%B0">переключения контекста</a>;</li><li>упрощение сборки;</li><li>желание справиться с задачей самостоятельно.</li></ul><p>В целесообразности решения меня убедило высказывание Уолтера Брайта (создателя языка D) <a href="http://www.drdobbs.com/architecture-and-design/so-you-want-to-write-your-own-language/240165488">в одной из его статей</a>:</p><blockquote>Я бы не советовал использовать генераторы лексических и синтаксических анализаторов, а также другие так называемые «компиляторы компиляторов». Написание лексера и парсера не займёт много времени, а использование генератора накрепко привяжет вас к нему в дальнейшей работе (что имеет значение при портировании компилятора на новую платформу). Кроме того, генераторы отличаются выдачей не релевантных сообщений об ошибках.</blockquote><h2>Абстрактный семантический граф</h2><figure><img src="https://media.tproger.ru/uploads/2017/04/prog-lang-3.png" alt="" /></figure><p>В этой части я реализовал структуру, по своей сути наиболее близкую к «промежуточному представлению» (intermediate representation) в LLVM. Существует небольшая, но важная разница между абстрактным синтаксическим деревом (АСД) и абстрактным семантическим графом (АСГ).</p><h3>АСГ vs АСД</h3><p>Грубо говоря, семантический граф — это синтаксическое дерево с контекстом. То есть, он содержит информацию наподобие какой тип возвращает функция или в каких местах используется одна и та же переменная. Из-за того, что графу нужно распознать и запомнить весь этот контекст, коду, который его генерирует, необходима поддержка в виде множества различных поясняющих таблиц.</p><h3>Запуск</h3><p>После того, как граф составлен, запуск программы становится довольно простой задачей. Каждый узел содержит реализацию функции, которая получает некоторые данные на вход, делает то, что запрограммировано (включая возможный вызов вспомогательных функций), и возвращает результат. Это — интерпретатор в действии.</p><h2>Варианты компиляции</h2><p>Вы, наверное, спросите, откуда взялся интерпретатор, если я изначально определил Pinecone как компилируемый язык. Дело в том, что компиляция гораздо сложнее, чем интерпретация — я уже упоминал ранее, что столкнулся с некоторыми проблемами на этом шаге.</p><h3>Написать свой компилятор</h3><p>Сначала мне понравилась эта мысль — я люблю делать вещи сам, к тому же давно хотел изучить язык ассемблера. Вот только создать с нуля кроссплатформенный компилятор — сложнее, чем написать машинный код для каждого элемента языка. Я счёл эту идею абсолютно не практичной и не стоящей затраченных ресурсов.</p><h3>LLVM</h3><p><a href="http://llvm.org/">LLVM</a> — это коллекция инструментов для компиляции, которой пользуются, например, разработчики Swift, Rust и Clang. Я решил остановиться на этом варианте, но опять не рассчитал сложности задачи, которую перед собой поставил. Для меня проблемой оказалось не освоение ассемблера, а работа с огромной многосоставной библиотекой.</p><h3>Транспайлинг</h3><p>Мне всё же нужно было какое-то решение, поэтому я написал то, что точно будет работать: транспайлер (transpiler) из Pinecone в C++ — он производит компиляцию по типу «исходный код в исходный код», а также добавил возможность автоматической компиляции вывода с GCC. Такой способ не является ни масштабируемым, ни кроссплатформенным, но на данный момент хотя бы работает почти для всех программ на Pinecone, это уже хорошо.</p><h3>Дальнейшие планы</h3><p>Сейчас мне не достаёт необходимой практики, но в будущем я собираюсь от начала и до конца реализовать компилятор Pinecone с помощью LLVM — инструмент мне нравится и руководства к нему хорошие. Пока что интерпретатора хватает для примитивных программ, а транспайлер справляется с более сложными.</p><h2>Заключение</h2><p>Надеюсь, эта статья окажется кому-нибудь полезной. Я крайне рекомендую хотя бы попробовать написать свой язык, несмотря на то, что придётся разбираться во множестве деталей реализации — это обучающий, развивающий и просто интересный эксперимент.</p><p>Вот общие советы от меня (разумеется, довольно субъективные):</p><ul><li>если у вас нет предпочтений и вы сомневаетесь, компилируемый или интерпретируемый писать язык, выбирайте второе. Интерпретируемые языки обычно проще проектировать, собирать и учить;</li><li>с лексерами и парсерами делайте, что хотите. Использование средств автоматизации зависит от вашего желания, опыта и конкретной ситуации;</li><li>если вы не готовы / не хотите тратить время и силы (много времени и сил) на придумывание собственной стратегии разработки ЯП, следуйте цепочке действий, описанной в этой статье. Я вложил в неё много усилий и она работает;</li><li>опять же, если не хватает времени / мотивации / опыта / желания или ещё чего-нибудь для написания классического ЯП, попробуйте написать эзотерический, типа <a href="http://progopedia.ru/language/brainfuck/">Brainfuck</a>. (Советуем помнить, что если язык написан развлечения ради, это не значит, что писать его — тоже сплошное развлечение. — прим. перев.)</li></ul><p>Я делал довольно много ошибок по ходу разработки, но большую часть кода, на которую они могли повлиять, я уже переписал. Язык сейчас неплохо функционирует и будет развиваться (на момент написания статьи его можно было собрать на Linux и с переменным успехом на macOS, но не на Windows).</p><p>О том, что ввязался в историю с созданием Pinecone, ни в коем случае не жалею — это отличный эксперимент, и он только начался.</p>]]></content:encoded>
    </item>
  </channel>
</rss>