понедельник, 10 января 2011 г.

Просмотр html-содержимого в mutt и правильная кодировка

Есть такой, очень функциональный текстовый браузер, как w3m, который, кроме всего прочего, умеет отображать картинки. Причем не только во фрэймбуффере, но и в окне терминала (в debian нужно установить пакет w3m-img):




Так вот, в debian-е, если этот пакет установлен, mutt будет использовать его при отображении html-содержимого в e-mail сообщениях. Однако, сообщения приходят в различных кодировках, а в mutt все отображается лишь в одной (utf8 по умолчанию), в результате часть сообщений оказываются нечитаемыми. Чтобы это исправить, надо добавить следующую строку в свой .mailcap:

cat >> ~/.mailcap
text/html; /usr/bin/w3m -dump -I %{charset} -T text/html '%s'; copiousoutput; description=HTML Text; nametemplate=%s.html


"Магической" является опция -I %{charset}. Результат - на картинках:


четверг, 19 августа 2010 г.

Установка разрешения экрана в grub2 при помощи 915resolution

Когда я был молод и глуп, я извращался с grub-ом, пытаясь получить родное разрешение в консоли linux на своем недобуке. Сейчас, благодаря поддержке KMS в ядре, это нафиг никому не нужно. Но ебанут красноглазым нет покоя! Итак устанавливаем родное разрешение непосредственно для grub-а, чтобы не оскорблять свой ясный взор "замыленными" шрифтами, при выборе вариантов загрузки.
На моем MSI Wind u100 конфиг загрузчика изменился так:

$ diff -urU 4 grub.cfg-old grub.cfg
--- grub.cfg-old 2010-08-19 18:35:57.000000000 +0300
+++ grub.cfg 2010-08-19 18:08:23.000000000 +0300
@@ -36,8 +36,10 @@
insmod ext2
set root='(hd0,msdos1)'
search --no-floppy --fs-uuid --set d38f73d1-1c4b-4854-b640-4d80bd808903
if loadfont /usr/share/grub/unicode.pf2 ; then
+ insmod 915resolution
+ 915resolution 41 1024 600
set gfxmode=1024x600
load_video
insmod gfxterm
fi

В debian-е для этого мне понадобилось изменить 2 файла: /etc/default/grub и /etc/grub.d/00_header (я слышал за это могут и руки оторвать).
И да, перед экспериментами лучше запастись чем-нибудь вроде загрузочной флэшки, так как есть вероятность получить незагружаемую систему.

В итоге:

(как обычно, фотографировал на калькулятор)

суббота, 17 июля 2010 г.

Usbmount - автоматическое монтирование флешки

В современных linux-дистрибутивах автоматическое монтирование флешек успешно реализуется с помощью HAL (или что-там-теперь-будет-вместо-него) и DE. Те бедолаги, которые не пользуются KDE/GNOME, в качестве альтернативы, могут выбрать halevt (HAL-озависимый) или autofs (его конфиги явно не самые дружелюбные).
Отдельные умники пишут свои, порой довольно изощренные, наборы правил для udev (правда сами разработчики udev предостерегают от такого подхода). А наиболее ортодоксальные линуксоиды, возможно, все еще используют записи в fstab, наизусть помнят все опции mount, при этом брезгливо косятся в сторону HAL …и выгребают ряд проблем при одновременном подключении нескольких флешек, или при подключении незнакомых флешек с причудливыми таблицами разделов; и вообще ни про какое автоматическое монтирование здесь речь уже не идет.
Оказывается, в сторонке, довольно давно, стоит готовый велосипед под названием usbmount (http://usbmount.alioth.debian.org/). По сути это все те же скрипты, запускаемые через udev. Одновременное подключение флешки и телефона с 2-мя разделами прошло гладко. В общем, закомментировал пережитки прошлого в fstab (хотя usbmount его вполне уважает), и, надеюсь, забыл про монтирование флэшек на ближайшие несколько лет (хотя стоп! тут же exFAT наступает).

среда, 30 июня 2010 г.

(Не)надежность master-master репликации в mysql

Перед нами встала задача обеспечить быструю и надежную работу клиентов с одной базой данных на 2-х географически удаленных объектах. В качестве одного из вариантов рассматривалась работа с 2-мя mysql серверами, которые бы реплицировались по принципу master-master. Далее рассматривается (не)надежность такой системы при одновременном изменении одних и тех же данных.

Настроим master-master репликацию (о том как это делается можно узнать из статей об основах репликации и мульти-мастер репликации).

Проведем небольшой эксперимент. Создадим таблицу
сервер1:
mysql> CREATE TABLE `new_table` (
`field1` varchar(32),
`field2` varchar(32),
`field3` varchar(32)
);

и внесем в нее начальные данные
сервер1:
mysql> SELECT * FROM new_table;
+--------+--------+--------+
| field1 | field2 | field3 |
+--------+--------+--------+
| value0 | value0 | value0 |
+--------+--------+--------+

После того как мы убедимся что БД реплицируется в обе стороны, разорвем соединение между серверами и изменим одну и ту же запись таблицы одновременно на обоих серверах.
сервер1:
mysql> UPDATE new_table SET field1='value1', field2='value1';
mysql> SELECT * FROM new_table;
+--------+--------+--------+
| field1 | field2 | field3 |
+--------+--------+--------+
| value1 | value1 | value0 |
+--------+--------+--------+
сервер2:
mysql> UPDATE new_table SET field2='value2', field3='value2';
mysql> SELECT * FROM new_table;
+--------+--------+--------+
| field1 | field2 | field3 |
+--------+--------+--------+
| value0 | value2 | value2 |
+--------+--------+--------+

После возобновления соединения и синхронизации серверов вырисовывается следующая картина:
сервер1:
mysql> SELECT * FROM new_table;
+--------+--------+--------+
| field1 | field2 | field3 |
+--------+--------+--------+
| value1 | value2 | value2 |
+--------+--------+--------+
сервер2:
mysql> SELECT * FROM new_table;
+--------+--------+--------+
| field1 | field2 | field3 |
+--------+--------+--------+
| value1 | value1 | value2 |
+--------+--------+--------+
Наблюдаем нарушение целостности данных и различия в репликах.

Альтернативные методы решения поставленной задачи можно найти в комментариях к вышеуказанным статьям (например, настройка master-slave репликации с использованием mysql-proxy или использование Multi-Master Replication Manager).

четверг, 20 мая 2010 г.

Проверка UMTS-оператора в chatscript-е

Подключаюсь к ОГО безлимит-мобильный, в котором безлимит - при регистрации в сети Utel, и помегабайтная оплата в роуминге Киевстар после превышения 40Мб лимита. Естественно есть желание проверять, в сети какого оператора зарегистрировался модем. Виндовая версия Utel-овской приблуды отображает оператора в статус-баре, линуксовую версию (найденный на просторах сети Mobile Partner) устанавливать не стал.

Подключаюсь при помощи pppd и chat. На одном буржуйском сайте, был найден список AT-команд, где есть такое:


Command: AT+COPS?,
Response: +COPS: (<mode>,[<format>,<oper>[,<act>]]),…, (<moden>,[<formatn>,<opern>[,<actn>]])
Description: Get/set current GSM/UMTS network operator, list available operators. This can be used to change for example access type and switch network.

Example:

AT+COPS=?
+COPS: (2,”3″,”3″,”24004″,2),(1,”3″,”3″,”24008″,0),(3,”Sweden 3G”,”Sweden3G”,”2)

Воспользовавшись этой информацией можно написать свой chatscript:



'' ATZ
OK-AT-OK "AT+COPS=?" UTEL3G ''
OK-AT-OK AT+CGDCONT=1,"IP","unlim.utel.ua"
OK-AT-OK "ATDT*99***1#"
CONNECT ''
'' \d\c

среда, 2 декабря 2009 г.

Terminus в ядре

Давно уже было желание вкомпилировать terminus прямо в ядро, чтобы не смотреть долгие 10 секунд на стандартный шрифт (пока не запустится один из console-* сервисов). Совсем недавно наткнулся на следующую статью, далекого 2006-го года: http://kaktyc.wordpress.com/2006/10/23/terminis-in-kernel/. Свое описание для terminus14 постараюсь выложить немного позже. Результат:


(background на tty устанавливается с помощью fbcondecor).

воскресенье, 2 ноября 2008 г.

Устанавливаем разрешение 1024x600 во framebuffer-е linux для нетбука MSI Wind (или Asus eeePC)

Внимание, заметка устарела! Вам не нужно выполнять эти заумные штуки, описанные в заметке. В современных дистрибутивах все работает "из коробки". Можно разве что показывать внукам со словами: "Вот как оно было в 2008-м".

Стандартными методами, для фреймбуффера консоли linux, можно установить разрешение 800x600 (указать параметр ядра vga=788), но при этом на данном нетбуке консольные шрифты будут растянуты. Параметра vga=XXX для 1024x600 не существует.

Но существует хак, описанный в http://www.nathancoulson.com/proj_eee.shtml, который позволяет добиться нужного результата. По ссылке рассмотрен пример установки 800x480 для eeePC, но инструкция годится и для Wind-a (т.к. используется одинаковый чипсет 945GME). У меня это работает так (фото см. ниже).
Пара слов для вступления. Не стоит выполнять указанные тут команды без четкого представления что они делают. Приведенные команды не являются копипастом, в большинстве своем написаны по памяти и могут содержать ошибки. Все это приводится лишь для обще
75;о представления о необходимых шагах. Я не несу ответственности за негативные последствия Ваших действий.
Итак, сначала нужно применить патч grub-1.96-915resolution-0.5.2-3.patch к grub2. После этого в grub2 появится поддержка модуля 915resolution.
Я пользуюсь Debian, и оформлял для себя патченый grub в виде deb-пакета (люблю порядок), поэтому проделал ряд дополнительных необязательных действий, которые для упрощения здесь не привожу. В общем случае - качаем и распаковываем исходники grub2, переходим в полученный каталог и применяем патч

# patch -Np1 -i /path/to/grub-1.96-915resolution.patch

Если нет ошибок, собираем пропатченый grub2, удаляем старую версию загрузчика (при помощи Вашего менеджера пакетов) и устанавливаем новую (желательно также при помощи Вашего менеджера пакетов))).
Устанавливаем grub2 в загрузочную область:

# grub-install /dev/sda

Далее, насколько я понял, нужно подменить один из vga-режимов. Создаем файл 01_915resolution следующего содержания (в конечном результате в /etc/grub/grub.cfg будут автоматически добавляться 2 строки):

# cat /etc/grub.d/01_915resolution
cat << EOF
insmod 915resolution
915resolution 5c 1024 600
EOF


Значение 5c взято из выхлопа команды 915resolution -l (о ней ниже). Это может быть любое неиспользуемое значение режима с нужной глубиной цвета.
Перегенерируем /boot/grub/grub.cfg

# update-grub2

В общем на этом этапе все готово. Пробуем перегрузиться, к параметрам ядра добавляем video=intelfb vga=604
Откуда взять vga=604 написано здесь http://wiki.debian.org/DebianEeePC/TipsAndTricks, раздел "Text Mode". В общем, данное значение зависит от того что мы написали в /etc/grub.d/01_915resolution (вычисляется как 0x200+0x05c=0x25с в десятичном представлении), это тот режим, который мы подменили.
Для того чтобы не писать каждый раз параметры загрузки ядра вручную, в файле /etc/default/grub можно указать следующую опцию:
GRUB_CMDLINE_LINUX=" video=intelfb vga=604 "
после чего не забываем update-grub2.

Об утилите 915resolution. Взять её можно здесь http://www.geocities.com/stomljen/. Но на текущий момент версия 0.5.3 не знает о чипсете 945GME (который установлен в eeePC и Wind-е). Опять же, существует патч, который может её этому научить. Все описано здесь: http://wiki.debian.org/DebianEeePC/HowTo/GetNativeConsoleResolution. В принципе эта утилита нужна только один раз, чтобы выбрать неиспользуемый режим.

Прежде чем выполнять все это самостоятельно, рекомендую еще раз ознакомиться с документами по следующим ссылкам:
http://www.nathancoulson.com/proj_eee.shtml
http://wiki.debian.org/DebianEeePC/HowTo/GetNativeConsoleResolution
http://wiki.debian.org/DebianEeePC/TipsAndTricks
http://www.geocities.com/stomljen/

Что получаем в итоге: