Author Archive

Конвертация htaccess от apache в правила для nginx

Может кому пригодится сайтик который конвертирует правила из htaccess в nginx
http://www.anilcetin.com/convert-apache-htaccess-to-nginx/

Подборка SQL запросов

Допустим у вас есть номер телефона рекламного отдела и PR-манагеры пустили какую-то рекламу в сентябре.
Задача: найти всех клиентов которые позвонили в сентябре первый раз в жизни, но при этом им, что-то не понравилось и они не звонили после сентября.
Инфа нужна, чтоб промыть им мозги… 🙂
Вот, что у меня получилось сходу:

SELECT c.*,d.*
FROM
(SELECT a.callerid AS callerid1,a.count AS count1 FROM
(SELECT callerid,dst,COUNT(*) FROM calls WHERE dt BETWEEN '2010-09-01 00:00:00' AND '2010-10-01 00:00:00' AND dst='5555555' GROUP BY callerid,dst) AS a 
 
LEFT OUTER JOIN
(SELECT callerid,dst,operator FROM calls WHERE dt BETWEEN '2009-02-01 00:00:00' AND '2010-09-01 00:00:00' AND dst='5555555') AS b
 
ON a.callerid=b.callerid
WHERE b.dst IS NULL) AS c
 
LEFT OUTER JOIN
(SELECT callerid AS callerid2,dst,COUNT(*) AS count2 FROM calls WHERE dt BETWEEN '2010-10-01 00:00:00' AND '2010-11-01 00:00:00' AND dst='5555555' GROUP BY callerid,dst) AS d
 
ON c.callerid1=d.callerid2
WHERE d.dst IS NULL

Запрос не сильно легкий, требует оптимизации, но результат дает 🙂

Не пускает анонима на сервер Proftpd

Поставил Proftpd, сконфигурил…. а он взял и начал ругаться на недоступность папки для анонимного пользователя

Ноя 08 18:55:03 localhost proftpd[29469] 127.0.0.1: ProFTPD 1.3.3c (maint) (built Пнд Ноя 8 2010 18:47:55 EET) standalone mode STARTUP
Ноя 08 18:55:12 localhost proftpd[29481] 127.0.0.1 (10.0.1.100[10.0.1.100]): FTP session opened.
Ноя 08 18:55:12 localhost proftpd[29481] 127.0.0.1 (10.0.1.100[10.0.1.100]): ftp: Directory ~/ is not accessible.
Ноя 08 18:55:14 localhost proftpd[29481] 127.0.0.1 (10.0.1.100[10.0.1.100]): FTP session closed.

На форуме Генты узрел, что если в системе включен acl для раздела, то не будет пускать… либо отрубить acl:

Опубликовано IsakovAN в 28 Декабрь, 2006 – 22:16.
Эх, взял напильник(strace) и начал е***ись…
Короче, весь баг был в чем? В файловой системе, в которой находился /home/ftp был выключен acl! И он из-за этого отказывался пускать ананимуса. Что за глупость?!

man mount:
Цитата:

acl / noacl
Support POSIX Access Control Lists (or not).

Т.е. в fstabе надо опцию acl вписать.

Либо просто пересобрать фтп-сервер без поддержки acl

USE="-acl" emerge -av proftpd

Работа с Postgresql: настройка, масштабирование

Книга Работа с Postgresql: настройка, масштабирование является справочным пособием по настройке и масштабированию Postgresql. В книге иследуются вопросы по настройки производительности Postgresql, репликации и кластеризации. Изобилие реальных примеров позволит как начинающим, так и опытным разработчикам быстро разобратся с особенностями масштабирования Postgresql для своих приложений.
http://postgresql.leopard.in.ua/

ссылка на книгу если с сайта не грузится

postgresql

Правила Rewrite для поддержки ЧПУ на серверах под управлением Nginx для DLE

После перехода на с Apache на связку Nginx+spawn-cgi у меня некоректно запустились сайті на DLE.
Причем проблемы была именно в ссылках ЧПУ. Обычные ссылки newsid=xxx прекласно работали.
Решение проблемы
В конфиге Nginx вместо :

#                            if (!-e $request_filename) {
#                            rewrite ^(.+)$ /index.php?q=$1 last;

Вставляем такой код:

rewrite ^/page/(.*)$ /index.php?cstart=$1 last;
 
rewrite ^/([0-9]+)/([0-9]+)/([0-9]+)/page,([0-9]+),([0-9]+),(.*).html(/?)+$ /index.php?subaction=showfull&year=$1&month=$2&day=$3&news_page=$4&cstart=$5&news_name=$6 last;
rewrite ^/([0-9]+)/([0-9]+)/([0-9]+)/page,([0-9]+),(.*).html(/?)+$ /index.php?subaction=showfull&year=$1&month=$2&day=$3&news_page=$4&news_name=$5 last;
rewrite ^/([0-9]+)/([0-9]+)/([0-9]+)/print:page,([0-9]+),(.*).html(/?)+$ /engine/print.php?subaction=showfull&year=$1&month=$2&day=$3&news_page=$4&news_name=$5 last;
rewrite ^/([0-9]+)/([0-9]+)/([0-9]+)/(.*).html(/?)+$ /index.php?subaction=showfull&year=$1&month=$2&day=$3&news_name=$4 last;
 
rewrite ^/([^.]+)/page,([0-9]+),([0-9]+),([0-9]+)-(.*).html(/?)+$ /index.php?newsid=$4&news_page=$2&cstart=$3 last;
rewrite ^/([^.]+)/page,([0-9]+),([0-9]+)-(.*).html(/?)+$ /index.php?newsid=$3&news_page=$2 last;
rewrite ^/([^.]+)/print:page,([0-9]+),([0-9]+)-(.*).html(/?)+$ /engine/print.php?news_page=$2&newsid=$3 last;
rewrite ^/([^.]+)/([0-9]+)-(.*).html(/?)+$ /index.php?newsid=$2 last;
 
rewrite ^/page,([0-9]+),([0-9]+),([0-9]+)-(.*).html(/?)+$ /index.php?newsid=$3&news_page=$1&cstart=$2 last;
rewrite ^/page,([0-9]+),([0-9]+)-(.*).html(/?)+$ /index.php?newsid=$2&news_page=$1 last;
rewrite ^/print:page,([0-9]+),([0-9]+)-(.*).html(/?)+$ /engine/print.php?news_page=$1&newsid=$2 last;
rewrite ^/([0-9]+)-(.*).html(/?)+$ /index.php?newsid=$1 last;
 
rewrite ^/([0-9]+)/([0-9]+)/([0-9]+)(/?)+$ /index.php?year=$1&month=$2&day=$3 last;
rewrite ^/([0-9]+)/([0-9]+)/([0-9]+)/page/([0-9]+)(/?)+$ /index.php?year=$1&month=$2&day=$3&cstart=$4 last;
rewrite ^/([0-9]+)/([0-9]+)(/?)+$ /index.php?year=$1&month=$2 last;
rewrite ^/([0-9]+)/([0-9]+)/page/([0-9]+)(/?)+$ /index.php?year=$1&month=$2&cstart=$3 last;
rewrite ^/([0-9]+)(/?)+$ /index.php?year=$1 last;
rewrite ^/([0-9]+)/page/([0-9]+)(/?)+$ /index.php?year=$1&cstart=$2 last;
rewrite ^/tags/([^/]*)(/?)+$ /index.php?do=tags&tag=$1 last;
rewrite ^/tags/([^/]*)/page/([0-9]+)(/?)+$ /index.php?do=tags&tag=$1&cstart=$2 last;
rewrite ^/user/([^/]*)/rss.xml$ /engine/rss.php?subaction=allnews&user=$1 last;
rewrite ^/user/([^/]*)(/?)+$ /index.php?subaction=userinfo&user=$1 last;
rewrite ^/user/([^/]*)/page/([0-9]+)(/?)+$ /index.php?subaction=userinfo&user=$1&cstart=$2 last;
rewrite ^/user/([^/]*)/news(/?)+$ /index.php?subaction=allnews&user=$1 last;
rewrite ^/user/([^/]*)/news/page/([0-9]+)(/?)+$ /index.php?subaction=allnews&user=$1&cstart=$2 last;
rewrite ^/user/([^/]*)/news/rss.xml(/?)+$ /engine/rss.php?subaction=allnews&user=$1 last;
rewrite ^/lastnews/(/?)+$ /index.php?do=lastnews last;
rewrite ^/lastnews/page/([0-9]+)(/?)+$ /index.php?do=lastnews&cstart=$1 last;
rewrite ^/catalog/([^/]*)(/?)+$ /index.php?catalog=$1 last;
rewrite ^/catalog/([^/]*)/page/([0-9]+)(/?)+$ /index.php?catalog=$1&cstart=$2 last;
rewrite ^/newposts(/?)+$ /index.php?subaction=newposts last;
rewrite ^/newposts/page/([0-9]+)(/?)+$ /index.php?subaction=newposts&cstart=$1 last;
rewrite ^/static/(.*).html(/?)+$ /index.php?do=static&page=$1 last;
rewrite ^/favorites(/?)+$ /index.php?do=favorites last;
rewrite ^/favorites/page/([0-9]+)(/?)+$ /index.php?do=favorites&cstart=$1 last;
 
rewrite ^/rules.html$ /index.php?do=rules last;
rewrite ^/statistics.html$ /index.php?do=stats last;
rewrite ^/addnews.html$ /index.php?do=addnews last;
rewrite ^/rss.xml$ /engine/rss.php last;
rewrite ^/sitemap.xml$ /uploads/sitemap.xml last;
 
rewrite ^/category/([^.]+)/(.*).html(/?)+$ /index.php?subaction=showfull&news_name=$2 last;
rewrite ^/category/([^.]+)/page/([0-9]+)(/?)+$ /index.php?do=cat&category=$1&cstart=$2 last;
rewrite ^/category/([^.]+)(/?)+$ /index.php?do=cat&category=$1 last;
 
if (!-d $request_filename) {
        rewrite ^/([^.]+)/page/([0-9]+)(/?)+$ /index.php?do=cat&category=$1&cstart=$2 last;
        rewrite ^/([^.]+)/?$ /index.php?do=cat&category=$1 last;
}
 
if (!-f $request_filename) {
        rewrite ^/([^<]+)/rss.xml$ /engine/rss.php?do=cat&category=$1 last;
        rewrite ^/page,([0-9]+),([^/]+).html$ /index.php?do=static&page=$2&news_page=$1 last;
        rewrite ^/print:([^/]+).html$ /engine/print.php?do=static&page=$1 last;
}
 
if (!-f $request_filename) {
        rewrite ^/([^/]+).html$ /index.php?do=static&page=$1 last;
}

Проблема с нумерацией сетевых интерфейсов в Gentoo

В случае если менять сетевые интерфейсы на системе с генту ( как вариант замена сгоревшей), то следующая новая сетевая карта получит индекс на единицу больший.
Но иногда это не оправдано, когда в системе 3 сетевые карты, а вы заменили 2 из них… в итоге получаем : eth1,eth3,eth4 … не очень удобно и не практично.
Чтоб немного разрулить эту ситуацию можно пойти двумя путями:
1. очистить содержимое файла /etc/udev/rules.d/70-persistent-net.rules с которого udev берет информацию.
После перезагрузки вы получите нумерацию eth0, eth1,eth2
2. Отредактировать вручную этот файл на свое усмотрение:

cat /etc/udev/rules.d/70-persistent-net.rules 
# This file was automatically generated by the /lib64/udev/write_net_rules
# program, run by the persistent-net-generator.rules rules file.
#
# You can modify it, as long as you keep each rule on a single
# line, and change only the value of the NAME= key.
 
# PCI device 0x14e4:0x1648 (tg3)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:e0:81:34:2a:0b", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth3"
 
# PCI device 0x14e4:0x1648 (tg3)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:e0:81:34:2a:0a", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth2"
 
# PCI device 0x8086:0x100e (e1000)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:07:e9:0b:28:e0", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1"
 
# PCI device 0x8086:0x100e (e1000)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:07:e9:0b:28:d5", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"
 
# PCI device 0x8086:0x1229 (e100)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:e0:81:34:2a:55", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth4"

Миграция Postgres с 8.4 на 9.0

Решились потренироваться делать репликацию Master-Slave, которая реализована в версии 9.0
Значит так-с…
1. Обновляем Portage

emerge --sync

2. Ставим новую БД

LINGUAS="ru" ACCEPT_KEYWORDS="~amd64" emerge -av  /usr/portage/dev-db/postgresql-server/postgresql-server-9.0.1.ebuild

3. Конфигурим

emerge --config =dev-db/postgresql-server-9.0.1

4. правим конфиг и запускаем на порту 6543, не выключая старый постгресс
5. производим миграцию БД

pg_dumpall -p 5432 | psql -d postgres -p 6543

6. стартуем новую БД на порту 5432 предварительно выключив старую

После чего устанавливаем Postgres на втором хосте, который будет использоваться как Slave

LINGUAS="ru" ACCEPT_KEYWORDS="~amd64" emerge -av  /usr/portage/dev-db/postgresql-server/postgresql-server-9.0.1.ebuild

Вносим изменения в Master, чтобы слэйв мог к нему подключится:

$ $EDITOR postgresql.conf
listen_addresses = '10.0.xx.yy'
 
$ $EDITOR pg_hba.conf
# The standby server must have superuser access privileges.
host  replication  postgres  10.0.xx.zz/22  trust

Read more

Устанавливаем плагин Java в Gentoo

Для запуску Java коду на системі Gentoo ви повинні мати JRE (Java Runtime Environment) встановлений.
Перш ніж йти далі, слід зазначити, що це буде працювати тільки з 32-розрядної версії Firefox. Це тому, що бінарний пакет JRE тільки у 32-бітному виконанні отже, несумісний з 64-розрядною версією Firefox. Якщо ви працюєте в 64-бітнії системі переконайтесь, що ви встановили www-client/mozilla-firefox-bin пакет, щоб отримати 32-розрядний оглядач.

Є безліч JRE пакетів у портежей, але рекомендований пакет є dev-java/sun-jre-bin.Не слід плутати з JRE JDK (Java Development Kit), який буде додавати непотрібні Java інструменти для програмування .

Щоб отримати плагін для браузера, ви повинні включити USE прапор nsplugin для JRE. Ви можете додати прапори USE до глобальних, поставивши їх прямо в make.conf.

Якщо ви не хочете кожен раз встановлювати прапор, ви можете поставити прапор тільки на цей пакет в /etc/portage/package.use.

dev-java/sun-jre-bin nsplugin

Потім встановлюємо JRE

emerge -av dev-java/sun-jre-bin

Ключі ‘-V’ і ‘a’ дозволять Вам переглянути USE прапори, які включені, і підтвердити, що вони правильні, перш ніж дозволити продовжити роботу.

Якщо ви працюєте в системі amd64 то вам потрібно встановити app-emulation/emul-linux-x86-java пакет. Цей пакет містить основні 32-розрядні бібліотеки для запуску 32-розрядних двійкових файлів JRE в 64-розрядних систем.

Вам необхідно встановити прапор USE nsplugin
/etc/portage/package.use.

app-emulation/emul-linux-x86-java
emerge -av app-emulation/emul-linux-x86-java

Тепер у вас є все, щоб налаштувати систему на використання JRE з утилітою eselect.

Використовуйте це для x86 системи.

eselect java-nsplugin set sun-jre-bin-1.6

Використовуйте це для amd64 системи.

eselect java-nsplugin set 32bit emul-linux-x86-java-1.6

Після того, як всі ці кроки були завершені ви можете переконатися, що все правильно, запустивши:

eselect java-nsplugin list

Доступні плагіни 32-розрядної Java

  [1]   emul-linux-x86-java-1.6  current

Доступні плагіни 64-бітної Java браузера

Available 32-bit Java browser plugins
  [1]   emul-linux-x86-java-1.6  current
Available 64-bit Java browser plugins

Переконайтеся, що Firefox знайшов плагін, відкривши about:plugins Тепер ви повинні побачити плагін Java в списку.

Осваиваем Git

Никогда не пользовался системами контроля версий, так как мало что творю на языках программирования, а скрипты можно просто хранить в папочке.
Ну и вот решил попробовать хранить скрипты (и не только) в каком-то хранилище, но при этом упустить освоение SVN И CVS, а сразу приступить к Git’у , так как мы не исчем легких путей 🙂

Для начала создаем собственный репозиторий с проэктом, который будет находится не на локальной машине, а где-то в сети.
Пишу по мотивам статьи How to set up your own private Git server on Linux
Сервер и клиенты (в основном) работают под управлением Gentoo.
Итак приступим.
Для начала добавим свой публичный ключ на сервер

cd ~/.ssh
ssh-keygen -t rsa
scp ~/.ssh/id_rsa.pub 'user'@'server':.ssh/authorized_keys

Теперь мы можем зайти по SSH на наш сервер и установить Git:

ssh <server>
ACCEPT_KEYWORDS="~amd64" USE="bash-completion cvs subversion" emerge -av git
</server>

Теперь добавим пользователя

useradd -d /home/git -m -s /bin/bash git

Теперь вам нужно добавить свой публичный ключ для пользователя Git

mkdir /home/git/.ssh
cp ~/.ssh/authorized_keys /home/git/.ssh/
chown -R git:git /home/git/.ssh
chmod 700 !$
chmod 600 /home/git/.ssh/*

Read more

Отладка Asterisk

просматривать красивый дамп по SIP протоколу:

tcpdump -pvvvvvv -i <inface> -s0  udp port 5060

Iskratel vs Asterisk

Состыковка Астериска с ИскраТел проходит довольно занятно.
Провайдер телефонной связи может отдавать телефонные звонки по SIP, но сервер сигнализации и голосовые сервера находятся в разных местах.
По умолчанию Астер считает, что источник RTP находится на одном хосте с Сервером сигнализации, чтоб сказать ему о поиске голоса на тех хостах которые приходят в INVITE, а также в SDP, в настройках sip.conf необходимо добавить такие строки

canreinvite=yes
dtmfmode=info

When SIP initiates the call, the INVITE message contains the information on where to send the media streams. Asterisk uses itself as the end-points of media streams when setting up the call. Once the call has been accepted, Asterisk sends another (re)INVITE message to the clients with the information necessary to have the two clients send the media streams directly to each other.

А также опцией permit разрешить посылать голос на хосты отличные от сигнального.
В итоге лог должен содержать что-то типа такого:
Read more