Analitycs

пятница, 24 февраля 2012 г.

Tornado AsyncHTTPTestCase: AssertionError: Async operation timed out after 5 seconds

Тестирование в Торнадо (особенно асинхронных сервисов) имеет много неочевидных нюансов.

Ситуация

Если ваш сервис внутри асинхронных обработчиков сам создает асинхронные задачи - например, для того чтобы забрать что-то с внешнего сервиса - в стиле

class MyAsyncHandler(tornado.web.RequestHandler):

    @tornado.web.asynchronous
    def get(self, *args, **kwargs):
        try:
            # тут чего то берем с внешнего сервера
            self.auth_request({})
        except Exception, ex:
            self.error('Async - %s'%ex)
            self.reply(None)


    def auth_request(self, params, callback=None):
        url = self.application.settings['external_service'] + '?' + urlencode(params)

        if not callback:
            callback = self._on_load

        http = httpclient.AsyncHTTPClient()
        http.fetch(url, callback, validate_cert=False)

    def _on_load(self, response):
        # обрабатываем полученные результат        
        pass

То при написании юнит-тестов через AsyncHTTPTestCase в подобном ключе по официальной документации(!!!)

class MyTestServer(AsyncHTTPTestCase):
    def get_host(self):
        return 'http://%s:%d'%(SERVER['host'], SERVER['port'])
    
    def get_app(self):
        myserver = MyServer()
        myserver.run(SERVER['host'], SERVER['port'])        

        return myserver.app # приложение Tornado
    
    def get_response_obj(self, url, **kwargs):
        if len(kwargs) > 0:
            url += '?' + urllib.urlencode(kwargs)
        
        logging.info('Request [%s]'%url)

        self.http_client.fetch(url, self.stop)
        response = self.wait()
        
        print response

        if response.body: 
            return response.body
        
        return None

При запуске тестов начинаем ловить потрясающие спецэффекты,

Traceback (most recent call last): 
  File "/home/xxxx/test_wait.py", line 9, in test_1 
    self.wait(timeout = 5) 
  File "/xxxxx/site-packages/tornado/ 
testing.py", line 169, in timeout_func 
    timeout) 
AssertionError: Async operation timed out after 5 seconds 

Лечится это добавлением в класс теста переопределенного метода get_new_ioloop

class MyTestServer(AsyncHTTPTestCase):
    ....
    
    def get_new_ioloop(self): 
        return ioloop.IOLoop.instance()  

Такие дела...

Тема в гуглогруппеGist с примером

среда, 22 февраля 2012 г.

Vanessa Paradis+M "La Seine" (Монстр в Париже)

Волшебная мелодия, которую я прощелкал клювом (как обычно ;-) ) и услышал только сегодня, хотя ей уже с полгода.
Лучше слушать на французском...

Сам мультик тоже очень достойный. В-общем - "it make my day" (c)

суббота, 18 февраля 2012 г.

ASUS Eee PC 901 - Нетбук для графомана

Потихоньку переношу старые статьи со старого блога - мало ли кому пригодятся.

Проверка, можно ли работать с текстом на Asus Eee PC 901 в полевых условиях. Несколько непривычно, но все таки можно — теперь, гуляя с мелкой, видимо буду не только читать книжки про покраску фигурок, но и что-то набирать. Прежде всего — эта машинка бралась именно как мелкий помощник, который можно всегда носить с собой.

К сожалению, как читалка книг нетбук оправдал себя не полностью — да, читать PDF на нем все-таки МОЖНО (в отличии от коммуникаторов на PocketPC) но в местах, где много людей (например, в метро) — практически невозможно.

  1. устройство все таки слишком большое, чтобы держать его в одной руке 
  2. тука непривычная, в отличие от телефона и привлекает излишнее внимание окружающих
  3. Перелистывание страницы присходит по нажатию Fn+курсорные стрелки, а это требует держать устройство двумя руками 
  4. Под стандартный Xandros пока не нашел программы разворота экрана — думаю деражать его в книжном развороте все таки удобней


Так что пока применене следующее - выкатил коляску с «маленькой человекой» на улицу, сел на скамеечку — и можно графоманствовать.

StarOffice вполне подходит для набора небольших текстов, а старая привычка хранить все тексты в RTF не должна дать геморроев с совместимостью.

Клавиатура — это да, больное место, но в принципе — можно приноровится. Честно говоря, думал - будет хуже. На мой взгляд — для записи «потока сознания» для последующей обработке на большом брате - вариант вполне удачный. Несколько неудобно смещение цифровых клавиш на 1 влево, так что систематически промахиваюсь. Кстати, нужно посмотреть — есть ли у него возможность подключить какую нибудь раскладную клавиатуру? типа как Belkin для PocketPC

Что понравилось — так это время жизни аккумулятора. 4-5 часов держит совершенно спокойно при выключенных беспроводных интерфейсах.

Многие вещи после Мака вызывают недоумение — бешеное количество различных индикаторов и лампочек, маленький и неудобный тачпад, отсутсвие подсветки клавиатуры, интерфейс некоторых программ производит ощущуение воспаленного мозга — например «Рисуем с пингвином» - я надеюсь мой ребенок никогда не увидит этого ужаса. Видимо, изменения в мозгу «поциента» после использования Mac действительно необратимы ;-)

Firefox'а вполне хватает для чтения почты и новостей, но при одновременно запущеном Gmail и Google Reader в режиме энергосбережения субноут(или все-таки нетбук?) немного подтормаживает, стоит проверить этот нюанс на высокой производительности.

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

При подготовке этого текста ни одного ребенка не пострадало.

пятница, 17 февраля 2012 г.

Blogger - Sorry, dynamic views aren't available for this blog.

В динамическом режиме показа блога на Blogger.com выводится сообщение

Sorry, dynamic views aren't available for this blog. 

Это возможно в трех случаях:

  1. Если блог приватный. 
  2. Если на блоге нет RSS лент. 
  3. Если на блоге в лентах показываются обрезанные сообщения (short feeds).
Так что не включаем обрезание постов, только что накололся на этом.

вторник, 14 февраля 2012 г.

Cicero Valentine Card

Единственная валентика, которая понравилась ;-)

Sanguine is red
Dead lips are blue
The last victim suffers
And so will you

И да, я басурманских праздников не отмечаю - кроме Св. Патрика ;-)

понедельник, 13 февраля 2012 г.

Отстрелялись с серией Tsukasa Bullet

Три тайваньских тушки из одного артбука высосали всю энергию двух человек, скоро поедут к новому владельцу.  Картинки, как обычно, кликабельны.

суббота, 11 февраля 2012 г.

Как проверить string ли переменная в Python? - isinstance(val, basestring)

Когда нужно проверить - строка ли переменная в Python - есть небольшой подводный камень, о котором иногда забывают...

Все ли помнят что строки в питоне разные? (например, str и  unicode), так что для общей проверки нужно использовать isinstance(val, basestring):

 Например

$ python
Python 2.7.1 (r271:86832, Jul 31 2011, 19:30:53) 
[GCC 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.15.00)] on darwin
Type "help", "copyright", "credits" or "license" for more information.

>>> isinstance('abcd', str)
True
>>> isinstance('abcd', basestring)
True
>>> isinstance(u'abcd', str)
False
>>> isinstance(u'abcd', basestring)
True