Sunday, November 27, 2011

Звук в FreeBSD

Небольшое вступление
Уже прошло много времени с тех пор как я написал последний пост в своем блоге. 
И сейчас я хочу исправить эту ситуацию, потому что у меня скопилось достаточно много заметок по работе с FreeBSD и работы в консольном режиме в особенности.
В этом посте я просто приведу свой заметки по настройке звука, воспроизведения mp3, ogg из под консоли.
Небольшое замечание:
Ясно, что нормальные люди не будут слушать музыку:
а) в FreeBSD;
б) и из консоли.
Свои заметки я привожу так, что бы не пропали, может быть кому-то они будут полезны.

Содержание:
  1. Настройка звука в FreeBSD;
  2. Необходимое ПО для воспроизведения mp3;
  3. Необходимое ПО для воспроизведения ogg;
  4. Регулирование громкости звука.
Настройка звука в FreeBSD
С первым чем придется разобраться это настройкой звуковой карты, а именно подгрузкой соответствующих модулей.
Подгрузка всех  модулей для всех известных аудио устройств:
#: kldload snd_driver
Или можно подобрать тот который подходит больше всего (ссылка):
#: kldload snd_emu10k1
или добавлением соответствующей строки к файлу /boot/loader.conf:
snd_emu10k1_load="YES"

Необходимое ПО для воспроизведения mp3
Для прослушивания mp3 будем использовать mpg123 (Порт audio/mpg123).
Запуск на прослушивание одной композиции:
#: mpg123 file.mp3
Запуск списка на воспроизведение:
#: mpg123 -C -@ /home/user/musuk/list.txt

Необходимое ПО для воспроизведения ogg
Для воспроизведения файлов в формате ogg необходима утилита ogg123, поставляемая с пакетом vorbis-tools. Vorbis-tools — набор утилит для  использования, манипулирования и создания vorbis файлов.
Запуск на прослушивание: 
#: ogg123 file.ogg
Особенности настройки порта vorbis-tools.
Единственная, мною замеченная, большая особенность этого порта — это то, что он  подтягивает за собой большое количество ненужных в консольных системах библиотек и программ. Поэтому есть потребность ознакомится со списком зависимостей, чтобы не захламить компьютер не нужными графическими библиотеками.
Первое что попадается в зависимостях vorbis-tools - это Libao. 
Libao  - это кросс платформенная аудио библиотека позволяющая программам ее использующим  выдавать звуковые сигналы используя простой API. У библиотеки libao имеются следующие зависимости на выбор пользователя:
ARTS - aRts (analog Real time synthesizer, аналоговый синтезатор реального времени) Из  wikipedia: мультимедийная архитектура, реализуемая в проекте рабочей среды KDE. Cтала частью её архитектуры в KDE версии 2.0. aRts позволяет воспроизводить множество аудиопотоков одновременно, как на локальном компьютере, так и по сети. 
ESOUND -Enlightened Sound Daemon (ESD или EsounD) — звуковой сервер для оконного менеджера Enlightenment и среды GNOME. ESD смешивает звуковые потоки нескольких одновременно выполняемых программ и выводит получающийся поток на звуковую плату. ESD также может управлять передачей звука посредством сети. Так, приложения, поддерживающие ESD, могут передавать аудио поток по сети любому присоединённому компьютеру, на котором запущен сервер ESD. Поддержка ESD должна быть специально реализована в приложении, поскольку ESD не эмулирует обычные звуковые API. Так как ESD был доступен на протяжении более чем десятилетия — раньше чем большинство других звуковых серверов, то очень большое количество приложений Unix поддерживают ESD непосредственно или с помощью дополнений.
NAS - (Network Audio System) клиент-серверная система передачи звука с открытым исходным кодом.
PulseAudio - кроссплатформенный звуковой сервер, созданный в качестве улучшенной замены таких серверов, как ESD.
Все системы кроме ESD в качестве зависимостей тянут компоненты X11 и|или Qt, что в консольной системе может быть излишеством. Выбираем ESD.
Подробнее о звуковых системах в Unix like системах на http://www.slackguide.com/content/view/62/1/ 

Регулирование громкости звука
Получить текущий уровень громкости:
#: mixer vol
задать уровень громкости 60%:
#: mixer vol 60

Ссылки по теме:

Thursday, June 10, 2010

Поиск значений атрибутов в XML при помощи XPath в C#

Поиск значений атрибутов в XML при помощи Xpath в C#:

Однажды имелась потребность осуществить поиск по атрибутам элементов в xml базе:

<?xml version="1.0" encoding="utf-8" ?>

<sensomotor>

<aqustic less="180" more="" value="Удовлетворительно" signal="0"/>

<aqustic less="240" more="211" value="Пипец" signal="0"/><aqustic less="210"

more="181" value="Необходимы меры по оказанию ПМП"
signal="1"/>

...
<optic less="220" more="" value="Удовлетворительно" signal="0"/>

<optic less="260" more="220" value="Принять срочные меры по оказанию ПМП" signal="1"/>

<optic less="" more="260" value="Нет реакции" signal="2"/>...

</sensomotor>



В этой xml базе содержится соответствие диапазона значений и соответствующий им «диагноз». Атрибуты элементов определяют диапазоны значений.

Решить эту задачу можно в C# использую Xpath:

using System.Xml.XPath;

//current – значение которое должно входить в интервал задаваемое в атрибутах эл-та
//param — имя эл-та aqustic или optic
public string readConf(string current,string param)
{
XPathDocument xpdoc = new XPathDocument("conf.xml");
XPathNavigator nav = xpdoc.CreateNavigator();
XPathExpression expr = nav.Compile("sensomotor/"+param+"[(@more<" + current +
"and @less>" + current + ") or (@less>" + current + " and @more=\"\") or (@more<"+
current + " and @less=\"\")]");
XPathNodeIterator iter = nav.Select(expr);
string str="";
while (iter.MoveNext())
{
XPathNavigator nav2 = iter.Current.Clone();
// Выбираем у найденого эл-та атрибут “value”:
str += nav2.GetAttribute("value","");
}
return str;
}

Monday, June 7, 2010

Задания на вакансию С# Developer

В общем, получил я список тестовых заданий на вакансию программиста. Поэтому привожу первое задание на алгоритмы, может, кому пригодится…
Написать класс, преобразующий числа из одной позиционной системы счисления в другую.
Класс должен реализовать следующий интерфейс
interface IConvert
{
///
/// Преобразование числа из одной позицонной системы счисления в другую
///

/// строковое предствление числа в базовой системе счисления
/// строка представляющая основание базовой системы счисления
/// строка представлюща основание системы счиления в которую надо перевести
/// строковое предстваление числа в новой системе счисления
/// Исключание если конвертируемое значение не представлет из себя число в базовой сисеме счисления
string Convert(string value, string fromBase, string toBase);
}

Примечание:
Строки предствлюшие основние позиционной системы содержат любые символы для предстваления цифры, в порядке возрастания

Пример
Value = “GSAK”
fromBase = “ASGK” – основание системы равно 4 (если записать арабскими то 0,1,2,3)
toBase= “0,1,2,3,4,5,6,7,8,9” – основние сисемы равно 10
return value = “147”

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

static void Main(string[] args)
{

PositionSystemConverter PSC = new PositionSystemConverter();
Console.WriteLine("Пример работы программы (из 4-ой сист. счисл. в 10-ю):");
//Фактически конвертируем из 4-ой сист. счисл. в 10-ю
string rez_str = PSC.Convert("ASGK", "GSAK", "0,1,2,3,4,5,6,7,8,9");
Console.WriteLine(rez_str);
//Конвертируем из 4-й сист. счисления в 16-ю
string rez_str2 = PSC.Convert("ASGK", "GSAK", "0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f");
Console.WriteLine("Работа алгоритма(из 4-й сист. счисления в 16-ю): "+rez_str2);
//Осуществим проверку стандартными средствами библиотеки классов
Console.WriteLine("Проверка: "+ Convert.ToString(Convert.ToInt32(rez_str), 16));
//Конвертируем из 4-й сист. счисления в 2-ю
string rez_str3 = PSC.Convert("ASGK", "GSAK", "0,1");
Console.WriteLine("Работа алгоритма(из 4-й сист. счисления в 2-ю): "+rez_str3);
Console.WriteLine("Проверка: " + Convert.ToString(Convert.ToInt32(rez_str), 2));
//Конвертируем из 4-й сист. счисления в 16-ю
string rez_str4 = PSC.Convert("ASGKS", "GSAK", "0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f");
Console.WriteLine("Работа алгоритма(из 4-й сист. счисления в 16-ю): " + rez_str4);
}

Рис. 1 Результат работы
Судя по рис.1 работает как надо (147 получатся).
И вот реализация интерфейса.
Следует сказать про программу. Первым делом анализируется fromBase – составляется словарь (символ - соответствующее десятичное число). Потом используя строку Value и словарь определяем число в 10й системе. И в конце, анализируя строку toBase – определяем необходимую систему счисления, осуществляем перевод. Задача легко раскладывается «по полочкам».
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace TZ_project
{
interface IConvert
{
///
/// Преобразование числа из одной позицонной системы счисления в другую
///

/// строковое предствление числа в базовой системе счисления
/// строка представляющая основание базовой системы счисления
/// строка представлюща основание системы счиления в которую надо перевести
/// строковое предстваление числа в новой системе счисления
/// Исключание если конвертируемое значение не представлет из себя число в базовой сисеме счисления
string Convert(string value, string fromBase, string toBase);
}

class PositionSystemConverter : IConvert
{
public string Convert(string value, string fromBase, string toBase)
{
//Конвертируем в Десятичное значение число value
int ValueInDec = ConvertfromBaseToDec(fromBase,value);
// Теперь есть необходимость узнать основание системы отсчета в которую надо конвертировать
int Osnovanije = OsnovanieToBase(toBase);
// Теперь конвертируем из десятичной в систему toBase
// Получаем массив разрядов соответствующее сиситеме ToBase
// Разряды в массиве заданы десятичными значениями, поэтому надобудет заменить эти значения
// на соответствующие символы (см. парам. ToBase)
int[] rezDec = convertFromDec(ValueInDec, Osnovanije);
// Формируем строку в формате строки toBase
string ValueToBase = writeInFormatToBase(toBase,rezDec);

return ValueToBase;
}
private int ConvertfromBaseToDec(string fromBase, string value)
{
// Определяем длины входных параметров метода
int fromBase_len = fromBase.Length;
int value_len = value.Length;
// Создаем массивы под алфавит и масив разрядов
baseVocabular[] ABC = new baseVocabular[fromBase_len];
int[] razr_dec = new int[value_len];
//Заполним алфавит буквами из строки fromBase
// После выполнения цикла переменная Osnovanije будет содержать основание системы
int Osnovanije;
for (Osnovanije = 0; Osnovanije < valuechararray =" value.ToCharArray();" j =" 0;" n =" 0;" rez =" 0;//Заранее" razr_len =" razr_dec.Length;//Определяем" shag =" razr_len" j =" 0;" razradcol =" (int)Math.Ceiling(Math.Log(rez)" rezrazrad =" new" i =" razradCol" ostatok =" rez" rez =" rez" tobaseelements =" toBase.Split(',');" elements_len =" ToBaseElements.Length;" tobaseabc =" new" tobaseosn =" 0;" numberrazr_len =" numberRazr.Length;" rezultstr = "" i =" 0;" n =" 0;" charindex =" charIndex;" ch =" simbol;" ch ="="" charindex ="="">
select * from #t

В результате выполнения <запрос> должен получиться следующий результат

8 qwe 100.00
10 asd 100.00
12 zxc 100.00

Решение:
with c as
(
select row_id, sum(case when _key='asd' then _total end) as asd
,sum(case when _key='qwe' then _total end) as qwe,
sum(case when _key='zxc' then _total end) as zxc
from #t
group by row_id
)
--select * from c
delete from #t where row_id not in(
select MAX(row_id) from c where asd=(select MAX(asd) from c)
union all
select MAX(row_id) from c where qwe=(select MAX(qwe) from c)
union all
select MAX(row_id) from c where zxc=(select MAX(zxc) from c)
)
select * from #t
Задачка непростая, первое что пришло в голову это развернуть таблицу по колонке _key. Недостаток решения, в том, что используются значения из таблицы. Эти же значения можно было бы получить запросом: “select distinct _key from #t”, но нет в T-SQL поддержки «классических» массивов, которые здесь бы пригодились…

Рис. 2 Результат Select-запроса С

Рис. 3 Результат запроса