Блоґ одного кібера

Історія хвороби контуженого інформаційним вибухом

Posts Tagged ‘Python

Timeout decorator

with 2 comments

Декоратор який використовуючи сигнал Unix SIGALRM перериває роботу функції якщо та працює довше ніж задане число секунд:

import signal

class TimeOut(Exception):
    def __init__(self, msg='Time out error'):
        super(Exception, self).__init__(msg)

def on_alarm(signum, frame): # при надходженні сигналу кидати виняток
    raise TimeOut()

def limit_time(t, default=None):
    signal.signal(signal.SIGALRM, on_alarm) # встановити обробник сигналу

    def decorator(f): 
        def decorated(*args, **kwargs):
            signal.alarm(t) # попросити ОС прислати нам сигнал через t секунд
            try:
                return f(*args, **kwargs)
            except TimeOut:
                return default
        return decorated
    return decorator

import contextlib
# Дякую Алекс!
@contextlib.contextmanager
def time_limit(t):
    signal.signal(signal.SIGALRM, on_alarm)
    signal.alarm(t)
    try:
        yield
    except TimeOut:
        pass


import time

@limit_time(5) # працювати не довше 5 секунд
def test():
    for i in range(10):
        print i
        time.sleep(1)

test()

with time_limit(5):
    for i in range(10):
        print i
        time.sleep()

Written by bunyk

Вересень 2, 2014 at 14:13

Опубліковано в Кодерство

Tagged with ,

Вступ до ZODB

leave a comment »

ZODB – то така старовинна технологія об’єктних баз даних, знайдена десь поряд з антикітерським механізмом, але на відміну від останнього про неї збереглось ще трохи документації, чим можна скористатись. Якщо вам потрібно розібратись в чомусь написаному з допомогою цієї ZODB, то можете витратити 20 хв і прочитати мою публікацію. Вона коротка тому ви нічим не ризикуєте. :)

Щоб встановити ZODB, досить написати:

pip install ZODB

Щоб відкрити з’єднання з базою в файлі потрібно виконати:

import ZODB

connection = ZODB.connection('data.db')

Прочитати решту цієї замітки »

Written by bunyk

Липень 21, 2014 at 23:00

Опубліковано в Кодерство

Tagged with

Чим відрізняється декоратор від адаптера? (І про фасад)

with 2 comments

Цих вихідних їхав поїздом додому, і в купе побачив на столі книжку “Heads first Design Patterns” видавництва O’reilly. Моїми сусідами по купе були хлопець з дівчиною. Вони виглядали сонними, і навіть плутали напрям поїздки (думали що поїзд до Києва їде, а не до Франківська, хоча їхали до Франківська), і активно проявляли намір лягти спати, тому я запитав:

- Можна я вашу книжку подивлюсь? Бо завжди хотів знати чим відрізняється декоратор від адаптера.

На що хлопець відповів:

- Так, звісно.

А дівчина:

- Ви що, теж програміст?! Як вас всіх скрізь багато розвелось!

Вони лягли на свої полиці, я теж підклав під голову рюкзак, вмостився на своїй полиці і взявся за книжку.

Книжка чудова, всім рекомендую. Правда, напевне дорога як холєра, але якщо вам пощастить до неї дістатись – читайте без жодних сумнівів. Щоб довго не тягнути інтригу, скажу що про відмінність декоратора і адаптера я таки дізнався. Там в цій книжці навіть цілий діалог між декоратором та адаптером описують, де ці два шаблони доводять один одному хто з них крутіший. :)
Прочитати решту цієї замітки »

Written by bunyk

Липень 9, 2014 at 08:40

Опубліковано в Кодерство, Нещоденник

Tagged with , ,

Кулінкулятор

with 8 comments

2014-06-02_23-59-43_642Написав калькулятор для обчислення енергетичної цінності, ціни і терміну зберігання страв що створюються з набору наперед відомих інгредієнтів за всілякими рецептами.

Наприклад рецепт на одну дію:

> print(кукурудза + тунець)
Кукурудза ніжна вакуумована стерилізована і
Консерви рибні. Тунець подрібнений стерилізований.
Ціна: 32.48 грн. Вихід: 470 грам
Енергетична цінність в 100 г продукту: 487.6 кДж
білки - 8.34 г, жири - 1.54 г, вуглеводи 15.79 г. 
Після відкриття зберігати не більше ніж: 48 год

Прочитати решту цієї замітки »

Written by bunyk

Червень 2, 2014 at 23:01

Опубліковано в Кодерство

Tagged with ,

Віддалене керування Windows з Python

with 8 comments

А хтось за допомогою пітона навчився керувати мікрохвильовкою.

А хтось за допомогою пітона навчився керувати мікрохвильовкою.

Зараз я знаю два способи робити це за допомогою WinRM – реалізації компанією Microsoft відкритого протоколу WS-Management (Якщо точніше то не WS-Management, а MS-WSMV але то надто тонкі деталі).

Перший спосіб – синхронна бібліотека нашого співвітчизника Алексея Діяна pywinrm. Другий – асинхронна бібліотека американського виробництва яка називається txwinrm, де tx означає Twisted. Плюс першої в тому, що з її коду я зліпив приклад виклику команди на віддаленому хості менш ніж за 300 рядків коду, замінивши urllib2 на requests. Думаю якщо ще трохи розберусь на дозвіллі – зліплю ще менший приклад і продокументую його маючи нормальний компактний опис нутрощів протоколу MS-WSMV.

А на роботі я маю проблеми з конфігурацією користувача для отакого віддаленого керування, але з адміністратором все працює після виконання на сервері звичайного winrm quickconfig.

Written by bunyk

Квітень 24, 2014 at 20:52

Опубліковано в Кодерство

Tagged with ,

Фреймворк фільтра TSV (CSV)

leave a comment »

Тут розкажу про модуль csv в Python, та як змусити його реагувати на кодування файлів.

TSV (значення розділені табуляцією) - це формат таблиці, яка зберігається в звичайному текстовому файлі і в якій кожен рядок – це рядок тексту, а стовпці розділяються символом табуляції. Його вміють відкривати всілякі програмки електронних таблиць, але перевага ще й в тому що його можна прочитати за допомогою звичайнісінького cat. Для прикладу табличка з групами крові (дані не перевірені, якщо ви сюди за ними, то краще спитайте лікаря):

bunyk@xubuntyk:~/tsv_filter_test$ cat blood.tsv 
Тип	Можливий донор для
A+	A+, AB+
O+	O+, A+, B+, AB+
B+	B+, AB+
AB+	AB+
A-	A+, A-, AB+, AB-
O-	A+, O+, B+, AB+, A-, O-, B-, AB-
B-	B+, B-, AB+, AB-
AB-	AB+, AB-

Прочитати решту цієї замітки »

Written by bunyk

Квітень 12, 2014 at 09:41

Опубліковано в Кодерство

Tagged with

Звідки в коді йде цей вивід? (вдосконалюємо логи)

with 3 comments

Найважливіше питання для розробника якому треба пофіксити помилку, і він не знає де, але знає що в логах написано щось не те – хто саме й звідки ті логи пише.

Для вирішення такої проблеми я написав функцію watch_for_output, яка патчить sys.stdout та sys.stderr так що ті починають з кожним рядком що їм передають, виводити всі контактні дані того хто передає. Я помістив її в свою бібліотеку з всякими утилітами, тому використати її можна так:

import butils
butils.watch_for_output()

print 2 + 2

# OUT: test.py:4 print 2 + 2
# OUT: 4
# OUT: test.py:4 print 2 + 2 # print друкує ще перехід на новий рядок
# OUT: 

Біда тільки що коли вивід відбувається за допомогою не print, а наприклад якогось log.info, вийде таке:

2014-04-10 20:56:19,593 INFO zen.zenpython: Connecting to localhost:8789
/opt/zenoss/lib/python2.7/logging/__init__.py:863 stream.write(fs % msg)

Не дуже корисно… Але, ми бачимо в рядку лога таке: zen.zenpython. Це, скоріш за все, назва логера, а ми знаємо що логгер – сінглтон відносно назви (Note that Loggers are never instantiated directly, but always through the module-level function logging.getLogger(name). Multiple calls to getLogger() with the same name will always return a reference to the same Logger object. Logger objects). Тепер, ми можемо пропатчити його формат так, аби він друкував окрім всього іншого рядок і файл з якого викликаний:

import logging

FORMAT = '%(pathname)s:%(lineno)s %(message)s'
fmtr = logging.Formatter(FORMAT)
han = logging.StreamHandler()
han.setFormatter(fmtr)

log = logging.getLogger('zen.zenpython')
log.addHandler(han)

І ми отримуємо щось на зразок:

/opt/zenoss/Products/ZenHub/PBDaemon.py:602 Connecting to localhost:8789
2014-04-10 21:05:27,853 INFO zen.zenpython: Connecting to localhost:8789

Хей, тепер ми знаємо звідки можна починати копатись в коді!

Інші корисні поля, наприклад func (назва функції з якої відбувається логування) чи name (назва логера) описані в класі LogRecord.

Written by bunyk

Квітень 10, 2014 at 20:13

Опубліковано в Кодерство

Tagged with

Follow

Get every new post delivered to your Inbox.

Join 200 other followers