Почитал злоключения tema'ы Лебедева. Поразмышлял о том, как устроено питание в нашем районе, и решил все обстоятельно описать. Итак, мы находимся в забытом богом уголке суши, известном также как Марьино. Несмотря на то, что людей здесь вроде как нет, и быть не может, обилие ресторанчиков, кафешек, саун и клубов различной направленности не может не удивлять. Чувствуешь себя рублевским бомжом. В данном случае - марьинским. Здесь идет вполне реальная борьба за клиента. Притом не совсем понятен смысл, так как по-моему мнению бизнес-ланч не может быть рентабельным. Но наверно я не знаю всей кухни (и слава роботам, что не знаю). Итак, представляем участников нашего забега (названия намеренно изменены до неузнаваемости):
"101 жаркая марьинская ночь" - в это заведение я бы никогда не заглянул, но мои более небрезгливые коллеги все же пару раз туда сходили, когда хозяева вывесили гордый транспарант про бизнес-ланч. На деле инфраструктуры бизнес-ланча нет, посетителей тоже нет, поэтому пищи готовой тоже нет. По ощущениям, скармливают то, чем кормят обслугу. Особых претензий к еде нет, просто она начиная от первого до второго с салатом идентична по вкусу и содержанию. Ходить мы туда перестали после того, как очередная трапеза сопровождалась допросом с понятыми некоего посетителя данного заведения, который не удержался, и пырнул кого то ножичком. Итоговая оценка - 3.
"Аля барокка" - почти что самое близкое к нам заведение. Пользуемся им как резервом, если не работают по каким-либо причинам другие места. Нельзя сказать, что этим все сказано, так как это было бы не совсем справедливо. Не так давно (по меркам медленной и нерасторопной марьинской жизни) в заведении сменился хозяин, и мы даже первое время ходили и радовались переменам. Но главный недостаток - цена, на 10% выше, чем в других местах. В бизнес-ланче каждая копейка на счету, и потраченное время. Т.е. это должна быть быстрая, в меру вкусная, и недорогая еда. 10% и на 5 минут дольше обслуживание - и мы идем уже чуть дальше. Итоговая оценка - 4.
"Созвездие" - пару лет назад мы впервые посетили это заведение. Налаженный технический процесс, умеренная ценовая политика. Попытки измениться в лучшую сторону. Все это создает ощущение спокойствия. Цены за это время выросли в 2 раза, но все равно - лучшее соотношение цена/качество среди участвующих и неучаствующих (а их у нас действительно много). Официанты всегда вежливые, персонал дружелюбный. За все время только один случай отравления (что-то не так было с окрошкой). Это действительно долгий положительный опыт. Итог - 5.
Что интересно, и характерно - здесь каждый день (ну с учетом протяженности марьинских дней) что-то меняется, клиентов немного и за них идет борьба. Как бы это ни странно звучало. Сравнивая с другим местом наших пищевых прогулок, Владыкино, которое расположено в гостиничном комплексе (т.е. вроде как само расположение обязывает кормить всех вкусно), марьинское изобилие и качество услуг просто поражают.
К сожалению, сейчас политика сводится к тому, что марьинский офис прикроют, а значит - прикроется и питание в марьинском общепите. Что очень печально. И придется жрать в какой нибудь аля-лебедевской тошниловке и задорого.
вторник, 22 июня 2010 г.
понедельник, 21 июня 2010 г.
ЮАР: А судьи кто?
Чемпионат поражает уровнем судейства, такого даже в местных чемпионатах не увидишь, а тут - в каждом матче примеры полнейшей некомпетентности.
Итальянцам пора паковать чемоданы. С такой игрой можно забыть о финале.
Французы ищут внутреннего врага. Неспортивному поведению не может быть оправдания. Так же, как и неубедительной игре.
Судя по всему, после группового этапа может подобраться на редкость скучный состав участников. Для меня это очень печально, так как мой личный интерес к футболу получит серьезный удар.
Одно радует, великая сила футбола берет свое, все обезьянки отфильтровались. Может быть хоть вувузел будет поменьше. Потому что смотреть на кривляния мартышек, из-за которых страдают замечательные игроки уже порядком надоело.
Итальянцам пора паковать чемоданы. С такой игрой можно забыть о финале.
Французы ищут внутреннего врага. Неспортивному поведению не может быть оправдания. Так же, как и неубедительной игре.
Судя по всему, после группового этапа может подобраться на редкость скучный состав участников. Для меня это очень печально, так как мой личный интерес к футболу получит серьезный удар.
Одно радует, великая сила футбола берет свое, все обезьянки отфильтровались. Может быть хоть вувузел будет поменьше. Потому что смотреть на кривляния мартышек, из-за которых страдают замечательные игроки уже порядком надоело.
суббота, 19 июня 2010 г.
Публикация репозиториев mercurial через связку nginx + uwsgi
В процесс развития инфраструктуры домашнего сервера решил перейти со связки
apache + subversion на более интересный вариант с nginx + mercurial. Покопался в сети и не нашел интересного мне варианта на uwsgi, поэтому разбирался сам. Результат естественно публикую для пользы коммунити.
Надо обеспечить web-доступ к репозиторию mercurial. Требуется иметь две схемы доступа, приватную и публичную. Приватная требует авторизации пользователя на чтение и запись, публичная - только на запись. Работать должно через nginx и uwsgi.
Я не рассматриваю установку nginx, uwsgi и mercurial. Предполагается, что они установлены и собраны в нужной конфигурации (т.е. nginx собран с модулем для uwsgi). Будем рассматривать только процесс настройки. Хост система у меня gentoo, кое что относится только к этому дистрибутиву, большая же часть полезна всем.
По пунктам:
1. Создание выделенного пользователя для mercurial и репозиториев под ним, запуск через uwsgi;
2. Подключение uwsgi в nginx;
3. Настройка доступа;
4. Создание сервиса для запуска uwsgi средствами gentoo.
В качестве базы я пользовался материалом отсюда.
Создаем пользователя:
Создаем конфигурации для коллекций репозиториев (все еще из под пользователя hg):
Теперь создаем wsgi-запускалки (за образец я беру пример из поставки mercurial, и заменяю там config):
Все готово к запуску uwsgi (все еще под пользователем hg):
Запускаем без указания модуля, модули будут загружаться динамически соответствующей директивой в конфигурации nginx.
Идем в /etc/nginx и правим через sudo или под root.
В /etc/nginx/nginx.conf прописываем upstream для uwsgi:
Затем в нужном нам server добавляем обработчики location для uwsgi, например так:
Перезапускаем nginx. Заходим в браузер по одному из адресов http://localhost/public или http://localhost/private и убеждаемся, что нигде не ошиблись.
Осталось настроить доступ.
До этого мы настроили сервер в localhost с полным доступом, теперь цепляемся к внешнему адресу (kilork.org) с разграничением доступа:
Стоит отметить, что в случае public доступа конфигурация немного странная (приходится писать proxy_pass http://localhost). Для private добавляется только доступ. Либо тут мне не хватает познаний, либо это какая-то ошибка с передачей параметров при ограничении доступа.
Заводим пользователей:
Перезапускаем nginx. Проверяем.
Если все работает, то осталось только привести в порядок скрипты в gentoo, так как запускать руками сервер не сильно правильно.
Подозреваю, что скоро эта часть станет неактуальной и скрипт будет идти в составе ebuild'а. Но пока его нет, сделаем простейший скрипт для упрощения себе жизни.
Создаем исполняемый файл /etc/init.d/uwsgi_hg со следующим содержимым:
1002 надо заменить на id пользователя hg. Пока скрипт ужасно грязный, как разберусь получше, или кто может поможет - улучшу обязательно.
Теперь мы можем спокойно стартовать, останавливать, добавлять в загрузку наш новый сервис:
Осталось перенести статику на nginx, переписать парочку скриптов, которые взаимодействуют с subversion на apache, и о последнем можно будет забыть. С чем я себя и поздравляю.
apache + subversion на более интересный вариант с nginx + mercurial. Покопался в сети и не нашел интересного мне варианта на uwsgi, поэтому разбирался сам. Результат естественно публикую для пользы коммунити.
1. Постановка задачи
Надо обеспечить web-доступ к репозиторию mercurial. Требуется иметь две схемы доступа, приватную и публичную. Приватная требует авторизации пользователя на чтение и запись, публичная - только на запись. Работать должно через nginx и uwsgi.
2. Решение
Я не рассматриваю установку nginx, uwsgi и mercurial. Предполагается, что они установлены и собраны в нужной конфигурации (т.е. nginx собран с модулем для uwsgi). Будем рассматривать только процесс настройки. Хост система у меня gentoo, кое что относится только к этому дистрибутиву, большая же часть полезна всем.
По пунктам:
1. Создание выделенного пользователя для mercurial и репозиториев под ним, запуск через uwsgi;
2. Подключение uwsgi в nginx;
3. Настройка доступа;
4. Создание сервиса для запуска uwsgi средствами gentoo.
2.1. Создание выделенного пользователя для mercurial и репозиториев под ним
В качестве базы я пользовался материалом отсюда.
Создаем пользователя:
sudo useradd --home-dir /home/hg -m hgДиректории:
sudo -u hg mkdir -p /home/hg/repos/{private,public}Права:sudo chmod u=rwx,g=rwx,o= -R /home/hgИнформация о пользователе и настройки push:
sudo su - hg echo -e "[ui]\nusername = kilork.org\n[web]\nallow_push = *\npush_ssl = false" > ~/.hgrc
Создаем конфигурации для коллекций репозиториев (все еще из под пользователя hg):
echo -e "[collections]\n/home/hg/repos/public = /home/hg/repos/public" > /home/hg/public.config echo -e "[collections]\n/home/hg/repos/private = /home/hg/repos/private" > /home/hg/private.config
Теперь создаем wsgi-запускалки (за образец я беру пример из поставки mercurial, и заменяю там config):
echo -e "from mercurial import demandimport; demandimport.enable()\nfrom mercurial.hgweb.hgwebdir_mod import hgwebdir\n\napplication = hgwebdir('public.config')" > /home/hg/public.py
echo -e "from mercurial import demandimport; demandimport.enable()\nfrom mercurial.hgweb.hgwebdir_mod import hgwebdir\n\napplication = hgwebdir('private.config')" > /home/hg/private.pyВсе готово к запуску uwsgi (все еще под пользователем hg):
uwsgi -s /tmp/uwsgi.sock -C -m -M
Запускаем без указания модуля, модули будут загружаться динамически соответствующей директивой в конфигурации nginx.
2.2. Подключение uwsgi в nginx
Идем в /etc/nginx и правим через sudo или под root.
В /etc/nginx/nginx.conf прописываем upstream для uwsgi:
upstream uwsgicluster {
server unix:///tmp/uwsgi.sock;
}Затем в нужном нам server добавляем обработчики location для uwsgi, например так:
server {
listen localhost;
server_name localhost;
location /public {
uwsgi_pass uwsgicluster;
include uwsgi_params;
uwsgi_param SCRIPT_NAME /public;
uwsgi_param UWSGI_SCRIPT public;
uwsgi_modifier1 30;
}
location /private {
uwsgi_pass uwsgicluster;
include uwsgi_params;
uwsgi_param SCRIPT_NAME /private;
uwsgi_param UWSGI_SCRIPT private;
uwsgi_modifier1 30;
}
}Перезапускаем nginx. Заходим в браузер по одному из адресов http://localhost/public или http://localhost/private и убеждаемся, что нигде не ошиблись.
Осталось настроить доступ.
2.3. Настройка доступа
До этого мы настроили сервер в localhost с полным доступом, теперь цепляемся к внешнему адресу (kilork.org) с разграничением доступа:
server {
listen kilork.org;
server_name kilork.org www.kilork.org;
location /public {
limit_except GET {
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/.hg.public.htpasswd;
proxy_pass http://localhost;
}
uwsgi_pass uwsgicluster;
include uwsgi_params;
uwsgi_param SCRIPT_NAME /public;
uwsgi_param UWSGI_SCRIPT public;
uwsgi_modifier1 30;
}
location /private {
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/.hg.private.htpasswd;
uwsgi_pass uwsgicluster;
include uwsgi_params;
uwsgi_param SCRIPT_NAME /private;
uwsgi_param UWSGI_SCRIPT private;
uwsgi_modifier1 30;
}
}Стоит отметить, что в случае public доступа конфигурация немного странная (приходится писать proxy_pass http://localhost). Для private добавляется только доступ. Либо тут мне не хватает познаний, либо это какая-то ошибка с передачей параметров при ограничении доступа.
Заводим пользователей:
sudo htpasswd -c /etc/nginx/.hg.public.htpasswd hguser sudo htpasswd -c /etc/nginx/.hg.private.htpasswd hguser sudo htpasswd /etc/nginx/.hg.private.htpasswd hguser2
Перезапускаем nginx. Проверяем.
Если все работает, то осталось только привести в порядок скрипты в gentoo, так как запускать руками сервер не сильно правильно.
2.4. Создание сервиса для запуска uwsgi средствами gentoo
Подозреваю, что скоро эта часть станет неактуальной и скрипт будет идти в составе ebuild'а. Но пока его нет, сделаем простейший скрипт для упрощения себе жизни.
Создаем исполняемый файл /etc/init.d/uwsgi_hg со следующим содержимым:
#!/sbin/runscript
# Copyright 1999-2010 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: $
depend() {
need net
}
start() {
ebegin "Start uwsgi for hg"
cd /home/hg
start-stop-daemon --start \
--exec /usr/bin/uwsgi -- --uid 1002 --pidfile /home/hg/uwsgi_hg.pid -s /tmp/uwsgi.sock -C -m -M -d /home/hg/uwsgi_hg.log
eend $? "Failed to start uwsgi for hg"
}
stop() {
ebegin "Stopping uwsgi for hg"
if [ -f /home/hg/uwsgi_hg.pid ]; then
pkill -9 uwsgi &> /dev/null
rm /home/hg/uwsgi_hg.pid
fi
eend $? "Failed to stop uwsgi for hg"
}
1002 надо заменить на id пользователя hg. Пока скрипт ужасно грязный, как разберусь получше, или кто может поможет - улучшу обязательно.
Теперь мы можем спокойно стартовать, останавливать, добавлять в загрузку наш новый сервис:
sudo rc-config start uwsgi_hg sudo rc-config stop uwsgi_hg sudo rc-config add uwsgi_hg default
Осталось перенести статику на nginx, переписать парочку скриптов, которые взаимодействуют с subversion на apache, и о последнем можно будет забыть. С чем я себя и поздравляю.
воскресенье, 13 июня 2010 г.
Футбол: первые матчи, первые впечатления.
Прошли первые два дня чемпионата. Потрясающие эмоции, которые дает футбол. Маленький смешной Марадонна, руководящий великолепной сборной Аргентины. Чопорный Бэкхем, чем-то похожий на Зверева. Судьи, которых непонятно зачем выпустили на поле. Неплохая игра хозяев чемпионата. Пока у меня не было ни одного разочарования. Отчаянные уругвайцы, схватившиеся с напыщенными французами. Наказанные футболом мексиканцы. Глупейший гол американцев. Все вписывается в футбольную мозаику.
На выходные уехал на дачу, и обычная экономия траффика была забыта, смотрел субботние матчи по sportbox через skylink-модем. Ушло где-то 400 метров трафика, но оно того естественно стоило. Skylink вытянул трансляции и я почти ничего не пропустил.
Оле Оле Оле!!!
На выходные уехал на дачу, и обычная экономия траффика была забыта, смотрел субботние матчи по sportbox через skylink-модем. Ушло где-то 400 метров трафика, но оно того естественно стоило. Skylink вытянул трансляции и я почти ничего не пропустил.
Оле Оле Оле!!!
воскресенье, 6 июня 2010 г.
Зависимости между службами в Gentoo: наводим порядок в net.ppp0, nginx и xdm/gdm
В gentoo иногда сталкиваешься с неприятными моментами в старте сервисов. После отключения hal, перестал стартовать xdm, так как dbus стартовал пойзже. А nginx стартовал раньше apache2 (что вообщем-то не так важно), но еще и хотел директории /var/tmp/nginx, а /var/tmp у меня - это раздел в памяти. Если отваливался net.ppp0, то останавливались все сетевые сервисы, хотя локальная сеть и вайфай вполне себе продолжали работать. Вообщем, так дальше жить было нельзя.
Первым делом идем в /etc/rc.conf и ставим:
Тем самым мы говорим, что достаточно хотя бы одного поставщика net, а не всех сразу. Это решает проблему с net.ppp0.
Дальше, я добавил сервис для создания каталога для nginx, и для установки некоторого порядка в старте, у меня этот файлик я назвал /etc/init.d/kilork и выглядит он так:
Здесь мы говорим, что запускаемся после apache2 (для nginx) и после dbus (для gdm).
Добавляем в сервисы в default (у меня они там все кучей):
Теперь создаем или правим настройки по порядку старта для nginx и xdm:
В обоих скриптах добавляется строчка rc_after="kilork", которая говорит, что запускаемся мы после старта сервиса kilork.
Вот теперь вроде все замечательно стартует, ничто не отваливается и все поднимается когда надо. Буду смотреть, насколько рабоче решение, до этого я пользовался парочкой дурацких скриптов, которые смотрели, висит ли соединение, после чего переподнимали все сервисы, но это было естественно неправильно.
К слову сказать, для целей, под которые я сделал kilork - есть стандартный local, но вот только у него стоит "after *", что немного идет в разрез с тем, что мне надо запустить после него gdm и nginx. Поэтому вот так.
Первым делом идем в /etc/rc.conf и ставим:
rc_depend_strict="NO"
Тем самым мы говорим, что достаточно хотя бы одного поставщика net, а не всех сразу. Это решает проблему с net.ppp0.
Дальше, я добавил сервис для создания каталога для nginx, и для установки некоторого порядка в старте, у меня этот файлик я назвал /etc/init.d/kilork и выглядит он так:
#!/sbin/runscript
description="kilork"
depend()
{
after apache2
after dbus
}
start()
{
ebegin "Starting local"
mkdir /var/tmp/nginx
eend $? "Failed to start local"
}
stop()
{
ebegin "Stopping local"
eend $? "Failed to stop local"
}Здесь мы говорим, что запускаемся после apache2 (для nginx) и после dbus (для gdm).
Добавляем в сервисы в default (у меня они там все кучей):
rc-config add kilork default
Теперь создаем или правим настройки по порядку старта для nginx и xdm:
kilork@phoenix ~ $ cat /etc/conf.d/nginx rc_after="kilork" kilork@phoenix ~ $ cat /etc/conf.d/xdm CHECKVT=7 DISPLAYMANAGER="gdm" rc_after="kilork"
В обоих скриптах добавляется строчка rc_after="kilork", которая говорит, что запускаемся мы после старта сервиса kilork.
Вот теперь вроде все замечательно стартует, ничто не отваливается и все поднимается когда надо. Буду смотреть, насколько рабоче решение, до этого я пользовался парочкой дурацких скриптов, которые смотрели, висит ли соединение, после чего переподнимали все сервисы, но это было естественно неправильно.
К слову сказать, для целей, под которые я сделал kilork - есть стандартный local, но вот только у него стоит "after *", что немного идет в разрез с тем, что мне надо запустить после него gdm и nginx. Поэтому вот так.
среда, 2 июня 2010 г.
Программа лояльности
Так как меня все же кто-то читает в rss, в рамках программы лояльности - отключаю рекламу, хватит кормить Google.
вторник, 1 июня 2010 г.
Готовимся к чемпионату миру по футболу
Пришла пора определиться с чемпионатом мира. Для меня тут все достаточно просто, я болею за итальянцев и аргентинцев. За первых исторически, а за вторых - хочу посмотреть, как голый тренер их будет бегать.
Подписаться на:
Сообщения (Atom)