среда
Апгрейд MySQL и переписывание запросов

Технически апгрейд базы MySQL несложен, но могут возникнуть не очевидные подводные камни. Например, если MySQL был 4-й версии, а после upgrade версия стала выше 5.0.11, то могут возникнуть проблемы с работой запросов, использующих LEFT JOIN.
Начиная с версии MySQL 5.0.12 запросы с JOIN обрабатываются по стандарту SQL:2003, поэтому такие запросы к базе придется переписать. Вот пример:
CREATE TABLE IF NOT EXISTS `t1` (
`id` int(10) unsigned NOT NULL auto_increment,
`type` enum('a','b') default NULL,
PRIMARY KEY (`id`),
KEY `type` (`type`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
INSERT INTO `t1` VALUES (1, 'a'), (2, 'a'), (3, 'b'), (4, 'a'), (5, 'b');
CREATE TABLE IF NOT EXISTS `t2` (
`t1_id` int(10) unsigned default NULL,
KEY `t1_id` (`t1_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
INSERT INTO `t2` VALUES (1), (1), (1), (2), (2);
CREATE TABLE IF NOT EXISTS `t3` (
`t1_id` int(10) unsigned default NULL,
KEY `t1_id` (`t1_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
INSERT INTO `t3` VALUES (1), (1), (2), (2), (3);
#Test 1
select t1.id
from t1, t2
left join t3 on t1.id = t3.t1_id and t1.type = 'a'
where t1.id = t2.t1_id
group by t1.id
#1054 - Unknown column 't1.id' in 'on clause'
#Test 2, swap the order of the conditions in "on"
select t1.id
from t1, t2
left join t3 on t1.type = 'a' and t1.id = t3.t1_id
where t1.id = t2.t1_id
group by t1.id
#1054 - Unknown column 't1.type' in 'on clause'
В MySQL 4.x запрос работает без ошибок, начиная с версии 5.0.12 запрос ругается на синтаксис. Если в эти запросы добавить скобок, все заработает:
select t1.id from (t1, t2) left join (t3) on (t1.id = t3.t1_id and t1.type = 'a') where t1.id = t2.t1_id group by t1.id select t1.id from (t1, t2) left join (t3) on (t1.type = 'a' and t1.id = t3.t1_id) where t1.id = t2.t1_id group by t1.id
Ярлыки: MySQL, Полезное, Программирование
воскресенье
Выбираем видеокарту

Так получилось, что моя видеокарта ATI Radeon X1650 сдохла, проработав почти 3 года. К ней особых претензий не было, и я таки решил выбрать себе видюху того же производителя на замену убитой. Одним из основных требований к карте у меня была возможность просмотра HDTV в формате h.264, ну и невысокая цена. Мой выбор пал на карточку ATI Radeon HD 5570, стоит она примерно $85 и втыкается в тот же слот PCI Express, что использовался ныне покойной видюхой.
Карта тупо втыкается в маму, ставятся драйвера от производителя ATI — и вуаля, все работает. Xorg 7.4 достаточно умный, чтобы определить новое железо и нормально его использовать без изменения каких-либо конфигурационных файлов.
Решил я погонять игрушки протестировать производительность новой видеокарты в условиях максимальных нагрузок. Перепробовал много 3D вещей, доступных под линуксом - Quake3, TileRacer, Supertuxcart, Etracer и т.п. - все работает без нареканий.
Эти карты очень свежие, на рынке появились в феврале 2010 года. Убежден, что подлянки с прекращением выпуска драйверов для новых версий Xorg для этой карты ожидать в ближайшее время не стоит.
суббота
gedit: необходимый инструмент разработки

Любому программисту нужен удобный текстовый редактор, желательно настраиваемый под себя и с кучей функций. Раньше я пользовался в основном Kate, когда сидел под KDE; но сейчас времена изменились, и я открыл для себя gedit в GNOME.
Этот бесплатный редактор мне пришелся по вкусу. Выглядит он очень просто, но стоит подключить к нему пару-тройку плагинов, и удобство работы в нем многократно возрастает. Плагины к нему написаны практически на все случаи жизни, скачать их можно здесь.
Однако, я привык к другим горячим клавишам в других редакторах. В gedit отсутствует возможность их переназначить, но как оказалось, их можно поменять средствами GNOME. Например, плагин Отступ строк (Text Ident) по умолчанию работает на комбинациях клавиш Ctrl+T и Ctrl+Shift+T; но если для смены раскладки клавиатуры используется Ctrl+Shift, то вторая комбинация клавиш просто не будет работать. Поменять их можно, если залезть в настройки гнома (Центр управления -> Внешний вид, закладка Интерфейс, поставить галку Редактируемые ускорители меню или "Interface" -> "Editable menu shortcut keys" для англоязычной версии).

После включения этой опции можно навести курсор мыши на интересующий пункт меню и нажать желаемые комбинации клавиш - все поменяется.
Еще одна неочевидная вещь, некоторые параметры gedit можно поменять только редактированием параметров gnome. Например, по умолчанию gedit в меню Файл будет показывать последние 4 открытых файла, что маловато. Если же запустить gconf-editor и отредактировать параметр gedit2->ui->recents, то можно задать их столько, сколько надо:

ИМХО это один из самых удобных редакторов для разработчика
Ярлыки: Linux, Полезное, Программирование
вторник
Переезд серверов в другой датацентр

Так получилось, что наши сервера должны были переехать в другой датацентр в течение суток. Занятие получилось очень геморройное, поскольку меняется вся конфигурация сети — IP-адреса, шлюзы по умолчанию, даже маска сети. Так вот появилась задача, настроить сеть так, чтобы в старом ДЦ могли выключить сервера, привезти в новый ДЦ, там тупо включить - «и чтоб все заработало». У всех серверов статические айпишники, так что вариант с получением адресов с сервера DHCP здесь не пройдет.
Задача решается, если известна новая конфигурация сети. Есть старый добрый способ сделать несколько IP адресов на сетевой карте, с помощью алиасов. В CentOS можно прописать свой default gateway для каждого алиаса.
Пример старой конфигурации:
$ cat /etc/sysconfig/networking/devices/ifcfg-eth0 # Intel Corporation 82541GI Gigabit Ethernet Controller DEVICE=eth0 ONBOOT=yes BOOTPROTO=none HWADDR=00:11:22:22:44:55 NETMASK=255.255.255.0 IPADDR=1.2.3.4 TYPE=Ethernet USERCTL=no IPV6INIT=no PEERDNS=yes GATEWAY=1.2.3.254 DNS1=4.2.2.2 DNS2=8.8.8.8Создаем новый алиас для этой же сетевой карты с параметрами сети нового ДЦ:
$ cat /etc/sysconfig/networking/devices/ifcfg-eth0:1 # Intel Corporation 82541GI Gigabit Ethernet Controller DEVICE=eth0:1 BOOTPROTO=none BROADCAST=5.6.7.255 IPADDR=5.6.7.8 NETMASK=255.255.255.0 NETWORK=5.6.7.0 TYPE=Ethernet PEERDNS=yes GATEWAY=5.6.7.254 DNS1=4.2.2.2 DNS2=8.8.8.8Вуаля. Сервер можно выключать и перевозить.
CentOS и свежий MySQL

Начиная с версии 5.1 в MySQL поддерживается партиционирование таблиц, а это как раз то, что мне надо. Решил я проапгрейдить свой сервер, но оказалось, что в стандартных репозиториях CentOS mysql довольно старый.
Проблема решается подключением репозитория remi.
Для 32-битной версии:
wget http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-3.noarch.rpm
wget http://rpms.famillecollet.com/enterprise/remi-release-5.rpm
rpm -Uvh remi-release-5*.rpm epel-release-5*.rpm
Для 64-битной версии:
wget http://download.fedora.redhat.com/pub/epel/5/x86_64/epel-release-5-3.noarch.rpm
wget http://rpms.famillecollet.com/enterprise/remi-release-5.rpm
rpm -Uvh remi-release-5*.rpm epel-release-5*.rpm
Далее следует отредактировать /etc/yum.repos.d/remi.repo, установить enabled = 1, и запустить:
yum upgrade mysql-server
Ярлыки: Linux, MySQL, Полезное