Analitycs
понедельник, 13 февраля 2012 г.
суббота, 11 февраля 2012 г.
Как проверить string ли переменная в Python? - isinstance(val, basestring)
Когда нужно проверить - строка ли переменная в Python - есть небольшой подводный камень, о котором иногда забывают...
Все ли помнят что строки в питоне разные? (например, str и unicode), так что для общей проверки нужно использовать isinstance(val, basestring):
Например
Все ли помнят что строки в питоне разные? (например, 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#
Разумеется - все данные похерятся.
В итоге - hard-reset через коды
dial 3845#*970#
Разумеется - все данные похерятся.
понедельник, 6 февраля 2012 г.
Сервер боевой или production? - или лингвистические особенности
Забавный лингвистический факт.
Сервера, на которых крутятся сайты/сервисы для клиентов:
Ох, не спроста имеется эта разница в национальных названиях... ох не спроста ;-) ;-)
Сервера, на которых крутятся сайты/сервисы для клиентов:
- в английском языке они всегда называются production server - PRODUCTION, то есть производственные.
- в русском же языке сплошь и рядом - БОЕВЫЕ сервера. То есть - те, на которые идешь в бой, соответсвенно - либо победишь, либо проиграешь.
Ох, не спроста имеется эта разница в национальных названиях... ох не спроста ;-) ;-)
пятница, 3 февраля 2012 г.
Как перезапустить демонизированный процесс в Supervisord?
Если в supervisord запущено несколько процессов и один из них отвалился, не нужно перезапускать демон целиком - есть консольная утилитка supervisorctl.
Ага, вот процесс-виновник - перезапускаем халявщика
Все ОК - "13 секунд, полёт нормальный. Хьюстон, у нас НЕТ проблемы" (с)
# 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 секунд, полёт нормальный. Хьюстон, у нас НЕТ проблемы" (с)
вторник, 31 января 2012 г.
Python/PHP - запятая - казнить нельзя помиловать
Сегодня ловлю баг в сервисе - в JSON-результате вместо поля с integer выдается список элементов-integer, то есть вместо
упорно получаю
Перепроверяю код 20 раз - ничего не могу понять... вроде все правильно, должен быть идентификатор ОДИН, но хоть ты тресни - список. Подвисаю на несколько минут, иду попить кофе, снова смотрю в код...
Правлю один символ - все работает. После хохота начинаю вспоминать хорошего PHP team-leader, с которым работал много-много лет назад.
Он был большим аккуратистом в плане чистоты форматирования кода и железнобетонно приучил меня расставлять меня запятые в ассоциативных массивах в КАЖДОМ элементе, включая последний. Так как в случае необходимости быстро переставить элементы в коде - не пришлось бы искать потенциальную ошибку c пропущенной запятой.
А для Python - это собственно - сокращенный формат списка-последовательности.
Так что вот вам прекрасный пример того, что старые привычки часто вредят, а иногда - вредят ОЧЕНЬ сильно. "Казнить нельзя помиловать" (с) ;-)
Ну и верный вариант - БЕЗ запятой ;-)
data : { 'id' : 1 }
упорно получаю
data : { 'id' : [1] }
Перепроверяю код 20 раз - ничего не могу понять... вроде все правильно, должен быть идентификатор ОДИН, но хоть ты тресни - список. Подвисаю на несколько минут, иду попить кофе, снова смотрю в код...
Через несколько минут доходит - начинаю истерически хохотать
def bla-bla(self, args): data = { 'bla-bla' : bla_bla, 'name' : name, 'id' : temp_id, } return data
Правлю один символ - все работает. После хохота начинаю вспоминать хорошего PHP team-leader, с которым работал много-много лет назад.
Он был большим аккуратистом в плане чистоты форматирования кода и железнобетонно приучил меня расставлять меня запятые в ассоциативных массивах в КАЖДОМ элементе, включая последний. Так как в случае необходимости быстро переставить элементы в коде - не пришлось бы искать потенциальную ошибку c пропущенной запятой.
А для Python - это собственно - сокращенный формат списка-последовательности.
Так что вот вам прекрасный пример того, что старые привычки часто вредят, а иногда - вредят ОЧЕНЬ сильно. "Казнить нельзя помиловать" (с) ;-)
Ну и верный вариант - БЕЗ запятой ;-)
def bla-bla(self, args): data = { 'bla-bla' : bla_bla, 'name' : name, 'id' : temp_id } return data
Подписаться на:
Сообщения (Atom)