Уставновка 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 браузерах.