Analitycs

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

Как правильно деплоить Python сервис запущеный через supervisord?

Иногда supervisord заглючивает и он неправильно определяет необходимость перекомпиляции pyc файлов при обновлении python файлов, что при деплое новой версии сервиса на Python приводит к забавным, но неприятным эффектам

Рекомендуемый порядок действия

# supervisorctl stop my_super_service

Теперь обновляем файлы, затем РУЧКАМИ удаляем pyc

# find path_to_my_service -type f -name "*.pyc" -delete
# supervisorctl start my_super_service

При использовании сервисов автоматического деплоя - имеет смысл повесить эти операции на автоматические хуки - до и после деплоя.

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

Ищу Python developer - Junior, СПб


Ищу будущих коллег и хороших людей:


Обязанности:

Разработка и сопровождение серверной части проекта Омлет.ру (легальный видео-контент);

Что хотим  от вас?

  • Хороший опыт работы с бекендами сайтов
  • Опыт разработки на Python или устойчивое желание его изучить - при наличии знаний других языков (С#, PHP, Perl , Ruby);
  • Знание MySQL;
  • Аналитический склад ума,
  • Коммуникабельность,
  • Знание основ ООП,
  • Самообучение и саморазвитие,
  • Чувство юмора и адекватность - обязательно.

Вы кандидат нашей мечты, если...

  • уже работали с Python
  • есть опыт работы с no-SQL решениями,
  • есть опыт работы с высоконагруженными веб-сервисами/сайтами - не стесняйтесь показывать портфолио - нам это интересно;
  • владеете хорошей математической базой;
  • знаете и применяете различные языки программирования, новейшие технологии,
  •  владеете английским языком
Если есть практический опыт Tornado/Twisted - вам большой такой плюс, перекрывающий многие минусы.

Что мы предлагаем?

  • Возможность забросить PHP - вам еще не надоело? 
  • Работу в большом и интересном проекте
  • Офис - ст. метро Василеостровская + 5 минут ходьбы - и то прогулочным шагом 
  • Неординарные задачи
  • Полностью белое оформление и ЗП
  • Повышенный отпуск - как компенсация за ненормированный рабочий день
  • Корпоративную симку для связи
  •  После испытательного срока - ДМС

При наличии знаний и умений из способностей кандидата нашей мечты - позиция может быть повышена, причем - значительно, начинаем от 50к белыми.

Omlet.ru HD в Android Market

Вот собственно - релиз приложения Omlet.ru для Android планшетов.

Ставим и смотрим фильмы в хорошем качестве на таблетках.

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

Studio XIII - resin garage kits, figures & scale models

Пять лет назад, 24 февраля 2007 года (как потом выяснилось - в самый холодный день той зимы ) мы поженились с Татьяной “Ведьмой” - мое второй половинкой.

До этого, а затем и - после этого мы сделали много совместных “проектов” - начиная от дочки Киры и заканчивая большим количеством фигур и моделей и парой книг. Так как мы до сих пор не прибили друг друга за уже почти 10 лет знакомства, то думаю - дальше будет уже проще...

Заканчивай с лирикой, в какой-то прекрасный момент мы поняли, что полезно где-то иметь краткий список наших работ - то, что называется умным басурманским словом “портфолио”... так и появился наш новый небольшой проект. Встречайте -

Блог Studio XIII - фигурки аниме на заказ, модели, resin garage kits

Мы не видим смысла копировать туда статьи со ScaleModels.ru - поэтому будем выкладывать туда просто краткие анонсы наших работ. Сейчас там далеко не все, что сделано за эти годы, так что - заносите блог в закладки и подписывайтесь на RSS ленту.

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

Принять участие в этом конкурсе может любой зарегестрированный участник ScaleModels.ru

Требования и личные пожелания к логотипу

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

Участие в конкурсе


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

Призы

В качестве моральной компенсации за столь тяжелую психофизическую нагрузку призер-победитель получает от наc следующие "плюшки":

  • плакат и сумку с фотографиями нашей работы Alita Rebirth 
  • cсылку на свой сайт/блог с нашего блога и самого ScaleModels.ru (разумеется - если только автор не занимается всякими запретными в приличном обществе вещами) 
  • большое человеческое спасибо, почет и уважение. 
  • ну и на выбор - либо скидка 30% на один заказ нашей работы, либо подарок - один garage kit нашего производства - Kakashi-sensei или Hidden position


Что за второй garage kit? Он будет объявлен немного позже, нам осталось доделать совсем немного

Заранее спасибо за участие!

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

Анонс на ScaleModels.ru

Яндекс-Директ - консультации от сотрудников Яндекса

Я уже писал, что в отличие от многих вебмастеров, у меня как-то общение с Яндексом складывается вполне успешно. И Платоны понятно общаются - без загадок и вообще... как-то без особых проблем все.

Вот и в этот раз.

Яндекс-Директ открыл помощь вебмастерам по адресу advice@partner.yandex.ru, написал туда.

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

Очень мило с человеком расшаркались ;-)  Рекомендую воспользоваться, если необходимо - плохого не посоветуют.

Источник

пятница, 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

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

Как запускать периодические задачи на Tornado? PeriodicCallback!

Продолжая тему периодических задач в Twisted, в Tornado это делается немного по другому - с помощью специального tornado.ioloop.PeriodicCallback.

Примерчик - если кому пригодится

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import tornado.web
import tornado.httpserver
import tornado.ioloop

PERIOD = 30 # в минутах

class MyApplication(tornado.web.Application):

  def period_run(self):
    # чего-то тут делаем
    pass

...

app = MyApplication(handlers=urls, **settings)

http_server = tornado.httpserver.HTTPServer(app, xheaders=True)
 
loop = tornado.ioloop.IOLoop.instance()
period_cbk = tornado.ioloop.PeriodicCallback(app.period_run, 1000*60*PERIOD, loop)

period_cbk.start()

loop.start()

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

Как сделать hard-reset на LG Optimus Black?

Шаманство с зажатием Volume Down + Power + Home при включении не прокатило, может граната у меня не той системы?

В итоге - hard-reset через коды

dial 3845#*970#

Разумеется - все данные похерятся.


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

Сервер боевой или production? - или лингвистические особенности

Забавный лингвистический факт.

Сервера, на которых крутятся сайты/сервисы для клиентов:

  • в английском языке они всегда называются production server - PRODUCTION, то есть производственные. 
  • в русском же языке сплошь и рядом - БОЕВЫЕ сервера. То есть - те, на которые идешь в бой, соответсвенно - либо победишь, либо проиграешь.

Ох, не спроста имеется эта разница в национальных названиях... ох не спроста ;-) ;-)

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

Как перезапустить демонизированный процесс в Supervisord?

Если в supervisord запущено несколько процессов и один из них отвалился, не нужно перезапускать демон целиком - есть консольная утилитка supervisorctl.

# supervisorctl
api-test-data                    RUNNING    pid 22443, uptime 1 day, 16:52:01
api-test-empty                   FATAL      Exited too quickly (process log may have details)
auth-service                     RUNNING    pid 22444, uptime 1 day, 16:52:01

Ага, вот процесс-виновник - перезапускаем халявщика

supervisor> start api-test-empty
api-test-empty: started

supervisor> status
api-test-data                    RUNNING    pid 22443, uptime 1 day, 16:52:29
api-test-empty                   RUNNING    pid 27360, uptime 0:00:13
auth-service                     RUNNING    pid 22444, uptime 1 day, 16:52:29
supervisor> 

Все ОК - "13 секунд, полёт нормальный. Хьюстон, у нас НЕТ проблемы" (с)