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

Переезд 3.0: Цифровой Океан (Digital Ocean)

Некоторое время назад на домашнем сервере был поднят сайт. Долго ли, коротко ли, постепенно сайт проиндексировался и Яндексом, и Гуглом и даже всевозможными заморскими Бингами и Асками, так что на сайт стали захаживать посетители. Не то что бы много,- пара сотен в день. Всё хорошо,- и постоянный адрес от провайдера домашнего интернета пожалован, и канал не то, чтобы тонкий,- но временами серверу стало плохеть временами, да так, что не только ssh отваливался, а и перезагружать стало надобно, да аж по питанию.

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

Вообщем,- выбран был самый простой тариф, да ось знакомая, да времени на развёртывание ушло около минуты. Удобный интерфейс, моментальное развёртывание образов,- рекомендую всем.

И да, вы можете прямо сейчас зарегистрироваться на Digital Ocean и получить скидку на 10$ 

Python: pip install pip

pip install pip
Иногда необходимо сделать не просто pip install <какой-то пакет>, а установить, например, определённую версию библиотеки. Чтобы не искать по всей сети, собрал несколько полезных рецептов:

Graphite: отправка данных из Yandex-Танк

Продолжаю коллекционировать интересные штуки про Graphite: вот например, опенсорсная утилита для автоматизированного нагрузочного тестирования Yandex-Tank, разработка программистов Yandex, как можно догадаться из названия, построен на Фантоме. С некоторых пор и в Яндекс-Танке появилась поддержка Graphite. Конфигурационный файл выгрузки позволяет настроить разные префиксы метрик для тестируемых серверов. Подробности по ссылкам внизу статьи. Ну и, чтобы два раза не вставать, немного про, собственно, Яндекс-Танк (вольный перевод Readme.md с гитхаба проекта и немного отсебятины):

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-редактором:

Операционные системы: Menuet OS

Menuet OS,- миниатюрная операционная система для 32-битных и 64-битных x86 систем, написанная на чистом ассемблере с нуля. Базовый дистрибутив помещается на дискету 1,44 Мб и, при этом, содержит графический интерфейс, редактор, компилятор, и всякое прочее, что нужно для дальнейшего программирования. Не базируется ни на каких стандартах Unix или POSIX.

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 кому-то может показаться непривычным, а кому-то наоборот,- слишком привычным и удобным. 

Система визуализации статистики Graphite: Общие сведения

Организовать сбор статистики,- это не просто, а очень просто. Надо только сначала определиться,- нужна ли именно статистика, или душа мечтает о волшебном аналитическом инструменте уровня Business Intelligence. Различия систем таких классов следующие: статистика,- это сбор, хранение и отображение значений заранее известных метрик заранее определённым способом, а BI,- это скорее поиск и извлечение значений и зависимостей из необработанных наборов данных по заранее неизвестным критериям.

Единороги: время летать

Логотип FlyByUnicorn
Вероятно, какие-то волшебные шестерёнки во вселенной повернулись особенным образом, а может быть это просто весна? Следом за Pyladies в сферу внимания попал сайт FlyByUnicorn,- целая биржа труда для девушек и женщин в сфере IT. Среди предложений,- позиции программистов на Python, Ruby, Android, iOS, веб-дизайн, иллюстраторы и менеджеры проектов и прочая и прочая и прочая. Одно из основных требований,- хороший английский язык. Девчонки, налетайте!

Python для Настоящих Леди

Международное сообщество питонисток PyLadies в лице его активистки и создательницы Lynn Root приглашают к ним присоединиться представительниц прекрасной половины человечества, испытывающих тягу к программированию на Python. 

Про себя пишут примерно так (ОВП,- очень вольный перевод):
Мы интернациональная группа наставников, помогающая женщинам становиться активными участниками и лидерами в сообществе питонистов. Наша миссия в продвижении, обучении и консультировании разобщённого сообщества с помощью пропаганды, обучения, участия в конференциях и подобных им событиях.
PyLadies также планируют создать сеть дружеской поддержки для женщин и помочь им влиться в Мир Большого Питона. 
Влиться в сообщество можно истинно питоньим способом,- поставив пакет pyladies. Молодцы девчонки.

Python: property object вместо значения

Не раз уже бывало, что при разработке на Python в какой-то части кода вместо значения интересующей переменной в дебаг-лог попадает сообщение вроде этого:
INFO src.wiki.views views.dispatch:123 'content': '<property object at 0x10ae22f70>'
То, что у получение значения content в этом классе реализовано через property,- и так понятно, но почему вылезает этот самый самый загадочный property object вместо значения? Всё не просто, а очень просто: во всех этих случаях была попытка получить значение из функции, обёрнутой в @property, но не из экземпляра класса, а из самого класса.

Такое происходит из-за того, что в Python всё является объектами, даже классы. Запрашивая свойство (property) у класса вместо экземпляра,- получаем запрошенное, но это не значение,- а сам метод, вложенный в объект property.

То есть,- что запросил,- то и получил. Просто надо быть внимательнее и избегать неудачных паттернов, при которых в принципе возможно использование переменной - класса вместо переменной - экземпляра.

Python: ElementTree и undefined entity

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

Инструмент вебмастера: Site Auditor

Периодически проверяю статус индексирования поисковиками в программе Site-Auditor, помимо разных полезных сведений на текущий момент там сохраняются данные предыдущих проверок. Яндекс.Метрика и Google Analytics показывают данные с заметным отставанием, иногда до нескольких дней, утилиты вебмастера (Яндекс.Вебмастер и Google Webmaster Tools) тоже не всегда показывают актуальные данные. И вот подумалось,- а что, если извлечь данные из Site Auditor и сохранить их в какую-то свою историческую базу, да хоть и в графит? На маке использую AIR версию, вот некоторые итоги изысканий:


  • Данные, полученные программой, сохраняются в формате Adobe Shared Object, расширение sol.
  • Расположение файлов зависит от операционной системы, путь можно узнать на сайте Site-Auditor в разделе FAQ
  • Для работы с такими файлами в Python есть модуль PyAMF, установить можно с помощью pip
  • Помимо pyamf случайно нашёл модуль python site-auditor, по описанию судя делает почти всё тоже самое, что и программа. 

Python: наследование и логирование

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

Страсти по CSV


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

Python: string.reverse()?

Самый короткий способ получить реверс строки (строка задом наперёд) в Python:

'hello world'[::-1]=='dlrow olleh'

Надо учить матчасть: Extended Slices

PyObjC: разработка на Python для Mac OS X

Разработка графических приложений для MacOSX на Python возможна: для желающих странного существует проект PyObjC, целью которого является предоставить мост между языками Python и Objective-C. Реализация моста должна быть полностью двухсторонней, что позволит программистам на Python использовать всю мощь различных тулкитов Objective-C и наоборот,- программистам на Objective-C использовать функционал, реализованный на Python. Самое главное,- что эта библиотека позволяет писать Cocoa GUI приложения для Mac OS X на чистом Python Python. На сайте проекта выложены примеры взаимодействия с компонентами Mac OS X, например с адресной книгой.

Это был маркетинг, а теперь грустная реальность:
  • крайняя версия датируется 2009 годом
  • часть API не реализована в принципе (например AddressBook Plugin API)
  • в части API реализованы не все методы
В остальном,- надо тестировать.

Уровни 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

Страсти вокруг du -h

В очередной раз столкнулся с нехваткой дискового пространства на тестовом Linux-сервере,- значит пора чистить конюшни, то есть разобрать, наконец, завалы дистрибутивов "на всякий случай", бэкапы поудалять и вообще.

Обычный способ,- посмотреть сколько места занимает каждая папочка начиная с рута, зайти в самые толстые, найти вредителей и уничтожить,- и так рекурсивно пока df -h не начнёт показывать приемлимые цифры. Но перфекционизму нет предела,- хочется "чтобы одной командой", да "отсортировать по размеру", да ещё и в человекочитаемом формает, т.е. занимаемое место показывать в Гига-\ Мега- \Кило- байтах. Поигрался с du -h и sort'ом: не вытанцовывается, полез гуглить.

Набрёл на прекрасный топик с кучей рекомендаций, начиная от улучшенной версии coreutils >= 7.5, в которой sort умеет сортировать выдаваемые du -h значения, заканчивая половыми извращениями в виде Python-овских скриптов или вставок awk или Perl в командной строке. Но самое изящное решение оказалось простым, как Unix:

du -scBM * | sort -rn

Показывает отсортированные по убыванию размера папки и файлы в текущей директории. Размер приводится в мегабайтах, чего, вообщем-то, вполне достаточно для оценки,- стоит ли в папке искать залежи мусора, или пусть живёт?