Показаны сообщения с ярлыком программирование. Показать все сообщения
Показаны сообщения с ярлыком программирование. Показать все сообщения

NLG: Генерация текстовых описаний временных рядов

Задумался на тему практической реализации следующего алгоритма: имеется набор данных, например, временной ряд значений метрики в Graphite какого-либо процесса. Надо автоматически создать текст на естественном языке, описывающий имеющиеся данные в диапазоне с точки зрения уровня, видимых или незначительных изменений, трендов и так далее. Особенно интересно, если бы алгоритм позволял сравнить несколько временных рядов, показывая в получившемся описании различия в характере исходных данных. Краткие тезисы для дальнейших исследований:

Python: склеивание строк на этапе компиляции

В питоновской конференции на reddit.com один товарищ поделился интересной находкой:

оказывается некоторые операции Python выполняет ещё до реального запуска кода (или загрузки модуля), т.е. на этапе компиляции модуля. Простой пример:

>>> "a {0} " "c".format("b")
'a b c'
>>> "a {0} " + "c".format("b")
'a {0} c'

Конкатенация строк, разделённых пробелами, выполняется на этапе лексического анализа, а операция сложения,- на этапе выполнения.

Ссылки по теме:



Следите за границей

Несколько дней не мог найти блуждающую багу в программе на python: файл базы pdb (Pilot Database) при определённых условиях сохранялся неправильно. Везде, где только можно, вставил отладочные сообщений и assert'ы,- вроде всё правильно,- но не работает. Пришлось вооружаться HEX-редактором:

Micro-Python: ещё один встраиваемый Python

Micro Python Board prototype
Три года назад я писал про проект Python-on-a-chip (сокращённо p14p). За развитием проекта я не следил, хотя, как выяснилоcь,- следить было и не за чем,- проект был заброшен в том-же 2011 году, по крайне мере последние новости на сайте p14p датируются 2011 годом.
Но не всё потеряно: буквально вчера в почтовой рассылке python.org появился анонс проекта Micro-Python: поддерживается синтаксис Python-3.4, хотя в реализации есть отличия Micro-Python от CPython. Также присутствует специфика, например inline assembler.

Python: теперь и с синтаксисом Haskel

У некоторых питонистов есть и такая презабавная забава,- ругаться на синтаксис Python и предлагать всевозможные улучшения. Пользователь GitHub Pyos ушёл дальше всех, реализовав на Python проект Dogelang( сокращённо dg). Из описания на сайте следует, что dg,- это самостоятельный язык программирования, компилирующийся в байткод, примерно как Scala собирается в JVM. Кроме того, код на dg вполне работоспособен под PyPy. Что, по большому счёту значит, что dg, не больше и не меньше,- альтернативный синтаксис Python 3 (или Python3 из параллельного мира, как кому больше нравится). Ко всему прочему, это позволяет использовать все существующие и совместимые с 3-й версией языка Python библиотеки. Выглядит это примерно так:


import '/sys/stdin'

IOTools = subclass object where
  #: Compute the average line length of a file.
  #:
  #: avglen :: TextIOBase -> NoneType
  #:
  avglen = staticmethod $ fd ->
    lengths = list $ map len fd
    count   = len lengths
    total   = sum lengths
    print 'Average line length:' $ if
      count > 0 => total / count
      otherwise => 0

IOTools.avglen stdin

Конечно, синтаксис dg кому-то может показаться непривычным, а кому-то наоборот,- слишком привычным и удобным. 

Python: ElementTree и undefined entity

При разборе XML с помощью библиотеки ElementTree иногда возникает ошибка undefined entity, если исходный документ содержит сущности HTML, например  .  Бороться с этим можно разными способами: использовать (или подменять) тип документа в обявлении DTD, предварительно проходиться по исходному коду и заменять сущности на соответствующие символы Unicode. В Python3 самым коротким способом мне показалось использовать стандартный словарь сущностей из модуля html.entities:

Сравнить нельзя обновить

Ну, допустим, хочется сделать скрипт проверки и обновления какого либо файла из интернет. Хороший такой скрипт, чтобы лишней нагрузки на сервер не создавал, и лишний трафик не гонял. То есть, необходимо проверять обновление какого-либо ресурса по URL, и, при необходимости, загружать новую версию, или как-то по иначе отреагировать, письмо, например, послать. Тут на помощь приходят заголовки HTTP Last-Modified (в ответе сервера) и If-Modified-Since или If-Unmodified-Since(в запросе). При ближайшем рассмотрении оказывается, что значения в этих полях не имеет смысла из строкового приводить к типу datetime в принципе

Страсти по CSV


В приступе очередного скриптописания столнулся с адскими проблемами при работе с CSV. Входные данные просты до безобразия: взять данные из Excel, заметьте,- простые данные, 4 столбца безо всяких извращений вроде переводов строки внутри значений или внутренних кавычек,- переложить это в CSV, прочесть скриптом на python, преобразовать по алгоритму. Компот и второе (т.е. прочесть и преобразовать),- оказалось меньшим из зол, а вот CSV...

.Gadget: Никаких логов в консоли

Пара стандартных гаджетов-виджетов
 на рабочем столе Windows
Довелось тут делать gadget для Windows Sidebar. Дело оказалось нехитрое, но шибко геморройное, как и всё связанное с Internet Explorer. Краткую инструкцию можно найти по известному адресу или погуглить, информации в сети достаточно.

Вкратце: Gadget для Windows Sidebar представляет из себя HTML-страничку с небольшой дополнительной обвязкой в виде ресурсов (javascript, CSS, графика) и нескольких дополнительных файлов, которые помогают винде понять "что со всем этим делать". Внутри странички может работать уже упомянутый javascript (в том числе всевозможные jQuery и прочие библиотеки с небольшими ограничениями), можно делать ajax-заросы к внешним ресурсам (с учётом Access-Control-Allow-Origin на сервере, конечно), можно прикрутить несколько дополнительных страниц (выезжающая плашка ака flyout и страница настроек). Все эти файлы собираются в одну папку с именем, оканчивающимся на ".gadget" и подкладываются операционной системе. Операционной системе это кажется гаджетом, который можно разместить на рабочем столе (в Vista и Windows7) и быть от этого счастливым.

К сути истории: сам виджет я собирал и тестировал по максимуму на макинтоше и под хромом, решив адаптацию под Windows и IE делать после того, как будет дизайн и будет работать весь javascript. Работающий уже полностью (как казалось) виджет положил на машину с Windows.... и не получил вообще ничего, абсолютно пустая страница в том виде, в котором она есть после загрузки страницы и инициализации скриптов, но без результата выполнения хотя-бы одной функции. Это меня озадачило...

Процесс ошибок был долог, но конечный результат таков:
Несмотря на то, что console.log работает в IE9 с открытым окном "Средства разработчика F12",- не надо использовать console.log в виджетах, ибо в виджете console.log приводит к ошибкам. А ошибки в гаджете,- не отображаются как таковые.

Уровни DEBUG

Надоело уже путаться какие уровни дебага какие типы сообщений пропускают. Проверил на Python 2.x с использованием стандартного модуля logging, получается такая таблица:

Уровень сообщения в логе
Уровень лога  DEBUG   INFO   WARNING   ERROR   CRITICAL 
DEBUG
V
V
V
V
V
INFO
V
V
V
V
WARNING
V
V
V
ERROR
V
V
CRITICAL
V

Получается, что если хочется самый чистый лог,- ставим уровень в CRITICAL и видим только критичные события в логе. Надо чуть подробнее,- ставим ERROR, видим сообщения типа ERROR и CRITICAL, и так далее. Самый подробный уровень DEBUG показывает все типы сообщений от самых низкоуровневых DEBUG до CRITICAL. Почему-то у меня никак не уложится в голове, что INFO идёт сразу за DEBUG

СМИ: Слишком Много Информации

Прежде чем разрабатывать систему защиты системы, убедись, что система не работает против тебя. Очень часто, система авторизации возвращает слишком много информации в случае неуспешного логина. Например, в абстрактной системе (веб-сайт, или FTP-сервер или SIP-софтсвич) пытается авторизоваться злоумышленник, используя случайный логин vasya.pupkin и пароль 123456. Система ищет в списке пользователя vasya.pupkin и пытается сверить хеш пароля (вы же не храните пароли в базе данных открытом виде, правда?). Система быстро убеждается в том, что пользователя с таким именем не существует и отправляет ответ, что-то вроде “Invalid Username”(Неправильное имя пользователя) или “Username Does Not Exist”(Пользователь не найден). Вот Вам прекрасный пример принципа СМИ,- слишком много информации.

Почему?

Apple Autoingestion.class и прокси. Загрузка отчёта с помощью curl

Собираю статистику по загрузкам своих приложений из Apple AppStore. Яблочники не так давно выпустили утилиту для загрузки отчётов, да вот беда,- не работает эта утилита через прокси, а у моего сервера другого доступа, кроме как через корпоративный прокси-сервер и нет. Пробовал устанавливать переменные окружения HTTP_PROXY и FTP_PROXY,- не помогает.

Универсальный конструктор класса для PHP4 и PHP5

Редко приходится работать с PHP, но всё-же иногда приходится. Чуть не сошёл с ума в попытке найти ошибку в чужом коде. На тестовой системе всё летало, а на боевой,- пустая страница. Закономерно оказалось, что версии PHP на тестовом и боевом серверах разные, а в коде используются классы с объявленными конструкторами в стиле PHP5. PHP4 про то, что нужно вызывать метод __construct() в качестве конструктора ничего не знает, пришлось уговаривать ;-)

В самом общем случае вариант универсального конструктора класса (для 4-й и 5-й версии PHP) выглядит вот так:

class Foo{
# конструктор для всех версий
function __construct($arg){
# сделать что-нибудь при создании объекта
}
# конструктор для PHP < 5.0
function Foo($arg){
# сюда мы попадаем по умолчанию в ранних версиях PHP
if(version_compare(PHP_VERSION,"5.0.0","<")){
# вызываем конструктор
$this->__construct($arg);
# регистрируем деструктор
register_shutdown_function(array($this,"__destruct"));
}
}
# деструктор для всех версий
function __destruct(){
# сделать что-нибудь перед уничтожением объекта
}
}
?>

Colspan=100%

Много раз сталкивался с ситуацией, когда надо сделать ячейку таблицы, объединяющую все столбцы (например для подзаголовка группы строк или как footer для всей таблицы). Если наперёд знаешь сколько столбцов,- не проблема, есть стандартный атрибут colspan, указываешь количество объединяемых ячеек, например colspan="2", всё работает.

А если страница выводится скриптом и количество столбцов наперёд неизвестно? И нет возможности посчитать в шаблонизаторе? В последний раз такая задача возникла при использовании Django, там шаблоны очень удобные, но с математикой там туго, а писать собственный template tag или filter казалось излишеством. Выкручивался либо изменением шаблона (чтобы такое объединение ячеек вообще не было нужно) либо городил в коде дополнительный подсчёт количества столбцов, пока не надоело. А когда надоело,- полез гуглить.

Оказалось, что не я один "хочу странного", куча народу уже сталкивалась с такой-же проблемой. Пробуют добавлять в свойства таблицы colspan="all" или colspan="0", - не во всех браузерах работает. На stackoverflow нашлось решение,- рекомендуют писать colspan="100%".

Попробовал на доступных браузерах,- работает везде.

Linux в браузере

Буквально вчера (16 мая 2011 года) в интернете запустился проект jslinux (эмулятор PC с Linux на javascript в браузере) от уважаемого мужчины по имени Фабрис Беллар. Эмулятор для запуска Linux полностью написан на JavaScript. При входе на страницу отображается консоль, на которой начинается загрузка Linux с нуля до момента отображения рутовой консоли. В консоли работает куча стандартных команд, вплоть до компилятора TCC. И всё это работает прямо в браузере. Крутизна необыкновенная.

Подсказки в полях ввода - реализация placeholder на JQuery

Понадобилось сделать небольшую обёртку для полей ввода в HTML, чтобы по умолчанию в пустом поле стоял текст подсказки (ну например, "введите номер телефона"), при входе в поле строка очищалась, при выходе и пустом значении подсказка возвращалась, а если что-то введено,- значение оставалось.
Написал коротенькую функцию на javascript с использованием библиотеки JQuery. На вход подаётся объект JQuery и строка для подсказки, текст подсказки устанавливается в поле и применяется CSS класс "hint" для оформления подсказки.


XLWT - создание Excel в Python

Очередной квест про программирование на Python,- помимо потребности прочитать Excel из Python появилась необходимость создать файл Microsoft Excel. Оказалось, что для xlrd (чтение Excel) существует парный пакет xlwt,- для создания файлов. Пакет позволяет создавать файлы с несколькими вкладками (sheet), применять форматирование в ячейках, вставлять формулы и кучу других полезных вещей. Поддержка кодировок на уровне, для русского языка достаточно при инициализации файла (книги, workbook) указать требуемую кодировку:

book = xlwt.Workbook(encoding='cp1251')

Все строки будут прозрачно перекодированы при записи в ячейки, если, конечно, вы пишете на python в UTF-8.

Qt4: декомпиляция файла ресурсов rcc

Некоторое время ковырял файл ресурсов, получаемого с помощью компилятора ресурсов rcc (Qt4). При помощи исходников компилятора удалось восстановил для себя структуру файла, может быть кому-то понадобится.

Семейный бюджет

КошелёкДошли руки попробовать облачный Google Application Engine. Сделал на питоне простенькое приложение для учёта финансов.

Киллер-фича,- возможность совместной работы (например муж+жена) с общими деньгами.

Если кому надо,- пользуйтесь, вход по гугловскому аккаунту.

ef bb bf - ползёт разметка в Django

Столкнулся с необъяснимым на первый взгляд явлением,- на одной из страниц Django'вского приложения необъяснимо разваливалась разметка страницы. Только на одной. Смотрю исходник страницы,- на первый взгляд всё в порядке, только какая-то чёрточка странная и посторонняя в самом начале HTML кода. Причём эта самая необъяснимая чёрточка видна далеко не во всех редакторах. В попытке вяснить причину добрался аж до просмотра в HEX,- оказалось, что там целые 3 байта EF BB BF, а не чёрточка. Остальное дело техники: эти байты,- признак ByteOrderMark. Осталось просмотреть все шаблоны, из которых генерируется страница, поскольку BOM может быть в любом из файлов, даже вложенном. У меня оказалось, что BOM присутствует в файле шаблона аж на третьем уровне вложенности шаблонов. Не забывайте проверять, в каком формате сохраняете файлы