Analitycs

понедельник, 14 ноября 2011 г.

Как реализовать периодические задачи в Twisted? (cron vs LoopingCall)

Первое что делают все программисты на Twisted, чтобы сделать периодические задачи - это лезут в cron. Я сам так раньше делал - и, к сожалению, не было никого рядом, чтобы стукнуть меня бамбуковой палкой по рукам.

Есть же методически грамотное, ВСТРОЕННОЕ решение - и нашел я его сегодня случайно, когда искал совершенно другую вещь.

from twisted.internet.task import LoopingCall

#==============================================================================
class MySuperServer(MyServer, twisted.web.server.Site):
    '''
    мой собственный веб-сервер, с блекджеком и шлюхами ;-)
    '''

    def __init__(self):
        lp = LoopingCall(self.checkStatus)
        lp.start(1.0) # период в секундах    

    def checkStatus(self):
        #self._log('Looping call')
        pass

пятница, 11 ноября 2011 г.

Chef creating new cookbook - rake aborted! Don't know how to build task

При попытке создания нового cookbook для Chef по некоторым мануалам вываливается ошибка

# rake new_cookbook COOKBOOK=xxx CB_PREFIX=site-
rake aborted!
Don't know how to build task 'new_cookbook'

Причина - прямое использование rake тут было deprecated, потом вообще убрали. Теперь труЪ-путь для подобных операций - только использование knife, командной утилиты Chef.


# knife cookbook create xxx

Вот не люблю ruby за это очень сильно - ведь был же суслик... а теперь его нету. ;-(

четверг, 10 ноября 2011 г.

Синхронизация времени на CentOS/Fedora

Как поправить разошедшееся время на CentOS/Fedora

$ sudo yum update tzdata -y

Проверить/выставить

$ cat /etc/sysconfig/clock 
ZONE="Europe/Moscow" 

И под конец запустить

$ sudo chkconfig --level 345 ntpd on && sudo service ntpd start

Подрезано тут (спасибо sanjek65)

среда, 9 ноября 2011 г.

PHP header("HTTP/1.0 404 Not Found") показывает пустую страницу

При отправке из PHP скрипта HTTP ошибки 404 - показывается белая страница, хотя в настройках вашего веб сервера явно задана собственная красивая страничка для этой ошибки.

Как лечить?

Просто считать содержимое файла с красивой 404 ошибкой и вывести его HTML в поток - примерно так
if ($is404) {
 $html = file_get_contents(YOUR_ROOT_PATH.'/404.htm');
 header("HTTP/1.0 404 Not Found");
 echo $html;
 exit();
}

четверг, 3 ноября 2011 г.

Python, Twisted, logging - Как логгировать несколько процессов/демонов в один файл?

Давайте поговорим немного про логгирование в Python.

Да, меня это ДЕЙСТВИТЕЛЬНО беспокоит, и я хочу об этом поговорить ;-)

Совсем недавно столкнулся с тем, что достаточно серьезный проект при портировании с Linux на MacOS потерял логгирование. Ну нет лог файла - и все тут. Полез в код разбираться - выяснилось, что разработчики очень любили изобретать велосипеды и делали логгирование через файл, открытый ручками и обычную запись туда переменных - прямо в файл. Все это работало... до поры до времени. Пришлось на скору руку переписывать.

В общем, мораль сей басни такова...

Есть в Python СТАНДАРТНЫЙ модуль logging  - его и нужно использовать для разного типа логгирования. Батарейка-то уже включена ;-)

Чтобы пример кода не был совсем тривиальным - приведу решение для той ситуации, когда у нас есть несколько многопроцессных РАЗНЫХ демонов на Twisted на одной машине, а еще и cron-скрипт запускается время от времени. И всю жизнедеятельность этого дурдома нужно логгировать в один файл

import os
import logging
from twisted.python import log                                                                                   

CURRENT_PATH = os.path.realpath(os.path.dirname(__file__))

# Все это "по уму" обычно запихивается в нормальный конфиг-файл
LOG_DIR = os.path.join(CURRENT_PATH, 'logs')                            
LOG_FILE = os.path.join(LOG_DIR, 'super-puper.log')  
LOG_LEVEL = logging.INFO
 
# инициализируем
FORMAT = ('%(asctime)-15s %(levelname)s %(message)s') 

if not os.path.exists(LOG_DIR):
    os.mkdir(LOG_DIR) 
 
logging.basicConfig(format=FORMAT, filename=LOG_FILE, handler=logging.handlers.RotatingFileHandler)   
observer = log.PythonLoggingObserver(loggerName='twisted')
observer.start()
observer.logger.setLevel(LOG_LEVEL)  

# класс-примесь для логгирования - в принципе - необязательно, реализация может быть разная - хоть функциями
class BasicLogClass():

    def _log(self, msg):
        log.msg(msg, logLevel=logging.INFO)

    def _error(self, msg):
        log.msg(msg, logLevel=logging.ERROR)

    def _warning(self, msg):
        log.msg(msg, logLevel=logging.WARNING)

В данном варианте работоспособность не проверял, но логика применения именно такая - выкусил из работающего проекта.

Кстати, если у кроновских скриптов нет использования twisted'овского reactor, то могуть быть проблемы, нужно подумать. Как вариант - использовать развилку в инициализации и логгировании без применения observer, но не уверен.

вторник, 1 ноября 2011 г.

Как исправить переход на зимнее время в MacOS X Snow Leopard 10.6.8?

Проблема 2011 года подкралась незаметно - новые машины с Lion не пострадали, а вот Snow Leopard честно перевел часы, не зная о новом приказе президента РФ.

Варианта решения два

1) Поставить другой TimeZone в настройках

2) Отхачить по аргентинскому рецепту (первый хак для консоли, второй для GUI)

mkdir temp
cd temp
curl -O http://www.iana.org/time-zones/repository/releases/tzdata2011m.tar.gz
tar zxvf tzdata2011m.tar.gz
sudo zic europe

curl -O http://www.opensource.apple.com/tarballs/ICU/ICU-400.42.tar.gz
tar zxvf ICU-400.42.tar.gz
cp tzdata2011m.tar.gz ICU-400.42/icuSources/tools/tzcode/
cd ICU-400.42/icuSources
./runConfigureICU MacOSX --with-data-packaging=archive
gnumake
sudo install -o root -g wheel -m 0644 -Sp data/out/icudt40l.dat /usr/share/icu/icudt40l.dat
cd ../../..
rm -rf temp

Источник 

понедельник, 31 октября 2011 г.

Денежные переводы с сайта Билайн.Деньги в страны ближнего зарубежья

А ребята из RURU времени не теряют ;-)

Билайн и универсальная платежная система RURU реализовали на сайте «Билайн.Деньги» сервис безадресных денежных переводов в страны ближнего зарубежья: Украина, Таджикистан, Армения, Грузия, Молдавия, Киргизия. В планах партнеров расширение географии переводов. Ранее абоненты «Билайн» могли совершать денежные переводы UNISTREAM (ЮНИСТРИМ) в страны СНГ, используя средства мобильного счета абонентов «Билайн», на сайте ruru.ru или при помощи SMS запроса на единый сервисный номер 7878. Также переводы были доступны через мобильное приложение «Платежный мир RURU» для смартфонов на базе Android и iOS. Теперь абоненты «Билайн» могут воспользоваться этой услугой на сайте «Билайн.Деньги» - money.beeline.ru.

Источник