10 декабря 2011 г.

awk вывод нескольких столбцов

Если из файла необходимо вывести несколько столбцов можно делать так:
$ cat file.log | awk '{for(i=4;i<=13;i++)printf "%s ",$i;print ""}'

27 ноября 2011 г.

Pulseaudioи качество звука

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

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

Итак все настройки о которых пойдет речь дальше живут в файле /etc/pulse/daemon.conf

Подробно о всех настройках читаем тут man pulse-daemon.conf

Судя по мануалам за качество звука отвечают следующие параметры

  • resample-method
  • default-sample-format
  • default-sample-rate

Начнём по прядку

resample-method - остановился на значении speex-float-10. Вроде бы значение src-sinc-best-quality по качеству выше, но и нагрузка на процессор тоже.

default-sample-format - нужно поставить float32le. Обратите внимание, что есть значения заканчивающиеся на le - little-endian и be - big-endian - зависит от порядка байт используемых процессором. Для x86 архитектуры это le, для SPARC - be.

default-sample-rate - на слух уловил разницу только когда ошибся и не дописал один 0 в значение 48000. Оставил по умолчанию 44100, т.к. 48000 сильно грузит процессор, а на слух разницы нет. Возможно какой-нить современный Моцарт и услышит, но я к этой категории не отношусь :-)

Рекомендую для каждой машины подбирать параметры экспериментально и не забивать смотреть на top, т.к. некоторыми комбинациями параметров я загружал процессор на 100%

После изменения параметров в конфиге чтобы новые настройки вступили в силу нужно выполнить pulseaudio -k

Есть ещё параметры которые влияют на загрузку процессора, но не влияют на качество:

  • default-sample-channels
  • default-channel-map

Эти значения должны соответствовать друг другу
default-sample-channels = 2
default-channel-map = front-left,front-right
или
default-sample-channels = 6
default-channel-map = front-left,front-right,rear-right,rear-left,front-center,lfe
Остановился на варианте из 6-ти каналов. Опять же на слух все 6 колонок как звучали так и звучат, нагрузка на процессор немного больше, но как-то приятней на душе что в конфиге включено 5.1

16 октября 2011 г.

mplayer, сетевое вещание и тэги в cp1251

Я практически постоянно слушаю через интернет радиостанцию "Наше радио". При всем разнообразии плееров доступных под Linux мне все же по душе старый-добрый mplayer который работает как автомат калашникова.

Так вот большая часть из известных мне радиостанций передает тэги в кодировке cp1251 (почему бы им не перейти на utf-8, ведь 21 век на дворе? видать только по религиозным соображениям), а так как локаль у меня utf-8 то "автомат калашникова" то-бишь mplayer отображает названия песен просто знаками вопроса. И если практически всех исполнителей я узнаю по голосам, то с названиями песен все намного хуже. Короче поставил перед собой задачу сделать что-нить чтобы можно было посмотреть названия привычными русскими буквами.

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

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

Почитав Desktop Notifications Specification я понял, что счастье возможно и начал искать инструмент который помог бы мне отсылать сообщение и при необходимости его переписать поверху. Т.к. я последние несколько лет пишу на C++ с использованием Qt перво наперво я обратил свой взор на замечательную утилиту qdbus которой уже пользовался в одном проекте. Но что-то не срослось у меня через нее отправить параметры "actions" и "hint", при этом через qdbusviewer все отправлялось как положено . Пойдя дальше я остановился на не менее замечательной утилите dbus-send но и тут меня поджидали грабли с этими параметрами вернее не с самими параметрами, а с их типами данных - ну никак не получалось заставить его работать.

При этом если смотреть на то что отправляет kdialog и notify-send (который тоже работает) через dbus-monitor, данные 100% соответствуют тому, что я отправляю через dbus-send и qdbus. Но что-то там в дебрях dbus мне сопротивляется.

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

Но не тут то было. Прямо в мануале есть рабочий пример как отправить Notify. И это заработало!!!

Теперь настало время собрать все требования в одну кучу:

  1. необходимо чтобы mplayer работал где-нить в фоновом режиме
  2. т.к. любая связь имеет два устойчивых положения - "либо нет, либо только что была" необходимо чтобы mplayer при обрыве связи сам пытался достучаться до радиостанции без моего пинка
  3. необходимо конвертировать все теги из кодировки cp1251 в utf-8
  4. необходимо отображать название каждой новой песни как стандартное уведомление Desktop Notifications при этом не плодить этих уведомлений, а обновлять уже существующее

И вот готовое решение (все листинги чуть ниже):

  1. mplayer запускаем в screen, пусть там себе работает и нам не мешает
  2. помимо всего прочего запускаем mplayer в бесконечном цикле чтобы при обрыве связи он запустился сам по себе
  3. тут iconv нам в помощь
  4. как я уже писал все делаем через gdbus

Теперь листинги:

Сам mplayer и скрипт по отсылке уведомления я запускаю под screen одной командой:

$ screen -c ~/.screenrc-mplayer &

Сам файл конфигурации screen-a имеет вид

$ cat ~/.screenrc-mplayer

# ScreenRC
# vi:ts=4:sw=4

vbell off
multiuser on
autodetach on
startup_message off
defscrollback 100000
defsilence on

screen  -t shell         0
screen  -t mplayer       1    /home/termit/.mplayer/mplayer.sh
screen  -t title         2    /home/termit/.mplayer/title.sh

hardstatus alwayslastline "%{= KW}%-w%{= wk}%50>%n %t%{-}%+w%<"

Этот конфиг делает в screen 3 терминала. На 0 запущен просто shell, на 1 запущен сам mplayer, на 2 запущен скрипт который отсылает уведомления.

Скрипт запускающий mplayer

$ cat /home/termit/.mplayer/mplayer.sh

#!/bin/sh
while sleep 2; do 
mplayer -msgcolor -playlist \
    http://188.127.243.169/nashe-128.m3u 2>&1 | \
    grep --line-buffered -i icy | \
    tee  ~/.mplayer/mplayer.log; 
done

Скрипт выводящий уведомления

$ cat /home/termit/.mplayer/title.sh

#!/bin/bash

# Имя приложения
NAMEAPP=mplayer

# Номер сообщения, необходим чтобы сообщение перезаписывалось
# поверху, может быть любым, если будет = 0, будут добавляться
# новые сообщения
NUMBER=1

# Имя иконки или путь к файлу с иконкой
ICON=kmplayer
#ICON=amarok
#ICON=dragonplayer

# Заголовок
HEAD="Сейчас играет"

# Время отображения сообщения
TIMEOUT=5000

tail -n1 -F ~/.mplayer/mplayer.log |
while read title
do

# вычислим название песни
SONGNAME=`echo $title | cut -d = -f 2 | cut -d \' -f 2 | grep -v '^ -'  `

# проверим не пустое ли название
[[ -z ${SONGNAME} ]] && continue

# отобразим сообщение
gdbus call --session \
        --dest org.freedesktop.Notifications \
        --object-path /org/freedesktop/Notifications \
        --method org.freedesktop.Notifications.Notify \
        ${NAMEAPP} \
        ${NUMBER} \
        ${ICON} \
        "`echo ${HEAD}`" \
        "`echo ${SONGNAME} | iconv -f cp1251`" \
        [] \
        {} \
        ${TIMEOUT}

done

Результат:

В KDE это выглядит так:

В Unity это выглядит так:

19 февраля 2011 г.

QR код

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

Итак это QR-код (Quick Response – быстрое распознавание, быстрый отклик, быстрый ответ) такие штрих коды придумали японцы как средство кодирования различной информации...

Например в приведённом штрих коде зашифрована моя контактная информация (визитка). Эту информацию можно считать мобильным телефоном со специальным приложением и получить готовую визитку не вбивая ничего руками.

В следующей партии визиток обязательно распечатаю на них такой :-)

Использование:

  1. Возьмите мобильный телефон с камерой
  2. Запустите программу для сканирования кода
  3. Наведите объектив камеры на код
  4. Получите информацию

4 января 2011 г.

Симулятор программиста

Вы хотите почувствовать себя программистом-профессионалом? Вы всегда хотели программировать но не получили соответствющего образования? Вы все делаете правильно, но проклятый ящик с микросхемами вас не понимает и все делает исключительно по своему?

Благодаря этому уникальному упражнению, вы, совершенно не зная ни одного языка программирования, сможете почувствовать себя настоящим программистом-профессионалом!

Для упражнения потребуются: - два участника; - часы (желательно с секундомером); - листок чистой бумаги; - ручка (шариковая или гелевая, но именно ручка,- это важно).

Один из участников будет "Заказчиком" (Работодателем), другой - "Исполнителем" (Программистом). "Заказчику" выдаются часы и право голоса, "Исполнителю" - бумага и ручка.

Начало упражнения: "Заказчик" засекает 10 минут и дает задание "Исполнителю": "Нарисуйте мне, пожалуйста, красивую девушку." Далее, пока "Исполнитель" рисует, стоя у него "над душой", высказывать следующие пожеллания к рисунку:

0:30 - Пусть у нее в руке будет меч.
1:00 - Двуручный меч, который она держит обоими руками!
1:30 - А в другую руку ей дайте УЗИ.
2:00 - Пусть она будет уставшей путешественницей, присевшей отдохнуть.
2:30 - На меч она опирается, отдыхает, значит.
3:00 - Пусть на ней будет развивающийся по ветру плащ!
3:30 - ...И купальник.
4:00 - А лучше доспех!
4:30 - Не... униформа!
5:00 - Уберите плащ, он не идет к униформе.
5:30 - Пусть она смело стоит на мостике космического крейсера!
6:00 - Почему у нее меч? Уберите это старье. А УЗИ переделайте в бластер!
6:30 - Ее волосы развиваются по ветру... для красоты, значит.
7:00 - Бастер не смотрится... уберите его. Она вообще капитан этого корабля, ей не нужен бластер!
7:30 - Ей нужна фуражка капитана! И аккуратно собранные на голове волосы!
8:00 - И сидеть она должна в кресле капитана!
8:30 - Красивая, суровая и необычайно смелая капитанша корабля пиратов...
9:00 - Нет, эскадры боевого флота Галлактической Федерации!
9:30 -... Вытягивая палец, отдающая приказ о смене курса...

По истечению 10 минут "Заказчик" берет работу "Исполнителя", критически ее осматривает и высказывает свое впечатление: "Ну это же совсем не то, что я хотел! А где ее верный советник? А почему у нее нет табельного оружия? И вообще, почему она такая некрасивая и суровая? Я же просил КРАСИВУЮ девушку! И вообще на рисунке столько каракулей... Плохой вы программист, зря я к вам обратился... Не буду платить за такую халтуру!"

Для большей остроты ощущений, можно взять целую "Комаду Разрабоотчиков", и пусть они вместе рисуют "большой и красивый пейзаж" за 10 минут"