Блог о Gentoo и около-линуксовым штукам

23 апреля 2017 г.

18:56 Опубликовал Дмитрий Исаенко , , Нет комментариев
В последнее время покачиваю образы с old-games.ru, а там формат bin.ecm. Сегодня будет рецепт конвертации в каноничный ISO.
Для начала, как обычно, надо поставить себе нативный ecm. Похоже, проект уже загнулся и сайт их не работает. Так что в SRC_URL будет линка на интернет архив. Но в любом случае это работает, так что переживать не о чем :)
Добавим ebuild в домашний оверлей:
# mkdir /usr/local/portage/app-cdr/
# mkdir /usr/local/portage/app-cdr/ecm
# vim ecm-1.0.0.ebuild

# Copyright 1999-2010 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: $

EAPI=2

inherit versionator
MY_P=$(delete_all_version_separators ${P})

DESCRIPTION="ECM prepares CD images (BIN, ISO, etc.) so that they'll compress far better"
HOMEPAGE="http://www.neillcorlett.com/ecm/"
SRC_URI="https://web.archive.org/web/20091021035854/http://www.neillcorlett.com/downloads/${MY_P}.zip"

LICENSE="GPL-2"
SLOT="0"
KEYWORDS="~amd64 ~x86"
IUSE=""

DEPEND="app-arch/unzip"

src_unpack() {
        mkdir "${S}"
        unzip -d "${S}" "${DISTDIR}"/${MY_P}.zip
}

src_compile() {
        gcc ${CFLAGS} -o ecm ecm.c || die "ecm compilation failed"
        gcc ${CFLAGS} -o unecm unecm.c || die "unecm compilation failed"
}

src_install() {
        dobin ecm unecm
        dodoc format.txt readme.txt
}                      

# chown -R portage:portage /usr/local/portage/
# repoman manifest
# eix update 
И установим его, плюс ещё bchunk, который тоже понадобиться
# emerge app-cdr/ecm app-cdr/bchunk
Теперь открываем какой-нибудь архив с сайта, и делаем следующее:
# unecm image.bin.ecm 
# bchunk <image.bin> <image.cue> <image_name>
# mount -o loop ./image_name.iso /media/something/
Готово!

См.также: https://github.com/developersu/loperOverlay

29 марта 2017 г.

loperIRCLogBot

7:47 Опубликовал Дмитрий Исаенко , Нет комментариев
loperIRCLogBot - очередной бот для записи логов на канале IRC. Написан на С. Использует слегка модифицированную libircclient. Он может заходить на 1 сервер, 1 канал и писать всё что там происходит. Может собираться под openWRT и наверное под много чего ещё. В общем все подробности чуть ниже. Этот пост (наверное) будет обновляться по мере выхода новых версий.
Написанное верно для версии: 1.1.
А теперь документация в виде FAQ.
Он работает под Windows?
Нет.

А если я его соберу под Windows?
Всё ещё нет.

OS X, BSD, AIX?
Не знаю, может быть. Попробуй и расскажи потом.

Как собирать?
$ make

Оно не работает, и тут нет ./configure. Что мне делать? Почему это происходит со мной?
Измени Makefile и ./files/Makefile. Они там простые. Я не особо разбираюсь в том, что есть ./configure поэтому его там нет.

При компиляции я вижу "warning:". Это норма?
Ну, вроде того. Я тоже иногда вижу подобное. Надо будет найти время и что-то с этим сделать.

Где исполняемый файл? Что запускать?
$ ./bin/loperIRCLogBot

Что с лицензиями?
Исходный код, который фактически является лишь файлом loperIRCLogBot.c распространяется под лицензией GNU General Public License v.3. Ты можешь прочесть текст лицензии в файле LICENSE, (распространяется вместе с кодом) или посетив сайт https://www.gnu.org/ (там он определённо должен быть). Также приложение использует (немного) модифицированную libircclient написанную George Yunaev. Libircclient распространяется под лицензией GNU Lesser General Public License v.3 или более поздней.

Можно ли (собрать и) использовать эту программу вместе с динамической библиотекой libircclient, которая у меня уже установлена?
Нет. Эта маленькая модификация, которая нужна для работы loperIRCLogBot не позволяет использовать оригинальную немодифицированную библиотеку. Посмотри на патч в директории ./files (в нём вся суть).

Где указывать настройки и как?
В файле ./bin/bot.conf. Ты можешь сгенерировать шаблон выполнив 
$ ./loperIRCLogBot -g
Файл настроек должен храниться (и будет сгенерирован) в той же директории, что и исполняемый файл. Пока это единственный вариант.
Из файла настроек приложение читает лишь первые 15 строк, так что удостоверься, что ты не прописал ничего важного ниже первых 15 строк.
Вот пример:
server:          irc.example.com
channel:         #channel
port:            6667
nick:            awesome_nick_here
username:        usrname
realname:        realname
password:        0 
maxNickLength:   30
logPath:         0 
link:            http://localhost:8080/logs/
reJoin:          yes
'server' должен быть установлен в описанном выше формате. Никаких irc://, слэшей и бэкслешей быть не должно.
'channel' это канал, к которому нужно подключиться. Должен начинаться с символа решетки '#'.
'port' порт сервера
'nick' ник на сервере. Ограничен параметром 'maxNickLength'. Т.е. длина ника не должна превышать число символов, определённое в maxNickLength.
'username'  имя пользователя, которое устанавливается вторым параметром в нике-сервера. Например nick!~[USERNAME]@ip_adress
'realname' это реальное имя. Не спрашивай, просто поставь тут что-то, ладно?
'password' это пароль от ника. Он передаётся серверу в виде '/nickserv IDENTIFY [password]'. Если установлен '0', то пароль не передаётся.
'maxNickLength' это максимальная длина ника. Различные серверы ограничивают максимальную длину ника. Значения в '30' символов тут будет достаточно. Максимально допустимое значение - 128, но я не уверен что тебе следует использовать максимальное значение, потому, что если сервер не поддерживает ники подобной длины, то программа может выполняться неправильно.
'logPath' путь к директории ./logs где хранятся логи. Если '0' то они все будут храниться  в той же папке, что и исполняемый файл. Обрати внимание, что путь должен быть абсолютным, а не относительным. Недопустимо указывать что-то типа ~/logs или ../../logs.
'link' это ссылка, которая будет служить ответом, когда кто-то на канале начинает своё сообщения с ника бота. Если '0', то в ответ никакой ссылки они не получат. Только смайлик.
'reJoin' определяет, следует ли автоматически заходить на канал после кика. Если 'yes' то следует, если 'no' то нет.

Есть ли какие-то ещё опции у приложения?
Да. Когда ты запускаешь приложение, ему можно передать следующие ключи:
-g, --genconf — создаёт шаблон конфигурационного файла. ОСТОРОЖНО! Это действие перезапишет существующий конфигурационный файл.
-n, --nomessage — подавляет вывод сообщений (на stdin, stderr).
-v, --version — показывает версию программы.
--help — показывает помощь по ключам.
Обратите внимание, что '-n' просто отключает вывод сообщений. Там нет всяких специфичных для демонов опций. Пока.

Можно как-то зайти больше чем на один канал?
Неа.

Если пропадёт соединение, сможет ли бот переподключиться? Если да, то когда это произойдёт?
Да. Через 20 минут. Возможно раньше. Зависит от активности на канале и пингов от сервера. Предсказание этого сейчас реализовано крайне криво.

29 августа 2016 г.

Vostro 5470: про Optimus и кнопки настройки яркости

5:32 Опубликовал Дмитрий Исаенко , , Нет комментариев
Сегодня будем разбираться, как избавиться от чёрного экрана при запуске SDDM (замена KDM) в Dell Vostro 5470. Тут я не ставлю целью добиться максимального энергосбережения, т.к. KDE всё равно использует для отрисовки графики OpenGL, ведь суть optimus - использовать для отрисовки 3D как раз nvidia чип, а не встроенный intel. Также мы рассмотрим тему оживления кнопок настроек яркости, а в конце ещё и заставим кнопку suspend уводить ноутбук в ждущий режим.

Итак, чтобы настроить работу Nvidia Optimus нужно, кроме того, что описано в wiki, добавить в настройки sddm строку modesetting. Эта фича не работает в случае, если прописать её в ~/.xinitrc как некоторые советуют. И это ключевой момент.
# vim /usr/share/sddm/scripts/Xsetup
xrandr --setprovideroutputsource modesetting NVIDIA-0
xrandr --auto
Касательно xorg.conf. В моём случае выглядит как-то так:
# cat /etc/X11/xorg.conf
Section "ServerLayout"
        Identifier "layout"
        Screen 0 "nvidia"
        Inactive "intel"
EndSection

Section "Device"
        Identifier "nvidia"
        Driver "nvidia"
        BusID "PCI:09:00:0"
EndSection

Section "Screen"
        Identifier "nvidia"
        Device "nvidia"
EndSection

Section "Device"
        Identifier "intel"
        Driver "modesetting"
        BusID "PCI:00:02:00"
        Option "AccelMethod"  "none"
EndSection
 
Section "Screen"
        Identifier "intel"
        Device "intel"
EndSection 
Теперь по драйверам. Используется проприетарные nvidia-drivers и интеловские драйвера. В make.conf имеется следующее:
VIDEO_CARDS="nvidia intel i965 modesetting"
Что касается настроек в ядре:
> Device Drivers > Graphics support >
<*> /dev/agpgart (AGP Support)  --->         ##есть подозрение, что это совершенно не нужно
      {*}   Intel 440LX/BX/GX, I8xx and E7x05 chipset support
-*- VGA Arbitration
(16)  Maximum number of GPUs
[*] Laptop Hybrid Graphics - GPU switching support
<*> Direct Rendering Manager (XFree86 4.1.0 and higher DRI support)  --->
      [*]   Enable legacy fbdev support for your modesetting driver
<M> Intel 8xx/9xx/G3x/G4x/HD Graphics
    Frame buffer Devices  --->
      [*] Enable Video Mode Handling Helpers
      [*] VESA VGA graphics support
-*- Backlight & LCD device support  --->
      <*>   Lowlevel LCD controls
      <*>     Platform LCD controls
      {*}   Lowlevel Backlight controls
      <*>     Generic (aka Sharp Corgi) Backlight Driver
    Console display driver support  --->
      -*- VGA text console   
      [*]   Enable Scrollback Buffer in System RAM
      (64)    Scrollback Buffer Size (in KB)      
      (80) Initial number of console screen columns      
      (25) Initial number of console screen rows  
      -*- Framebuffer Console support      
      -*-   Map the console to the primary display device
      [ ]   Framebuffer Console Rotation   
      [*]   Support for the Framebuffer Console Decorations
[*] Bootup logo  --->

Ну-с, вроде всё. Теперь перейдём к теме яркости. Почему-то у меня из коробки не работают кнопки увеличения и уменьшения яркости. Т.е. они, конечно, работают как кнопки, но яркость не меняют. Проверим для начала, определяет ли система нажатие на эти кнопки. Для этого запустим acpi_listen и пожмакаем. Должно появиться примерно следующее:
# acpi_listen 
video/brightnessdown BRTDN 00000087 00000000 K
video/brightnessdown BRTDN 00000087 00000000
video/brightnessup BRTUP 00000086 00000000
video/brightnessup BRTUP 00000086 00000000 K
^C
Если этого не произошло, идём смотреть ядро:
Device Drivers > X86 Platform Specific Device Drivers
    <*>   Dell Laptop Extras
    <*>   Dell Latitude freefall driver (ACPI SMO88XX)
    <M>   Intel PMC IPC Driver

Power management and ACPI options >
    [*] Suspend to RAM and standby         
    [*] Hibernation (aka 'suspend to disk')
    ()  Default resume partition           
    [ ] Opportunistic sleep                
    [ ] User space wakeup sources interface
    -*- Device power management core functionality
    [ ]   Power Management Debug Support   
    [ ] Enable workqueue power-efficient mode by default
    [*] ACPI (Advanced Configuration and Power Interface) Support  --->
      --- ACPI (Advanced Configuration and Power Interface) Support 
      [ ]   AML debugger interface (EXPERIMENTAL)
      [ ]   Deprecated power /proc/acpi directories
      [*]   Allow supported ACPI revision to be overriden
      < >   EC read/write access through /sys/kernel/debug/ec
      <*>   AC Adapter
      <*>   Battery
      {*}   Button
      {*}   Video
      {*}   Fan
      [*]   Dock
      <*>   Processor
      < >   Processor Aggregator
      <*>   Thermal Zone
      -*-   NUMA support
      [ ]   ACPI tables override via initrd
      [ ]   Debug Statements
      [ ]   PCI slot detection driver
      -*-   Container and Module Devices
      <*>   Smart Battery System
      < >   Hardware Error Device
      < >   Allow ACPI methods to be inserted/replaced at run time
      <M>   ACPI NVDIMM Firmware Interface Table (NFIT)
      [ ]   ACPI Platform Error Interface (APEI)
      [ ]   PMIC (Power Management Integrated Circuit) operation region support  ----
    [*] SFI (Simple Firmware Interface) Support  ----
        CPU Frequency scaling  --->        
        CPU Idle  --->                     
    [*] Cpuidle Driver for Intel Processors
        Memory power savings  --->
          <*> Intel chipset idle memory power saving driver
Это должно помочь.

Также, у вас должен быть в системе следующий путь:
/sys/class/backlight/intel_backlight/
В директории /sys/class/backlight вы также можете обнаружить под-директорию dell_backlight . Скорее всего вы что-то перемудрили с настройками. В целом - то, что эта папка есть, нет ничего страшного, ведь что там не меняй - подсведка меняться не будет.

Если кнопки определились, то пропишем правило скрипту ACPI. Тут привожу скрипт(ы) в полном варианте. Изменённые секции выделены красным.
# vim /etc/acpi/default.sh 
#!/bin/sh
# /etc/acpi/default.sh
# Default acpi script that takes an entry for all actions

set $*

group=${1%%/*}
action=${1#*/}
device=$2
id=$3
value=$4

log_unhandled() {
        logger "ACPI event unhandled: $*"
}

case "$group" in
        button)
                case "$action" in
                        power)
                                /etc/acpi/actions/powerbtn.sh
                                ;;

                        *)      log_unhandled $* ;;
                esac
                ;;

        ac_adapter)
                case "$value" in

                        *)      log_unhandled $* ;;
                esac
                ;;

        video)
                case "$action" in
                        brightnessdown)

                                /etc/acpi/actions/brightness.sh -

                                ;;

                        brightnessup)

                                /etc/acpi/actions/brightness.sh +

                                ;;

                        *)      log_unhandled $* ;;
                esac
                ;;

        *)      log_unhandled $* ;;
esac
Ну и сделаем для этого ещё один скрипт:
# vim /etc/acpi/actions/brightness.sh 

#!/bin/bash
bl_dev=/sys/class/backlight/intel_backlight/
step=10   #set 

case $1 in
        -) echo $(($(< $bl_dev/brightness) - $step)) >$bl_dev/brightness ;;
        +) echo $(($(< $bl_dev/brightness) + $step)) >$bl_dev/brightness ;;
esac
И тут вы можете заметить, что т.к. в acpi_listen одно нажатие кнопки определялось двумя ивентами ACPI, то и изменение яркости будет происходить с двойной силой. Итого, устанавливая step=10 он фактически будет отрабатывать 20-ку. Ну и ладно. Я вот ставил step=1 и сначала думал, что изменение яркости вообще не происходит. 10 - это норма ;)
# chmod +x /etc/acpi/actions/brightness.sh 

А чтобы два раза не вставать, настроим заодно и поведение кнопки sleep. Я постоянно пользуюсь утилитой pm-suspend и хотел бы отправлять в сон ноут по одному клику. Для начала установим пакет, содержащий pm-suspend.
# emerge sys-power/pm-utils
Посмотрим, как эта кнопка определяется системой:
# acpi_listen 
button/sleep SBTN 00000080 00000000 K
^C
Всё вроде хорошо. Осталось модифицировать наш скрипт.
# cat /etc/acpi/default.sh    
#!/bin/sh
# /etc/acpi/default.sh
# Default acpi script that takes an entry for all actions

set $*

group=${1%%/*}
action=${1#*/}
device=$2
id=$3
value=$4

log_unhandled() {
        logger "ACPI event unhandled: $*"
}

case "$group" in
        button)
                case "$action" in
                        power)
                                /etc/acpi/actions/powerbtn.sh
                                ;;

                        # if your laptop doesnt turn on/off the display via hardware
                        # switch and instead just generates an acpi event, you can force
                        # X to turn off the display via dpms.  note you will have to run
                        # 'xhost +local:0' so root can access the X DISPLAY.
                        #lid)
                        #       xset dpms force off
                        #       ;;

                        sleep)
                                /usr/sbin/pm-suspend
                                ;;

                        *)      log_unhandled $* ;;
                esac
                ;;

        ac_adapter)
                case "$value" in
                        # Add code here to handle when the system is unplugged
                        # (maybe change cpu scaling to powersave mode).  For
                        # multicore systems, make sure you set powersave mode
                        # for each core!
                        #*0)
                        #       cpufreq-set -g powersave
                        #       ;;

                        # Add code here to handle when the system is plugged in
                        # (maybe change cpu scaling to performance mode).  For
                        # multicore systems, make sure you set performance mode
                        # for each core!
                        #*1)
                        #       cpufreq-set -g performance
                        #       ;;

                        *)      log_unhandled $* ;;
                esac
                ;;

        video)
                case "$action" in
                        brightnessdown)

                                /etc/acpi/actions/brightness.sh -
                                ##echo $group -  $action - $device - $id - $id>> /tmp/1.sh

                                ;;

                        brightnessup)

                                /etc/acpi/actions/brightness.sh +
                                ##echo $group -  $action - $device - $id - $id>> /tmp/1.sh

                                ;;

                        *)      log_unhandled $* ;;
                esac
                ;;

        *)      log_unhandled $* ;;
esac

На этом всё.

Ссылки:
https://wiki.archlinux.org/index.php/acpid
https://wiki.gentoo.org/wiki/ACPI

31 июля 2016 г.

virtualenv - отличный способ не засорять систему пакетами python

17:32 Опубликовал Дмитрий Исаенко Нет комментариев
При разработке на python часто требуется установка дополнительных пакетов. Традиционно для этого используется утилита pip (dev-python/pip). Отсюда всплывает вопрос, а может стоит оградить себя от установки пакетов через pip прямиком в систему? И как это сделать?
Именно для этого придумали утилиту virtualenv, которая выступает генератором виртуальных сред python. Кратко рассмотрим как это работает.
Для начала установим virtualenv:
# emerge dev-python/virtualenv
Теперь создадим каталог с окружением:
$ virtualenv env
Using base prefix '/usr'
New python executable in env/bin/python3.4
Also creating executable in env/bin/python
Installing setuptools, pip, wheel...done.
После этого, у нас появилась возможность использовать pip из этого каталога. Установим туда какой-нибудь пакет, чтобы посмотреть куда он установится:
$ env/bin/pip install python-telegram-bot
Collecting python-telegram-bot
  Downloading python_telegram_bot-5.0.0-py2.py3-none-any.whl (130kB)
    100% |████████████████████████████████| 131kB 3.7MB/s
Collecting certifi (from python-telegram-bot)
  Downloading certifi-2016.2.28-py2.py3-none-any.whl (366kB)
    100% |████████████████████████████████| 368kB 709kB/s
Collecting urllib3>=1.10 (from python-telegram-bot)
  Downloading urllib3-1.16-py2.py3-none-any.whl (98kB)
    100% |████████████████████████████████| 102kB 342kB/s
Collecting future>=0.15.2 (from python-telegram-bot)
  Downloading future-0.15.2.tar.gz (1.6MB)
    100% |████████████████████████████████| 1.6MB 424kB/s
Building wheels for collected packages: future
  Running setup.py bdist_wheel for future
  Stored in directory: /home/username/.cache/pip/wheels/11/c5/d2/ad287de27d0f0d646f119dcffbac1f4e63df128f28ab0a1bda
Successfully built future
Installing collected packages: certifi, urllib3, future, python-telegram-bot
Successfully installed certifi-2016.2.28 future-0.15.2 python-telegram-bot-5.0.0 urllib3-1.16
You are using pip version 7.1.2, however version 8.1.2 is available.
You should consider upgrading via the 'pip install --upgrade pip' command. 
Там же есть валидатор кода pep8 (конечно, если он установлен dev-python/pep8). Запускается он аналогично.
$ env/bin/pep8
Можно перенести настройки этого virtualevn на всю систему - для этого нужно сделать
$ . env/bin/activate
или
$ source env/bin/activate
Для того, чтобы "выключить" эти настройки, нужно написать
$ deactivate
Для того, чтобы использовать эту среду в своих приложениях, нужно добавлять в sh-скрипты следующую форму:
#!/usr/bin/env python
<python code here>
Или же просто натравливайте интерпретатор python из директории на свои *.py скрипты.

На этом всё.

13 июня 2016 г.

Ставим Windows 7 на GPT с флешки

1:32 Опубликовал Дмитрий Исаенко Нет комментариев
Это одинаково полезно как для свежей установки, так и для восстановления системы. В случае загрузки Win7 не в режиме EFI она будет ругаться, что не может установиться\не видит таблицу разделов в формате GPT. Выглядит это как-то так: 
Windows cannot be installed to this disk. The selected disk is not of the GPT partition style
Итак, для обхода этой 'проблемы' нам понадобится флешка эдак на 8Gb и образ Windows 7 x64 (желательно MSDN?). 
  1. Сперва создадим табицу разделов в MBR. Удобнее делать всё это используя Gparted. Для этого нужно в приложении открыть флешку и выбрать "Устройство" -> "Создать таблицу разделов" -> отметить в меню msdos.
  2. Теперь отформатируем флешку в FAT32. Для этого на сером прямоугольнике в программе жмём правой кнопкой и выбираем "Новый". В типе файловой системы нужно указать fat32. Жмём ОК и применить (галочка).
  3. Далее следует установить флаг boot на единственный раздел - правой кнопкой на имени раздела и "Управление флагами". Галочка должна быть только на boot.
  4. Теперь монитруем образ Win7. Например:
    # mount -o loop /home/user/windows7.iso /media/flashko/
    
  5. Далее копируем всё содержимое /media/flashko/ на флешку.
  6. Теперь на самой флешке переходим в каталог efi/microsoft/ и копируем директорию boot/ на один каталог выше (конкретно в efi/).
  7.  Теперь переходим в efi/boot/ и делаем следующее (нужен установленный 7zip):
    # 7z e ../../sources/install.wim 1/Windows/Boot/EFI/bootmgfw.efi
    # mv bootmgfw.efi bootx64.efi
    
На этом всё. Перезагружаемся и грузим флешку в режиме UEFI.

20 марта 2016 г.

Делаем IR приёмник для LIRC (igorplugusb)

16:51 Опубликовал Дмитрий Исаенко , , Нет комментариев
Сегодня будем делать инфракрасный приёмник. В таком качестве мною был выбран распространённый igorplugusb — старая, не лишенная недостатков, но очень простая в создании схема. Прекрасный пример реализации я нашел на сайте JumpTruck, который в свою очередь почти без изменений списан с проекта Дика Стрифланда (Dick Streefland). Но не смотря на это, готовые схемы мне не понравились. Мне хотелось micro-usb штекер и миниатюрную плату, поэтому я решил переделать реализацию под себя. 
Для новой разводки был использован бесплатный (условно) Eagle cad, который прекрасно подходит для разработки небольших схем и обладает огромным набором библиотек компонентов. В конечном итоге у меня получилось следующее (кликабельно):



Скачать их, вместе с прошивкой и самую-малость-кривым-PDF для лазерного утюга можно отсюда: https://cloud.mail.ru/public/CH4D/Sw3D5nLh5

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

Если вы в первый раз используете Eagle (у меня это версия 7.4.0), то после установки и первого запуска он предложит вам создать папку по-умолчанию для проектов и всего-такого-прочего. В неё-то и надо скопировать директории IR3 и lib.

Теперь о том, что касается компонентов (нагло содрано):
Комп. Значение Корпус Описание
C1 27pf 0603 Керамический конденсатор
C2 27pf 0603 Керамический конденсатор
C3 0.1uf 0603 Керамический конденсатор
C4 4,7uf 0603 Конденсатор (тут у автора была ошибка - нужен именно 4,7uf)
C5 100uf E2,5-6 Электролит. конденсатор
D1 3,6V SOD80C Стабилитрон 3.6V
D2 3,6V SOD80C Стабилитрон 3.6V
IC1 ATtiny2313 DIL20 ATTINY2313-20PU
LED1 LED3MM 3mm LED (синенький)
Q1 12MHz HC49U70 Кварц
R1 68 0805 (или 0603) 68Ом резистор
R2 1k5 0603 1,5КОм резистор
R3 68 0805 (или 0603) 68Ом резистор
R4 330 0603 330Ом резистор
R5 22k 0603 22КОм резистор
R6 100 0603 100Ом резистор
R7 4,7КОм 0603 4,7КОм резистор
U$1 TSOP4838 782-TSOP4838 IR приёмник 38kHz
X1 Micro-usb USB-MICRO-SMD micro-usb разъём

Теперь несколько слов о прошивке. Я использовал, как и Jumptruck, прошивку main.hex из папки IR из пакета 1,4. Сейчас на сайте доступен для скачивания архив 1.7 — что там внутри и как оно работает я не знаю. Если есть желание проверить, то пожалуйста.

Прошивал я своим программатором usbasp через avrdude. Тут проблем у вас возникнуть не должно. Как настроить окружение я писал в одной из предыдущих публикаций. Тут же традиционно показываю выкладку:
 # avrdude -c usbasp -pt2313 -U flash:w:main.hex                     

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.01s

avrdude: Device signature = 0x1e910a
avrdude: NOTE: FLASH memory has been specified, an erase cycle will be performed
         To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: reading input file "main.hex"
avrdude: input file main.hex auto detected as Intel Hex
avrdude: writing flash (2006 bytes):

Writing | ################################################## | 100% 18.64s


avrdude: 2006 bytes of flash written
avrdude: verifying flash memory against main.hex:
avrdude: load data flash data from input file main.hex:
avrdude: input file main.hex auto detected as Intel Hex
avrdude: input file main.hex contains 2006 bytes
avrdude: reading on-chip flash data:

Reading | ################################################## | 100% 8.66s


avrdude: verifying ...
avrdude: 2006 bytes of flash verified
avrdude: safemode: Fuses OK

avrdude done.  Thank you.

 # avrdude -pt2313 -U hfuse:w:0xdb:m -U lfuse:w:0xef:m -c usbasp

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.01s

avrdude: Device signature = 0x1e910a
avrdude: reading input file "0xdb"
avrdude: writing hfuse (1 bytes):

Writing | ################################################## | 100% 0.02s

avrdude: 1 bytes of hfuse written
avrdude: verifying hfuse memory against 0xdb:
avrdude: load data hfuse data from input file 0xdb:
avrdude: input file 0xdb contains 1 bytes
avrdude: reading on-chip hfuse data:

Reading | ################################################## | 100% 0.00s

avrdude: verifying ...
avrdude: 1 bytes of hfuse verified
avrdude: reading input file "0xef"
avrdude: writing lfuse (1 bytes):

Writing | ################################################## | 100% 0.02s

avrdude: 1 bytes of lfuse written
avrdude: verifying lfuse memory against 0xef:
avrdude: load data lfuse data from input file 0xef:
avrdude: input file 0xef contains 1 bytes
avrdude: reading on-chip lfuse data:

Reading | ################################################## | 100% 0.00s

avrdude: verifying ...
avrdude: 1 bytes of lfuse verified

avrdude: safemode: Fuses OK

avrdude done.  Thank you.

Перейдём к настройке LIRC. 

Для начала, необходимо правильно сконфигурировать ядро. Для этого включим следующие необходимые фичи через menuconfig.
Device Drivers -> Multimedia Support
  [*]   Remote Controller support
  [*]   Remote controller decoders  ---> 
      <M>   LIRC interface driver
      <M>     Enable IR to LIRC bridge
      <M>   Enable IR raw decoder for the NEC protocol
      <M>   Enable IR raw decoder for the RC-5 protocol
      <M>   Enable IR raw decoder for the RC6 protocol
      <M>   Enable IR raw decoder for the JVC protocol
      <M>   Enable IR raw decoder for the Sony protocol
      <M>   Enable IR raw decoder for the Sanyo protocol
      <M>   Enable IR raw decoder for the Sharp protocol
      <M>   Enable IR raw decoder for the MCE keyboard/mouse protocol
      <M>   Enable IR raw decoder for the XMP protocol
  [*]   Remote Controller devices  --->
         IgorPlug-USB IR Receiver
  Input device support  --->
      <*>   Event interface  (не знаю на сколько это актуально)

После того, как мы настроили ядро и перезагрузились, при подключении устройства в dmesg должно появиться следующее:
[57672.609962] usb 1-5.2: new low-speed USB device number 9 using xhci_hcd
[57672.699435] usb 1-5.2: New USB device found, idVendor=03eb, idProduct=0002
[57672.699438] usb 1-5.2: New USB device strings: Mfr=0, Product=2, SerialNumber=0
[57672.699439] usb 1-5.2: Product: USBtiny IR/LCD
[57672.700146] Registered IR keymap rc-hauppauge
[57672.700217] input: IgorPlug-USB IR Receiver as /devices/pci0000:00/0000:00:14.0/usb1/1-5/1-5.2/1-5.2:1.0/rc/rc0/input20
[57672.700250] rc0: IgorPlug-USB IR Receiver as /devices/pci0000:00/0000:00:14.0/usb1/1-5/1-5.2/1-5.2:1.0/rc/rc0
[57672.700309] input: MCE IR Keyboard/Mouse (igorplugusb) as /devices/virtual/input/input21
[57672.700452] rc rc0: lirc_dev: driver ir-lirc-codec (igorplugusb) registered at minor = 0
Соответсвенно в /dev теперь есть устройство /dev/lirc0.

Теперь самое интересное - заставить всё это дело работать. Версия lirc-0.9.0-r5, которая есть сейчас в portage безумно устарела и, строго говоря, не работает. Поэтому я решил написать ebuild для более свежей, но не последней версии 0.9.3a.

Вот выкладка:
$ cat lirc-0.9.3a.ebuild    
# Copyright 1999-2016 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Id$

EAPI=4

inherit eutils systemd flag-o-matic autotools

DESCRIPTION="decode and send infra-red signals of many commonly used remote controls"
HOMEPAGE="http://www.lirc.org/"

MY_P=${PN}-${PV/_/}

if [[ "${PV/_pre/}" = "${PV}" ]]; then
        SRC_URI="mirror://sourceforge/lirc/${MY_P}.tar.bz2"
else
        SRC_URI="http://www.lirc.org/software/snapshots/${MY_P}.tar.bz2"
fi

LICENSE="GPL-2"
SLOT="0"
KEYWORDS="amd64 ppc ppc64 x86"
IUSE="doc static-libs X audio irman ftdi inputlirc iguanair"

S="${WORKDIR}/${MY_P}"


REQUIRED_USE="
        iguanair? ( irman )
"
DEPEND="
        doc? ( app-doc/doxygen )
"

RDEPEND="
        X? (
                x11-libs/libX11
                x11-libs/libSM
                x11-libs/libICE
        )
        audio? ( 
                >media-libs/portaudio-18 
                media-libs/alsa-lib
        )
        irman? ( media-libs/libirman )

        iguanair? ( app-misc/iguanaIR )

        ftdi? ( dev-embedded/libftdi:0 )

        inputlirc? ( app-misc/inputlircd )
"

pkg_setup() {

        # set default configure options
        LIRC_DRIVER_DEVICE="/dev/lirc0"

        filter-flags -Wl,-O1
}

src_prepare() {
        # Rip out dos CRLF
        edos2unix contrib/lirc.rules
}

src_configure() {
        econf \
                $(use_enable static-libs static) \
                $(use_with X x)
}


src_install() {
        emake DESTDIR="${D}" install

        newinitd "${FILESDIR}"/lircd lircd
        newinitd "${FILESDIR}"/lircmd lircmd
        newconfd "${FILESDIR}"/lircd.conf.4 lircd

        insinto /etc/modprobe.d/
        newins "${FILESDIR}"/modprobed.lirc lirc.conf

        newinitd "${FILESDIR}"/irexec-initd irexec
        newconfd "${FILESDIR}"/irexec-confd irexec

        systemd_dounit "${FILESDIR}"/irexec.service
        systemd_dounit "${FILESDIR}"/lirc.service
        systemd_dounit "${FILESDIR}"/lircm.service

        if use doc ; then
                dohtml doc/html/*.html
                insinto /usr/share/doc/${PF}/images
                doins doc/images/*
        fi

        keepdir /etc/lirc
        if [[ -e "${D}"/etc/lirc/lircd.conf ]]; then
                newdoc "${D}"/etc/lirc/lircd.conf lircd.conf.example
        fi

        use static-libs || rm "${D}/usr/$(get_libdir)/liblirc_client.la"
}

pkg_preinst() {

        local dir="${EROOT}/etc/modprobe.d"
        if [[ -a "${dir}"/lirc && ! -a "${dir}"/lirc.conf ]]; then
                elog "Renaming ${dir}/lirc to lirc.conf"
                mv -f "${dir}/lirc" "${dir}/lirc.conf"
        fi

        # copy the first file that can be found
        if [[ -f "${EROOT}"/etc/lirc/lircd.conf ]]; then
                cp "${EROOT}"/etc/lirc/lircd.conf "${T}"/lircd.conf
        elif [[ -f "${EROOT}"/etc/lircd.conf ]]; then
                cp "${EROOT}"/etc/lircd.conf "${T}"/lircd.conf
                MOVE_OLD_LIRCD_CONF=1
        elif [[ -f "${D}"/etc/lirc/lircd.conf ]]; then
                cp "${D}"/etc/lirc/lircd.conf "${T}"/lircd.conf
        fi

        # stop portage from touching the config file
        if [[ -e "${D}"/etc/lirc/lircd.conf ]]; then
                rm -f "${D}"/etc/lirc/lircd.conf
        fi

}

pkg_postinst() {

        # copy config file to new location
        # without portage knowing about it
        # so it will not delete it on unmerge or ever touch it again
        if [[ -e "${T}"/lircd.conf ]]; then
                cp "${T}"/lircd.conf "${EROOT}"/etc/lirc/lircd.conf
                if [[ "$MOVE_OLD_LIRCD_CONF" = "1" ]]; then
                        elog "Moved /etc/lircd.conf to /etc/lirc/lircd.conf"
                        rm -f "${EROOT}"/etc/lircd.conf
                fi
        fi

        einfo "The new default location for lircd.conf is inside of"
        einfo "/etc/lirc/ directory"
}

Ну и листинги всего остального, что есть в папке (чего уж мелочиться):
$ ls 
files  lirc-0.9.3a.ebuild  Manifest  metadata.xml

$ cat metadata.xml 
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE pkgmetadata SYSTEM "http://www.gentoo.org/dtd/metadata.dtd">
<pkgmetadata>
  <maintainer type="project">
    <email></email>
  </maintainer>
  <use>
    <flag name="audio">Build alsa-lib and portaudio required for some receivers</flag>
    <flag name="ftdi">Build libftdi required by FTDI driver</flag>
    <flag name="iguanair">Build libiguanair required by iguanaIR</flag>
    <flag name="inputlirc">Build inputlirc</flag>
    <flag name="irman">Build libirman required by Irman</flag>
  </use>
</pkgmetadata>
$ cat files/irexec-confd
# Options to pass to the irexec process
IREXEC_OPTS="/etc/lircrc"

# User to execute irexec as.
# Warning: Running irexec as root can open security holes
#IREXEC_USER="root"

# Use this to disable the warning printed when starting irexec as root
# IREXEC_DISABLE_ROOT_WARNING=yes 
$ cat files/irexec-initd 
#!/sbin/runscript
# Copyright 2003 Martin Hierling <mad@cc.fh-lippe.de>
# Distributed under the terms of the GNU General Public License v2
# $Id$

: ${IREXEC_USER:=root}

depend() {
        need lirc
}

start() {
        if [ "x${IREXEC_USER}" = "xroot" -a "x${IREXEC_DISABLE_ROOT_WARNING}" != "xyes" ]; then
                ewarn "Warning: Running irexec as root can open security holes"
        fi

        ebegin "Starting irexec"
        start-stop-daemon --start --chuid ${IREXEC_USER} --user ${IREXEC_USER} --chdir / \
                --exec /usr/bin/irexec -- --daemon ${IREXEC_OPTS}
        eend $? "Failed to start irexec."
}

stop() {
        ebegin "Stopping irexec"
        start-stop-daemon --stop --exec /usr/bin/irexec --user ${IREXEC_USER}
        eend $? "Failed to stop irexec."
}
 $ cat files/irexec.service 
[Unit]
Description=IR Exec
After=lirc.service
Wants=lirc.service

[Service]
ExecStart=/usr/bin/irexec

[Install]
WantedBy=multi-user.target
$ cat files/lircd
#!/sbin/runscript
# Copyright 1999-2014 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Id$

PIDFILE=/var/run/lirc/${SVCNAME}.pid
: ${LIRCD_SYMLINKFILE:=/dev/lircd}
: ${LIRCD_SOCKET:=/var/run/lirc/lircd}

depend() {
        need localmount
        use modules
        provide lirc
}

start() {
        local retval

        ebegin "Starting lircd"

        for retval in ${LIRCD_SET_SYSCLASSRCS} ; do
                if [ -e /sys/class/rc/${retval}/protocols ] && \
                grep -qs 'lirc' /sys/class/rc/${retval}/protocols ; then
                        einfo "Setting lirc protocol active for ${retval}"
                        echo lirc >/sys/class/rc/${retval}/protocols
                fi
        done

        checkpath -q -d -m 0755 -o root:root /var/run/lirc
        rm -Rf ${LIRCD_SOCKET} && ln -s ${LIRCD_SOCKET} ${LIRCD_SYMLINKFILE}
        if [ $? -ne 0 ]; then
                eend $? "Unable to create symbolic link ${LIRCD_SYMLINKFILE}"
                return 1
        fi

        start-stop-daemon --start --quiet --pidfile "${PIDFILE}" --exec /usr/sbin/lircd -- \
                -P "${PIDFILE}" ${LIRCD_OPTS}
        retval=$?

        if [ ${retval} -ne 0 ]; then
                rm -Rf ${LIRCD_SOCKET}
        fi

        eend ${retval}
}

stop() {
        ebegin "Stopping lircd"
        rm -f ${LIRCD_SYMLINKFILE}
        start-stop-daemon --stop --quiet --pidfile "${PIDFILE}" --exec /usr/sbin/lircd
        eend $?
}
 $ cat files/lircd.conf.4 
# Options to pass to the lircd process

# for devices with lirc-kernel-module
#LIRCD_OPTS="-d /dev/lirc0"
#LIRCD_OPTS="-d /dev/lirc"

# for devices using the input-layer
#LIRCD_OPTS="-H devinput -d /dev/input/by-path/pci-0000:00:0a.0--event-ir"
# This should work, Bug #235107
#LIRCD_OPTS="-H devinput -d name=*DVB*"

# set default protocol to 'lirc' for in-kernel IR decoding
# for the following entries in /sys/class/rc/
# (space-separated list if there is more than one)
LIRCD_SET_SYSCLASSRCS="rc0"

# If running mulitple instances of lircd, the following
# can be used to override the default socket path and
# socket symlink
#LIRCD_SOCKET="/var/run/lirc/lircd"
#LIRCD_SYMLINKFILE="/dev/lircd"
$ cat files/lircmd 
#!/sbin/runscript
# Copyright 1999-2004 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Id$

depend() {
        need lircd
}

start() {
        ebegin "Starting lircmd"
        start-stop-daemon --start --quiet --exec /usr/sbin/lircmd
        eend $?
}

stop() {
        ebegin "Stopping lircmd"
        start-stop-daemon --stop --quiet --exec /usr/sbin/lircmd
        eend $?
}
$ cat files/lirc.service 
[Unit]
Description=Linux Infrared Remote Control
After=network.target

[Service]
ExecStart=/usr/sbin/lircd --nodaemon --driver=default --device=/dev/lirc0

[Install]
WantedBy=multi-user.target
$ cat files/modprobed.lirc 
#
# For first serial receivers:
#
#options lirc_serial irq=4 io=0x3f8
#options lirc_sir irq=4 io=0x3f8

#
# Detach first serial port from serial-driver.
# Use this when you have your serial-port-driver statically
# compiled into your kernel, or as a module but loaded before
# the lirc-module.
# 
#install lirc_serial setserial /dev/ttyS0 uart none; modprobe --ignore-install lirc_serial
#
#install lirc_sir    setserial /dev/ttyS0 uart none; modprobe --ignore-install lirc_sir


#
# For parallel receivers:
#
#options lirc_parallel irq=7 io=0x3bc

Таким образом, всё что вам нужно сделать - так это добавить ебилд в локальный репозиторий, выполнить repoman manifest и установить пакет.
# emerge lirc

Скачать zip можно отсюда: https://cloud.mail.ru/public/2Mdy/yGnm7BVgX
Да, я тут подумал, что так жить нельзя, и решил завести себе аккаунт на GitHub. Так что теперь ебилды можно будет качать и отсюда: https://github.com/developersu/loperOverlay

Теперь добавим демон lircd в автозагрузку:
# rc-update add lircd default
И запустим его:
# /etc/init.d/lircd start
 * Starting lircd ...
 * Setting lirc protocol active for rc0        [ ok ]
Проверить, что всё работает как надо можно коммандой mode2. Когда она запущена нужно поклацать пультом и диод замигает, а в консоли вы увидите примерно следующее:
# mode2 
Using device: /dev/lirc0
Using device: /dev/lirc0
Warning: Running as root.
pulse 9045
space 4607
pulse 511
space 1706
pulse 511
space 597
pulse 597
space 511
pulse 597
space 511
pulse 597
space 511
pulse 597
space 597
pulse 597
space 511
pulse 597
space 511
pulse 597
space 511
pulse 597
space 1621
pulse 682
space 1706
pulse 597
space 511
pulse 597
space 597
pulse 597
space 1706
pulse 597
space 1706
pulse 597
space 1621
pulse 682


О том, как настроить конкретный пульт для управление системой в KDE мы поговорим в следующий раз.

На этом у меня всё.

Источники:
https://dicks.home.xs4all.nl/avr/usbtiny/
http://jumptuck.com/2008/10/26/usb-ir-receiver/
http://gentoo-en.vfose.ru/wiki/LIRC

25 февраля 2016 г.

Смотрим торренты стримом в peerflix

12:22 Опубликовал Дмитрий Исаенко Нет комментариев
Задумался на днях о том, как бы смотреть фильмы из торрентов не дожидаясь каждый раз пока они полностью загрузятся. И вот набрёл на одну такую программу, которая позволяет это делать. Называется она peerflix. На вход ей передаётся файл .torrent (его можно не скачивать — распарсит даже URL), а на выходе запускает smplayer. Я почи уверен, что можно там запускать и VLC и всё что душе угодно, но разбираться как всегда лень. Так что вот вам, в уже привычном для всех стиле, короткая записка как это всё быстро развернуть и начать "смотреть фильмы уже сегодня"!
Как обычно, в основном дереве этого пакета нет. Если вообще не хотите париться, то вот линка на список оверлеев: https://gpo.zugaina.org/media-tv/peerflix
Я как обычно забил на это дело и добавил ebuild в свой локальный оверлей. Таким образом:
# cd /usr/local/portage/
# mkdir -p media-tv/peerflix
# cd media-tv/peerflix
# wget http://data.gpo.zugaina.org/jorgicio/media-tv/peerflix/peerflix-0.32.2.ebuild
# chown portage:portage -R /usr/local/portage/
# repoman manifest
# eix-update 
# echo media-tv/peerflix ~amd64 >> /etc/portage/package.accept_keywords
# emerge -a peerflix
Смотреть любимые фильмяшки можно так:
peerflix fat_as_your_mom.torrent -g -d
Это дело отлично заменяет fs.to,ex.ua,cxz.to и всякие там futuron.tv. На этом у меня всё ;)

Ссылки: https://github.com/mafintosh/peerflix