Transact SQL великолепный язык, функциональности которого более чем достаточно для решения большинства часто возникающих задач. Однако иногда возникают задачи, которые с его помощью решать долго и/или неудобно. Пожалуй, самым ярким примером является продвинутый парсинг строк, в котором приходится использовать регулярные выражения или просто хитрый и закрученный алгоритм. Начиная с SQL Server 2005, эта проблема решается созданием хранимой процедуры/функции CLR. Но этот подход требует перекомпиляции и развертывания сборки при внесении изменений. А так хочется, не покидая Management Studio, изменять поведение своих процедур.
Естественным образом возникает желание встроить в T-SQL поддержку какого-нибудь скриптового языка, чтобы выполнять код на лету. Благодаря DLR (Dynamic Language Runtime) в .Net Framework 4 у нас появилась такая возможность. Исключительно в силу личных пристрастий автора в качестве такого языка был выбран IronPython.
Под катом пошаговая инструкция и демонстрация результата.
Читать полностью »
Рубрика «python» - 307
Используем IronPython из Transact SQL
2013-01-03 в 12:12, admin, рубрики: .net, DLR, ironpython, python, sql server, метки: c++, DLR, ironpython, sql serverНадеюсь, вы отлично встретили Новый год, и сейчас у вас отличное праздничное настроение. По крайней мере у меня это именно так — мы не пили никакого алкоголя, и чокнулись в полночь бокалами с водой из пятилитровой канистры, поэтому мы проснулись, погуляли, и тут я вспомнил про то, как вчера поздравлял своего друга с Новым годом:
Желаю, чтобы в конце каждого года ты, вспоминая то, что было за последние 366 if ((year%4 == 0 and year%100 != 0) or (year%400 == 0)) else 365 дней, думал про себя:
— Ох, нифига себе, какой был экшен. Обязательно буду рассказывать внукам или напишу об этом потом книгу.
Итак, выше достаточно простой inline-способ определить количество дней в году (переменная year), который, по сути, полностью раскрывает их суть: в григорианском календаре високосными годами считаются те годы, порядковый номер которых либо кратен 4, но при этом не кратен 100, либо кратен 400. Иными словами, если год делится на 4 без остатка, но делится на 100 только с остатком, то он високосный, иначе — невисокосный, кроме случая, если он делится без остатка на 400 — тогда он всё равно високосный.
Например, 2013 год невисокосный, 1700, 1800 и 1900 — опять же невисокосные годы, а вот 2000, 2004, 2008 и 2012 — високосные.
Но что, если мы не помним, сколько дней в високосных (366 дней) и невисокосных (365 дней) годах, или просто хотим написать определение количества дней в году максимально быстро? Можно ли сделать так на Python? Конечно же, можно.
Обучение программированию через игру или как быстро собрать весь мёд
2012-12-28 в 7:15, admin, рубрики: python, образование, ооп, метки: python, образование, ооп Несколько лет назад я начал преподавать свой любимый язык python школьникам. И возникла такая задача: рассказать про объектную модель, но что бы это было не скучно и как можно нагляднее. И тут меня не сразу, но осенило — пчёлы!
Читать полностью »
Electric Imp — Делаем WiFi термометр
2012-12-27 в 7:01, admin, рубрики: diy или сделай сам, electric imp, google app engine, python, Raspberry Pi, метки: electric imp, google app engine, python, Raspberry Pi Многие из вас знакомы с анонсом Electric Imp, который не так давно был на хабре, кроме того уже начинают появляться первые впечатления от его использования. Поскольку это устройство мне показалось перспективным и довольно интересным, я при первом появлении в продаже версии developer edition заказал себе чтобы немного поиграться и оценить возможности.
Читать полностью »
Бенчмарк HTML парсеров
2012-12-26 в 9:25, admin, рубрики: benchmark, dom, erlang, html, lxml, nodejs, parser, PyPy, python, xpath, высокая производительность, Программирование, метки: benchmark, c++, dom, erlang, html, lxml, nodejs, parser, PyPy, python, xpathПереписывал на работе кусок одного сервиса с Python на Erlang. Сам сервис занимается тем, что скачивает по HTTP значительное количество однотипных HTML страниц и извлекает из них некоторую информацию. Основная CPU нагрузка сервиса приходится на парсинг HTML в DOM дерево.
Сперва захотелось сравнить производительность Erlang парсера mochiweb_html с используемым из Python lxml.etree.HTML(). Провел простейший бенчмарк, нужные выводы сделал, а потом подумал что неплохо было бы добавить в бенчмарк ещё парочку-другую парсеров и платформ, оформить покрасивее, опубликовать код и написать статью.
На данный момент успел написать бенчмарки на Erlang, Python, PyPy, NodeJS и С в следующих комбинациях:
- Erlang — mochiweb_html
- CPython — lxml.etree.HTML
- CPython — BeautifulSoup 3
- CPython — BeautifulSoup 4
- CPython — html5lib
- PyPi — BeautifulSoup 3
- PyPi — BeautifulSoup 4
- PyPi — html5lib
- Node.JS — cheerio
- Node.JS — htmlparser
- Node.JS — jsdom
- C — libxml2 (скорее для справки)
В тесте сравниваются скорость обработки N итераций парсера и пиковое потребление памяти.
Интрига: кто быстрее — Python или PyPy? Как сказывается иммутабельность Erlang на скорости парсинга и потреблении памяти? Насколько быстра V8 NodeJS? И как на всё это смотрит код на чистом C.
Читать полностью »
Слабые ссылки в различных языках программирования
2012-12-25 в 14:11, admin, рубрики: c++, haskell, java, perl, python, ruby, Программирование, метки: c++, haskell, java, perl, python, ruby, Программирование В языках с автоматическим управлением памятью сборщик мусора удаляет объекты, когда они перестают быть доступными по ссылкам. Обычно это именно то, что нужно: объект существует, пока есть возможность к нему обратиться.
Иногда такое поведение не подходит. Например, программе понадобилось хранить некоторую вспомогательную информацию об экземплярах некоторого класса, но у вас нет возможности добавить в этот класс своё поле. В этом случае можно создать отображение, в котором ключом будет объект, а значением — вспомогательная информация.
Вот тут-то и начинаются проблемы. Поскольку отображение хранит ссылки на ключи, те объекты, к которым была привязана вспомогательная информация, перестают освобождаться из памяти. Если программа в процессе своей работы создаёт много объектов, память рано или поздно заканчивается.Читать полностью »
PyCon in Russia: let it be
2012-12-25 в 12:37, admin, рубрики: Conference, pycamp, pycon, python, Блог компании IT-People, Программирование, метки: conference, pycamp, pycon, python Не без волнения пишем этот пост — да, мы взялись за организацию первого в России PyCon. Если совсем кратко — то можно перейти на сайт PyCon.ru вся информация есть там. А под катом мы рассказываем, кто мы такие и почему собираемся всё провести именно так.
Читать полностью »
Играемся с изображениями в Python
2012-12-23 в 15:25, admin, рубрики: PIL, python, изображения, обработка изображений, метки: PIL, python, изображения, обработка изображений, рандом В этой статье я хотел бы разобрать различные способы преобразования изображений с помощью Python. Для примеров я решил взять несколько наиболее известных. В статье не будет ничего сложного, она ориентированна в основном на новичков.
Картинка для испытаний:
Подготовка
import random
from PIL import Image, ImageDraw #Подключим необходимые библиотеки.
mode = int(input('mode:')) #Считываем номер преобразования.
image = Image.open("temp.jpg") #Открываем изображение.
draw = ImageDraw.Draw(image) #Создаем инструмент для рисования.
width = image.size[0] #Определяем ширину.
height = image.size[1] #Определяем высоту.
pix = image.load() #Выгружаем значения пикселей.
Оттенки серого
Для получения этого преобразования необходимо «усреднить» каждый пиксел.
if (mode == 0):
for i in range(width):
for j in range(height):
a = pix[i, j][0]
b = pix[i, j][1]
c = pix[i, j][2]
S = (a + b + c) // 3
draw.point((i, j), (S, S, S))
Skype-бот для голосовых конференций
2012-12-22 в 19:21, admin, рубрики: python, skype, skypekit, метки: python, skype, skypekit
Вероятно, некоторые помнят сервис Skype Casts — публичные голосовые конференции, где каждый мог создать конференцию, которая анонсировалась на сайте skype.com. В 2008 году сервис был закрыт.
Сегодня единственная возможность хостить конференцию — держать запущенным Skype-клиент.
Это не удобно, потому как человек, который «держит» конференц-звонок не может принять входящий вызов, иначе конференция будет поставлена на удержание и никто в ней не сможет общаться. Если у хоста проблемы с интернетом — связь портится у всех.
К тому же хостить звонок в котором 10-15 участников существенно нагружает компьютер.
Мы пытались решить эту задачу держа запущенным Skype на Windows-сервере. Чтобы звонок не обрывался когда все участники кладут трубку — приходилось запускать две копии клиента и держать второго как участника конференции.
Но такая схема не очень стабильна, через 3-5 дней один из клиентов вылетает и звонок обрывается. Приходилось каждый переподнимать его вручную.
И вот наконец удалось найти стабльное и просто решение на основе skypekit позволяющие:
Постоянно держать звонок с помощью одной копии skypekit.
Если все участники конференции положили трубки, звонок перезапускается как /golive
Хостить бота на Linux-сервере без X-ов.
Десктопный клиент требует для запуска X-сервер. Skypekit можно запускать без него, даже на VPS.
Доступен под все платформы Windows/Linux/Mac
Управлять ботом через комманды в чате
Бот умеет разграничивать права доступа, различать комманды отправленные из основного чата конференции и из других чатов.
При желании можно написать аналог irc-шного eggdrop.
Пишем бота для игры «Найди отличие»
2012-12-21 в 19:41, admin, рубрики: PIL, python, игра, работа с изображениями, метки: PIL, python, игра, работа с изображениями
Не так давно я наткнулся на игру, в которую играл много лет назад. Я думаю, многие при поиске отличий ломали себе глаза долгое время. Сегодня я решил пройти её еще раз, но проходить её с 0 мне было, честно говоря, лень. Поэтому я решил написать себе помощника. Итак, начнем.
Писал я всё на python 2.7
Использовалась библиотека PIL
from PIL import Image, ImageDraw
Далее необходимо описать все функции и методы, которые мы будем использовать, для того, чтобы всем был понятен дальнейший код.
image1 = Image.open("1.jpg")
Так мы открываем нужный нам файл.
pix1 = image1.load()
Записываем в pix1 цвета всех пикселов картинки. Теперь по координате пикселя мы можем получить его цвет.
draw = ImageDraw.Draw(ANS)
Создание инструмента для рисования.
image1.size
Возвращает пару (ширина и высота картинки).
draw.ellipse((x1, y1, x2, y2), fill = "black")
Рисование чёрного элипса по заданным координатам.
ANS.save("ans.png", "PNG")
Сохранение изображения в формате PNG. Если не указан полный путь, то сохраняется в папку с исполняемой программой.
del draw
Удаление инструмента «draw».
Приступим к главному…
Читать полностью »