1 июня 2012 г.

Юрий Нестеренко

Краткий программистский разговорник 

 

1. Общение с начальством

Невозможно в принципе - я не знаю, как это сделать
Невозможно - я знаю, как, но мне лениво
Сложно - придется прочитать документацию
В принципе, реализуемо - я как раз вчера скачал из интернета библиотеку, которая решает поставленную задачу
Элементарно - употребляется исключительно при оценке задач, стоящих перед другими программистами, независимо от степени их сложности
Работает - компилируется
Отлаживаю - не компилируется
Прогоняю тестовые примеры - пытаюсь найти такой, на котором программа не вываливается
Работал допоздна - играл по сети
К десяти - после обеда
После обеда - к 18:00
Завтра - через неделю
Неделя - месяц
Месяц - полгода
Год - никогда
Точно - может быть
Вероятно - вероятность равна 1.5%
Может быть - нет
Нет - а кого вы еще найдете за такие деньги?

 

2. Общение с заказчиком

Невозможно в принципе - невозможно в принципе
Сложно - элементарно, но предложенная сумма мне не нравится
В принципе, реализуемо - я понятия не имею, как это сделать, но предложенная сумма мне нравится
Элементарно - употребляется исключительно в ответ на вопрос, легко ли будет пользователю освоить интерфейс программы
Ресурсоемкая задача - мне лень заниматься оптимизацией
Передовые информационные технологии - мне лень заниматься оптимизацией
Большой объем работы - целый час качал библиотеку из интернета
Минимальные требования - запустится, но работать не будет
Дружественный интерфейс - поддерживается мышка
Простой интерфейс - не поддерживается мышка
Полная совместимость - никто не проверял, но чем черт не шутит?
Релиз - бета-версия
Особенности - глюки
Оптимизация - выкидывание того, что так и не удалось заставить работать
Превосходит аналоги - занимает больше места
Неделя - 1) месяц 2) день
Месяц - 1) полгода 2) неделя
Год - понятия не имею, сколько

 

3. Общение с коллегой

Козел - начальник
Козлы - заказчики
Ламеры - 1) все авторы программных продуктов, за исключением говорящего и собеседника 2) то же, но включая собеседника
Юзеры - низшая форма жизни, тупиковая ветвь эволюции
Хакеры - 1) вершина эволюции, принадлежность к каковой говорящегонеявно подразумевается 2) гады, вчера приславшие мне очередной троян
Глюкало - 1) софт 2) железо
Глюкодром - 1) железо 2) софт
Sux и Rulez - все остальные слова

(C) YuN, 2003
http://yun.complife.ru

26 мая 2012 г.

Испорченный телефон IT бизнеса

Программист – Начальнику группы

Это невозможно! По буквам: Н-Е-В-О-З-М-О-Ж-Н-О! Нам потребовалось бы изменить дизайн и никто в нашей команде не знает как была устроена эта система. Кроме того никто не знает языка на котором был написан это софт. Так что даже если бы кому-то пришло в голову это сделать, то у него не получилось бы. Если вас интересует моё мнение, то это тот тип проектов, которые наша компания должна избегать изо всех сил!

Начальник группы – Менеджеру проекта

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

Менеджер проект – Менеджеру первого уровня

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

Менеджер первого уровня – Менеджеру второго уровня

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

Менеджер второго уровня - CEO

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

CEO - клиенту

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

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 это выглядит так: