четверг, 5 мая 2011 г.

Смена аудиокарты при помощи Unity

Не всем будет полезно это знать, но тем кому это необходимо будут радоваться! Сегодня я научу Вас, как менять выход с одной аудиокарты на другую одной кнопкой, причем под новой Ubuntu 11.04 с использованием Unity.

Для начала надо прикинуть как меняется звук в самом гноме. Меняется он при помощи PulseAudio, Кому интересно могут порыться полностью, но я затрону только часть. Почитав TFM я увидел, что в самом низу страницы есть скриптик, который подходит под наши нужды. 
Слегонца испохабив и урезав комментарии для блога я получил следующее:
#!/bin/bash
totalsc=$(pacmd "list-sinks" | grep card: | wc -l)
if [ $totalsc -le 1 ]; then
  notify-send -u critical -t 5000 "Nothing to switch, system only has one sound card."
  exit
fi
scindex=$(pacmd list-sinks | awk '$1 == "*" && $2 == "index:" {print $3}')
cards=$(pacmd list-sinks | sed 's|*||' | awk '$1 == "index:" {print $2}')
PICKNEXTCARD=1
count=0
for CARD in $cards; do
  if [ $PICKNEXTCARD == 1 ]; then
    nextsc=$CARD
    PICKNEXTCARD=0
    nextind=$count
  fi
  if [ $CARD == $scindex ]; then
    PICKNEXTCARD=1
  fi
  count=$((count+1))
done
pacmd "set-default-sink $nextsc"
inputs=$(pacmd list-sink-inputs | awk '$1 == "index:" {print $2}')
for INPUT in $inputs; do # Move all current inputs to the new default sound card
  pacmd move-sink-input $INPUT $nextsc
done
nextscdesc=$(pacmd list-sinks | awk '$1 == "device.description" {print substr($0,5+length($1 $2))}' \
                         | sed 's|"||g' | awk -F"," 'NR==v1{print$0}' v1=$((nextind+1)))
exit
Всё что нам надо, это сохранить этот скрипт в файл и положить его в необходимую папку. Назовем файл soundswitch и наполним его сосуд истиной кода. После чего выполняем копирование:
sudo cp soundswitch /usr/local/bin/
Дальше создаём ярлык для запуска скрипта. Лично я сделал это ручками, создав файлик, наполнив его следующим содержимым:
[Desktop Entry]
Name=Soundswitch
Exec=/usr/local/bin/soundswitch
Icon=preferences-sound
Terminal=false
Type=Application
StartupNotify=false
Дальше следует просто перетянуть этот ярлык на панель Unity и получать удовольствие от клика и перманентной смены аудиокарты. 
PS: Возникла проблемка с быстрой сменой в Unity. При нажатии на кнопку она сменяет аудиокарту, но потом долго тупит и только потом можно нажать снова. Пока не нашел как победить эту напасть.

воскресенье, 1 мая 2011 г.

LaTeX, Tabular и костыли...

Сегодня я покажу как решить ещё одну проблему с tabular. У всех наверное возникало желание сделать таблицу со столбцами необходимого размера. Обычно это делается вводной строкой по виду:

\begin{tabular}{|p{0.15\textheight}|p{0.2\textheight}|p{0.2\textheight}|}\hline
Я хочу быть в центре & $1$ & $м^2$  \\
Я тоже хочу быть в центре & $2$ & $см^2$ \\
А я буду в центре & $3$ & $дм^2$ \\\hline
\end{tabular}

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

Нам понадобиться пакет \usepackage{array}. Почитав к нему документацию я нарыл полезных вещей. Начнемс.
При импорте пакета у нас появляется возможность использовать структуру:
>{decl.} и <{post decl.}
Первая команда помогает нам декларировать прямо перед надписью в строке, а вторая соответственно после, любой текст и команды. Теперь на живом примере покажу как и что можно сделать.
Исправляем код, на вот такой:

\begin{tabular}{|p{0.15\textheight}|>{$}p{0.2\textheight}<{$}|>{$}p{0.2\textheight}<{$}|}\hline
Я хочу быть в центре & 1 & м^2  \\
Я тоже хочу быть в центре & 2 & см^2 \\
А я буду в центре & 3 & дм^2 \\\hline
\end{tabular}

Компилируем и видим, что ничего не изменилось. Однако, LaTeX не вывалил ошибки по поводу того, что у нас стоит ^2 без соответствующих $...$. Теперь рассмотрим почему. Как говорилось ранее, команды >{decl.} и <{post decl.} добавляют чепуху в нашей строке. В нашем случае происходит добавление необходимых знаков $...$ до и после командами:
>{$} и <{$}
Мы избавились от ненужного копипаста, дальше больше, непосредственное центрование. Кто знает чутка как ковырять LaTeX, уже знает команду \centering. Так как у нас создаётся в каждой ячейке таблицы \parbox{width}{}, то внутри него можно объявлять команду \centering и мы не получим никаких лишних сюрпризов. Но не будем же мы каждый раз писать в каждой ячейке эту команду? Правильно, добавляем её подобным макаром, но с одним небольшим НО:

\begin{tabular}{|p{0.15\textheight}|>{\centering\arraybackslash$}p{0.2\textheight}<{$}|>{$}p{0.2\textheight}<{$}|}\hline
Я хочу быть в центре & 1 & м^2  \\
Я тоже хочу быть в центре & 2 & см^2 \\
А я буду в центре & 3 & дм^2 \\\hline
\end{tabular}

На выходе получаем следующее:
Теперь о этом самом НО. Если не написать после \centering \arraybackslash, то в случае таблицы у нас будут матюки и вся программа вывалиться. \arraybackslash означает что-то типо \\, но вдаваться в подробности не буду, если надо, то почитаете сами.

А теперь чертовски хитрый ход конём. Чтобы не писать каждый раз эту длинную фразу к каждому столбцу умные люди придумали следующее:
\newcolumntype{X}[1]{>{\centering\arraybackslash}p{#1}} 
Да, да, это функция, но только специфическая. Она создаёт новый тип колонки, который вызывается через X{width}, и делает колонку по центру. Соответственно можно модифицировать как хочется.
Ну а теперь полный мастеркласс:
\usepackage{array}
\newcolumntype{X}[1]{>{\centering\arraybackslash}p{#1}}
\usepackage{rotating} 
\begin{tabular}{|X{0.1\textheight}@{\hspace{0.1\textheight}--->}>{\begin{sideways}$}X{0.1\textheight}<{$\end{sideways}}||>{$}X{0.1\textheight}<{$}|}\hline
Я хочу быть в центре & 1 & м^2  \\ \cline{3-3}
Я тоже хочу быть в центре & 2 & см^2 \\ \cline{3-3}
А я буду в центре & 3 & дм^2 \\\hline
\end{tabular} 

На выходе получаем следующее:

Помимо сказанного я применил фишку с добавлением отступа и разделителя командой
@{\hspace{0.1\textheight}--->}
Заметим, что цифры повернулись слево, это делается командой \begin{sideways}...\end{sideways} из пакета \usepackage{rotating}, которую мы тоже забабахали в объявление таблицы.

+ ко всему прочему, я заюзал команду \cline, о которой не знает только ленивый.
На этом пожалуй всё, удачи Вам в ваших LaTeX'ованиях!