Из старой сумки вы сможете сделать вот такой браслет. Оригинальные украшения из ненужных вещей — что может быть приятней и полезней?


Из старой сумки вы сможете сделать вот такой браслет. Оригинальные украшения из ненужных вещей — что может быть приятней и полезней?

Темой данной замечательной статьи будет декор дома ко дню святого Валентина. Отличный повод порадовать себя и своих любимых уже приближается!
В функциональных языках есть интересная возможность, фактически являющаяся расширением идеи перегрузки функций — сопоставление с образцом. Для этого поддерживается специальный синтаксис шаблонов структур данных, позволяющий проверить что объект имеет определенный тип и/или поля, а также извлечь из него некоторые данные. Пример из haskell (частично взято тут wiki):
-- f - функция от одного целого параметра
-- возвращающая целое
f :: Int -> Int
f 1 = 0
-- если ей передать 1, то она вернет 0
f _ -> 1
-- если что-либо другое - 1
-- map от чего угодно и пустого списка возвращает пустой список
map _ [] = []
-- рекурсия - map от функции и списка это конкатенация
-- f от первого параметра и map от f и остатка списка
map f (x:xs) = f x : map f xs
-- разбор структуры
-- Foo это или Bar или Baz
data Foo = Bar | Baz {bazNumber::Int, bazName::String}
h :: Foo -> Int
-- Baz - это тип структуры, bazName - это имя поля
h Baz {bazName=name} = length name
h Bar {} = 0
-- f - функция от одного целого параметра
-- возвращающая целое
f :: Int -> Int
f 1 = 0
-- если ей передать 1, то она вернет 0
f _ -> 1
-- если что-либо другое - 1
-- map от чего угодно и пустого списка возвращает пустой список
map _ [] = []
-- рекурсия - map от функции и списка это конкатенация
-- f от первого параметра и map от f и остатка списка
map f (x:xs) = f x : map f xs
-- разбор структуры
-- Foo это или Bar или Baz
data Foo = Bar | Baz {bazNumber::Int, bazName::String}
h :: Foo -> Int
-- Baz - это тип структуры, bazName - это имя поля
h Baz {bazName=name} = length name
h Bar {} = 0
Примерно тоже можно сделать во многих функциональных языках, но я никогда не видел подобных возможностей в императивных языках. Самое близкое что есть по интеллектуальности — перегрузка функций в C++. Такое положение связанно и с особенностями задач, обычно решаемыми в функциональных языках, и с их ориентированностью на рекурсивные структуры данных и с попытками уйти от if и других императивных особенностей.
Но тем не менее желание сделать что-то подобное для python возникало после каждого ковыряния в функциональщине и после каждой конструкции вида:
if isinstance(x, Message):
if x.mtype == DATA_READY and x.data is not None:
#some code
pass
elif x.mtype == PROCESS_FINISHED:
#some code
pass
# ....
# .....
if isinstance(x, Message):
if x.mtype == DATA_READY and x.data is not None:
#some code
pass
elif x.mtype == PROCESS_FINISHED:
#some code
pass
# ....
# .....
А тут что-то захотелось посмотреть внимательно на модуль ast (abstract syntax tree) — давно не использовал его, последний раз еще во времена 2.4 — тогда очень жалел, что он не позволяет компилировать измененный ast (кстати делал интересный проект по портированию большого куска кода с PyQt3 на PyQt4 и ast позволил значительно автоматизировать этот перенос).
ast позволяет получить из python кода его результат после синтаксического разбора, но еще до компиляции в байтокод, исследовать его и/или изменять и компилировать новый вариант. Пример ast:
a = f.b(1)
=>
Assign(
targets=[Name(id='a', ctx=Store())],
value=Call(
func=Attribute(
value=Name(id='f', ctx=Load()),
attr='b',
ctx=Load()),
args=[Num(n=1)],
keywords=[],
starargs=None,
kwargs=None
)
)
Фактически мы получаем исходный текст в удобном для ковыряния виде (правда несколько громоздком). Именно с абстрактными синтаксически деревьями работаю всяческие анализаторы кода, оптимизаторы и прочее. ast предоставляет некоторое количество вспомогательных функций и два класса — NodeVisitor для просмотра ast и NodeTransformer для модификации.
На этом все про ast. Что хотелось от сопоставления с образцом:
После некоторого времени размышлений остановился на таком варианте:
with match(x) as res:
1 >> 2
int >> x * 3
str >> func_str(x)
SomeType(c=V_c, d=V_c) >> on_val(V_c)
SomeType(c=V_c, d=V_d) >> on_val2(x, V_c)
print "res =", res
with match(x) as res:
1 >> 2
int >> x * 3
str >> func_str(x)
SomeType(c=V_c, d=V_c) >> on_val(V_c)
SomeType(c=V_c, d=V_d) >> on_val2(x, V_c)
print "res =", res
Как это должно было-бы работать:
if x == 1:
res = 2
elif isinstance(x, int):
res = x * 3
elif isinstance(x, str):
res = func_str(x)
elif isinstance(x, SomeType) and
hasattr(x, 'c') and
hasattr(x, 'd') and
x.c == x.d:
res = on_val(x.
c)
elif isinstance(x, SomeType) and
hasattr(x, 'c') and
hasattr(x, 'd'):
res = on_val2(x, x.c)
else:
raise ValueError("{0!r} don't match any pattern!".format(x))
if x == 1:
res = 2
elif isinstance(x, int):
res = x * 3
elif isinstance(x, str):
res = func_str(x)
elif isinstance(x, SomeType) and
hasattr(x, 'c') and
hasattr(x, 'd') and
x.c == x.d:
res = on_val(x.c)
elif isinstance(x, SomeType) and
hasattr(x, 'c') and
hasattr(x, 'd'):
res = on_val2(x, x.c)
else:
raise ValueError("{0!r} don't match any pattern!".format(x))
Совсем так, как хотелось, сразу не вышло. Вышло так:
import python_match
@python_match.mathing
def come_func():
# some code
with python_match.match(x) as res:
1 >> 2
int >> x * 3
str >> func_str(x)
SomeType(c=V_c, d=V_c) >> on_val(V_c)
SomeType(c=V_c, d=V_d) >> on_val2(x, V_c)
print res.val
import python_match
@python_match.mathing
def come_func():
# some code
with python_match.match(x) as res:
1 >> 2
int >> x * 3
str >> func_str(x)
SomeType(c=V_c, d=V_c) >> on_val(V_c)
SomeType(c=V_c, d=V_d) >> on_val2(x, V_c)
print res.val
Из необязательных ограничений — нужно импортировать модуль python_match без переименования. Обернуть все функции, где используется сопоставление с образцом, декоратором 'python_match.mathing'.
Как это работает:
Осталось некоторое количество ограничений, которые однако не принципиальные, так что поскольку задача скорее стояла из разряда — «как бы это сделать» я не стал заниматься дальнейшими оптимизациями/улучшениями.
Полный код тут — python_match.py, test_pm.py.
Ссылки:
ru.wikipedia.org/wiki/haskell
ru.wikipedia.org/wiki/Erlang
en.wikipedia.org/wiki/Pattern_matching
en.wikibooks.org/wiki/Haskell/Pattern_matching
docs.python.org/library/ast.html
github.com/koder-ua/python-lectures/blob/master/python_match.py
github.com/koder-ua/python-lectures/blob/master/test_pm.py
en.wikipedia.org/wiki/Abstract_syntax_tree
Исходники этого и других постов со скриптами лежат тут — github.com/koder-ua. При использовании их, пожалуйста, ссылайтесь на koder-ua.blogspot.com.
Автор: konstantin danilov

Сегодня вы узнаете, как сделать браслеты своими руками. У вас получится оригинальный браслет с вышивкой бисером на металлической основе.
Для того,что бы контролировать свой трафик существует замечательная программа iftop .
Установка в debian:
Смотрим наличие пакета:
$ aptitude search iftop
Устанавливаем:
$ sudo apt-get install iftop
iftop — программа,с помощью которой удобно анализировать сетевой трафик,проходящий через сетевой интерфейс,запуск:
$ sudo /usr/sbin/iftop -i «интерфейс» (eth,pppoe,wlan0)
Программа отображает таблицу текущего использования пропускной способности,в виде цифр и графического представления.
По умолчанию программа отображает конечные точки сетевых соедений(можно нажать клавишу «p»,тогда будут отображаться также номера портов), объем передаваемых данных отображется как в виде цифр,так и в виде графического представления:горизонтальной полоски.Настройка отображаемой информации осуществляется путем нажатия на клавиши: для вывода списка доступных команд нажмите «?».
iftop можно запускать с различными опциями,например ,если нужно отслеживать только один интерфейс.
Информация отображается в очень простом и понятном виде.Программа незаменима для контроля сети и определения ее пропускной способности.Возможно, вам также понадобится команда «netstat -p» для определения,какой именно процесс используется в настоящее время.
Опции iftop:
Примечание:
Фильтрация по порту: iftop -f «dst port номер_порта»
Автор: r1za
Спинка: наберите цепочку из 121 возд. п. вяжите столбиками с/н 10 рядов.
Далее вяжите узором следующим образом: *2 ст. с/н, 1 возд. п.*, повторяйте *-* до конца ряда. Далее вяжите, чередуя 10 рядов ст. с/н и 1 ряд клеточками. На высоте 35 см для приталивания убавьте 9 раз х 1 п. с обеих сторон = 101 п. На общей высоте 52 см вывяжите ажурную кайму по схеме 1.
Далее снова вяжите основным узором, прибавляя в каждом 2-м ряду 4 раза х 1 п. = 95 п. После этого для рукавов наберите по краям по 23 возд. п.: с правой стороны в конце работы наберите 23 возд. п., затем работу переверните и отдельной нитью наберите 23 возд. п. для второго рукава и присоедините (привяжите) к основной нити. В начале рукавов в каждом 2-м ряду прибавьте 3 раза х 1 ст. с/н. Провяжите 30 рядов, затем для выреза горловины средние 37 п. закройте.
Далее каждую часть вяжите отдельно, закрывая с внутренней стороны в каждом 2-м ряду 2 раза х 2 возд. п. и 2 раза х 1 возд. п. На высоте рукавов 15 см вывяжите скосы плеча в 3 этапа: закройте сначала 1 раз х 12 п., затем 1 раз х 11 п. и 1 раз х 27 п. (закрывайте полустолбиками).
Вторую часть свяжите симметрично.
Перед: вяжите аналогично спинке, но с более глубоким вырезом горловины. Причем после ажурной полосы по центру вывяжите ажурную узор по схеме 2. На высоте 10 см от ажурной полосы для выреза горловины закройте средние 26 п. и далее каждую часть вяжите отдельно, убавляя с внутренней стороны по 1 п. в каждом 6-м ряду.
Рукава и плечи вывяжите аналогично спинке.
Сборка: выполните плечевые, боковые швы и швы рукавов. Вырез горловины и нижний край обвяжите «рачьим шагом».
Автор: Ангелина
Дата публикации: 2012-01-11T17:52:00.000+02:00