20090426

Недостаточно места для обновления дистрибутива?

Ну поскольку на днях вышла новая убунту, и народ сейчас активно обновляется, то многие, как и я, обнаружат, что для обновления системы на диске недостаточно места.

У меня разбиение диска такое: корневой раздел / 10 гигабайт, на нём же /var/cache/. Обычно свободно около 1 гигабайта (поудаляв редко используемое, можно освободить 2 ГБ). Для обновления система затребовала больше 4,5 гигабайт — новые пакеты нужно куда-то скачать. Что делать, не переразбивать же диск только ради апгрейда? Тем более, что всё остальное время мне такого / вполне хватает.

Есть выход. Дополнительное место нужно для временного размещения скачанных пакетов. Потом оно будет не нужно (обычные обновления системы не требуют многих гигабайт). В Debian/Ubuntu скачанные пакеты помещаются в /var/cache/apt/archives/. И я просто временно разместил этот каталог на внешнем диске, где места достаточно.

Дополнение: ниже описано, как поступил я. Как подсказывают в комментариях, можно было поступить гораздо проще:
$ sudo mount --bind /каталог/в/разделе/где/много/места /var/cache/apt/archives
Признаюсь, что можно сделать --bind, просто забыл. В следующий раз попробую.


Действовал же так:

1) Сделал резервную копию текущего состояния archives/:
$ sudo rsync -avz --delete /var/cache/apt/archives ~/backup/var-cache-apt-archives

2) На диске, где вдоволь свободного места создал файл, в котором собираюсь разместить временный раздел под архивы (6 ГБ):
$ dd if=/dev/zero of=aptcache.img bs=1k count=6291456

3) Отформатировал этот файл как обычный раздел:
$ mke2fs aptcache.img

4) Подключил этот этот файл на место /var/cache/apt/archives/ (скрыв этим настоящий archives/):
$ sudo mount -o loop aptcache.img /var/cache/apt/archives/

5) Скопировал в него всё из старых archives/ (необязательно, там просто архив уже скачанных пакетов):
$ sudo rsync -avz ~/backup/var-cache-apt-archives/archives/ /var/cache/apt/archives/

6) Проверяю сколько свободного места есть, вижу, что теперь достаточно:
$ df -h / /var/cache/apt/archives/
Filesystem Size Used Avail Use% Mounted on
/dev/sda6 9.5G 7.0G 2.1G 78% /
/dev/loop0 6.0G 12M 5.6G 1% /var/cache/apt/archives

Далее обновляю систему как обычно. После обновления системы можно сделать apt-get clean (удалить скачанные пакеты) и отключить временный /var/cache/apt/archives/.

20090421

Редактирование HTML и XML в Vim

Пару слов о редактировании HTML и XML файлов в Vim. О выделении HTML-тэгов я уже писал. Мне в конфигурации Vim по умолчанию не хватает
  • работающего % для перехода между парными тэгами (как обычно он переходит между парными скобками),
  • автоматического добавления закрывающих тэгов,
  • быстрого окружения тэгом выделенного фрагмента.
  • быстрого удаления окружающего тэга.
  • кодирования и раскодирования HTML Entities («>» как «>» и обратно)
Почти всё это сразу есть в плагине xml.vim. Кроме HTML Entites, настроить кодирование которых тоже можно.

Установка и настройка

Cкачать файл xml.vim, сохранить в ~/.vim/ftplugin/xml.vim, сделать на него символическую ссылку с ~/.vim/ftplugin/html.vim. В ~/.vimrc включить загрузку плагинов по типам файлов:
filetype plugin on
Теперь при открытии XML и HTML файлов будет включаться этот плагин.

Для кодирования HTML Entities поместить в ~/.vim/plugin/ файл htmlesc.vim.

Использование

Переход между парными тэгами. Чтобы перемещаться между тэгами, поместить курсор внутрь тэга (например, на </div>), нажать %, курсор переместится к парному тэгу (т.е. к <div>).

Вставка закрывающих тэгов происходит автоматически при нажатии >. Таким образом, набрав <div> мы получим:
<div></div>
При желании, можно переназначить комбинацию для автодополнения тэга. Для этого в ~/.vimrc до загрузки плагина определяем переменную xml_tag_completion_map. Например, так:
let xml_tag_completion_map = ">>"
— в этом случае закрывающий тэг появится только при повторном нажатии на >.

Окружение фрагмента тэгом тоже сразу работает. Достаточно выделить фрагмент и нажать \x. Программа спросит каким тэгом окружить и аккуратно вставит и открывающий, и закрывающий тэги.

Удаление тэга — обратная операция. Нажимаем \d и ближайший окружающий тэг будет убран, но весь текст внутри тэга останется нетронутым.

В последних двух командах можно вместо \ назначить любую другую клавишу. Почитать документацию по плагину: :help xml-plugin.txt.

Кодирование и раскодирование HTML Entities. Для этого, напомню, мы используем скрипт ~/.vim/plugin/htmlesc.vim. Ctrl+h превращает нормальный текст в HTML («>» в «&gt;»), а Ctrl+u — обратно. Работает построчно.

Другие способы

Есть плагин closetag.vim. Он просто добавляет команду, закрывающую тэги, команда привязывается к сочетанию клавиш и вызывается вручную. Использовать просто: Ctrl+_ — закрыть текущий тэг, это удобно, когда его текст тэга уже написан. Этот плагин я тоже использую.

Есть отдельный скрипт, позволяющий окружать фрагменты текста тэгом. Примерно то же самое, что и \x в xml.vim.

По теме

Выделение HTML-тегов, строк и блоков кода в Vim
Как быстро закомментировать/раскомментировать блок кода в Vim

20090415

Хорошо забытое старое

Подновил старый пост о том, как сделать видео из серии картинок. Добавил про ffmpeg.

20090413

Функциональное веб-программирование

Многие читали Beating the Averages Пола Грэхэма (есть перевод). Он использовал Lisp, и считает, что именно поэтому создал самое удачное веб-приложение (которое потом превратилось в Yahoo! Store). Прекрасно!

А вот что реально уже готово и можно использовать прямо сейчас? Я решил не зацикливаться на Хаскеле, и вспомнил, что есть ещё Erlang, Caml, Scala, Scheme, Lisp. Стоило только начать поиски, и я нашёл много интересного. Делюсь находками.

1. Язык программирования Erlang и каркас для разработки веб-приложений Nitrogen. Кстати, сайт Nitrogen на нём же, видимо, и работает. Рекомендую посмотреть видео:

Видео: возможности Nitrogen (дек. 2008) (.mov)

скринкаст: Новые возможности Nitrogen (дек. 2008)


Обратите внимание на счётчик числа строк, нужных, чтобы запрограммировать страницу (такой счётчик есть и на всех страницах сайта Nitrogen). Число, как правило, двузначное. Меня лично поразило вот это — запуск долгоиграющих процессов на сервере. 31 строчка! Чтобы сделать подобное на Python и Django, мне пришлось попыхтеть.

Кроме Nitrogen, для Erlang есть ещё Erlyweb и Erlang Web.

2. Язык программирования Haskell и сервер приложений Happstack. Самое приятное, что проект хоть ещё и молодой, но уже работающий. На нём сделан Happstack-tutorial, на нём работает Patch-tag.com. Первые энтузиасты даже делают на нём свои блоги.

Запустить его на своей машине оказалось не очень трудно. И он работает. Но всё же, я чувствую, мне потребуется время, чтобы с ним более-менее разобраться. Документация, с точки зрения новичка, конечно, уступает документации Django.

Основная отличительная черта Happstack: реляционная база данных ему не нужна. Можно пользоваться теми структурами данных, которые наиболее удобны. Возможность с одной стороны спорная, полагаться на неё страшно, с другой — весьма интересная.

Вот маленькая презентация Happstack:

Но и не Happstack единым. Читаем Is Haskell a Good Choice for Web Applications?. Весьма обнадёживает. Исходник работающего сайта — в подарок.

3. Язык программирования Scala (гибридный функциональный язык программирований для виртуальной машины Java) и каркас для веб-приложений Lift. Можно посмотреть на его демо.

Интересно, что буквально на днях Гугл объявил поддержку Java на AppEgnine, и народные умельцы уже используют там Scala. Более того, точно так же на AppEngine запустили и Lift.
Scala — по-итальянски лестница. Думаю, игра слов scala — lift теперь всем понятна.


4. Язык программирования Caml и каркас для веб-приложений Ocsigen. Точнее, как я понял, Ocsigen — это веб-сервер, а каркас для веб-приложений называется Eliom. И есть ещё набор библиотек Ocsimore. Однако это детали.

Интересные особенности Ocsigen: валидность XHTML документа гарантируется на уровне типов языка, активно используется стиль отложенных вычислений, управление сессиями, URL-схемами и параметрами страниц автоматическое.

В репозитариях основных дистрибутивов Ocsigen уже есть, так что приступить к использованию будет легко. Вот, например, вики-органайзер написанный с использованием Ocsigen. Разработчики тоже не стесняются использовать детище для своих сайтов. Добрый знак. Работает, говорят, очень быстро. Однако будем помнить, что это прежде всего исследовательский проект.

Читая сайт Ocsigen, нашёл и совершенно удивительный проект. Немного не в тему, но очень здорово: O'Browser, написанная на Javascript виртуальная машина для байт-кода OCaml. Что это значит? Значит, что код на OCaml можно встраивать в веб-страницы! Вот, например, клон Boulderdash. Что-то подобное есть и для Haskell.


5. Язык программирования Scheme и каркас для веб-приложений LeftParen. Документация выглядит толково. К сожалению, не нашёл сайтов, которые его используют. Или какого-нибудь демонстрационного сайта.

Вообще-то LeftParen построен вокруг уже довольно развитой инфраструктуры для веб-программирования в PLT Scheme. И её вполне можно использовать непосредственно, см. документацию и учебник.

Для Scheme есть ещё Icing.

6. Язык программирования Lisp и веб-каркас Weblocks. Сайт и документация очень мне понравились. Если бы я писал на Лиспе, начал бы, наверное, с этого каркаса. Вот демонстрация.

Есть ещё KPAX (это не русское слово, просто такое смешное сокращение!). Пишут, что уже давно и серьёзно используется, но документация страдает. Для Лиспа есть ещё UnCommon Web, BKNR.

7. Ещё один диалект Лиспа — язык программирования Clojure, как и Scala рассчитан на использование на платформе JVM. Надо ли говорить, что и для него есть веб-каркас: Compojure. И на AppEngine его тоже оперативно запустили.



Вот так-то. Сколько всего, оказывается. Глаза разбегаются.

Созвучен этой заметке будет вот этот пост.

20090410

Иерархия числовых типов в Haskell

В Хаскеле очень затейливая иерархия числовых типов. Всё дело в том, что кроме обычных машинных целых и чисел с плавующей точкой, в ней нашлось место и числам произвольной точности (настоящим целым и рациональным), и комплексным, и числам с фиксированной точностью.

Цитирую по официальному описанию языка:
Класс Num числовых типов является подклассом класса Eq, так как все числа можно сравнить на равенство; его подкласс Real также является подклассом класса Ord, так как остальные операции сравнения применимы ко всем числам, за исключением комплексных (определенных в библиотеке Complex). Класс Integral содержит целые числа ограниченного и неограниченного диапазона; класс Fractional содержит все нецелые типы; а класс Floating содержит все числа с плавающей точкой, действительные и комплексные.
С одной стороны, система устроена очень логично: введение дополнительных операций расширяет множество чисел. Так, деление целых дополняет целые — рациональными. Логарифмы и экспоненты требуют действительных. Однако сразу представить и запомнить всю иерархию классов непросто. Лучше один раз увидеть! Поэтому хозяйке себе на заметку и другим на потеху я составил вот такую памятку:


Исходник диаграммы

Оформил как «диаграмму классов», чтобы всем привыкшим к ООП было понятно, что от чего «наследуется» (линия со стрелкой к родителю). Почти все эти типы являются абстрактными («интерфейсами» в ОО-терминологии). Конкретные же числовые типы я обвёл серыми рамочками (можно было обвести и Ratio). Полиморфные классы обозначил прямоугольниками со скруглёнными углами. Типы параметров таких полиморфных классов указал «аггрегацией» (линия с ромбиком на стороне полиморфного класса). При составлении ориентировался на первоисточник.

Also in English.

20090404

gettext для Хаскеля

Василь Пастернак написал Haskell-интерфейс для gettext (библиотека для перевода программ на разные языки — интернационализации, как теперь говорят пишут).

Я хочу дать ссылки на пару его заметок:
Заметки написаны по-английски, но там, в основном, примеры кода, так что разобраться будет нетрудно.

Также: hgettext в HackageDB.

20090403

Русские буквы в matplotlib/pylab

Усилиями некого Алексея сегодня мы все наконец узнали как в Matplotlib/Pylab делать подписи по-русски. Вот работающий пример:
#!/usr/bin/env pytnon
# vim: set fileencoding=utf-8 ts=4 sw=4 expandtab:

# Cyrillic letters in Matplotlib,
# thanks to Alexey for solution, see http://koldunov.net/?p=290#comments
from matplotlib import rc
rc('font',**{'family':'serif'})
rc('text', usetex=True)
rc('text.latex',unicode=True)
rc('text.latex',preamble='\usepackage[utf8]{inputenc}')
rc('text.latex',preamble='\usepackage[russian]{babel}')

from pylab import *

def figsize(wcm,hcm): figure(figsize=(wcm/2.54,hcm/2.54))
figsize(13,9)

x = linspace(0,2*pi,100)
y = sin(x)
plot(x,y,'-')
xlabel(u"ось абсцисс")
ylabel(u"ось ординат")
title(u"Две беды в России — синусы и косинусы!")
savefig('rus-mpl.pdf')
И вот результат:



По теме:
Matplotlib. Простые вещи — 1
Matplotlib. Простые вещи — 2
Как построить график с изолиниями в gnuplot, gri и pylab
Короткие «рецепты» по применению Python в околонаучных целях

PS. Как, кстати, лучше PDF в растр конвертировать? Я делаю так:
$ pdftoppm -r 300 image.pdf | convert ppm:- image.png
Дополнение: ещё лучше вариант предложил Дмитрий Душкин:
from matplotlib import rc
font = {'family': 'Droid Sans',
        'weight': 'normal',
        'size': 14}
И всё отлично работает.

20090402

Дополнения к статье «eeePC 901 и Debian»

В декабрьскую статью про eeePC 901 и Debian добавил:

1) Замечания по поводу сборки ядра 2.6.29 в Debian. Кратко: хотя пакет этого ядра уже появился в репозиториях (sid), ставить его на eeePC 901 смысла нет, так как драйвер тачпэда Elantech в нём выключен, а поддержку WiFi-модуля RT2860 в Debian-ядре вообще выкинули по лицензионным соображениям (см. #522078 и #521553). Выход — собирать самим из исходников с kernel.org. К статье приложил свой конфиг ядра.

2) Пошаговые инструкции по пересборке свежей ALSA в виде пакета Debian. В общем-то, конкретизированное на примере повторение Debian Wiki. Учитывая, что нужная ALSA теперь есть в sid, пересобрать пакет несложно, а запись звука зато не будет ломаться при апгрейдах.

3) Пример настройки тачпэда Elantech. Раз уж собрали ядро 2.6.29 с его поддержкой, то почему бы дополнительными возможностями тачпэда не пользоваться?