Показаны сообщения с ярлыком python. Показать все сообщения
Показаны сообщения с ярлыком python. Показать все сообщения

вторник, 10 августа 2010 г.

Ода eclipse

Очень часто люди задаются вопросом, чем пользоваться для разработки программного обеспечения. Однозначного ответа тут нет. У меня очень долго не складывались отношения с eclipse, так как либо он тормозил, так как компьютеры были слишком слабыми, либо он падал, так как что-то с чем-то не срасталось, либо у меня на тот момент оказывались более удобные инструменты. В целом, использование eclipse идет немного мимо желания шире использоват vim. И тем не менее, я сейчас пользуюсь eclipse, и нисколько не жалею. Пользуюсь на маленьком asus eee 901, на котором как утверждается - невозможно им пользоваться. Оказалось - возможно. Главное, очистить как можно больше рабочего пространства. Мое выглядит приблизительно вот так:

Вполне душевно.

Самое вкусное естественно в том, что за время глючной жизни затмения под него было разработано множество плагинов, да и сам он оброс полезным функционалом. Перечислю те, которые сильно помогают мне:
  • Vrapper - делает eclipse похожим на vim. До полного сходства далеко, но зато весь функционал остается в непосредственной доступности.
  • Pydev - теперь мы можем редактировать и отлаживать python.
  • EPIC - если вы еще не забыли о языке perl, этот плагин вам также понадобится. Меня он тут очень выручил, когда выяснилось, что модуль получения котировок вышел из строя.
  • MercurialEclipse - интеграция с mercurial.

Итого, у меня почти vim, я могу править и отлаживать все что мне нужно, все это собрано в одном месте, да и в версии eclipse helios добавили хорошие возможности по созданию ссылок в рабочем пространстве, что сильно упрощает жизнь, очень удобно. В экран влезает, работает достаточно стабильно. Вот и встает вопрос, как же подружить свою любовь к vim и удобность работы с eclipse. Пока ответа нет (eclim не предлагать, хочу его использовать, но я так понимаю - придется его пилить, то, что я попробовал - это слишком мало, по сравнению с тем, что дает мне vrapper), я иду на компромисы и изучаю возможности и того и другого, не отдавая однозначного предпочтения. В конце концов я уверен, что прийду к какому-то хорошему варианту, лучше, чем текущий.

А пока, спасибо eclipse за повышение моей продуктивности.

суббота, 10 июля 2010 г.

Дела заботы отпуск

Идет подготовка к запуску kilork.org.

Строю все на статике без использования каких либо технологий сложнее того, что могу сделать на коленке за время интереса. За 5 дней на даче довел шаблон в LyX. Разобрался с eLyXer - инструмент на python для получения HTML из LyX. Немного переписал под свои цели (добавил российскую локализацию, изображение - ссылка на исходное изображение). Для генерации и редактирования страничек сделал питоновские скрипты, которые назвал pynanocms. Все обязательно сделаю доступным вместе с вводом сайта в действие. Пока можно посмотреть lyx-версию руководства по GnuCash в новоподключенном репозитории - здесь.

А я пока должен добить eLyXer - недолокализованные места еще остались, а я стараюсь сделать все чисто. Затем - подцепить RSS, и в целом можно будет публиковать.

Отпуск прошел продуктивно, надеюсь, работа не станет помехой моим планам.

суббота, 19 июня 2010 г.

Публикация репозиториев mercurial через связку nginx + uwsgi

В процесс развития инфраструктуры домашнего сервера решил перейти со связки
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, и о последнем можно будет забыть. С чем я себя и поздравляю.

вторник, 24 ноября 2009 г.

Дружим java и python через web services

На первый взгляд, веб сервисы замечательное изобретение, которое должно обеспечить всех глобальным счастьем. На деле все не так радужно. Хорошо веб сервис зовется из того же языка и фрэймворка, на котором он написан сам, что основательно портит саму идею.



Мне потребовалось подружить java с python, для сервера мы используем jax-ws, а для клиента нашли сначала SOAPpy, но уперлись в то, что данная библиотека как-то плохо дружелюбна со сгенерированными jax-ws wsdl. Притом решать я начал проблему не с того конца. Я научился расширять генератор wsdl собственными классиками. Подцепился в самые нутри, добился таки смены targetNamespace... и налетел на ошибку через еще пару строчек SOAPpy.



Стало очевидно, что дальше с SOAPpy нам не по пути. Еще несколько минут поиска, и мы выходим на suds. Пока что моя кожа благодаря этой библиотеке - мягкая и шелковистая.



Про jax-ws выяснились откровенно говоря неприятные подробности: нутри страшные, индусско-японские, и совершенно дурацкие. Я вообще обычно тревожусь, когда для того, чтобы понять, куда надо ткнуться, мало прочитать статью автора, надо еще самолично проанализировать код, выругаться 10 раз, найти хак для того, чтобы сделать то, что надо нам, но что невозможно сделать тем механизмом, что поставил автор, и все это в первую неделю пользования либом. Зачем было пользоваться такими корявыми классами и так их коряво сращивать. И меня бы все это не волновало, если бы оно все работало. Так ведь нет, не работает еще вдобавок. Reference Implementation, называется.

понедельник, 9 ноября 2009 г.

Все говно, кроме мочи

В очередной раз нашел этому подтверждение в интервью с Brad Fitzpatrick: "...The implementation of libraries that look like they could be beatiful are shit...".

Очень точно подмечено. То что с виду кажется не г..., при ближайшем рассмотрении все равно оказывается им самым.

В эти выходные наконец таки реализовал скрипт для сборки нового ядра и почистки старых. Экономия нервных клеток на этой операции будет оценена не скоро, но думаю - будет приятно. Мне кажется, именно в этом суть программистского подхода к делу, все рутинные операции учить делать машину. Если мы делаем это больше чем один раз, это уже надо автоматизировать. Очередной пункт в личном todo-листе выполнен. Выложу тут и код этого сокровища в следующий раз. А пока оставшиеся пункты:
1. python-скрипт для заполнения ежедневных отчетов на работе
2. perl-скрипт Finance::Quote::Sberbank - исправить накопившиеся ошибки (есть 9-месячный багрепорт, а это ужасно)
3. локализовать openerp
4. lfs-нуть нетбук
5. найти или написать штуку для проверки торговой стратегии на архивных данных
6. написать собственно штуку для торговой стратегии
7. сделать информеры на svn репозитории в виде notify в gnome

И еще много чего, что мне хочется сделать. Каждый день я сижу где-то до 2-х часов ночи, стараясь сделать сегодня чуть-чуть больше чем вчера. И главное - ни один день не должен пройти без познания или создания чего-то нового. Это настоящее счастье - узнавать новое.