Уставновка mysql-5.0.* в debian/testing при наличии установленного mysql-5.5

Что мы должны получить:
  1. mysql-5.5, который установлен из пакетов продолжает работать и никому не мешает
  2. mysql-5.0, работающий независимо от 5.5
Да, собирать будем из сорцов (деваться некуда). Всё ниженаписанное делается из под root пользователя.

Первым делом ставим нужные для сборки пакеты
aptitude update && aptitude install build-essential unzip
Качаем нужную версию 5.0, я ставил 5.0.51b.
cd /tmp
wget http://downloads.mysql.com/archives/mysql-5.0/mysql-5.0.51b.zip
unzip mysql-5.0.*
cd mysql-5.0.*
Начинаем конфиг и сборку… говорим конфигуратору, что установить всё нужно в /opt/mysql-5.0 (это позволит не засорять систему — для удаления/обновления mysql-5.0 трогаем только /opt/mysql-5.0)
./configure --prefix=/opt/mysql-5.0 --exec-prefix=/opt/mysql-5.0
make &&; make install
Всё, mysql установлен и готов к работе. Но, это ещё не всё. Нужно создать data-dir (для хранения бд), выделить файлы для pid, socket и лога. А ещё конфиг.
cd /opt/mysql-5.0
mkdir data etc run
bin/mysql_install_db --datadir=data --user=mysql # инициируем хранилище БД
chmod a+w run
Конфиг. Обязательно нужно указать где слушать и дать немного ресурсов, иначе наш mysql задохнётся. То, что ниже, пишем в /opt/mysql-5.0/etc/my.cnf
[mysqld]
bind-address = 0.0.0.0 # если не нужны подключения с любых хостов, то ставим 127.0.0.1
key_buffer              = 16M
max_allowed_packet      = 16M
thread_stack            = 192K
thread_cache_size       = 8
query_cache_limit       = 1M
query_cache_size        = 16M
 Ну вот, собственно, и всё, наш mysql-5.0 полностью готов. Осталось только запустить и сменить пароль от root.
Запускаем:
/opt/mysql-5.0/bin/mysqld_safe --defaults-file=/opt/mysql-5.0/etc/my.cnf --basedir=/opt/mysql-5.0 --datadir=/opt/mysql-5.0/data --user=mysql --pid-file=/opt/mysql-5.0/run/mysqld.pid --socket=/opt/mysql-5.0/run/mysql.sock --port=3307 --log-error=/opt/mysql-5.0/run/error.log &
Объясняю опции запуска, которые мы указали.
 --defaults-file — конфиг, который будет прочитан первым (а в нашем случае единственным)
--basedir — место, куда установлен mysql
--datadir — хранилище БД
--user — пользователь, с правами которого запущен демон mysql
--pid-file — файл, который хранит идентификатор запущенного процесса (нужен для остановки mysql и т.д.)
--socket — куда класть socket для подключений через него
--port — какой порт слушать для tcp подключений
--log-error — куда класть лог работы
Идём проверим что там в логе…
tail -f /opt/mysql-5.0/run/error.log
 Если всё в порядке, то видим что-то наподобие следующего
130321 22:20:53  mysqld started
nohup: ignoring input
130321 22:20:53  InnoDB: Started; log sequence number 0 1183112176
130321 22:20:53 [Note] /opt/mysql-5.0/libexec/mysqld: ready for connections.
Version: '5.0.51b'  socket: '/opt/mysql-5.0/run/mysql.sock'  port: 3307  Source distribution
Самое время пойти поменять пароль от root
bin/mysqladmin --socket=/opt/mysql-5.0/run/mysql.sock -u root password 'ваш новый пароль в одинарных кавычках'
 Вот и всё. Чуть не забыл — для остановки сервера mysql используем следующую команду:
kill `cat /opt/mysql-5.0/run/mysqld.pid`

sfDoctrineActAsSignablePlugin и оптимизация запросов к БД

При использовании этого плагина мы часто забираем записи из БД и показываем, кто же их создал или редактировал.
Если выводим только одну запись, то всё ОК.

Но если выводить список таких записей, то обнаружим, что на каждую запись появляется по запросу для получения Creator'a и Updator'a. Что же делать? А вот что:
Было — Doctrine_Core::getTable('Posts')->findAll()
Стало — Doctrine_Core::getTable('Posts')->createQuery('a, a.Creator, a.Updator')
И получаем нужные джоины автоматом.

Собственно, данная техника работает не только для actAs Signable. Это поможет уменьшить количество запросов при получении любых связанных записей.

Why I like Ubuntu?

Last time I installed it about a year ago (10.04 may be). It was like Ubuntu - quietly simple, kind and beautiful.

Now I'm installing 11.10 and writing this post while I wait.

Pretty good stuff.
Installer became user-friendly for 95%.

It prompts to download mp3 and so on packages.
It wants your wi-fi to get updates and localization pack.
It already copying files while you choose time zone and keyboard layout.
It wants to make your avatar from your notebook's camera.

Simply WOW.

FYI: how to launch Firefox while you see progress bar and 'installing...'.
1) click on sound icon
2) launch Banshee
3) go to Banshee - Browse home page
4) voila - profit!

So Firefox isn't all - you can listen music, play with webcam and chat with friends.

Time to finish writing - it's installed and wants to reboot.

Как не заниматься copy-paste в конфигурации Apache

Стандартная ситуация copy-paste

(используем debian unstable, apache2-mpm-itk) — добавить виртуалхост в Apache: логин под рута, переходим в sites-available, копируем существующий/создаём новый файл vhost-а, редактируем его, заменяя, по большей части, только document root, пользователя и пути для логов. В уме программиста появляется слово — переменные. Их всего 4-5, а ради их замены приходится копировать 1КБ одинаковой информации. Именно об этом я думал, когда начал гуглить «using vars in apache config».

Что предлагает нам индеец?

Задаём внешнюю переменную в /etc/apache/envvars, юзаем <IfDefined> в конфиге. Жутко неудобно, потому как шаблон виртуалхоста из этого слепить не получится.

Mod_macro.so спешит на помощь

Препрекраснейшая вещь, найти можно на http://www.cri.ensmp.fr/~coelho/mod_macro/.
Что предлагают:
  1. задаём макрос в каком-нибудь /etc/apache2/conf.d/macro-vhost
    1. ## Define a VHost Macro.
    2. <Macro VHost $host $port $dir>
    3. Listen $port
    4. <VirtualHost $host:$port>
    5. DocumentRoot $dir
    6. <Directory $dir>
    7. # do something here...
    8. </Directory>
    9. # limit access to intranet subdir.
    10. <Directory $dir/intranet>
    11. order deny,allow
    12. deny from all
    13. allow from 10.0.0.0/8
    14. </Directory>
    15. </VirtualHost>
    16. </Macro>
  2. генерируем виртуалхосты
    1. ## Use of VHost with different arguments.
    2. Use VHost www.apache.org 80 /projects/apache/web
    3. Use VHost www.perl.com 8080 /projects/perl/web
    4. Use VHost www.ensmp.fr 1234 /projects/mines/web



  3. профит?!


Сделайте мне УТФ8! — set utf-8 as default for mysql

По дефолту в debian-подобных системах (да и почти во всех пакетизированных) настройки пакета заданы жёстко и скомпилированы с default-настройками, которые оставлены для совместимости.

Именно из этих побуждений, mysql  Ver 14.14 Distrib 5.1.58, for debian-linux-gnu считает, что я должен использовать latin1-swedish, а не современный utf8.

Отучаем: в my.cnf (в случае debian — лучше /etc/mysql/conf.d/utf8ize.me) в самый конец файла пишем следующие магические строки:
  1. [client]
  2. default-character-set=utf8
  3.  
  4. [mysql]
  5. default-character-set=utf8
  6.  
  7.  
  8. [mysqld]
  9. default-character-set = utf8
  10. collation-server = utf8_unicode_ci
  11. init-connect='SET NAMES utf8'
  12. character-set-server = utf8

Идея для расширения браузера: умный кейлоггер

Представьте следующую ситуацию: некто получил доступ к вашему компьютеру на пару минут и установил расширение Google Chrome, которое не имеет виджетов и видимых окон, а висит в background worker'e, вешая собственное событие на $('form').submit().
В событии этом воркер собирает пары label + input, упаковывает и делает XHR-запрос на некий сервер, который складирует полученную информацию.

Подлить масла в огонь? Данный воркер можно добавить в любое расширение, вне зависимости от его функций и виджетов. Да и заподозрить его весьма трудно — часто ли вы смотрите список своих расширений?

P.S. Если не забуду — напишу подобное для Chrome.

Scrollbar как на новом дизайне Google

Google не так давно начал глобально перерисовывать и вылизывать свой интерфейс — пост не о том, красиво получилось или нет :)
Если вы пользуетесь Chrome/Chromium, то могли заметить, что гугл на некоторых своих страницах использует кастом-скроллбары:


Вот тот заветный код, который позволяет этого добиться:
  1. ::-webkit-scrollbar{width:15px;height:15px}
  2. ::-webkit-scrollbar-button:vertical{background-color:clear;height:5px}
  3. ::-webkit-scrollbar-button:start:decrement,
  4. ::-webkit-scrollbar-button:end:increment{display:block}
  5. ::-webkit-scrollbar-button:vertical:start:increment,
  6. ::-webkit-scrollbar-button:vertical:end:decrement{display:none}
  7. ::-webkit-scrollbar-track-piece{background-color:white}
  8. ::-webkit-scrollbar-thumb:vertical{height:50px;background-color:rgba(0,0,0,0.2);border-right:5px solid white;border-left:5px solid white}
  9. ::-webkit-scrollbar-thumb:vertical:hover{background-color:rgba(0,0,0,0.4)}
  10. ::-webkit-scrollbar-corner:vertical{background-color:white}
  11. ::-webkit-scrollbar-resizer:vertical{background-color:red}

Не нужны никакие картинки, никакие примочки. Лишь несколько строчек css.
Подробности о стайлинге скроллбара в Webkit-based браузерах.

База private и public доменов с freedns.afraid.org

Зачем-то напарсил.
База в MySQL, сохранены все исходные поля.

http://freedns.afraid.org — сервис бесплатного normal/dyn DNS.
Скачать базу доменов (registry).

phpmyadmin 3.4.4deb1 не работает (ошибка 500)

Сегодня на сервере debian/sid обновился phpmyadmin до 3.4.4.
И, каким-то странным образом перестал работать.

Оказалось, что всему виной php5-xcache.
Решение проблемы:
  1. mv /etc/php5/conf.d/xcache.ini /etc/php5/xcache.ini
  2. apache2ctl restart


Конечно же, придётся что-то придумать с акселератором php. Например, использовать apc или eaccelerator.

TP-Link TL-WR1043ND — отличный роутер

Недавно сгорел мой давний друг, D-Link DIR-320 и нужно было найти замену.
Среди всего ассортимента маркетинговых провокаций и ненужных бирюлек, я тщательно выбирал роутер, который не только имеет красивый и впечатляющий product description, но и хорошо выполнять возложенные на него функции.

DIR-320 довольно хорош, учитывая что он — «железный» клон ASUS WL-500g, который восхваляют направо и налево.

Так вот, даже 320-й не всегда справлялся с нагрузкой: то подвиснет, то просто тупит…
В сменившем его TP-Link'e-же, процессор в 2 раза мощнее — целых 400 Mhz! Новые стандарты Wi-Fi (802.11n, 300 Mb/s, 3×3dBi всенаправленные антенны), все 5 портов гигабитные, есть USB, в который можно вставить жёсткий диск и раздать на всю сеть, контролируя доступ (поддерживается samba-шара, ftp и медиа-сервер; можно создавать пользователей и назначать им права).

Железка сейчас топовая в TP-Link, на неё активно делают прошивки: с момента покупки, установил уже 2-ю.
Для «экспериментаторов» тоже есть где разгуляться: ROM 8 МБ, RAM 32 МБ; поддерживаются OpenWRT, DD-WRT и другие.

В общем, не нарадуюсь. А учитывая, что стоял выбор между ним и Netgear'ом, вдвойне доволен, что решил довериться китайцам.

Транслитерация для генерации имени получателя Western Union

В последнем проекте понадобилась оплата товаров через Western Union. Для отправки платежа необходимо сообщить ФИО в транслите, страну и город получателя.
Вот как получить необходимое ФИО, в соответствии с таблицей транслитерации Western Union:
  1. function transliterateForWesternUnion( $str ) {
  2. $str = mb_strtoupper( $str, 'utf-8' );
  3. return str_replace(
  4. array('А','Б','В','Г','Д','Е','Ё','Ж','З','И','Й','К','Л','М','Н','О','П','Р','С','Т','У','Ф','Х','Ц','Ч','Ш','Щ','Ы','Э','Ю','Я','Ь','Ъ'),
  5. array('A','B','V','G','D','E','YO','ZH','Z','I','Y','K','L','M','N','O','P','R','S','T','U','F','H','TS','CH','SH','SCH','Y','E','YU','YA','',''),
  6. $str
  7. );
  8. }

«Взлом» cForms CAPTCHA для WordPress

Некоторые капчи просто удивительны: принимают GET-параметры количества символов, используемых шрифтов и многого другого.

Сегодня наткнулся на следующее: WordPress-конпонент cForms, а конкретно CAPTCHA, предоставляемая им, в качестве аргумента URL принимает используемый при построении изображения алфавит.

Пример кривых рук, которые участвовали в разработке этой поделки. Пообновляйте страницу, это поднимает настроение.

Установка Virtualbox Guest additions в Ubuntu Server

Что за дополнения и для чего они нужны?

Virtualbox Guest additions изначально были сделаны для систем линейки Windows (согласно документации) и представляют из себя набор драйверов и утилит для управления гостевой ОС.

В Linux эти дополнения так же набор драйверов, но представляют собой модули для ядра. В связи с этим, модули необходимо пересобирать каждый раз, как будет обновлён пакет ядра Linux (linux-image-*), если в системе не установлен DKMS.

В большинстве *nix систем модули Virtualbox присутствуют, но зачастую очень старых версий. В официальной документации рекомендуется заменять их Дополнениями, актуальными для версии Virtualbox, установленной на хосте.

Устанавливаем

Итак, для того чтобы установить дополнения гостевой ОС, необходимо:
  • Обновить гостевую систему, так как модули ядра работают только с той версией ядра, на которой они собраны:
    sudo apt-get update && sudo apt-get upgrade

  • Установить build-essential, так как мы планируем собирать модуль ядра, а данный метапакет содержит необходимые нам make и gcc:
    sudo apt-get install build-essential

  • К счастью, в Ubuntu есть DKMS и нам не придётся собирать модули в ручную каждый раз, как обновили систему. Ставим его:
    sudo apt-get install dkms

  • В меню Virtualbox выбираем Устройства → Установить Дополнения гостевой ОС или нажимаем Host+D. Монтируем cdrom:
    sudo mount /dev/cdrom /media/cdrom

  • Переходим на смонтированный диск и запускаем установку:
    cd /media/cdrom && sudo sh ./VBoxLinuxAdditions.run
Дальше установщик сделает всё сам.
В случае, если вы проделываете это не в Ubuntu или в Ubuntu до 8.10, или в вашей системе попросту отсутствует DKMS, то необходимо будет после каждого обновления ядра системы пересобирать модули Virtualbox. Для этого необходимо выполнить команду sudo /etc/init.d/vboxadd setup.

Использование локального принтера в сеансе удалённого доступа — RDP printer redirection/mapping

Для того, чтобы использовать ваш локальный принтер необходимо проделать следующее:


  1. Разрешить подключение локальных принтеров в удалённом сеансе:


  2. После подключения необходимо установить драйвер принтера (такой же, как вы используете локально). На примере Samsung SCX-4216F:

    Скачать и установить

    Принтер скорее всего появится в списке. УДАЛЯЕМ ЕГО.

    Удостоверяемся, что необходимый драйвер остался задействован. Файл → Свойства сервера → Драйверы:

    Отключаемся от RDP и подключаемся снова — локальный принтер должен появиться при подключении

Use cases:


  • Терминальный сервер 1С: печать на принтер, который стоит рядом

  • Терминальный сервер «…»: печать на принтер, который стоит рядом


Восстановление писем из архива Kerio Mail/Connect — вытащить иголку из стога

В один прекрасный день, у одной прекрасной дамочки пропали письма в Outlook'е, да при этом аж за три месяца. Очень странным это может показаться, но .pst и не такое умеет.

В качестве сервера почты работает Kerio Connect 7.0.1 build 1249. Включены бэкапы, но работают они не так, как хотелось бы — делается копия текущего состояния ящика (а у пользователей, конечно же, стоит удаление писем с сервера).

К счастью, когда-то давно мной была выставлена спасительная галочка в настройках — «сохранять архив сообщений», благодаря которой Kerio любезно складывал всю почту (почта raw — там и спам, при желании можно заставить kerio и вирусы туда класть) за последние полгода в архив. Вздохнули с облегчением.

Структура архива Kerio Connect/Mail

А структуры нет. Ну, я конечно же преувеличиваю.. Но она ужасна.
Архив делится на папки по месяцам. И все, чёрт побери, все письма за этот месяц лежат в одной папке. В моём случае писем было ≈15 тысяч. Что может быть проще — разделить почту на папки на уровне почтового сервера, выделив почтовые адреса как сущности.

Разделить архив по получателям

Ну, это было первой идеей. Позже руки опустились, к сожалению. Поскольку писем много, а нам нужен только один получатель — пойдём «лоб в лоб»: возьмём плохой и ужасный php, чудесный и прекрасный Notepad++, такой розовый и блондинистый Denwer.. В общем, как обычно.

Спасительный говнокод.

  1. <?php
  2.    foreach( new DirectoryIterator( '.' ) as $file ) {
  3.       if ( $file->isDot() || $file->isDir() || $file->getFilename == __FILE__ ) {
  4.          continue;
  5.       }
  6.       
  7.       $name = $file->getFilename();
  8.       $file = file_get_contents( './' . $name );
  9.       if ( preg_match( '/(whatShouldWeFind@domain.(ru|com))/', $file ) ) {
  10.          rename( './' . $name, '../#saved/' . $name );
  11.          echo "moved " . $name . PHP_EOL;
  12.       }
  13.       
  14.       echo "skipped " . $name . PHP_EOL;
  15.    }
Ах да — мне было лень, создайте сами папку #saved рядом с #messages. Скрипт класть в папку #messages. Запускать как-то так: cd dirWithArchive/2011-Jan/#msgs && /usr/local/php5/php script.php. В 9-й строке меняется необходимый получатель.

Подведём итог

Скрипт ужасен. Скрипт работает. Разработчики Kerio в очередной раз доказали, что продукт хорош до тех пор, пока его используют стандартно — поставили, взломали через ukaip86.exe, настроили и забыли.
Спасибо за внимание.

reset.css — так ли всё хорошо?

Наткнулся на необычный и интересный баг — <b> и <strong> не делают текст полужирным, если использовать reset.css от Eric A. and Kathryn S. Meyer:

Решение: закомментировать 23-ю строку в reset.css (font: inherit;). Пользуйтесь.

Интересное поведение Google Chrome

Наткнулся на удивительное: мало того, что Chrome кастомизирует страницу с ошибкой, так ещё и докладывает, что я не один не могу открыть сайт. Приятно.

jQuery.mousewheel: обработка событий колеса мыши

В данной статье мы будем пользоваться jquery.mousewheel.

Для того, чтобы обработать событие скролла, необходимо повесить listener на определённый элемент:
  1. $('#wrapper')
  2.    .mousewheel(function (event, delta) {
  3.       //code
  4.    })
  5. ;
Пример — как обработать скролл — делаем горизонтальную прокрутку блока при вращении колёсика мыши:
  1. $('#photo-wrapper')
  2.    .data('scrollLeft', -1) //для предотвращения блокировки вертикального скролла
  3.    .mousewheel(function (event, delta) {
  4.       if ( (!this.scrollLeft && delta > 0) || (this.scrollLeft == $(this).data('scrollLeft') && delta < 0) ) {
  5.          return true; //данный блок необходим для того, чтобы перестать блокировать вертикальный скролл, если горизонтальный закончился
  6.       }
  7.       
  8.       $(this).data('scrollLeft', this.scrollLeft); //сохраняем текущий скролл слева
  9.       
  10.       this.scrollLeft -= (delta * 300); //на сколько прокрутить блок? (размер скролла)
  11.       return false; //отключить вертикальный
  12.    })
  13. ;

jQuery's .animate вешает chrome/webkit на ≈10 секунд (загрузка процессора 100%)

Есть в одном проекте следующий код:
  1. $(t)
  2.    .css({'border': '9px solid #D9D9D9'})
  3.    .animate({'border': '9px solid #C62417'}, 'fast')
  4.    .animate({'border': '9px solid #D9D9D9'}, 'fast')
  5.    .animate({'border': '9px solid #C62417'}, 'fast')
  6.    .animate({'border': '9px solid #D9D9D9'}, 'fast')
  7. ;
И вешает он браузер (Google Chrome 11.0.696.28 beta) при вызове события.
В чём же проблема? Как выяснилось, проблема в том, что создаются несколько одинаковых анимаций последовательно.

Решение — заменить одинаковые цвета на практически не отличающиеся, но немного другие:
  1. $(t)
  2.    .css({'border': '9px solid #D9D9D9'})
  3.    .animate({'border': '9px solid #C62417'}, 'fast')
  4.    .animate({'border': '9px solid #D9D9D8'}, 'fast')
  5.    .animate({'border': '9px solid #C62418'}, 'fast')
  6.    .animate({'border': '9px solid #D9D9D9'}, 'fast')
  7. ;
Таким образом анимации становятся разными и проходят с загрузкой процессора ≈1%.

SSHFS — Альтернатива использованию SFTP/SSH клиентов

Больинство из нас работает с файлами сайта удалённо, через ftp или sftp/ssh. FTP жутко тормозной, в связи с чем я уже давно перешёл полностью на ssh (чего и вам советую).

Каким образом легко получить доступ к файлам, не используя sftp/ssh-клиент?

Есть такая чудо-штука, называемая fuse. На её основе можно делать файловые системы, которые находятся удалённо (например, smbfs). Так вот, существует sshfs, который позволяет примонтировать удалённый хост на локальный компьютер и работать с файлами так, будто они на вашем жёстком диске!

Debian-way howto:
  1. sudo apt-get install sshfs
  2. sudo mkdir /media/host-name
  3. sudo chown your-username /media/host-name
  4. sudo adduser your-username fuse
  5. sudo adduser your-username nogroup
  6. sudo gnome-session-save --logout
  7.  
  8. #after logout-login you can mount a host like this
  9. sshfs -o workaround=rename host-name.com:/working-dir/ /media/host-name
  10.  
  11. #and unmount a host like this
  12. fusermount -u /media/host-name

Как ещё упростить жизнь? :)

Я пользуюсь Убунтой, а в ней по умолчанию gedit. В настройках можно включить auto save, save backups, line numbers, auto indentation, right margin и плагин side pane, а также подсветку синтаксиса. Side pane позволяет по нажатию F9 открывать "проводник", в котором легко перейти в монтированную директорию и заняться работой.