Posts

Showing posts from May, 2010

Блеск и нищета PostgreSQL

Давно сталкиваюсь в продакшене с проблемой, что выборки с подзапросами выполняются неприлично долго. Причем в тестах воспроизвести такое поведение никак не удавалось. И вот наконец получилось! Оказывается, проблема существует всегда, но становится заметной только на таблицах с миллионами записей - простейшая выборка "тормозит", если увеличиваются _значения_ используемых в выборке идентификаторов, потому в таблицах с десятками тысяч и менее записей баг просто незаметен. Сначала приведу один из рабочих запросов, над которыми ломал голову: SELECT d.id AS document_id, d.phone_number AS phone, r.name AS region, p.code AS point, p.trademark AS point_trademark, (case when p.is_priority then '1' else '' end) AS color_it, c.code AS center_code, a.value AS status, u2.name AS user_2, tp.name AS template, c.name AS center, (a.save_date at time zone interval '04:00')::date AS work_date, date_trunc('second',(a.save_date at time zone interval

Веб-редакторы - метод contentEditable и jQuery

Свершилось - метод contentEditable теперь поддерживают все браузеры, начиная от IE 6 и Firefox 3 (см. Firefox 3 -has attribute ContentEditable on all HTML elements ). Соответственно, создание редактируемой области на странице более не требует iframe. Достойная внимания реализация в виде JQuery-плугина представлена здесь: In-place editing with contentEditable property and jQuery Демонстрацию смотреть тут Выглядит просто, а возможности очень большие. Например, можно форматировать текст с помощью клавиш: Ctrl+b, Ctrl+i, Ctrl+u. Манипуляции с блоками текста - Ctrl+c, Ctrl+x, Ctrl+v - доступны также из контекстного меню. Для гиков, скажите вы? А вот и нет - можно просто скопировать форматированный текст из MS Word или с веб-страницы и вставить в редактируемый элемент с сохранением форматирования! Конечно, следует учитывать, что таким способом пользователь может в однострочное поле вставить многострочный документ солидных размеров, но проверку вводимых пользователем данных никто не отме

UUID для PostgreSQL с помощью Tcl

Понадобилось мне быстро добавить уникальный идентификатор (uuid) к таблице. На тикле нужная функция пишется очень легко - с помощью пакета uuid или вызова внешней утилиты. Генерация 10 000 идентификаторов во втором случае занимает около 10 с на десктопе, что вполне себе шустро, так что на нем и остановимся. Установим пакет с нужной нам утилитой: sudo aptitude install uuid А вот и реализация функции: --DROP FUNCTION uuid(); CREATE OR REPLACE FUNCTION uuid() RETURNS text AS $BODY$ return [string map {- ""} [exec uuid]] $BODY$ LANGUAGE 'pltclu' VOLATILE SECURITY DEFINER; ALTER FUNCTION uuid() OWNER TO offline; --select uuid(); alter table offline.documents add column checksum text not null default uuid(); CREATE UNIQUE INDEX documents_checksum_idx ON offline.documents USING btree (checksum); Очень даже наглядная иллюстрация "unix way". Разумеется, так делать можно только под юниксами, где порождение множества процессов есть совершенно но

Жизненный цикл программиста

Ссылка на статью: Жизненный цикл программиста Статья известного российского системного программиста, зав. лабораторией Института системного анализа РАН, члена Российской академии интернета, автора шахматной программы «КАИССА» (первого чемпиона мира среди шахматных программ), президента компьютерной фирмы ДИСКо, лауреата всех профессиональных опросов «Top-100 Российского компьютерного бизнеса», Михаила Донского. Прекрасно написано и по существу, для меня было истинным удовольствием ознакомиться со статьей. Как физик по образованию, особенно оценил изложение основ системного подхода в программировании. А как человек, много читающий, получил удовольствие от стиля изложения. Рекомендуется к прочтению всем.

Масштабируемые СУБД

Статья здесь: PAPER: HIGH PERFORMANCE SCALABLE DATA STORES Хотелось бы перевести как "хранилища данных", но такой термин существует и означает нечто иное; скорее, термин СУБД подходит, хотя я знаю, что под таковыми в русскоязычной литературе обычно (ошибочно) подразумевают реляционные СУБД, а то и вовсе объектно-реляционные (что, в общем-то, самой грязной воды маркетинг). Насчет высокой производительности вопрос спорный, все зависит от задач. Вот так название статьи и превратилось в "Масштабируемые СУБД". Авторы выделяют четыре класса систем: Key-value stores: Redis, Scalaris, Voldmort, and Riak. Document stores: Couch DB, MongoDB, and SimpleDB. Record stores: BigTable, HBase, HyperTable, and Cassandra. Scalable RDBMSs: MySQL Cluster, ScaleDB, Drizzle, and VoltDB. К сожалению, некоторые из этих продуктов закрытые, а некоторые - сырые и глючные, но что есть, то есть. Уж не знаю, почему из обзора выпала MemcachedDB. Думаю, статья полезна в качестве шпаргалки

Редактор JSON

Пакет edit-json , имя редактора edit_json . Покамест не опробовал в деле, посмотрю чуть позже.

Tcl и XMPP

Есть и сервер и клиент: tclxmppd - Cross-platform XMPP and Jabber server written in Tcl tclxmpp - XMPP client and component library in Tcl А также в клиенте Cocinella можно посмотреть соответствующую библиотеку: JabberLib Как оно сделано в Tkabber я не знаю, но нужный код там тоже есть. Плюс мы всегда можем вызвать внешнюю утилиту, например, ejabberdctl (необходимо запускать от рута или пользователя ejabberd) или sendxmpp (от любого пользователя, но требуется указать логин и пароль для доступа к jabber-серверу).

Memcached и Tcl

MEMCACHED FOR TCL Требует библиотеку libmemcached, для которой в дебиане squeeze есть пакет libmemcached2 и в sid пакет libmemcached4 . Актуальные исходники брать здесь: http://github.com/bovine/memcached-for-Tcl

Расширения для Tcl

Tcl Extensions - by Category

Модем Huawei E1550 в debian - продолжение

Приобрел соответствующую железку, подключил. Ниже рассказываю, как именно. Вот подробное описание для работы с модемами в линуксе: ZTE MF626, он же ONDA MT503HS Как "приручить" МТС-модем Huawei E1550 Для билайновских модемов есть вот такое java-поделие, тормозное, но работающее: Юзер Интерфейс под Linux А вот такой конфиг позволит обычным способом подключиться: /etc/wvdial.conf [Dialer Defaults] Phone =. Username =. Password =. New PPPD = yes [Dialer beeline] Auto Reconnect = on Init1 = ATZ Init2 = AT+CGDCONT=1,"IP","home.beeline.ru" Baud = 460800 Modem = /dev/ttyUSB0 Modem Type = USB Modem Phone = *99# Password = beeline Username = beeline Abort on Busy = on Stupid Mode = on У меня включен тариф "Легкий безлимит", на других тарифах точка доступа может отличаться. Все для удобства абонента ;-) Указанная в конфиге скорость подключения игнорируется, так что приведенное выше значение ни на что не влияет. Вот что мы видим при подключени

Об архитектуре Reddit

В предыдущей заметке Супервизоры для систем высокой доступности я уже давал ссылку на статью 7 LESSONS LEARNED WHILE BUILDING REDDIT TO 270 MILLION PAGE VIEWS A MONTH А сейчас хочу провести небольшой анализ обсуждаемой архитектуры. В статье приводится 7 правил - рассмотрим их все. LESSON ONE: CRASH OFTEN The essence of this lesson is: automatically restart failed and cancerous services. Согласен полностью. LESSON 2: SEPARATION OF SERVICES The essence of this lesson is: group like processes and data on different boxes. Идея здравая, а вот обоснование совершенно невразумительное - утверждается, что все проблемы от потоков в питоне и некорректной работе с кэшем в СУБД, и с какого-то перепугу эти два фактора обобщаются на абсолютно все виды систем. Вот что стоило бы сказать, так это автоматизацию развертывания разделенных сервисов и возможность их неадминистрируемой работы. LESSON 3: OPEN SCHEMA The essence of this lesson is: don't worry about the schema. Рекомендация в

Супервизоры для систем высокой доступности

7 LESSONS LEARNED WHILE BUILDING REDDIT TO 270 MILLION PAGE VIEWS A MONTH LESSON ONE: CRASH OFTEN The essence of this lesson is: automatically restart failed and cancerous services. The downside of running your own system in a colo is that you are on the hook for maintenance. When your service dies you have to fix it now, even at 2AM. This is a constant tension in your life. You have to take a computer with you everywhere and you know that anytime anyone calls it could be another disaster you have to fix. It ruins your life. One way to mitigate this problem is restart process that have died or become cancerous. Reddit uses Supervise to automatically restart applications. Special monitoring programs kill processes that use too much memory, use too much CPU, or aren’t responsive. Instead of worrying just restart and the system is up. Of course you have to read the logs and find a root cause, but until then it keeps you sane. Так оно и есть, причем сейчас есть более продвинутая ре

Репликация пользователей из основной БД в ejabberd

Для обеспечения высокой доступности при минимальной нагрузке оптимальным решением является синхронизация учетных записей пользователей из основной БД в базу ejabberd (mnesia). Ранее я приводил пример авторизации внешним скриптом, но для более-менее серьезного применения это создает лишнюю нагрузку на основную БД, плюс снижает доступность. См. ejabberdctl should be able to dump to stdout . Дамп пользователей sudo ejabberdctl dump_table /tmp/dump passwd Парсер дампа #!/usr/bin/tclsh8.5 proc K {arg args} {set arg} proc << name {K [read [set f [open $name]]] [close $f]} array set jusers {} set lines [split [<< /tmp/dump] \n] foreach line [lrange $lines 1 end] { set user [string map {, " " \{ "" \} ""} [string range $line 0 end-1]] set name [lindex $user 1] set host [lindex $user 2] set pass [lindex $user 3] lappend jusers($host) $name $pass } puts $jusers(kuban) В результате для каждого виртуального хоста получаем спи

Очереди и деревья в SQLite

Приведу пару ссылок на сообщения рассылки: Managing trees in the database Persistent queue implementation based on SQLite

Книга "Dive Into HTML5"

Книга живет по адресу diveintohtml5.org а называется она Dive Into HTML5 BY MARK PILGRIM WITH ILLUSTRATIONS FROM THE PUBLIC DOMAIN

Переход на squeeze

Перехожу на новый дебиан, это позволит уменьшить число необходимых бэкпортов и получить новые версии некоторых пакетов, которые я не бэкпортировал, но хотел бы обновить. Итак, нижеперечисленные пакеты моего репозитория могут быть упразднены (перечислены только критичные для работы системы пакеты, на самом деле стали неактуальными и версии многих других): haproxy stunnel fossil tcl8.4 tcl8.5 tcl8.6 unzip zip Внес следующие изменения. В некоторых конфигах присутствовали директивы, неподдерживаемые новыми версиями пакетов, их закомментировал. haproxy #capture cookie session= len 64 Заметим, что это изменения апстрим-версии. Также при запуске выдаются некоторые предупреждения, их посмотрим позже. stunnel4 #xforwardedfor = yes Эта директива добавлена использованным мною патчем (см. на оффсайте haproxy) и в апстриме не поддерживается. В пакетах tcl8.5/tcl8.6 основное изменение в моей сборке связано с директивой KILL_OCTAL. Пока под вопросом, влияет ли эта директива на текущий код (ра

Прицел на eJabberd

Поговорим о выборе системы сообщений для пользователей некоего проекта или компании. Притом исходим из следующих требований: пользовательский интерфейс системы сообщений должен встраиваться в интернет/интранет портал, работающий на строго фиксированном ip с доступом исключительно по https. Почему такое ограничение, обсуждать особенно ни к чему, поскольку это бизнес-требование, добавлю лишь, что для некоторых пользователей есть и техническое ограничение - например, скайлинк на тарифных планах для корпоративщиков (по крайней мере, на некоторых) предоставляет лишь доступ по https. собственная авторизация (любым способом, без ограничений), так что зарегистрированные в основной БД пользователи имеют доступ к системе сообщений (притом из соображений безопасности в основной БД хранится лишь хэш пароля) всеобъемлющий API для интеграции с системой сообщений - в частности, для подключения AJAX-интерфейса пользователя (никаких web sockets, см. первое требование) и логирования всех сообщений (

Вечный ИЕ6

В целях проверки пользователей на вшивость, то есть на использование ИЕ6/7, я хотел сказать, погрепал логи. Кстати вспомнилась замечательная статья о том, откуда такая путаница в идентификации браузеров: История строки User-Agent в браузерах Итак, результаты. В МР Поволжье ИЕ6/7 практически не используют - меньше 10% запросов. Зато в МР Юг почти 50% запросов именно от указанных браузеров! Результат жуткий, что-то в духе восстания зомби - учитывая, что сама Микрософт уже старатся эти артефакты закопать побыстрее, а они упорно сопротивляются. Отмечу, что это результаты по работе нашей веб-системы поддержки дилеров сотовых операторов.

Обновление js-библиотек пакета mbgserver-jquery

Деб-пакет mbgserver-jquery содержит базовые javascript библиотеки, используемые в наших проектах. Многие из них поправлены мною для исправления багов или получения желаемой функциональности. В целях унификации и упрощения поддержки периодически проверяю состояние апстрима, и по возможности заменяю правленную версию на оригинальную. И вот наконец-то удалось собрать набор библиотек, вовсе не требующих правки! jgrowl и ajaxupload доведены до ума в апстриме, причем все мои патчи независимо реализованы разработчиками :-) Конечно, не мешало бы им патчи эти отправить своевременно, но я разработку на javascript не люблю и занимаюсь этим лишь по необходимости. Расширение autocomplete заменяем на аналог из JQuery UI , появившийся в последнем релизе. Замечу, что указанный аналог имеет глюк с позиционированием списка вариантов при изменении масштаба страницы (а именно, замечено при нажатии Ctrl + в браузере google chrome). Расширения thickbox и cluetip заменит стандартный dialog из JQuery

Используем data:uri

Берем последний JQuery + JQuery UI с официального сайта , причем отказываемся от загрузки эффектов UI и соглашаемся с выбором темы оформления по умолчанию ui-lightness . Далее пакуем все это в deb-пакет mbgserver-jquery , сразу же заменяя ссылки на картинки в css -файле на их base64 представление согласно формату data:uri . Написанный на скорую руку скрипт делает то, что нам нужно, хотя его не стоит рекомендовать как образец программирования на тикле: #!/usr/bin/tclsh8.5 proc K {arg args} {set arg} proc >> {name data} {set f [open $name w]; puts -nonewline $f $data; close $f} proc << name {K [read [set f [open $name]]] [close $f]} set css [exec sh -c "cat *css"] foreach file [exec ls images/] { set file images/$file # puts $file set image [string map {\r {} \n {}} [exec base64 $file]] set mime [exec file --brief --mime-type $file] set css [regsub -all -- $file $css "'data:$mime;base64,$image'"] } #puts $css set dir [exec p

Навигация в AJAX-приложениях

Всем хороши AJAX-приложения, особенно когда в них работает навигация с помощью функций перехода по истории браузера и можно обновить текущую страницу. Во всех уважающих себя браузерах это реализуется, а печально известные ИЕ6 и ИЕ7, как всегда, отличились. Ну, что с ними делать - жить они еще будут на просторах рунета лет 10, не меньше. Как пел великий бард: "Остается одно - только лечь помереть". Точно такая же ситуация с data:uri и многими другими возможностями современного веба. Для корпоративных приложений, коими я и занимаюсь, поддержка ИЕ6 критична, что не радует. С другой стороны, если отказаться от попыток предоставить все возможности веб-приложений в ИЕ6, можно многое улучшить для пользователей современных браузеров. Чем же мы можем пренебречь в поддержке ИЕ6? Это выпадающие меню, которые можно заменить на страницы со списком пунктов (уже давно так делаем), это картинки интерфейса, которые просто не отобразятся (например, картинки пунктов меню - начинаем так делать)

SQLite БД и утилиты КЛАДР

Как ни странно, недавно на одном из форумов снова увидел вопросы по использованию КЛАДР . Вместо того, чтобы разобраться с тем, что из себя представляет КЛАДР , его сначала пытаются как-нибудь преобразовать во что-нибудь, а потом с этим чем-нибудь работать. Делать этого не следует, а чтобы понять, почему - загляните в описание формата КЛАДР . О том, как работать с исходной структурой КЛАДР , сохранив ее для удобства в БД SQLite , я уже писал: Использование адресного справочника КЛАДР в Tcl Преобразование справочника КЛАДР в формат SQLite Утилиты КЛАДР Сейчас я просто перекладываю деб-пакеты (исходного кода и бинарные) с БД и утилитами, описанные в перечисленных статьях, в открытый репозиторий. Скомпилировать утилиты под любую ОС не представляет сложностей, а под убунту можно и просто поставить бинарные деб-пакеты.

SQLite наносит ответный удар: Write-Ahead Logging в SQLite 3.7.0

Недавно Oracle вознамерился откусить часть чужого пирога в нише встраиваемых СУБД, предлагая пользователям SQLite прозрачный переход на новую версию СУБД BerkeleyDB с встроенной поддержкой программного интерфейса SQLite. Еще бы им не зариться - SQLite используется от смартфонов Android, iPhone и других до ОС Solaris, Linux и прочих. Притом для обеспечения совместимости Oracle использовал код самого SQLite, который распространяется под лицензией Public Domain и доступен для коммерческого использования. Но скорость реакции апстрима SQLite заслуживает всяческих похвал и в ответ на анонс компании Oracle команда разработчиков SQLite предоставляет новый режим работы СУБД SQLite без блокировки при чтении и записи! Таким образом, существующие пользователи SQLite не получат обещанного выигрыша от предлагаемого им Oracle перехода на BerkeleyDB просто потому, что в новой версии SQLite будет почти аналогичная конкурентность и множество других возможностей, которые Oracle еще не успела скопироват

Отказоустойчивость и балансировка нагрузки в кластере

Вот уже с неделю размышляю над дальнейшей стратегией построения веб-систем. А также, как водится, перелопачиваю документацию. Наконец-то нашлось время сформулировать многое из того, о чем раньше некогда было всерьез подумать. В том числе, нашел проект и одноименный деб-пакет keepalived . Почему именно этот проект, хотя есть намного более известные аналоги ( heartbeat )? Все просто - именно keepalived рекомендует автор HAProxy , предлагая в документации варианты совместного использования и примеры конфигурации. Сам я давно и успешно использую HAProxy и с его автором общался, неизменно получая точные и ясные ответы на вопросы продакшен конфигурации и защиты от сбоев и атак различных видов. Это была первая причина. А вторая - на мой взгляд, конфигурационные параметры heartbeat придуманы точно не гуманоидами, вот пусть эти головоногие (в лучшем случае) ими и пользуются. Третья причина - костыли в heartbeat для предотвращения одновременного использования разделяемых дисков несколькими у

ANN: O'Reilly book "Using SQLite" available for pre-order

Из рассылки анонсов SQLite: sqlite-announce Digest, Vol 25, Issue 1 In conjunction with O'Reilly Media, I am happy to announce that the book "Using SQLite" is now available for pre-order. When released later this summer, the title should also be available in several popular ebook formats. O'Reilly Media: http://oreilly.com/catalog/9780596521189/ Amazon: http://www.amazon.com/Using-SQLite-Jay-Kreibich/dp/0596521189/ You can help! "Using SQLite" is taking part in O'Reilly Lab's "Open Feedback Publishing System" (OFPS). While we continue to prepare the final draft, you can read an online version of the book and leave feedback. Changes and edits to the current draft are pushed to the website daily, allowing you to track and watch as the book takes its final form. I invite all SQLite list members to register and participate: http://using-sqlite.labs.oreilly.com/ Thank you for your help and support! -j -- Jay A. Krei

Skype для дома и бизнеса

Некоторое время назад в Skype появилась замечательная опция - подмена номера вызывающего абонента. Это означает, что теперь мы можем указать номер своего мобильного телефона и наши собеседники будут видеть именно этот номер, когда мы им звоним по скайпу. Соответственно, теперь скайпом пользоваться намного удобнее, поскольку нет нужны при каждом звонке объяснять, кто мы такие, откуда звоним и что это значит. Анонс я увидел вот здесь Новые тарифные планы Skype и видеоконференции в следующей бете . Процитирую самое интересное, на мой взгляд: Вчера вечером Skype объявил о введении новой системы тарифных планов (subscriptions) для звонков на фиксированные и мобильные номера. Подробностей пока не так много, но речь идет о гибкой системе формирования своего, персонализированного тарифного плана. Цены на новые тарифные планы начинаются с €0,89 (€1.02 с НДС) в месяц, что дает цену в €0,01 за минуту для звонков на номера практически по всему миру. Для сравнения: сейчас тарифный план «Мир» о

Выбор браузера: google-chrome

Постепенно и довольно незаметно браузер от гугл стал удобен и быстр. С девелоперской версии 5 я начал его использовать под линуксом (пакет google-chrome-unstable ) вместо конкуерора и файрфокса. Должен признаться, что именно google chrome позволяет мне использовать в качестве основного компьютера нетбук - браузер так быстр, что мощный компьютер просто не требуется, так что хром великолепно дополняет среду lxde. Полсотни вкладок, открытые в течении нескольких дней, не приводят к каким-либо утечкам памяти или снижению отзывчивости хрома, что по сравнению с файрфоксом доставляет просто огромное удовольствие. Флэш я отключаю, поскольку эта очень неэффективная технология и вдвое снижает время жизни от батареи, а прокрутка страниц с флэш временами сильно "тормозит" (прав Apple в своем желании "закопать" флэш - это действительно делается на благо пользователей). На днях появилась сборка новой версии под виндоус, так что есть повод сделать краткий обзор для пользователей вс

Модем Huawei E1550 в debian

Было дело, когда-то я активно пользовался gprs, который был хиленьким, глючным и дорогим каналом доступа в интернет, но - был. Прошли годы, появился сначала анлим доступ в интернет через проводной модем, потом анлим по эзернет... Про gprs вспоминал редко - когда хотелось поработать вдали от цивилизации, но недоступность анлим-тарифов убивала эту идею на корню. Сегодня ситуация меняется - появились недорогие анлим-тарифы, да и edge зачастую доступен вне городов (3g-доступ пока возможен лишь в крупных городах). Итак, пришло время, а тарифы далее будут лишь снижаться. Начинаем, разумеется, с выбора оборудования, то есть модема. Погуглив, я остановился на модели USB-модем Huawei E1550 . Теперь посмотрим, как нам его подключить в debian. Замечу, что в сети полным-полно сильно замудренных историй о настройке этого устройства в убунту и дебиане - но содержат они или полный бред, или обрывочные куски некоего тайного знания. Вот как пример: Настройка интернета USB-модем Huawei E1550 в Ubuntu

Книга по оптимизации веб-сайтов на стороне клиента

Скажу честно, что я от данного опуса отнюдь не в восторге - изложение попсовое и местами очень странное. Но, тем не менее, сей труд есть и с этим "нельзя не считаться". Вероятно, наиболее полезна книга окажется для тех, кто по каким-то причинам еще не знает английский язык и потому испытывает трудности в чтении манов. И, несмотря на определенные претензии к содержанию, скажем спасибо авторам за их труд. Книга «Реактивные веб-сайты»

Прототип интерфейса рассылки сообщений для ПО оффлайн-сервис

Image
Текущий вариант с древовидным представлением является почти стандартным и широко распространенным, но далеко не так удобен, как это может показаться на первый взгляд. А именно - для поиска нужного элемента (в данном случае, пользователя) зачастую приходится паремещаться по нескольким ветвям дерева, поскольку не всегда априори известно, в какой ветке следует искать. Разумеется, более современный подход заключается в предоставлении полнотекстового поиска по именам, так что, зная отправителя (если отправляем конкретному адресату), легко его найти. В случае массовой рассылки удобно предоставить набор некоторых групп (комнат, чатов и т.п.), которым и отправляется сообщение. Прототип сделан с помощью расширения Pencil к браузеру Mozilla Firefox . Отправить выбранным пользователям Отправить всем пользователям указанных регионов Upd. Отправить выбранным пользователям Отправить всем пользователям указанных регионов