12 нояб. 2012 г.

R: Построение гистограммы со столбцами равной площади

Гистограмма со столбцами равной площади полезна для более точного, чем гистограмма со столбцами равной ширины, отражения формы плотности вероятности распределения переменной.

Функция hist умеет строить такие гистограммы, если в качестве границ интервалов передать ей значения соответствующих квантилей, которые можно получить при помощи функции quantile.

Аргумент freq функции hist принимает при таком её использовании значение по умолчанию FALSE — отображаются не частоты а вероятности попадания переменной в тот или иной интервал.

> q <- quantile(x, probs=seq(0, 1, 1/9))
> h <- hist(x, breaks=q)
> rug(x)

Результат — на рисунке ниже.

Рисуем картограммы в R

Шейп-файлы с картой России (указаны границы административно-территориального деления вплоть до муниципальных районов и городских округов) можно получить на этом сайте сообщества GIS-Lab. Отдельные шейп-файлы для регионов РФ и стран — бывших республик СССР GIS-Lab выкладывает сюда (в файлах boundary-* указаны границы АТО вплоть до районов городских округов и территориальных органов управления).

> # Закажем необходимую для работы библиотеку maptools…
> library("maptools")
> #… и загрузим шейп-файл АТО Удмуртии в объект udm:
> udm <- readShapePoly("~/projects/r-maps/RU-UD/boundary-polygon.shp",
+ proj4string = CRS("+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs"))

Естественно, вместо "~/projects/r-maps/RU-UD/boundary-polygon.shp" следует указать имя Вашего файла, а вместо "+proj=longlat +ellps=WGS84 +datum=WGS84" — Ваши предпочтения по проекции и системе координат (Proj.4 представление). Значение proj4string можно изменять без перезагрузки шейп-файла, например, так:

> proj4string(udm) <- CRS("+proj=merc")

Собственно, уже можно начинать рисовать.

> # Создаём файл-устройство для рисования:
> png("boundary-all.png", width=300, height=400, units="px", bg="transparent")
> # Задаём поля отступов:
> par(mar=c(0.5,0.5,0.5,0.5))
> # Рисуем все АТО в объекте udm:
> plot(udm, col="white")
> # Закрываем файл-устройство:
> dev.off()

Результат:

Естественно, отображением можно управлять. Посмотрим на объект udm подробнее:

> summary(udm)
Object of class SpatialPolygonsDataFrame
Coordinates:
       min      max
x 51.12416 54.43483
y 55.85058 58.54584
Is projected: FALSE 
proj4string :
[+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs]
Data attributes:
     OSM_ID                    NAME       ADMIN_LVL  
 Min.   : -2076064   Октябрьское :  3   8      :311  
 1st Qu.: -1078857   Первомайское:  3   6      : 30  
 Median : -1066632   Каменское   :  2   9      :  5  
 Mean   :   521079   Камское     :  2   10     :  1  
 3rd Qu.: -1017007   Кильмезское :  2   2      :  1  
 Max.   :144692757   (Other)     :341   (Other):  2  
                     NA's        :  4   NA's   :  7

Нам интересны атрибуты OSM_ID, NAME и ADMIN_LVL. Так будет выглядеть та же карта с точностью до муниципальных районов и городских округов:

> png("boundary-6.png", width=300, height=400, units="px", bg="transparent")
> par(mar=c(0.5,0.5,0.5,0.5))
> plot(udm[udm$ADMIN_LVL == 6 & !is.na(udm$ADMIN_LVL), ], col="white")
> dev.off()

Конструкция "!is.na(udm$ADMIN_LVL)" отбрасывает те объекты, у которых не указан административный уровень. Если этого не делать, получим ошибку "NAs not permitted in row index". Запятая перед закрывающей квадратной скобкой (выделена красным) позволяет избежать ошибки "undefined columns selected".

Отбор отображаемых объектов можно делать и по их имени, вот так:

> plot(udm[udm$NAME == "Малопургинский район" & !is.na(udm$NAME), ], col="white")

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

Автоконфигурирование сетевых интерфейсов в guest Ubuntu server

После установки на ноутбук ОС Ubuntu Precise server edition в качестве гостевой, возникла задача — обеспечить к ней доступ по постоянному имени не только с системы-хозяина, но и с других компьютеров ЛВС. Задача осложняется тем, что ноутбук может быть подключен к ЛВС и через разъём RJ-45, и посредством Wi-Fi. Хорошо то, что сервис DHCP предоставляется в любом случае.

Постоянное имя гостевой ОС прекрасно обеспечивает avahi-daemon. Единственный недостаток — от компьютеров ЛВС требуется поддержка Zeroconf.

Однако, эксплуатация с поддержкой инициализации то одного, то другого интерфейса омрачена следующим: если оставить для обоих сетевых интерфейсов в файле /etc/network/interfaces режим auto, задержка на попытки их инициализации (при условии, что подключен к ЛВС только один) составляет несколько минут. Выход — указание для обоих интерфейсов режима инициализации allow-hotplug и включение сервиса, отслеживающего их подключение — netplug, например.

Все настройки производятся в гостевой ОС.

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…

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