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

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

Posts Tagged ‘Python

Вступ до 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

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

leave a comment »

Цих вихідних їхав поїздом додому, і в купе побачив на столі книжку “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

Стиль – це результат гіркого досвіду

with 2 comments

Imports should usually be on separate lines. (PEP8)

Колись давно, десь три роки тому, всередині фрейморку Zope якийсь добрий чоловік зробив отаку зміну.

Якщо конкретно, то мені в ній найбільше сподобалось оце:

І зараз я з прикладом поясню чому менше рядків краще лише в тому випадку коли рядки при цьому не стають довшими. Нехай ми працюємо з версією Zope зробленою ще до цього коміта і маємо трейс:

Переконуємось що App.special_dhtml містить клас DTMLFile. Значить причина помилки при імпорті в тому що код модуля не встигає прогнатись аж до того місця де йому кажуть створити цей клас. Методом дихотомії визначаємо що проблема в рядку 14:

import DocumentTemplate, Common, Persistence, MethodObject, Globals, os, sys

Десь тут виникає той самий ImportError, але рядок надто довгий аби точно знати де. Доведеться переписати аби рядків було більше. Далі import pdb; pdb.set_trace(); n n n n n ..., бачимо що винен модуль Globals, який імпортує App, а щоб імпортувати App, треба імпортувати special_dhtml, імпортом якого ми зараз займаємось.

Бачимо що й без нього можна обійтись, видаляємо імпорт, отримуємо наступну помилку.

The show must go on
I’ll face it with a grin
I’m never giving in
On – with the show
I’ll top the bill, I’ll overkill

Ну ви зрозуміли ;)

Written by bunyk

Березень 21, 2014 at 20:15

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

Tagged with

Follow

Get every new post delivered to your Inbox.

Join 192 other followers