MySQL: Archive Storage Engine

Рубрика: Development, MySQL | 13 March 2009, 20:56 | Vadim Voituk

Все очевидно, что любая современная информацонная система занимается хранением и анализом любого рода данных.  Аналитики утверждают что в среднем, обьем этих данных для среднестатистичекой компании растет на 42% в год.
В результате проблема хранения этих данных постепенно приобретает бОльшую актуальность.

Из своего опыта работы с достаточно большими массивами данных, хранимых в современных реляционных СУБД (по большей части в MySQL) могу сказать что не менее 50% данных в любой системе – это данные которые представляют собой только “историческую” ценность. [Далее...]

Project closed. Lessons learned.

Рубрика: Development, Just a life, Работа | 11 March 2009, 11:26 | juriy

Вот и подошел к концу очередной абзац моего резюме. Проект, которым я руководил последние полтора года, закончен. Как минимум, закончена его разработка с нашей, аутсорсинговой стороны.

Работая на этом проекте, я вынес для себя несколько важных уроков. Этот опыт я добывал сам: некоторые уроки дались легко, другие вылились в потерянное время и нервы. Чтобы как-то прорезюмировать проект в целом: работа над ним была _нормальной_. Практически не было овертаймов, была хорошо налажена коммуникация с заказчиками и внутри компании все «рабочие моменты» решались на удивление быстро.
[Далее...]

nginx init.d script

Рубрика: Development | 9 February 2009, 19:41 | Vadim Voituk

Как-то так получилось что при установки nginx с исходников, в /etc/init.d/ не установился скрипт для автозапуска web-сервера.

Потому исключительно себе на заметку (знаю точно – пригодится ещё) публикую то, что удалось найти в сети и допилить напильником до рабочего состояния.

Скачать nginx init.d / rc.d скрипт.

JavaScript applet loader.

Рубрика: Development, Java, JavaScript/Ajax | 6 February 2009, 13:50 | juriy

У каждого разработчика есть свои маленькие “заморочки” по поводу того как должно выглядеть приложение. Одна из моих любимых: пользователь должен знать минимум о том, как работает приложение и на каких технологиях оно построено. Взять, к примеру, Flash. Загружается тихонько в окне браузера, крутит пользователю картинки или видео и до тех пор, пока пользователь не начнет по нему кликать правой кнопкой, не признаЕтся кто он такой.

С другой стороны Java. Вот тебе пользователь раз логотип при загрузке апплета, да побольше, побольше, а если ты вдруг забыл про то, что работаешь с великой и могучей Java, мы тебе иконку в трей кинем, чтобы он тебе оттуда напоминал что пора качать новую версию.
Вобщем, вы мою позицию поняли.

Недавно я задался вопросом, как организовать загрузку апплета на странице так, чтобы пользователь не увидел экрана загрузки. Вместо него я бы хотел, к примеру, разместить логотип и progress bar (не настоящий, а просто картинку, которая показывает, что процесс идет). Второе обязательное требование: чтобы приложение отображалось, как только GUI прорисован. Мы не хотим заставлять пользователя ждать лишнее время.
[Далее...]

POST сюрприз

Рубрика: Java | 2 February 2009, 14:09 | juriy

Сейчас, в мире web 2.0 самый модный buzzword это давно уже не ajax. Асинхронные запросы на страничках настолько прочно вошли в нашу жизнь, что воспринимаются как должное. Более модный нынче термин – Comet. Comet – технология общения клиента с сервером, похожая на Ajax, за тем исключением, что Comet держит HTTP подключение открытым. Что это означает? К примеру, сервер может в любой момент оповестить клиента о событии, не дожидаясь, пока клиент спросит сам.
По такому принципу, к примеру, работает Google Talk из браузера.
Это преамбула.

На выходных я решил реализовать такое подключение из Java-апплета к серверу. Я хотел, чтобы _оба_ канала (и канал для запросов и канал для ответов) были постоянно открыты. Таким образом задержка передачи сообщений была бы идентична задержке TCP/IP подключения.
[Далее...]

How it works: Jabber server resolve

Рубрика: Development | 27 January 2009, 19:01 | Vadim Voituk

При разработке Jabber2Twitter-гейта, получил от бета-тестров жалобу на то, что не удается добавить бота в список контактов с не-Google-овских клиентов/доменов (Ya.Online, Qip, etc).
(Google тут при том, что Jabber-демон “живет” на его серверах)

Тогда в мозгу родился вопрос: А откуда Jabber-клиент должен знать, что при коннекте к Jabber-серверу нужно идти не на тот IP-адрес, куда указывать DNS, а на Google-евый сервер?

Грубо говоря, если у меня DNS-запись домена jabber2twitter.com находится на одном сервере (ServerA), а Jabber-демон – на другом (ServerB), то откуда Jabber-клиент знает, что нужно открывать сокет на ServerB:5222 ? 

Вот тут как раз в дело вступают DNS SRV-записи, которые указывают размещение сетевых сервисов для конкретного доменного имени. 
Опять же на грубом примере это выглядит так: в SRV-записи домена указывается что искать FTP/LDAP/etc. сервисы, привязанные к этому домену нужно искать вот по такому вот адресу.
Почти также как MX-записи указывают на то, где искать почтовые службы, привязанные к доменному имени. 

Возвращаясь к теме Jabber-протокола, спецификация RFC 3920, в разделе “14.3. Client-to-Server Communications”  говорит что, что перед тем, как клиент производит DNS-resolve IP-адреса, он должен проверить SRV-запись с именем ”_xmpp-client._tcp.example.com.”
И только в случае неудачи подключаться к тому серверу, на какой указывает A-запись домена.

Кому это может понадобиться, кроме разработчиков Jabber-клиентов/серверов? 

Отвечаю: Например тем, кто использует Google Chat на своем домене и хочет добавить возможность чатится с jabber-пользователями вне пределов этого домена.

В таком случае необходимо добавить SRV-записи так, как это описано тут.

В моем же случае, добавление SRV-записей вроде как решило описанную вначале заметки проблему.
Буду благодарен, если кто пользует не Google-овские Jabber-клиенты, попробует добавить в контакты bot@jabber2twitter.com и сообщит мне видит ли он бота online

GoDaddy: Nameserver not registered.

Рубрика: Development | 21 January 2009, 13:06 | Vadim Voituk

При управлении доменными именами, зарегистрированными на GoDaddy, возникла проблема, которая убила у меня 2 часа полезного времени.
(вот только не надо мне рассказывать что GoDaddy это не труЪ – сам знаю)

При попытке назначить определенному домену собственные (custom) nameservers (например ns1.myzone.com и ns2.myzone.com), получаем ошибку “Nameserver not registered.”
Аналогичная ситуация наблюдается если пытаемся создать профиль с указанием custom nameservers.

Пользовательская справка GoDaddy по поводу решения этой проблемы скромно умалчивает (хотя раньше лично мне всегда помогала).

Решение оказалось немного нетривиальным:

Необходимо в настроках домена myzone.com кроме того, что создать DNS-записи для субдоменов  ns1 и ns2, ещё и добавить аналогичные записи в “Host Summary” (прямоугольный блок внизу слева, на странице с информацией о домене).
В первом поле ввода указать ns1, а в поле “Host IP 1” – IP-адрес, куда должен указывать NS.
Аналогично и для записи ns2.

И только после этого, GoDaddy позволит указывать ns1.myzone.com и ns2.myzone.com в качестве Custom Nameservers для своих доменов и использовать их в профайлах.

MySQL: Определение размера таблицы

Рубрика: MySQL | 8 January 2009, 18:11 | Vadim Voituk

Вот такой вот интересный запрос случайно выудил из документации MySQL:

SELECT
    table_name AS table_name,
    engine,
    ROUND(data_length/1024/1024,2) AS total_size_mb,
    table_rows
FROM
    information_schema.tables
WHERE
    table_schema=DATABASE();

Показывает обьем и количество строк в таблицах MySQL.
Результат выглядит приблизительно так:

+-------------------+--------+---------------+------------+
| table_name        | engine | total_size_mb | table_rows |
+-------------------+--------+---------------+------------+
| categories        | MyISAM |          0.00 |         17 |
| downloadlinks     | InnoDB |         13.02 |      19158 |
| errors            | InnoDB |         15.02 |      84104 |
| lastdownloads     | MEMORY |          3.19 |        524 |
| providers         | MyISAM |          0.00 |         17 |
| starstags         | InnoDB |          1.52 |      14323 |
| tagids            | InnoDB |         35.59 |     759694 |
| tags              | InnoDB |       2036.00 |   21971934 |
| vars              | InnoDB |          0.02 |         51 |
| videocategories   | InnoDB |         49.58 |    1583675 |
| videos            | InnoDB |       1864.00 |    1954427 |
| videos_deleted    | MyISAM |         56.33 |      75889 |
| videostats2       | InnoDB |        271.88 |    3417776 |
| videostats2_daily | InnoDB |          0.02 |        266 |
+-------------------+--------+---------------+------------+

Правда есть один нюанс: на InnoDB-таблицах показывает количество незалоченных в данный момент строк.

P.S. А кто-то пробовал использовать ARCHIVE storage engine?
Как он в плане fail-over и repair?
Поделитесь good/bad experience?

Не верьте кодогенераторам,

Рубрика: Java | 5 January 2009, 11:57 | juriy

или история одного маленького и противного бага.

Сегодня убил некоторое время, отлавливая мерзкий баг. Баг был наглядно продемонстрирован юнит тестом, который, помимо всего прочего, проверял два объекта на эквивалентность. Сами объекты – простые java-бины с парой полей – одно типа int, второе типа String[][]. Код для equals и hashCode поручил сгенерировать eclipse’у. Подвох оказался в том, что метод equals попросту не работал – он всегда возвращал false. При детальном рассмотрении проблема нашлась:

if (!Arrays.equals(fieldTwo, other.fieldTwo))
	return false;

Все ведь просто, Arrays.equals сравнивает типы массива и количество элементов в каждом из них. Затем проверяет эквивалентность поэлементно. Первые две проверки проходят, а вот третья проваливается с треском. Ведь никакие два объекта-массива в java не эквиваленты:

System.out.println(new int[]{1}.equals(new int[]{1})) // Выведет false.

Для проверки эквивалентности многомерных массивов нужно использовать метод deepEquals, который, кстати, находится в том же классе Arrays.

Ради интереса я попробовал сгенерировать код equals и hashCode в IntelliJ IDEA. Idea отказалась учитывать многомерный массив при создании кода equals. По крайней мере, это честнее, чем создавать нерабочий код.

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

Java in a Cloud

Рубрика: Development, Google, Groovy, Java | 26 December 2008, 15:49 | Vadim Voituk

Пока прогрессивное мировое ИТ-сообщество самозабвенно обсуждает особенности трендового термина cloud-computing, массово уговаривает Google сделать поддержку Java&Groovy в Google App Engine, гадает будет или не будет в GAE поддержка Perl-а, небольшая компания из Вашингтона представила миру свое понимание cloud-computing в Java-мире.

Речь идет о компании Stax Networks, 16 декабря уходящего года запустившей под лозунгом “Java applications in the cloud” свой аналог Google App Engine для Java-разработчиков, который предоставляет завершенную инфраструктуру для разработки, тестирования и развертывания масштабируемых Java WEB-приложений.

Технически решение Stax построено поверх Amazon EC2 и позволяет создавать приложения основанные Servlets/JSP, Struts, GWT, Wicket, JRuby, Jython, Flex, ColdFusion.
В качестве СУБД в данный момент поддерживается только MySQL.

Инфраструктура Stax построена так, чтоб разработчику на этапе написания кода не нужно было думать о том, что находится на уроверь ниже чем Stax.
Управление приложениями и базами данных производится через удобную web-консоль, а локальная разработка и отладка производится привычными методами (я использовал для этого Eclipse и консольную утилиту stax).

Чем ещё интересен данный стартап – так это то, что в данный момент они не взымают плату за использование, аргументируя это тем, что вырабатываю правильную бизнесс-модель.
В итоге попробовать Stax в действии, в отличии от аналогов, можно абсолютно бесплатно и даже не имея кредитной карты.

Что я собственно уже и сделал: написал небольшое приложение, которое выводит список контактов из БД и запустил его в cloud-е на 2х серверах.
Под заголовком “Running Java in Cloud” можно увидеть IP и имя сервера в cloud-e, который обслуживает текущий запрос. И если понажимать F5 – можно заметить, что серверов всего-то 2.

В принципе идея предоставления Platform-as-a-Service (PaaS) далеко не новая, но более или менее популярных решений для Java мне пока не встречалось.

Аналогичные разработки:

  • Google App Engine (GAE) – самый известный из подобных app-хостингов.
    Пока поддерживает только Python и хранение данных в нереляционной БД Google BigTable.
  • Microsoft Azure – аналогичный GAE сервис от Microsoft. Поддерживает .NET языки.
  • Salesforce.com – CRM-хостинг для приложений написанных на проприетарном языке Apex
  • Heroku – аналог Stax, построенный на Amazon EC2, но для RubyOnRails приложений
  • 10Gen – ещё одна платформа, поддерживающая Python, Ruby и ServerSide JavaScript, а также обьекную СУБД Mongo.

P.S. В комплекте со Stax SDK идет Groovy древней версии 1.5.6