четверг, 26 декабря 2013 г.

Медиаплеер из Raspberry Pi

Сегодня у меня, наконец, заработал звук в Raspberry Pi под Gentoo linux, ура!

Раньше сама система работала устойчиво и не зависала, однако попытка проиграть какой-либо звук заканчивалась выводом в dmesg сообщений типа: [AO_ALSA] Playback open error: Operation not permitted, за которыми следовало зависание системы. Порывшись на форумах, я понял, что весь вопрос - в загрузочных файлах (похоже, в файле start.elf), который инициализирует железо при запуске системы. Для устранения проблемы идём на github, скачиваем весь проект firmware в виде zip, распаковываем его, и копируем все файлы, кроме тех, что начинаются с kernel*, в директорию /boot на нашем Pi (вообще, похоже, что играет роль один файл - start.elf, остальные я скопировал только из соображений перестраховки), после чего перезагружаем Pi. Ура, заработало!

Однако, просто рабочий звук - это хорошо, но мало, надо бы добавить функциональности, сделать из Pi медиаплеер, например, для прослушивания интернет-радио. Для этого отлично подойдёт MPD. Устанавливаем его как обычно:

emerge -av mpd

Проверьте USE-флаги, нам потребуются alsa, network, tcpd, остальные - по желанию.
После установки - нужно запустить демона, и добавить его в автозапуск

rc-update add mpd default && /etc/init.d/mpd restart

Теперь у нас есть работающий MPD на Pi, дело за малым - за клиентом.

Клиентов для MPD есть огромное множество. Я для себя выбрал Cantata для ПК, и  MPDroid - для смартфона. Настройки клиентов очень просты, нужно указать только IP-адрес MPD-сервера, и пароль, идентичный указанному в /etc/mpd.conf на сервере.

Интерфейс Cantata

Первая хороша тем, что имеет списочек интернет-радиоканалов, доступный по кнопке "потоки". Накидываем интересующие каналы в правое окно, запускаем проигрывание и закрываем Cantata, можно вообще выключить ПК - дальнейшее управление можно осуществлять со смартфона.
Приятного прослушивания! 

вторник, 10 сентября 2013 г.

Немного о криптовалютах (Bitcoin и другие).

Наверное, все уже хотя бы вскользь, да слышали о такой штуке, как Bitcoin. Что это такое? Для чего это нужно? В общих словах, Bitcoin - это виртуальная валюта, виртуальные деньги, имеющие ряд интересных особеннсотей:
  • Bitcoin (и подобные ей валюты) не имеет единого центра управления, единого центра эмиссии валюты и обработки транзакций. Наверное, это основное отличие таких денег от каких-либо других, имевших хождение ранее. У "обычных" валют есть регулятор - Центральный Банк, Казначейство или какое-то подобное заведение, которое регулирует количество валюты в обращении, печатая новые деньги, когда посчитает это нужным. В случае с Bitcoin такого центра нет.
  • Эта валюта потенциально анонимна, кошелёк не привязывается ни к имени, ни к паспорту, ни  к каким-либо другим персональным данным владельца. Ближайшим аналогом являются наличные деньги: Вы можете потерять их, их могут украсть, но и контролировать их для третьих лиц сложнее, чем счёт в банке.
  • Общий объём денег, которые принципиально могут быть в обращении, заранее ограничен на отметке 21 млн единиц, что делает невозможным включение "печатного станка" и перераспределение ресурсов к тем, кто владеет этим станком.
  • В отличие от других валют, Bitcoin требует определённых вычислительных затрат для генерации новых денег (эмиссии), что делает его похожим на золото (которое требует усилий для поиска , и не может быть получено простым включением печатного станка).
Такой набор особенностей делает эту валюту как минимум, интересной для рассмотрения.

Децентрализация валюты обеспечивается тем, что клиенты в сети обмениваются между собой информацией о всех производимых транзакциях, т.е. если кто-то потратил деньги (переслал их на счёт продавца пиццы, например) - это видит вся сеть, и после этого, чтобы продавец смог потратить куда-либо эти биткоины, он должен воспользоваться своей парой "публичный ключ"-"открытый ключ", тем самым подтверждая, что именно ему были отосланы эти деньги. При отправке куда-либо продавец указывает нового получателя, и шифрует сообщение его открытым ключом, соответственно теперь потратить деньги может только новый получатель, обладающий соответствующим секретным ключом. Минус такой системы в том, что при утрате ключей воспользоваться деньгами невозможно. Транзакции в системе объединяются в блоки, каждый из которых содержит ссылку на предыдущий блок, что даёт возможность отследить весь путь денег от момента их появления до текущего момента. При этом в блоках есть bitcoin-адреса тех, через кого прошли деньги, но какой-либо другой информации о получателях-отправителях, как, например, фамилия-имя-отчество, номер кредитной карты и прочее, нет, т.е. сами по себе транзакции анонимны.

Пожалуй, одной из самых инетерсных особенностей такой валюты является процесс её "появления", эмиссии. Процесс этот называется mining(в переводе - добыча (полезных ископаемых)), название несёт в себе отсылку к процессу золотодобычи. Сходство, по задумке авторов системы, лежит в том, что для добычи Bitcoin'ов нужно подобрать "правильное" случаное число. Смысл поиска этого числа лежит в том, чтобы контролировать эмиссию чем-то, что не может быть скачкообразно увеличено желанием небольшой группы лиц (т.е. сделать так, чтобы нельзя было просто включить "печатный станок" и получить для себя побольше денег). Число должно быть такое, чтобы при добавлении его к хешу вновь создаваемого блока получался хеш, имеющий в начале некоторое количество нулей.  Это количество определяет сложность майнинга, и оно сегодня достаточно велико, что делает майнинг весьма затруднительной задачей. Сложность определяется сетью так, чтобы число эмиссируемых в единицу времени биткойнов было более-менее постоянным, что приводит к росту сложности с ростом количества майнеров, и наоборот. В данные создаваемого блока входит так же и хеш предыдущего блока, что обеспечивает неразрывность цепочки.

В системе Bitcoin использовается хеш-функция SHA-256 , в основе которой лежит большое количество битовых сдвигов, и число подбирается простым перебором вариантов.
Изначально, пока сложность была совсем небольшой - майнинг вёлся на центральных процессорах обычных компьютеров, но достаточно быстро процессоры уступили место GPGPU - они давали существенный прирост в скорости и энергоэффективности. Для увеличения скорости майнинга собирались системы, содержащие несколько GPU на одной плате, и таких плат было несколько (всё определялось бюджетом майнера).

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

В таблице, приведённой по ссылке выше, кроме CPU и GPU устройств есть ещё ASIC и FPGA. Что это за штуки? Грубо говоря, это специализированные микросхемы, которые умеют только майнить bitcoin'ы, и ни на что больше не годятся. В основе Bitcoin-системы лежит алгоритм хеширования SHA-256, который предполагает большое количество битовых сдвигов и некоторое количество операций сложения. Для реализации этого алгоритма нужно совсем немного быстрой памяти и устройства сложения. Если сделать такой блок достаточно компактным, и разместить на кристалле большое число таких блоков - то в результате получим микросхему, которая способна выдавать фантастическую скорость хеширования при небольшой потребляемой мощности. Такие системы продаются под марками Avalon, Butterfly Labs, BitFury.

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

Итак, если у Вас есть вычислительные ресурсы и есть желание попробовать помайнить - нужно определиться, что майнить. Для этого есть замечательный калькулятор, в котором можно прикинуть, какую валюту стоит майнить на имеющемся железе.

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


пятница, 2 августа 2013 г.

Небыстрый путь к STM32

Почитав в интернете статьи про дешевизну и богатые возможности STM32, я решил, что хочу "пощупать" эти чудесные и недорогие контроллеры на практике. Для начала был прикуплен программатор J-Link, и собрана простенькая схема, только питание и разъём программирования (JTAG).

Тот самый китайский J-link.

Один из вариантов минимальной схемы на отладочной плате.


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

Ещё одна попытка.


Далее я распаял ещё несколько плат, но уже с использованием паяльной станции, чтобы избежать перегрева кристалла - но и они работать не стали.


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

Discovery, содержащий на борту SWD-программатор.

Путём проб и ошибок я выяснил, что для работы STM32 необходимо подключение питания не только на VCC и на VDD, но и на AVCC и AVDD, даже если Вы не планируете использовать аналоговые устройства (ЦАП, АЦП, компараторы). Без подачи питания на аналоговую часть - микросхема работать не будет. Кроме питания для запуска ничего не требуется, внешние кварцы не нужны. На внутреннем генераторе микросхема неплохо разгоняется, и при заявленых 24 МГц контроллер стабильно работает на 56МГц, и при этом никакого заметного нагрева микросхемы нет.

Заработало!

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

среда, 10 июля 2013 г.

Собираем ядро и настраиваем звук в Gentoo на Raspberry Pi

В этой заметке я обобщу свой длительный опыт "борьбы" с пересборкой ядра Gentoo Linux на Raspberry Pi.

Итак, вы хотите пересобрать ядро, например для того, чтобы заработал звук. Приступим!

1) Вместе с образом Gentoo на Pi идут тексты старого (3.2.*) ядра, они лежат в /opt/raspberrypi/, и имеют размер порядка 1Гб. Для экономии места на SD-карте, целесообразно удалить их.

2) Собирать ядро будем через genkernel, вытягивать тексты - через git (обычное, vanilla-ядро работать НЕ будет, нам нужно ядро, содержащее в себе патчи для raspberry pi). Устанавливаем необходимые инструменты:

root # emerge --ask git genkernel

3)После того, как git и genkernel установились, скачиваем тексты ядра, я предлагаю скачать прямо в /usr/src:

root # cd /usr/src
root # 
git clone --depth 1 git://github.com/raspberrypi/linux.git

После успешного выполнения этих команд, получаем в /usr/src/linux исходные тексты ядра, которые подойдут для нашего Pi. Осталось собрать!

4)Собираем ядро. Как показывает практика, если сразу вызвать меню настроек ядра (menuconfig), и повключать множество всяких опций, есть хорошие шансы того, что ядро не скомпилируется, вылетит с какой-либо ошибкой. По этому, сначала просто обновим ядро до актуальной версии:

root # genkernel --kernel-config=/proc/config.gz kernel

Эта команда будет выполняться порядка нескольких часов, было бы разумно оставить её работать на ночь. В результате её работы мы получаем в /boot следующее:


Как можно видеть, появились файлы kernel-genkernel-arm-3.6.11+, initramfs-genkernel-arm-3.6.11+ и System.map-genkernel-arm-3.6.11+ (версия может отличаться, зависит от того, что было скачано из git) - это и есть новое ядро. Осталось добавить его в настройки загрузки.
Настройки загрузки лежат в /boot/config.txt, нам нужно в конец файла дописать следующую строку:


kernel=kernel-genkernel-arm-3.6.11+
(там может вообще не быть строки kernel=..., это нормально, просто дописываем строку с указанием на новое ядро в конец файла)

Сделать это можно или текстовым редактором (nano -w), или командой:

root # echo "kernel=kernel-genkernel-arm-3.6.11+" >> /boot/config.txt

Первый шаг сделан, после этого мы уже имеем обновлённое ядро. Перезагружаемся:

root # reboot

После перезагрузки факт обновления ядра можно увидеть через команду uname -a

5)Конфигурируем новое ядро под себя.
Конфигурирование ядра уже проходит несколько проще, чем обновление. Нужна всего одна команда:

root # genkernel --kernel-config=/proc/config.gz kernel --menuconfig all

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

Вот пара моментов, на которые стоит обратить внимание при настройке ядра:

1) Нужно включить поддержку сжатой initram fs, иначе при сборке появится ошибка. Для включения идём в General Setup, и включем поддержку, как на картинке:


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


После настройки ядра можно попробовать включить звук. Для этого нам нужно установить alsa-utils:

root # emerge alsa-utils

После установки, пробуем подключить модуль, отвечающий за звук:

root # modprobe snd_bcm2835

Для проверки работы alsa запустим alsa-mixer:

root # alsamixer

Должна быть примерно такая картинка:


Если оно так - УРА, звук заработал! Если вылезло сообщение об ошибке - скорее всего, не собран модуль ядра, запускаем конфигурацию, и внимательно исследуем секцию device drivers->sound devices
Звуковая система у Pi имеет несколько выходов (HDMI, джек 3.5мм), и возможна ситуация, когда плеер музыку играет, но звука нет - это может быть из-за того, что выбран не тот выход, который есть по факту. Выбор выхода производится так:

Автоматический выбор выхода:
root # amixer cset numid=3 0

Ручной выбор - выход 3.5мм:
root # amixer cset numid=3 1

Ручной выбор - выход HDMI:
root # amixer cset numid=3 2

Для того, чтобы каждый раз не набирать команды руками - стоит создать в /etc/local.d файлик с именем типа 02_local.start, сменить ему права на 755 (командой chmod 755 /etc/local.d/02_local.start), и вписать в него те команды, которые должны быть выполнены при запуске системы.

понедельник, 13 мая 2013 г.

Использование Google Drive в Linux

Подключаем Google Drive в Linux на манер Dropbox.

Google предлагает для своего диска (Google drive) офицальные клиенты под Windows, iOS, Android, но не для Linux. Однако, есть неофицальный клиент grive, c помощью которого можно настроить синхронизацию какой-либо папки в системе с google drive - и получить некое подобие dropbox, только с большим количеством свободного места.

понедельник, 15 апреля 2013 г.

Использование ZRAM в Gentoo Linux

Linux обладает одной интересной возможностью - возможностью создания в части оперативной памяти сжатой области, в которой возможно расположить раздел подкачки (swap). Благодаря сжатию этой области, в том же объёме оперативной памяти можно разместить больше (в 3-8 раз) данных, правда ценой некоторой потери скорости (сжатие требует процессорного времени), однако потеря скорости практически незаметна в сравнении с потерей скорости при подкачке с физического диска. 

понедельник, 18 марта 2013 г.

Переход от Mysql к MariaDB в Gentoo


Быстро и просто переходим от использования СУБД Mysql на использование MariaDB в Gentoo.

понедельник, 11 февраля 2013 г.

Из глубин FIDO - сказка про Йожа

В глубинах FIDO'шных архивов была почти случайно найдена вот такая штука:
(осторожно, внутри много специфической кащенитской лексики)

*СКАЗКА О ЦАРЕ ЙОЖЕ И ЦАРЕВИЧЕ ЙОЖОHКЪЕ*

воскресенье, 10 февраля 2013 г.

Термостат за один вечер

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

понедельник, 14 января 2013 г.

Установка Gentoo linux на Raspberry Pi

Итак, у меня появилась такая игрушка, как Raspberry Pi, и желание использовать её как девайс для управления освещением, для начала. Логика проста - она почти не потребляет энергии, в отличие от "обычного" компьютера, и на неё вполне можно "навесить" файлохранилище (подключив обычные SATA-жёсткие диски через преобразователь usb-sata (типа такого - http://chinawebshop.ru/product_44388.html )), да и мультимедийные функции, типа проигрывания интернет-радио, или музыки через mpd, она потянет на "ура". К слову, управление mpd вполне возможно с android-платформы, что даёт нам возможность управлять музыкой дома с телефона или планшета. Заманчиво? Тогда приступим!