Posts

Showing posts from January, 2010

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

Piligrim представила системы спутникового слежения размером со спичечный коробок Миниатюрные устройства с заявленными прекрасными техническими характеристиками и разумной ценой - выглядит неплохо. Бесплатный сервер сбора информации по GPRS - отличный маркетинговый ход. Вот интересно, как насчет возможности подключения внешних датчиков. Upd. Посмотрел инфу от производителя (питерская контора) - реализация и сервис примитивные, координаты пересылает на сервер по HTTP при поступлении входящего звонка (сам звонок не принимает, т.е. платить за него не придется). Непонятно, можно ли настроить регулярную передачу координат. Датчики подключать нельзя. Форум поддержки лучше не читать, ибо полная лажа, имхо похоже на то, что все посты созданы непосредственно сотрудниками производителя. Если будет время, постараюсь посмотреть аналоги за рубежом, т.к. устройство сделано явно на нескольких готовых компонентах, а себестоимость устройства, думаю, где-то в районе 50 евро.

e-mail адреса с ограниченным временем жизни с qmail

Красивое решение для блокирования спама с помощью суффиксов имени пользователя: a simple way is to create ~phil/.qmail-default containing |if test "$EXT" '>' `date +%Y%m%d`; then echo address expired; exit 100; fi followed by delivery instructions for the successful case. You may, of course, choose to replace the simple one-liner with a script checking that $EXT really has the form of a date, etc. I used something like this a long time ago, and then I used these addresses for my usenet postings, thinking that any spam generated for these addresses would sooner or later get stopped. It wasn't a great success, and it ended up pissing off a friend when he tried to respond to a usenet posting of mine a couple months after I had posted it. But spam for these addresses, including garbled versions including only the date, kept coming for years after I stopped doing this. Оригинал см. по следующему адресу Temporary email addresses Тут же можно посмотреть и другие р

Грейлистинг и антиспам для qmail

В продолжение темы об использовании qmail в debian-russian решил сохранить ссылочку, иначе в следующий раз придется снова разыскивать: Greylisting Links А вот по этой ссылке можно посмотреть описание более мощного решения: latest rblsmtp filter Также рекомендую заглянуть по следующему адресу: qmail Information См. патчи, ссылки, HOWTO. И напомню заодно адрес неофициального сайта поддержки , так как ранее я приводил только адрес русскоязычного зеркала. В рассылке qmail встретил тему, созданную мантейнером неофициального дебиан-пакета с qmail, а так как этот вопрос я слышу с завидной регулярностью, привожу ссылку: netqmail: reject unknown recipients during SMTP В частности, интересна следующая цитата: from qmail.org: - Andrew Richards has modified Paul Jarc's realrcptto into qmail-verify. It now uses UDP for privilege separation which also allows an incoming mail server to query a separate mailstore for larger installations. http://free.acrconsulting.co.uk/email/qmail-verify.h

Баллада о qmail

В debian-russian завертелась дискуссия о qmail и других MTA. Не скрою, свою руку я к этому очень даже приложил. Хотелось бы кратко резюмировать - интерес к qmail зачастую спотыкается на том, что мол нет актуального пакета в дебиане (напомню, место действия - рассылка дебиана) и никто тот qmail не поддерживает и как бы не остаться с ним в гордом одиночестве. Сначала я полагал, что мой собеседник специально придирается к мелочам, вместо того, чтобы "зрить в корень": Чтоб мудро жизнь прожить, знать надобно немало, Два важных правила запомни для начала: Ты лучше голодай, чем что попало есть, И лучше будь один, чем вместе с кем попало. Но, признаюсь, я был не прав, и стоило предоставить оппоненту больше информации к размышлению. Итак, неофициальный репозиторий sid/lenny с утилитами DJB от замечательного мантейнера Gerrit Pape (он же, кстати, поддерживает пакет dash ). Заметим, что его сборка qmail давным-давно загружена на ftp-master, но и по сей день там "маринуется

Производительность SQLite FTS3

Возвращаясь к вопросу о производительности модуля полнотекстового поиска в SQLite, мы можем наблюдать весьма приятную картину: $ ls -lh|grep test.db|awk '{print $5}' 15G $ sqlite3 test.db SQLite version 3.6.21 sqlite> select count(*) from file_text; 908800 sqlite> select total(length(content)) from file_text; 6552194816.0 sqlite> select count(docid) from file_text where file_text match 'претензия'; 1536 CPU Time: user 0.004001 sys 0.000000 sqlite> select count(docid) from file_text where file_text match 'новости август абонент'; 256 CPU Time: user 0.028002 sys 0.000000 sqlite> select count(docid) from file_text where file_text match 'новости август абонент*'; 512 CPU Time: user 0.420026 sys 0.000000 Резюме : набор из почти миллиона документов общим размером 100 Гб, суммарно содержащих 6,5 миллиардов знаков, хранится в 15 Гб БД и поиск по одному слову занимает единицы миллисекунд, по нескольким словам - десятки миллисекунд, по нескольким сл

Репозиторий с apt-ftparchive

Заменяя reprepro на apt-ftparchive , в первую очередь хотелось сохранить имеющуюся структуру каталогов. Нижеприведенная конфигурация решает эту задачу, только каталог pool разделен на pool-lenny и pool-etch, поскольку так проще поддерживать. Вот такая команда обновит список пакетов локального репозитория: /etc/apt/apt-archive-mbg А такая команда обновит репозиторий на основном сервере: apt-archive-mbg-upload Замечу, что секция non-free из локального репозитория будет скопирована в отдельный закрытый репозиторий. Ниже приведены скрипты и конфиги, необходимые для решения указанной задачи. apt-archive-mbg-upload #!/bin/dash /usr/bin/rdiff-backup --exclude '**/main' /mnt/work/apt-archive-mbg .../apt-archive-mbg /usr/bin/rdiff-backup --exclude '**/non-free' /mnt/work/apt-archive-mbg .../debian /etc/apt/apt-archive-mbg #!/bin/dash apt-ftparchive generate /etc/apt/apt-archive-mbg.conf cd /mnt/work/apt-archive-mbg/dists/etch apt-ftparchive -c /etc/apt/apt-mbg-e

Язык newLISP

В поисках средства для создания быстро стартующих утилит провел тесты и среди реализаций lisp. Самым быстрым оказался newLISP . Поставил deb-пакет с офсайта, разумеется, с поддержкой unicode . Поскольку у него в комплекте предоставляется и модуль для работы с SQLite, то я сразу же написал соответствующий тест. Ниже приведено сравнение с D-версией: $ time newlisp ./sqlite.lsp 3.6.21 real 0m0.013s user 0m0.008s sys 0m0.004s $ time ./sqlite DB open. sqlite_version() = 3.6.21 DB closed. real 0m0.010s user 0m0.004s sys 0m0.004s $ cat sqlite.lsp (module "sqlite3.lsp") (if (sql3:open "lsp.db") (sql3:error)) (println (((sql3:sql "select sqlite_version()") 0) 0)) (sql3:error) (sql3:close) (exit) $ cat sqlite.d import sqlite3; int main() { sqlite3* db; int code; sqlite3_stmt *stmt; char *sql="select sqlite_version();"; code = sqlite3_open("file.db", &db); if(SQLITE_OK != code) { printf("DB create error

Язык D

В поисках С-подобного языка с нативной поддержкой строк решил попробовать язык D . Цель состоит в оптимизации строковых операций в небольших сишных утилитах, в остальном С меня вполне устраивает. Быстродействие циклов и арифметики оказывается полностью идентично сишному варианту: $ cat hello.d int main(char[][] args){ int i; double x; for (i=0,x=0;i<100000000;i++) x+=1.1*i; printf("i=%d; x=%.2f\n",i,x); return 0; } $ gdc-4.1 hello.d -o hello $ time ./hello i=100000000; x=5499999945475522.00 real 0m0.535s user 0m0.528s sys 0m0.000s $ cat hello.c #include "stdio.h" main(){ int i; double x; for (i=0,x=0;i<100000000;i++) x+=1.1*i; printf("i=%d; x=%.2f\n",i,x); } $ gcc hello.c -o hello $ time ./hello i=100000000; x=5499999945475522.00 real 0m0.563s user 0m0.524s sys 0m0.004s А теперь рассмотрим более жизненный пример, на примере работы с SQLite базой данных. Элементарный пример взят отсюда , пл

Язык Lua

Шелл lua запускается довольно шустро, решил еще некоторые тесты провести. Итак, встраиваем интерпретатор в сишную программу. Скрипт читается с stdin /* Compile as gcc -o2 -I/usr/include/lua5.1/ -llua5.1 lua.c -o lua Use as echo -e "a = 1 + 1;\nprint( a);\n"|./lua */ #include <stdio.h> #include <string.h> #include <lua.h> #include <lauxlib.h> #include <lualib.h> int main (void) { char buff[256]; int error; lua_State *L = lua_open(); luaL_openlibs(L); while (fgets(buff, sizeof(buff), stdin) != NULL) { error = luaL_loadbuffer(L, buff, strlen(buff), "line") || lua_pcall(L, 0, 0, 0); if (error) { fprintf(stderr, "%s", lua_tostring(L, -1)); lua_pop(L, 1); // pop error message from the stack } } lua_close(L); return 0; } Скрипт вкомпилирован в тело программы /* Compile as gcc -o2 -I/usr/include/lua5.1/ -llua5.1 lua.c -o lua Use as ./lua *

Сумма прописью на tcl

По словам Anton Kovalenko, "КЛАДР напомнил о бурной юности..", и он прислал мне кусок своего кода, любезно разрешив его опубликовать на правах Public Domain: namespace eval speller { set names(19) { {ноль} {один одна} {два две} три четыре пять шесть семь восемь девять десять одиннадцать двенадцать тринадцать четырнадцать пятнадцать шестнадцать семнадцать восемнадцать девятнадцать} set names(90) { {} {} двадцать тридцать сорок пятьдесят шестьдесят семьдесят восемьдесят девяносто } set names(900) { {} сто двести триста четыреста пятьсот шестьсот семьсот восемьсот девятьсот} set major_triads { {1 тысяч а и {} 0} {0 миллион {} а ов 0} {0 миллиард {} а ов 0} {0 триллион {} а ов 0} {0 квадриллион {} а ов 0} {0 квинтиллион {} а ов 0} {0 секстиллион {} а ов 0} } set rur_descrip {0 рубл ь я ей 1} set kop_descrip {1 копе йка йки ек 1} proc spell {num descrip {usercall 0}} { variable names foreach {female root one two five spellZero} [lindex $descrip 0] {break}

Как я управляю пакетами своего репозитория

Возник тут разговор на эту тему, вот и решил выложить краткое описание. Итак, обновление пакета package, загрузка его обратно в репозиторий: # download apt-get source package # install build dependencies apt-get build-dep package #... edit package # update changelog (and version) dch -i # build updated package debuild -us -uc -sa # remove old version from local repository reprepro removesrc lenny package # include new version into local repository reprepro -C main include lenny /mnt/work/build/...package...changes # update remote repository rdiff-backup --exclude '**/conf' --exclude '**/db' /mnt/work/reprepro/ .../debian Новая версия установится автоматически после стандартного: sudo aptitude update && sudo aptitude upgrade Upd. Не упомянул про вход в чрут ленни для сборки, но многие пакеты этого не требуют (метапакеты, пакеты с настройками или скриптами, etc.).

Метапакет с моим десктопом

В силу перехода с КДЕ на IceWM , сделал метапакет для автоматической установки необходимых мне на десктопе программ: sudo aptitude install mbg-desktop Соответственно, в дальнейшем, будет просто обновляться список зависимостей этого пакета. В ближайших планах выложить пакет с системой монтирования USB-накопителей и файл тулбара IceWM , настройки IceWM и так далее. Разумеется, все новые зависимости будут установлены системой apt автоматически. Пользуюсь частью КДЕ-шных (kmail, kopete, konqueror), но их не прописывал (пока?). Надо сначала глянуть, сколько того самого КДЕ они за собой потянут.

Правильное монтирование USB-устройств

Добрался сделать свою утилиту для монтирования USB-накопителей. Как водится, долго думал, после чего стало ясно, что ни одной "правильной" системы монтирования я не видел. Все дело в том, что пользователь работает с физическими устройствами, а не дисками в их понимании ОС, и тем более не с их разделами. То есть требуется следующий функционал: примонтировать/отмонтировать/перемонтировать все и примонтировать/отмонтировать последнее подключенное устройство. Все, больше ничего не нужно. Но вот отсутствие именно этих двух возможностей и делает все системы монтирования настолько неудобными, какие они есть. Реализация в виндоус, кстати, не исключение, - сколько раз сам наблюдал, когда пользователь среди множества разделов (сетевые шары, внешний жесткий диск, флэшка) пытается "узнать" последний подключенный, чтобы отмонтировать именно флэшку. Пакет пока не выложил, но скоро будет. Называется он mbg-usbmount и содержит одноименную программу для монтирования, являющуюся обв

Утилиты КЛАДР

Статья перемещена по адресу http://sqlite.mobigroup.ru/wiki?name=sqlite3-kladr

Измерим шеллы в попугаях

Иногда возникает вопрос, какой шелл быстрее. Измеряем скорость запуска на уже не раз упоминавшемся CoreQuad 2.66GHz: $ time echo " "|dash real 0m0.001s user 0m0.000s sys 0m0.000s $ time echo " "|bash real 0m0.002s user 0m0.000s sys 0m0.004s $ time echo " "|perl real 0m0.002s user 0m0.000s sys 0m0.000s $ time echo " "|zsh real 0m0.003s user 0m0.004s sys 0m0.000s $ time echo " "|tclsh8.4 real 0m0.005s user 0m0.004s sys 0m0.004s $ time echo " "|tclsh8.5 real 0m0.007s user 0m0.004s sys 0m0.000s $ time echo " "|tclsh8.6 real 0m0.007s user 0m0.008s sys 0m0.000s Как видим, весьма мудро в дебиане решили выкинуть bash в пользу dash. Правда, дефолтовый /bin/sh указывает в ленни на /bin/bash, так что нелишним будет в скриптах явно писать /bin/dash. Это полезно как с точки зрения быстродействия, так и потому, что в дальнейшем не придется разбираться, нет ли где в коде "башизмов". zsh приятно удивил, хотя именно для скр

Google AJAX Libraries API

Согласно Developer's Guide : The AJAX Libraries API is a content distribution network and loading architecture for the most popular, open source JavaScript libraries. By using the google.load() method, your application has high speed, globally available access to a growing list of the most popular, open source JavaScript libraries. Что удобно, так это наличие прямых ссылок на последние релизы библиотек, по которым можно скачать с помощью wget, вместо тыканья по разным менюшкам на офсайтах.

1С-Предприятие 7.7 и SQLite

Вот интересная ссылка: Работа в 1С-Предприятии 7.7 с базами данных SQLite Автора этого проекта можно найти в форуме SQLite на sql.ru Сам я никогда с 1C не работал, успешно избегая сей участи, но система широко распространенная, так что возможность интеграции с ней вполне востребована. Если этот компонент поможет обмениваться данными, не влезая в саму 1C, то профит.

Автомонтирование устройств

При монтировании CD/DVD дисков под utf8 локалью кириллица в именах файлов нечитабельна. Есть несколько путей решения вопроса, в том числе отключение rock-расширений ФС на диске: $ cat /etc/fstab|grep cdrom /dev/sr0 /media/cdrom0 udf,iso9660 ro,user,noauto,norock 0 0 или использование утилиты fuseiso, предоставляющей возможность явно указать нужную перекодировку: fuseiso /dev/sr0 /media/cdrom0 -omodules=iconv,from_code=cp1251,to_code=utf8 fusermount -u /media/cdrom0 fuseiso , кстати, понимает не только iso-формат, но и некоторые другие, широко распространенные под виндоус. Из описания: "Также он позволяет монтировать .BIN, .MDF, .ING и .NRG если они содержат только одну дорожку." Для автомонтирования usb-устройств пригодится пакет usbmount , представляющий собой небольшой файлик с набором udev-правил и несколько шелл-скриптов для монтирования устройств, причем проверяется существование параметров монтирования для подключенного устройства в fstab, прежде чем

Прощай, KDE

В целях испытания на себе KDE 4, прежде чем ставить его близким (сейчас используют KDE 3.5) с полгода я жил с этим, хм, изделием. Итак, пришла пора подвести итоги. Начнем с того, что ставить KDE 4 можно разве что заклятому врагу, и не приведи вам судьба в это вляпаться. Даже при том, что я использую всего несколько КДЕ-шных программ, оно меня успело достать до чертиков. Я уж не говорю про такие "мелочи", что раскладку клавиатуры в КДЕ 4.1 однажды починили, громко по этому поводу кричали (а как же - много лет не могли исправить этот баг), после чего почти сразу же сломали и больше не чинят. В конкуероре периодически "отваливается" работа с файловой системой - дерево каталогов показывает, а вот список файлов не работает, при этом отображается сообщение "Malformed URL". Про стабильность работы могу лишь сказать, что текущая версия по стабильности работы отстает от КДЕ 3.5, а по утечкам памяти, наоборот, опережает. В настоящий момент монитор батареи ноутбука п

Система полнотекстового поиска sqlite3-poisk

Статья не завершена. Пакет sqlite3-poisk уже доступен в моем debian-репозитории. Индексатор Пример использования: poisk-scanner share.db /mnt/project/www/share /mnt/project/www После выполнения указанной команды будет создана БД share.db в текущей директории с результатами индексирования директории /mnt/project/www/share. Пути к проиндексированным файлам отсчитываются от директории /mnt/project/www - это удобно для поиска по файлам веб-проектов, чтобы сразу получать ссылки относительно корневой директории сайта. Утилита poisk-scanner-mbg предназначена для индексации веб-проектов, структура директорий которых совпадает с используемой автором. TODO В настоящее время поисковые запросы интегрированы в мой веб-портал, но я планирую их также реализовать в отдельной утилите poisk-http , которая будет принимать HTTP-запросы через stdin. Для веб-доступа к утилите рекомендую использовать tcpserver . Запрос от другой системы на поиск документов, располагающихся в дереве директори

Tcl на arm-android и другое

Alexander Danilov прислал интересные ссылочки: /tclkit/android-arm/ Judy Arrays Exploring Expect (477 страниц) Насчет этой ссылки мнения разделились, но все же: Tcl3D offers the 3D functionality of OpenGL and other 3D libraries at the Tcl scripting level. А вот еще попалось на глаза: The L Programming Language

True Unix Way

Проходят дни и годы, и начинаю все больше замечать, что с помощью маленьких, с умом реализованных утилит эффективно выполняю большую часть работы, а на различных монстров тратится львиная доля времени, причем, по сути, эти монстры решают всего-то пару задач. Как пример - KDE 4.x предоставялет мне несколько полезных программ, таких, как kmail, kget, kopete, kjots, запуск приложений по ALT+F2, ksnapshot (иногда), konqueror, kwrite, k3b (иногда). "Прочее" реализуется еще несколькими программами: mozilla firefox terminal skype (очень иногда) open office (иногда) pgadmin (иногда) virtualbox (иногда) transmission, dvdrip (очень иногда), avidemux (очень иногда), gimp (очень иногда), mplayer, музыкальный плеер (имхо все они глючные, так что выбираю каждый раз по ситуации). И... все! Притом времени на возню с КДЕ, начиная с версии 3.5, потрачено неоправданно много. Множество возникающих каждый день задач выполняются посредством консольных утилит, причем выполняются эффективно. Как при

mbg-opendocument-[server|client]

Внимание: при изменении версии openoffice необходимо переустановить пакет odtfactory-server . Внимание: пакеты переименованы и создан отдельный пакет с файлом конфигурации: odtfactory-client odtfactory-config odtfactory-server Ограничения для отдельного процесса конвертации (для одностраничного шаблона нужно около 200 Mb памяти, которые занимают openoffice и ява, а с указанными настройками можно обрабатывать достаточно большие документы): ulimit -m 300000 ulimit -v 300000 ulimit -f 2000 Размер выходного файла не может превышать 8 Mb, для подавляющего большинства применений этого лимита хватает с избытком. Обработчик каждого формата принимает не более 3-х одновременных подключений (настраивается в /etc/service/odt2*/run скриптах). Архитектура Клиент-серверное взаимодействие выполняется путем двусторонней передачи бинарных файлов, при этом никакая служебная информация не передается. Для контроля целостности файлов на стороне клиента и сервера следует воспользоваться анализат

Виртуальный X-server

Случается, что необходимо запустить программу, привязанную к использованию X-server. В подобных случаях может помочь пакет xvfb . Сценарий runit для запуска приведен ниже: # cat /etc/sv/X/run #!/bin/sh export LANG="ru_RU.UTF8" export HOME="/home/ooo" exec 2>&1 exec chpst -u nobody:nogroup /usr/bin/Xvfb -screen 0 800x600x24 :10 \ -from localhost -nolisten tcp Есть один неприятный момент - иногда по необъяснимым причинам x-server перестает запускаться с указанным номером дисплея и удаление /tmp/.X11-unix не помогает. Во избежание указанной проблемы предусмотрен "финт ушами", причем опции " -from localhost -nolisten tcp" уже не требуются, tcp-порт по умолчанию не открывается. В примере запускаю команды одновременно в двух разных консолях: $ xvfb-run --auto-servernum --server-args='-screen 0 640x480x8' sh -c "echo \$DISPLAY" :99 $ xvfb-run --auto-servernum --server-args='-screen 0 640x480x8' sh -c "echo \$DIS

Secure Remote Log Transmission System

А вот нашлась и система логирования на удаленный хост, совместимая с daemontools . Анонс: Secure Remote Log Transmission System Описание: Srlog2 Design Documentation deb-пакета нет, но есть описание, как эту утилиту опакетить и применять : srlog2: secure remote logging

Using AOLserver as a proxy server

В некоторых случаях удобно переадресовать или сгенерировать запрос к тому или иному бэкенду, нежели обрабатывать его средствами AOL Server. Отправка запроса реализуется достаточно легко с помощью встроенной функции ns_httpopen : Using AOLserver as a proxy server set conn [ns_httpopen GET $some_arbitrary_URL {} 30] set read_desc [lindex $conn 0] set write_desc [lindex $conn 1] set headers [lindex $conn 2] set mime_type [ns_set get $headers content-type] set head "HTTP/1.0 200 OK MIME-Version: 1.0 Content-Type: $mime_type\r\n\r\n" # Plus any more headers you need. ns_write $head ns_startcontent -type $mime_type ns_writefp $read_desc Для перенаправления запроса потребуется лишь скопировать все или некоторые хидеры исходного запроса (в примере выше хидеры не передаются). Таким образом, возможно, к примеру, выполнение авторизации в аоле и обработка запроса бэкенд-сервером. См. также реализацию http-клиента для аола на основе cURL: Topic: AOLserver -- HTTP client . Бэкендом може

Работа с файлами формата OpenDocument

Начнем с хорошего - контейнером является все-таки стандартный zip-архив, а не что-то доморощенное. Теперь о плохом - это zip-архив и имеет все его недостатки. Поговорим о том, как же нам сделать редактирование контента для целей, например, автоматизированного вывода на печать документов - распаковываем файл content.xml, выполняем в нем нужные замены с помощью sed или другой утилиты, записываем измененный файл обратно в архив. Две основные проблемы при работе с zip-архивами: утилита zip написана страшными голово...ногими существами с неизвестной планеты и сообщения об ошибках в архиве пишет в stdout (при запуске zip -T ...). Повбивав бы... Кроме того, не умеет заменять файл в архиве, принимая сам файл в stdin, а его имя - аргументом командной строки. Решение первой проблемы - утилита unzip: $ time unzip -qqt 100.odt real 0m0.006s user 0m0.004s sys 0m0.000s $ time unzip -qqt 100 >/dev/null warning [100]: 3 extra bytes at beginning or within zipfile (attempting to process anyway) f

Размышления о безопасности qmail от DJB

Ненароком попалась на глаза замечательная ссылочка: Some thoughts on security after ten years of qmail 1.0

Клиент-серверное взаимодействие

Предисловие, написанное после завершения заметки: все тесты выполнялись на ноутбуке core2duo, со сниженной до 800Мгц частотой процессора (для мирного использования дома хочется тишины). На десктопе с coreQuad процессором время уменьшится в несколько раз (имхо примерно втрое). Воспользуемся утилитами DJB. Проверим скорость: $ time ./header@ localhost / 8081 HTTP/1.0 200 OK Date: Tue, 5 Jan 2010 22:12:53 GMT Connection: close Cache-control: no-cache, no-store Content-Type: text/html; charset=utf-8 Content-Length: 1502 real 0m0.017s user 0m0.008s sys 0m0.012s $ time ./responce@ localhost / 8081 > test.html real 0m0.018s user 0m0.008s sys 0m0.008s $ time cat test.html |./header HTTP/1.0 200 OK Date: Tue, 5 Jan 2010 22:22:47 GMT Connection: close Cache-control: no-cache, no-store Content-Type: text/html; charset=utf-8 Content-Length: 1502 real 0m0.009s user 0m0.004s sys 0m0.004s Как видим, отправка запроса и получение ответа с помощью tcpclient занимает около 9 мс (включая время на преоб

Обработка email-сообщений

Полагаем, что qmail у нас уже установлен и настроен. Текущая задача заключается в том, чтобы автоматизировать обработку сообщений. Будем использовать пакеты mpack , mailtextbody (или mimedecode - если хотим получить сообщение целиком, со всеми хидерами, но декодированное, вот только жаль, что utf-8 не понимает), mess822 (последний доступен в моем репозитории). Что интересно, из найденных мною обработчиков email ни один даже близко не стоял рядом с утилитами DJB из пакета mess822 . Собственно, в очередной раз убедился, что современные девелоперы способны испаскудить любую хорошую идею, понаписав мегабайты [глючного] кода - ни одного нормального email-клиента, состоящего, согласно идеологии unix, из набора простых утилит, в репозитории дебиана не нашлось. Ну и черт с ними, лучше разобраться и пропатчить mess822, нежели пользовать более "современные" поделия. Отправка письма со вложением $ mpack -s test ./sqlite3-rdiff veter@veter-laptop Отправка письма без вложения $ echo &