Уровни DEBUG

Надоело уже путаться какие уровни дебага какие типы сообщений пропускают. Протестировал на Python с использованием стандартного модуля 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

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

, , ,

Компиляторы Python


Для сборки кода на python в исполняемый файл можно воспользоваться одним из комиляторов:

Эти утилиты собирают все модули и файлы данных в один исполняемый (для данной операционной системы) файл, который может запускаться на любом компьютере без установленного Python'а.

Рамблер-Контакты

Рамблер-Контакты (окна программы)Пропустил новость, что в июле 2011 года появился новый IM-клиент "Рамблер-Контакты". Поддерживает протоколы Jabber, MMP (Mail.ru Agent), GoogleTalk, ICQ, умеет подключаться к FaceBook, вКонтакте, Яндекс.Онлайн и QIP. Сейчас (в ноябре 2011) всё ещё в статусе бета, оно и понятно,- при установке ругается на отсутствие прав, показывает какие-то каракули, однако устанавливается. После установки пытается запуститься и падает с грохотом. Ручной запуск удаётся,- однако,- для входа требуется логин на Рамблере, дальше не пошёл. Дизайн явно навеян макосью, но достаточно приятный, по крайней мере не такой кривой, как у мультифона.

Дождёмся стабильной версии?

, ,

МультиФон-Бизнес

МегаФон запустил коробочное решение программной АТС, подключенной к МультиФону, под названием МультиФон-Бизнес. Появился почему-то только в поволжском регионе, хотя решение из себя представляет причёсанный рашпилем Asterisk в виде дистрибутива Debian Linux'а c Аsterisk'ом, FreePBX и веб-интерфейсом для настройки. Из коробки умеет создавать внутреннюю нумерацию, подключать МультиФон-аккаунт в качестве внешнего транка, просматривать статистику и прочее разное. Осталось понять,- кому это надо? Вроде все, кто хотел, свои * уже настроили?

Python в микроконтроллере: p14p

На просторах интернета наткнулся на проект python-on-a-chip,- энтузиасты разрабатывают урезанную виртуальную машину (Virtual Machine, VM) Python с кодовым названием PyMite, которая сможет выполнять код Python на микроконтроллерах без участия какой-либо операционной системы. Читать далее...

,

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

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

Почему? Читать далее...

, ,

Промежуточные итоги

Смотрю статистику в Google Analitycs,- оказывается пропустил маленькое, но гордое событие: суточная посещаемость на сайте доросла до отметки 100+. В основном поисковый трафик, но есть и около 10% ссылочного трафика. Народ ищет разное, в основном про МультиФон, но есть и эcтеты, которых интересует обжим (распиновка) E1. В лидерах ключевых слов поискового трафика, как ни странно, не МультиФон, а PyScripter,- неплохой редактор (почти IDE ;-) для языка Python. Однако, для рефакторинга PyScripter не очень подходит, в последнее время начал иногда использовать IDE Eclipse с установленным PyDev. Если бы не лишний вес, пользовался бы эклипсом, хотя с рефакторингом там тоже не всегда всё хорошо. Но зато eclipse c PyDev понимает проекты для Django.

, ,

Apple Autoingestion.class и прокси

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

, ,

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

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

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

 
<?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(){
    # сделать что-нибудь перед уничтожением объекта
  }
}
?>
 

, ,