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)