20070830

Веб-сервер в одну строчку: версия 2.1

Алексей Свешников опубликовал в своём блоге пример веб-сервера, занимающего одну строчку на bash. Очень меня этой безделушкой порадовал. Красиво!

Однако его «сервер» у меня не заработал :)

Если запрос слать телнетом, то вроде что-то шлёт в ответ, а если запрашивать браузером или wget — нет. Пишется: ««127.0.0.1» разорвал соединение».

У меня возникло подозрение, что это из-за того, что скрипт начинает отвечать, не дождавшись конца HTTP запроса (а должен читать заголовки запроса до пустой строки). Я это исправил и wget заработал.

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

И честно говорить, что это HTTP/1.0. Или поставить HTTP/1.1 и добавить Connection: close. (HTTP/1.1 applications that do not support persistent connections MUST include the "close" connection option in every message. —RFC2616)

Потом ещё я увидел, что символы перевода строк где-то «защищаются» bash. А именно во время вывода echo. Приходят литералы «\n» вместо кодов CRLF. А положено, чтобы шли именно CRLF. И заголовок ответа также должен заканчиваться пустой строкой.

В общем, вот мой вариант (эта версия у меня работает и с браузером, и с wget):

true; while [ $? -eq 0 ];do nc -vlp 8080 -c'(r=read;e=echo;$r a b c;E=NOTYET;while [ ${#E} -gt 0 ];do $r E;E=`$e $E|tr -d "\r\n"`;done;f=`$e $b|sed 's/[^a-z0-9_.-]//gi'`;h="HTTP/1.0";o="$h 200 OK\r\n";c="Content";if [ -z $f ];then($e -e $o;ls|(while $r n;do if test -f ${n}; then $e "<a href=\"/$n\">$n</a><br>";fi;done););elif [ -f $f ];then $e -e "$o$c-Type: `file -ib $f`\n$c-Length: `stat -c%s $f`\n";cat $f;else $e -e "$h 404 Not Found\n\n404\n";fi)';done


Эта версия ещё и скрывает подкаталоги текущего каталога, показывая только файлы. Набирать одной строчкой и смотреть результаты на 127.0.0.1:8080.

20070827

TiddlyWiki: персональный вики-блокнот

TiddlyWiki — это очень необычное приложение, это полноценная вики, умещающаяся в одном HTML файле. Да, в одном файле! При этом, если его открыть в почти любом современном браузере*, то появиться настоящая вики с довольно удобным интерфейсом. Можно вносить в неё любые изменения и сохранять их в этот же файл.

*С TiddlyWiki умеют работать Firefox и другие основанные на Gecko, а также Opera**, IE, Safari**, Camino. А вот в Konqueror не работает редактирование.


Применений множество. Во-первых, это удобно использовать для разных записей, например в качестве личного органайзера, ведь при этом есть возможность связывать записи вики-ссылками. Во-вторых, если потом этот файл выложить на любой веб-сервер как статическую страницу, то она превращается в полноценный вики-сайт. С поиском, тегами, AJAX-подобным интерфейсом и прочими вкусностями. Впрочем, при доступе к странице по HTTP редактирование недоступно. Это всё таки персональная вики.

Однако проще один раз увидеть, чем сто раз услышать. Но ещё лучше попробовать (см. ниже). Посмотрите также на ссылки в конце этого поста, если интересно увидеть, как по-разному может выглядеть TiddlyWiki.

На мой взгляд, TiddlyWiki может быть удачной заменой таким приложениям как Tomboy или Zim. В прошлом я пользовался Tomboy, и TiddlyWiki удовлетворяет меня гораздо больше: она быстрее и отзывчивее, она кроссплатформенна, набор заметок и навигация по ним удобнее, и в добавок файл TiddlyWiki всегда можно выложить в веб :)

Ещё одно возможное применение: ведение дневника-блога. Этому помогает функция датированных записей и встроенная поддержка RSS.

Преимущества TiddlyWiki

Итак, я вижу следующие преимущества TiddlyWiki:
  • Переносимость. Ведь все данные и сама программа находятся в одном файле. Его можно поместить на флэшку и иметь доступ к своим записям где бы вы ни оказались. Это большое преимущество перед традиционными программами для ведения записей, которые требуют установки.
  • Кроссплатформенность. Для работы с ней достаточно браузера. И неважно, какая операционная система у вас стоит.
  • Быстрый запуск. Ведь веб-браузер и так почти всегда открыт :) Для приложения, предназначенного для коротких быстрых записей это существенно.
  • Удобный ввод данных. Богатый набор средств разметки. Ненавязчивый интерфейс.
  • Удобство навигации по записям: поиск, теги, возможность выбирать какие записи видны на экране.
  • Формат данных максимально приближен к plain-text. При желании всегда можно отредактировать в обычном текстовом редакторе. При этом, благодаря вики-разметке, записи остаются наглядными и читаемыми.
  • TiddlyWiki является свободным программным обеспечением с очень активным сообществом. Действительно, попробовав, наверное, нельзя в эту программку не влюбиться. Как результат: есть много модов, плагинов и тому подобных вещей.

С чего начать

Инструкция по «установке» следующая:
  1. Пойти на http://www.tiddlywiki.com/#DownloadSoftware и скачать пустой файл вики.
  2. (Необязательно) Пойти на http://glebsite.ru/tw/ и следуя приведённым там инструкциям установить модуль русификаци написанный Глебом Тржемецким (спасибо!)
  3. (Необязательно) По аналогии с установкой модуля русификации можно установить другие модули с других TW-сайтов, например, панельку инструментов wikibar c http://aiddlywiki.sourceforge.net/wikibar_demo_2.html
Для тех, кому лень проделывать все эти шаги самостоятельно, я выложил уже готовые русифицированные шаблоны TiddlyWiki. Они дополнены также небольшой справкой по вики-разметке. Мне её не хватало в умолчальном «пустом» шаблоне. Поэтому для близких и друзей я её написал.

Вот мои шаблоны:
empty-ru.html — базовая TW + русификация + ReminderMacros + справка по вики-разметке
empty-ru-wikibar.html — базовая TW + русификация + ReminderMacros + справка по вики-разметке + wikibar

Впрочем, если времени с момента написания этого поста (август 2007) до момента, когда вы его читаете, прошло немало, лучше пойти на www.tiddlywiki.com и взять последнюю версию оттуда. Кстати, там же есть и инструкция как обновлять код TW с сохранением данных.

Внимание! При сохранении важно использовать вариант «Сохранить ссылку как...» в контекстном меню при правом щелчке мыши по ссылке. Другие варианты могут не работать. Вариант wget URL тоже приемлим.

После этого сохранённый файл можно открывать в браузере и начинать редактировать. Первая запись, которая будет открыта называется GettingStarted. В ней можно задать своё имя и перейти к специальным записям SiteTitle и SiteSubtitle задающим название вашей вики. Ну а дальше на ваше усмотрение. Полезно также заглянуть в раздел «Установки» («Options») справа. После сеанса редактирования вики не забудьте нажать ссылку «Сохранить изменения» или ALT+S (впрочем, браузер вам напомнит, если что). При попытке сохранить файл на диск, браузер вероятно попросит разрешения на диск писать (обычно у него такого права нет, так что это нормально).

При записи создаётся файл с резервной копией (предыдущей версией). Обычно она отличается от имени файла вики добавление большого количества цифр в конце. Я, чтобы появление этих файлов не отвлекало, поставил в настройках сохранять резервные копии в каталог .mywiki.backup.

Миграция записей Tomboy

До TiddlyWiki я пользовался (пытался пользоваться) Tomboy. Милое приложение, только несколько медленное. И не всегда было легко добиться, чтобы создавалась нужная ссылка. И как-то совсем перестало работать, потому что во время одного из distupgrade-ов сломалось Mono, точнее что-то, от чего оно где-то глубоко внутри зависит... В общем, как и с некоторыми другими Mono-приложениями*, Tomboy у меня был, а теперь его нет. Однако после него остались записи.

*В числе других Mono-приложений, от которых я отказался: F-Spot (хотя я однажды и дождался, когда он проиндексирует мой фотоархив, работал медленно, пользоваться тегами было неудобно, а функции редактирования в нём меня после Picasa только расстраивали) и Beagle (поиск это конечно здорово, но не очень-то быстро, и самое главное, что ищет далеко не всё, а это делает его несколько бесполезным). Так что из всех Mono-приложений пользуюсь только autopano-sift.

Для конвертации записей Tomboy в TiddlyWiki я написал маленький скрипт tomboy2tiddly, описание и инструкции к нему здесь. Скрипт сохраняет гиперссылки в записях Tomboy и преобразует их в вики-ссылки, но все выделения шрифтом игнорируются. Для работы скрипта нужен xmlstarlet и python.

Скорость работы

В отличие от того же Tomboy, которых хранит каждую запись в отдельном файле, здесь все записи хранятся в одном файле, и обрабатываются JavaScript. Поэтому наверное при очень большом количестве записей TiddlyWiki будет работать медленнее.

Я провёл следующий эксперимент: взял свою вики с несколькими десятками записей, открыл в vim, и вставил 1001 короткую запись со случайным названием и содержимым (формат записи довольно простой). После этого полученный файл, который увеличился примерно на 100 кБ, открыл в браузере. Результат такой: время открытия файла увеличилось, файл открывался около 2 секунд, но скорость работы с вики осталась субъективно такой же (мои записи среди этой кучи мусора открывались так же быстро и изменение-сохранение записей никак не пострадало). Надо отметить, что генерировались эти 1001 запись куда дольше ;)

Мне кажется это неплохой результат. Во всяком случае, для личного вики-блокнота этого вполне достаточно. И после загрузки, в отличие от того же Tomboy, время отклика зато гораздо меньше.

Ссылки по теме

В заключение хочу дать ссылки на сайты с разными расширениями для TiddlyWiki и её модами (большинство из них сделаны, кстати, на самой TW):
  • Список разных модификаций и вариантов есть как обычно на Wikipedia
  • mptw.tiddlyspot.com MonkeyPirateTiddlyWiki, популярная модификация с изменённой системой тегов
  • www.tiddlytools.com большой архив расширений, тем и прочего добра
  • tw.lewcid.org ещё один репозиторий с расширениями для TW
  • tiddlywiki.abego-software.de и ещё один архив...
  • tiddlythemes.com архив тем для TiddlyWiki
Есть также возможность пользоваться TiddlyWiki онлайн, для этого есть как минимум два сервиса. В этом случае вики находится на сервере, но её всегда можно скачать на локальный диск, и потом синхронизировать обратно:
Стоит также отдельно отметить сайт сообщества разработчиков www.tiddlywiki.org и очень активную гугл-группу, посвящённую обсуждению TiddlyWiki.

Приятных записей!

Обновления: упомянул о поддержке RSS и поставил ссылку на гугл-группу.

Обновление 7.9.2007
**В комментариях отметили, что в Opera 9 не работает сохранение. Я установил Оперу, попробовал — действительно. Впрочем, в Google-группе TiddlyWiki объясняется в чём дело (Javascript в Opera в принципе не может писать на локальный жёсткий диск) и предложено решение проблемы. Сохранять TiddlyWiki в Opera (и Safari) можно с помощью Java-апплета TiddlySaver, помещённого туда же, где находится файл TiddlyWiki. Конечно, в этом случае требуется, чтобы в Opera была включена Java, а в ~/.java.policy было добавлено разрешение на запись файлов
grant codeBase "file:${user.home}/text/wiki/*" {
permission java.io.FilePermission "${user.home}${/}text${/}wiki${/}*", "read,write";
};

Skype читает профиль Firefox, /etc/passwd и разные другие файлы из /etc

На слэшдоте появилась заметка, в которой сообщается, что Skype читает файл /etc/passwd, файлы профиля Firefox (включая настройки плагинов и аддонов), и ещё разные файлы в /etc. Заметили это при использовании AppArmour, запуски Skype с strace информацию подтвердили. Соответственно вот тема на форуме Skype. Замечены в этом версии 1.4.0.94 и 1.4.0.99.

Хотя в Debian и большинстве современных дистрибутивов пароли пользователей больше не хранятся в /etc/passwd (хранятся они в /etc/shadow), доступ Skype к такому количеству настроек системы и приватных данных вызывает беспокойство. Во всяком случае доступ к профилям Firefox мне кажется не меньшим злом. Что с этими данными делает Skype — неизвестно.

Вообще говоря, шпионского модуля в Skype исключать нельзя. В частности, народ отмечает что Skype идеальный вариант для внедрения шпионского модуля спецслужбами (АНБ):
- он установлен на большинстве машин
- он хорошо защищён от декомпиляции/дебага
- он умеет обходить фаерволы
- сетевой трафик Skype шифруется
- он может передавать большие объёмы данных даже если звонок не совершается
- eBay (владелец Skype) уже были замечены в сотрудничестве со спецслужбами

Похоже, запускать Skype желательно исключительно в «песочнице», откуда ему ничего не доступно. Или вообще пользоваться альтернативами с открытым исходным кодом. Когда, кстати, libjingle заработает?

20070824

Планы: о чём я хочу написать

«Мне нужно так много сказать, а времени так мало...»

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

Итак, темы следующие:
  • Работа с текстом, инструментарий
    • слияние изменений между файлами (merge)
    • моё приглашение коммандной строки PS1
    • 10 любимых инструментов (coreutils)
    • человеколюбивые языки разметки текста (asciidoc, markdown)
    • использование svn для контроля изменений, бесплатные svn-площадки
    • vim (тема обширная, почти бесконечная)
    • использование tiddlywiki в качестве записной книжки (замена tomboy)
  • Графика, фото
    • панорамы в autopanosift+hugin+enblend
    • создаёт изображения расширенного динамического диапазона HDR (cinepaint)
    • создание картинок с текстом (email-on-a-pic) (convert)
  • Интернет
    • epiphany — система закладок основанная на тегах, умные закладки
    • epiphany — представление закладок в виде облака тегов (мой скрипт)
    • оффлайн генераторы сайтов (ikiwiki, m4html, микроблоги)
    • как сохранять вещание интернет-радиостанций в файл
  • Debian, Linux, администрирование системы
    • как отправлять отчёты об ошибках
    • apt-listbugs
    • настройки esmtp (упрощённый MTA)
    • настройка/изменение раскладок клавиатуры на лету с помощью setxkbmap
  • Визуализация данных
    • GRI
    • Tioga и ctioga
    • gnuplot (классика)
    • OpenDX
  • Численные расчеты, программирование
    • FiPy — библиотека для метода конечных объёмов для Python
    • использование screen на удалённых машинах
    • обзор матричных библиотек для C++
    • Blitz++

20070823

vnstat: простая программа для подсчёта трафика

Часто оплата интернета напрямую зависит от количества переданных данных, проще говоря трафика. Особенно это характер для доступа в интернет через мобильный телефон (GPRS, EDGE, UMTS...).

Скажем, я сейчас пользуюсь тарифным планом, предполагающим оплату 20€ за пакет 500 МБ, однако после превыщения указанного предела, услуга не прерывается, но стоимость доступа в Интернет незаметно меняется: просто каждый мегабайт стоит уже около 6€. В общем, жуть. Понятно, что я заинтересован чётко отслеживать израсходованный мной трафик. Подобных ситуаций можно привести ещё много.

Подсчёт трафика в Linux дело несложное. Каждый может настроить iptables как ему угодно, написать свои скрипты, сохранять статистику в базе данных... Можно использовать готовые решения, вроде ntop. Однако для моих целей мне всё это показалось слишком сложным.

И я нашёл очень простой инструмент для учёта трафика: vnstat. Он, кстати, есть в репозиториях Debian, так что установка не представляет сложностей. Она практически не требует настройки, просто считает трафик и позволяет смотреть статистику. Думаю, для «домашнего» использования этого более чем достаточно.

Трафик считается отдельно для каждого сетевого устройства (интерфейса). Чтобы начать подсчёт трафика на том или ином интерфейсе, например ppp0 (в моём случае это подключение через мобильный телефон), надо выполнить следующую команду, которая создаст базу данных для этого интерфейса:

vnstat -u -i ppp0


В случае Debian включается и отключается подсчёт трафика автоматически при включении или выключении сетевого устройства (это можно делать также вручную).

И всё! Теперь весь трафик будет учтён!

Чтобы узнать суммарную статистику по трафику через интерфейс ppp0, достаточно выполнить следующую команду:

$ vnstat -i ppp0
Database updated: Thu Aug 23 22:00:01 2007

ppp0

received: 354.63 MB (76.6%)
transmitted: 108.14 MB (23.4%)
total: 462.77 MB

rx | tx | total
-----------------------+------------+-----------
yesterday 18.58 MB | 3.31 MB | 21.89 MB
today 39.39 MB | 6.28 MB | 45.68 MB
-----------------------+------------+-----------
estimated 42 MB | 6 MB | 48 MB


Как легко видеть, у меня в запасе до ограничения в 500 МБ ещё около 40 МБ. На этот пост точно хватит.

Дополнение: доступны и другие формы отчётов (см. man vnstat). Например, для просмотра использования трафика по месяцам:
$ vnstat -i интерфейс -m

по неделям:
$ vnstat -i интерфейс -w

по дням:
$ vnstat -i интерфейс -d

по часам:
$ vnstat -i интерфейс -h

и, наконец, для желающих формировать собственные отчёты, может пригодится
$ vnstat -i интерфейс  --dumpdb


Если же возникнет желание стереть (сбросить) всю собранную статистику и начать отсчёт с нуля, то, на мой взгляд, самый простой способ это сделать:
  1. остановить подсчёт статистики для используемого интерфейса:
    vnstat -i интерфейс -u -r --disable

  2. удалить базу данных с собранной статистики (файл /var/lib/vnstat/интерфейс)

  3. создать новую базу данных с помощью
    vnstat -u -i интерфейс
    и радоваться начатой заново жизни