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. По крайней мере, это честнее, чем создавать нерабочий код.

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