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

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

Posts Tagged ‘Python

Scala partition в Python

with 3 comments

Вперше сьогодні в мене був момент “А якби я писав на Scala…”. Задача – є список з мухами і котлетами вкупі. Треба мухи окремо, котлети окремо.

В Python класично це так:

Frikadellen = [x for x in AllesZusammen if IstFrikadelle(x)]
Fliegen = [x for x in AllesZusammen if not IstFrikadelle(x)]

В Scala:

(Frikadellen, Fliegen) = AllesZusammen partition IstFrikadelle

Scala, окрім того що коротша, виграє тим що проходиться по списку лише раз.

Але StackOverflow як завжди дає жару:

Frikadellen, Fliegen = [], []
for x in AllesZusammen:
    (Fliegen, Frikadellen)[IstFrikadelle(x)].append(x)
    # або
    # (Frikadellen if IstFrikadelle(x) else Fliegen).append(x)

Це вже краще, але все одно було б добре якби до списку додали метод partition. Може б то Ґвідо поскаржитись?

Written by bunyk

Лютий 27, 2015 at 00:04

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

Tagged with ,

Як видалити платні речі з AWS

with 3 comments

За січень привалив рахунок на 4 з копійками долари, через те що якісь тестери настворювали в моєму тестовому аккаунті на AWS волюмів і лоад балансерів. А так як це вже не вперше, і мені надоїло перевіряти кожен регіон на наявність вказаних в білінгу пунктів, вирішив написати для цієї справи скрипта. Правда якщо ним захочете користуватись ви – треба ще розширити його інстансами, бакетами і всім іншим за що амазон може здирати бабло.

Дивуюсь чому вони замість повідомлення про перевищення бюджету не зроблять функцію автоматичного вимикання зайвих послуг.

Ах, скрипт:

from boto.ec2.connection import EC2Connection
import boto.ec2.elb

def main():
    ec2 = EC2Connection()
    for region in ec2.get_all_regions():
        print 'Region:', region.name
        process_region(region)

def process_region(r):
    c = r.connect()

    for volume in c.get_all_volumes():
        print '\tVolume:', volume.id
        if volume.attachment_state() == u'attached':
            volume.detach()
        volume.delete()

    c = boto.ec2.elb.connect_to_region(r.name)
    for lb in c.get_all_load_balancers():
        print '\tLoad balancer:', lb

if __name__ == '__main__':
    main()

Written by bunyk

Лютий 9, 2015 at 23:39

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

Tagged with ,

Трактат про Zope Component Architecture

with one comment

Zope – це дуже-дуже старий фреймворк (історія почалася ще з 1995), але деякі його частини, а іноді і сам він використовуються в різних системах і досі. Наприклад Twisted використовує інтерфейси Zope (їх свідчення). Біда з ним в тому, що якась пристойна інструкція в інтернеті не доступна. Може вона й була там колись, але на жаль посилання не завжди працюють, а з такою старовиною як Zope – дуже часто ведуть в тупик 404. Своїм трактатом постараюсь цю біду хоч трохи виправити.

Ах, ще цікавий факт, ZCA з’явилась в Zope 3 (BlueBream), при спробі переписати все “правильно”, ігноруючи зворотню сумісність. Таким чином ситуація трохи нагадує ситуацію з Python 3. Тільки Python 3 з’явився в 2008, і здається таки має деякі шанси вижити, а от Zope 3 (BlueBream) – в 2004, і від нього відросли інші фреймворки, наприклад BFG, який об’єднався з Pylons і став Pyramid. Але цю всі історію дуже цікаво розповідає Пол Еверітт, один з тих хто все це почав. Він пояснить вам що Zope ще не вмерла, вона просто спить:

А тут мова піде лише про таку частинку Zope, як ZCA. І ми будемо писати код. З нуля!
Прочитати решту цієї замітки »

Written by bunyk

Грудень 13, 2014 at 19:08

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

Tagged with

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

with one 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 9 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 ,

Follow

Get every new post delivered to your Inbox.

Join 224 other followers