Analitycs

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

Skyrim vs Fallout

Приехал Skyrim... Xbox, бедняга, будет теперь работать на износ - двое игроков в одной квартире не дадут бедной железке отдохнуть.

Воспитательница в детском саду уже спросила - "что за странную группу вы слушаете? Ребенок напевает какую-то новую музыку и размахивает дрыном" ;-) ;-)

Ну а в целом - весьма нравится. Расписывать не буду - и так везде на каждом сайте описания валяются.

Правда, можно  продолжить старую цитату с башорга - если раньше "запускаешь Fallout 3 - а там Oblivion" (с), то теперь - запустил Skyrim - а там... Fallout New Vegas ;-)

понедельник, 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

Источник