20 окт. 2012 г.

Ubuntu Precise: moodle+postgresql

В двух словах: плохая идея.

Подробнее: да, поддержка СУБД PostgreSQL в Moodle заявлена, даже подключить базу удаётся (важно проконтролировать, чтобы был установлен php5-pgsql, а не php5-mysql, который может быть автоматически заказан вместо него). Нет, начальное наполнение базы не завершается из-за множественных жалоб СУБД на ошибки SQL-кода. Версии — PostgreSQL 9.1, Moodle 1.9.9. Возможно, с PostgreSQL 8.4, которая также доступна в репозитории, ситуация иная.

С MySQL Moodle в Precise Pangolin просто работает.

10 авг. 2012 г.

R: Построение полигона частот

В R существует возможность вместо гистограммы (или вместе с ней) построить полигон частот.

> x <- rnorm(100)
> hist(x)
> h1 <- hist(x)
> lines(h1$counts ~ h1$mids, col="red")
> rug(x)

Выглядеть результат будет следующим образом:

Полигон частот, построенный на гистограмме

Рисование гистограммы можно подавить, построив только полигон частот:

> h1 <- hist(x, plot=FALSE)
> plot(h1$counts ~ h1$mids, col="red", type="l", bty="n",
+ main="Полигон частот для x", xlab="x", ylab="Частота")

h1 — очень информативный объект, он содержит сведения о границах ($breaks) и серединах ($mids) интервалов, на которые разбиваются исходные данные, частоте ($counts) и относительной частоте ($density) наблюдений на каждом интервале.

> str(h1)
List of 7
 $ breaks     : num [1:11] -2.5 -2 -1.5 -1 -0.5 0 0.5 1 1.5 2 ...
 $ counts     : int [1:10] 1 5 9 9 28 18 12 11 4 3
 $ intensities: num [1:10] 0.02 0.1 0.18 0.18 0.56 0.36 0.24 0.22 0.08 0.06
 $ density    : num [1:10] 0.02 0.1 0.18 0.18 0.56 0.36 0.24 0.22 0.08 0.06
 $ mids       : num [1:10] -2.25 -1.75 -1.25 -0.75 -0.25 0.25 0.75 1.25 1.75 2.25
 $ xname      : chr "x"
 $ equidist   : logi TRUE
 - attr(*, "class")= chr "histogram"

2 сент. 2011 г.

Настройка TV-тюнера PixelView PV — BT878P+ FM.RC

Выглядит этот TV-тюнер следующим образом:

PixelView PV — BT878P+ FM.RC

и с другой стороны:

PixelView PV — BT878P+ FM.RC

Настраивается в linux одной командой:

sudo echo "options bttv card=72 tuner=23 radio=1" > /etc/modprobe.d/bttv.conf

UPD:

В Ubuntu Lucid файл /etc/modprobe.d/bttv.conf следует создавать при помощи любимого текстового редактора.

В Windows программа DScaler 4.11.17 подхватывает телесигнал при указании в качестве карты — PixelView PlayTV pro, в качестве тюнера — Philips [PAL].

22 мар. 2011 г.

GRUB 2: Парольная защита загрузки Linux в режиме восстановления

В Ubuntu Lucid загрузка Linux в режиме восстановления настроена по умолчанию так, что доступ к учетной записи root не требует авторизациии. Кроме того, разрешено свободное редактирование любого пункта меню загрузки. Исправить ситуацию можно настроив в GRUB 2 аутентификацию.

Назначим имя и пароль суперпользователя GRUB 2, добавив следующий текст в конец файла /etc/grub.d/00_header:

cat << EOF
set superusers="user1"
password user1 password1
EOF

Суперпользователь (в нашем случае — user1) имеет возможность загружать и редактировать любой пункт меню GRUB 2, а также работать с GRUB 2 в режиме командной строки. Без прохождения аутентификации эти действия становятся невозможны.

В файле /etc/grub.d/10_linux заменяем этот фрагмент:
printf "menuentry '${title}' ${CLASS} {\n" "${os}" "${version}"

на следующий:

if ${recovery} ; then
  printf "menuentry '${title}' --users user1 ${CLASS} {\n" "${os}" "${version}"
else
  printf "menuentry '${title}' ${CLASS} {\n" "${os}" "${version}"
fi

Таким образом мы разрешаем загрузку режима восстановления (recovery) только пользователю user1.

GRUB 2 поддерживает хранение пароля в виде хэша (алгоритм PBKDF2). Сформировать такой хэш можно при помощи программы grub-mkpasswd_pbkdf2, которая запрашивает пароль и отдает его хэш в стандартный вывод (более двухсот символов заменено на многоточие для удобства отображения).

Enter password:  
Reenter password: 
Your PBKDF2 is grub.pbkdf2.sha512.10000.9290F727ED06C38BA4549EF7DE25CF5…

В случае использования PBKDF2-хэша пароля, запись для пользователя user2 в файле /etc/grub.d/00_header будет выглядеть так:

password_pbkdf2 user2 grub.pbkdf2.sha512.10000.9290F727ED06C38BA4549EF7DE25CF5…

Заметка основана на этом руководстве и этой статье.

19 сент. 2010 г.

Мультизагрузка, GRUB 2 и LVM

Дважды в год мне приходится организовывать на компьютере двойную загрузку — очередной и предыдущей версий Ubuntu. Ситуацию осложняет то, что корневой раздел я традиционно размещаю в системе LVM, соответственно под /boot выделен отдельный раздел, а установщик Ubuntu при работе затирает его содержимое (с фатальными для загрузки предыдущей версии последствиями).

Наиболее удобным мне кажется следующее решение:

  1. Содержимое /boot копируется с отдельного раздела в соответствующий каталог корневой файловой системы.
  2. Строка для /boot удаляется из /etc/fstab уже установленной версии Ubuntu. Также из системы удаляется системный загрузчик.
  3. Устанавливается новая версия Ubuntu. Загрузочный раздел используется под /boot уже ею. GRUB 2 при установке автоматически формирует строку для загрузки старой версии Ubuntu.

14 мар. 2010 г.

Заголовки партитур в LilyPond

Сформировать заголовок партитуры в LilyPond можно следующим образом:
\version "2.12.1"
\pointAndClickOff
\book{
  \paper {indent = 0}
  \header {
      dedication  = "Посвящение"
      title       = "Название"
      subtitle    = "Подзаголовок"
      subsubtitle = "Подподзаголовок"
      poet        = "Имя ПОЭТА"
      instrument  = "Название инструмента"
        %Центрируется под подподзаголовком. Кроме того, центрируется вверху 
        %каждой последующей после первой страницы.
      composer    = "Имя КОМПОЗИТОРА"
      meter       = "Meter string"
        %Выравнивается по левому краю под именем поэта.
      arranger    = "Имя АРАНЖИРОВЩИКА"
      piece       = "Название пьесы"      %Эти два параметра отображаются для
      opus        = "Название сочинения"  %каждого \score{}, если там не указаны
                                          %собственные значения.
      %breakbefore      = This forces the title to start on a new page 
      %(set to ##t or ##f).
      copyright        = "© Уведомление об авторском праве"
      %Центрируется внизу первой страницы.
      tagline           = "Подзаголовок"
      %Центрируется внизу последней страницы.
  }
  \score {
    \relative c'' {
      \tempo "Slowly and tenderly" 4.=54 
      c4
    }
    \header {
      %piece = "Название пьесы 1"      %Эти два параметра подавляют аналоги из 
      opus  = "Название сочинения 1"  %главного блока \header{} если заданы здесь.
        % Остальные параметры будут подавлены в любом случае.
    }
  }
  \markup {
      Необязательный текстовый блок
  }
  \score {
    {\tempo "Allegro" 4=120 
      c'4
    }
    \header {
      piece = "Название пьесы 2"      %Эти два параметра подавляют аналоги из 
      %opus  = "Название сочинения 2"  %главного блока \header{} если заданы здесь.
        % Остальные параметры будут подавлены в любом случае.
    }
  }
}
После компиляции этого кода получится следующий результат:
Обычное заполнение полей заголовков
В случае, когда пользователю необходимо отображение, отличное от предоставляемого (например, сведения о композиторе необходимо отобразить в несколько строк), он может воспользоваться более сложным синтаксисом:
\version "2.12.1"
\pointAndClickOff
\book{
  \paper {indent = 0} % Убираем "красную строку" во всем документе.
  \header {
      dedication  = \markup \fill-line {"Посвящение" "Еще одно посвящение"}
      title       = \markup \column \center-align {"Название произведения" "в несколько строк"}
      subtitle    = \markup \fill-line {" " "Подзаголовок"}
      subsubtitle    = \markup \fill-line {"Подподзаголовок" " "}
      poet        = \markup \left-align \center-column {"Город" "Имя ПОЭТА" "Год"}
      instrument  = "Название инструмента"
      composer    = \markup \right-align \center-column {"Город" "Имя КОМПОЗИТОРА" "Год"}
      meter      = \markup {Slowly and tenderly (\teeny \note #"4." #1 = 54) }
      arranger    = \markup \right-column {"Город" "Имя АРАНЖИРОВЩИКА" "Год"}
%     tagline     = ##f %Если не указать tagline выводится значение по умолчанию: 
%                         "Music engraving by LilyPond 2.12.1—www.lilypond.org"
  }
  \score { \relative c'' { c4 } }
}
После компиляции этого кода получится следующий результат:
Необычное заполнение полей заголовков
В принципе, штатное использование полей заголовка не обязательно. Здесь находится соответствующая страница официального руководства пользователя LilyPond.

4 янв. 2010 г.

Общесистемная настройка шрифтов

Мне не нравится то, как по умолчанию выглядят шрифты в Ubuntu. Напротив, мне нравится, как выглядят шрифты Monotype, используемые маленькой фирмой, производящей мягкие окна.

Команда
$ aptitude install ttf-mscorefonts-installer
с последующей доводкой напильником gnome-appearance-properties (Система → Параметры → Внешний вид → Шрифты), решает проблему лишь частично — в firefox, например, также необходимо указать три варианта шрифта, причем, желательно, для каждого языка.

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

Для исполнения этого желания достаточно использовать пару файлов:

  • /etc/fonts/local.conf для общесистемных настроек;
  • ~/.fonts.conf для настроек пользовательских.

Содержимое этих файлов прекрасно описано здесь, однако свою версию /etc/fonts/local.conf я приведу:

<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
<!-- Настройки отображения шрифтов по умолчанию -->
<match target="font">
  <edit mode="assign" name="rgba"><const>none</const></edit>
  <edit mode="assign" name="hinting"><bool>false</bool></edit>
  <edit mode="assign" name="hintstyle"><const>hintfull</const></edit>
  <edit mode="assign" name="antialias"><bool>true</bool></edit>
  <edit mode="assign" name="autohint"><bool>false</bool></edit>
</match>
<!-- Включить hinting, выключить antialias для мелких шрифтов -->
<match target="font">
  <test compare="less_eq" name="pixelsize" qual="any"><double>17</double></test>
  <edit mode="assign" name="hinting"><bool>true</bool></edit>
  <edit mode="assign" name="antialias"><bool>false</bool></edit>
</match>
<!-- Включить antialias для полужирных шрифтов среднего размера -->
<match target="font">
  <test compare="more_eq" name="pixelsize" qual="any"><double>15</double></test>
  <test name="weight" compare="more"><const>medium</const></test>
  <edit name="antialias" mode="assign"><bool>true</bool></edit>
</match>
<!-- Назначить предпочтения в семействах шрифтов
(шрифты Monotype предпочтительнее всех) -->
<alias>
  <family>serif</family>
  <prefer>
    <family>Times New Roman</family>
    <family>Liberation Serif</family>
    <family>DejaVu Serif</family>
    <family>Thorndale AMT</family>
    <family>Luxi Serif</family>
    <family>Nimbus Roman No9 L</family>
    <family>Times</family>
  </prefer>
</alias>
<alias>
<family>sans-serif</family>
  <prefer>
    <family>Arial</family>
    <family>Liberation Sans</family>
    <family>DejaVu Sans</family>
    <family>Verdana</family>
    <family>Helvetica</family>
    <family>Albany AMT</family>
    <family>Luxi Sans</family>
    <family>Nimbus Sans L</family>
  </prefer>
</alias>
<alias>
  <family>sans</family>
  <prefer>
    <family>Arial</family>
    <family>Liberation Sans</family>
    <family>DejaVu Sans</family>
    <family>Verdana</family>
    <family>Helvetica</family>
    <family>Albany AMT</family>
    <family>Luxi Sans</family>
    <family>Nimbus Sans L</family>
  </prefer>
</alias>
<alias>
  <family>monospace</family>
  <prefer>
    <family>Courier New</family>
    <family>Liberation Mono</family>
    <family>DejaVu Sans Mono</family>
    <family>Cumberland AMT</family>
    <family>Luxi Mono</family>
    <family>Nimbus Mono L</family>
    <family>Courier</family>
  </prefer>
</alias>
</fontconfig>

За способ включения сглаживания у полужирных шрифтов спасибо жижеюзеру sb0y.

UPD: Добавляю ссылки на отличное описание опций и виртуозный пример управления отображением шрифтов.