К PEP 8!

PEP 8 это стандарт форматирования кода языка питон.

Придерживаться его желательно, так как во многих случаях код становится более понятным (и более простым!). Так сложилось, что сам (каюсь-каюсь) придерживался больше своего, внутреннего стандарта. Но случилось непоправимое. Появилось требование к проекту, что программный код должен строго соответствовать стандарту PEP 8.

Так как мой редактор gEdit не умеет подсвечивать ошибки в форматировании, пришлось искать какой-то сторонний модуль. И такой модуль есть: pep8. Работаю с ним так: в консоли пишем pep8 <имя_файла>. На экране видим все ошибки. Но можно посмотреть ошибки во всех файлах, написав pep8 *.py. Тогда будут видны все ошибки в файлах, что находятся в текущем каталоге.

Руками удалять лишние пробелы да запятые трудоемко. Поэтому можно воспользоваться автоматическим форматированием. Такую возможность предоставляет модуль autopep08. Работает отлично. Не умеет только обрабатывать ошибки в длине строки (длина строки должна быть 79 символов.) Я работал так: autopep8 <текущий_файл> > <новый_файл> . А дальше сравнивал и искал где у меня ошибки.

Новый вид спама в мессенжерах

Примерно с неделю назад каждые 3 дня через мейл.агент начали мне писать девушки. Незнакомые. В этом плохого ни чего нет, наоборот, приятно :-) . Первые 3 минуты. Затем, понимаешь, что собеседница отвечает немного невпопад. А в самом конце разговора говорит, что надо идти работать и дает ссылку на сайт а-ля «риальные 3к0мства для сekca». Пара примеров диалогов:

(13:53:37) mnastya208087: ты здесь?
(13:57:42) dicos: привет, да, я тут)
(13:57:58) mnastya208087: :) )
(13:58:42) dicos: Как-то я растерялся, не каждый день мне пишут красивые девушки из Москвы)
(13:58:59) mnastya208087: как жизнь?
(13:59:11) dicos: да ни чего, спасибо. Работаю вот(
(13:59:28) mnastya208087: А мне что-то печально — выходные кончились, приходтся на работу ходить
(14:00:06) dicos: а что ты так работу не любишь, она на тебя обидится и то же тебя любить не будет
(14:00:16) dicos: надо ею радоваться
(14:00:31) dicos: принесли гору отчетов, а ты спасибо, ура, как хорошо
(14:00:43) dicos: а внутри поубивал бы всех))))
mnastya208087: Я из Кусимово, это поселок городского типа, где-то посредине Московой и Питером . Но послезавтра еду к вам на неделю! В гости к однокласснице
(14:03:14) dicos: вот оно что. сразу скажу, у нас морозн
(14:03:17) dicos: *морозно
(14:03:34) mnastya208087: напиши мне что-нибудь веселое
(14:04:00) dicos: вчера хотел 5 пельмешков съесть.
(14:04:14) dicos: налил в кастрюлю воды, закипела. начал сыпать
(14:04:30) mnastya208087: :) )
(14:04:32) dicos: а пельмени как ломанулись из пакета, пришлось полкило съесть
(14:04:50) mnastya208087: эх! пора «к станку», ещё спишемся, ладно?
лови пока посмотреть
p r i k o l . t k убери пробелы
здесь мой сайтик, потом обсудим
(14:07:05) dicos: хера себе спамеры пошли о_О
(14:07:25) mnastya208087: с чего ты взял?! я просто хочу общаться с интересными людьми
(14:07:49) dicos: а p r i k o l . t k это ты к чему написала?
(14:08:06) mnastya208087: :) )

еще один диалог, на который попался уже мой товарищ:

[07:33:38] jamleiaevlil: Приветики!
[07:33:46] jivoy1988: Здравствуй.
[07:34:03] jamleiaevlil: как поживаешь?
[07:34:17] jivoy1988: Отлично. Как утебя дела? =)
[07:34:46] jamleiaevlil: ))))))))
[07:36:12] jivoy1988: Ты кто? =) Я тебя не знаю. Ты просто так написала?
[07:37:47] jamleiaevlil: Мы не знакомы, но но что мешает познакомиться ;)
[07:45:29] jivoy1988: Растояние…
[08:04:55] jamleiaevlil: А мне как-то грустно — праздники кончились, приходится торчать на работе
[08:13:24] jivoy1988: Ну… не грусти ;) А где работаешь?
[08:13:42] jamleiaevlil: работаю менеджером ничего интересного
[08:14:14] jivoy1988: Интересно =) А где? Каким менеджером?
[08:14:31] jamleiaevlil: напиши мне что-нибудь смешное
[08:14:59] jivoy1988: Йа криведко, без чувства юмора.
[08:15:16] jamleiaevlil: ))))))))
[08:15:20] jivoy1988: Из меня смешное приходится выдавливать силой =)
[08:15:37] jamleiaevlil: блин! работать нужно, до связи, ок?
лови пока посмотреть
p r i k o l . t k вырежи пробелы
здесь мой сайтик, завтра поболтаем
[08:15:48] jivoy1988: Охуеть.

В обоих диалогах вопросы спамера стандартные: приветствие, как поживаешь, небольшой рассказ о чем-нибудь веселом. То есть сделать такую программу можно минут за 5.  А вот ответы то же стандартные, но они стандартны для глупенькой девушки. Или как у программ-говорилок :-)

Спам очень необычный.

Простых спамеров мейл.ру может выявлять по таким признакам: слишком быстро задаются вопросы и ответы, все сообщения стандартные, или с небольшими изменениями.

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

Единственный способ отличить человека от бота, это спросить его. Я спрашиваю название красной планеты нашей солнечной системы.

Добавить rowspan, colspan в таблицу Reportlab

Reportlab — это библиотека для генерации pdf документов. Мне нужно было создать таблицу, несколько колонок которой были объединены. Гугл вразумительного ответа не смог дать, поэтому стал читать официальную документацию. Действительно, на 77 странице вполне себе написано. Попробую дать перевод (вольный):

Класс Table поддерживает объединение столбцов и строк, аналог в html — rowspan и colspan. Формат объединения такой:

SPAN, (sc,sr), (ec,er)

где sc, ec объединяемые колонки а sr, er объединяемые строки. Пример:

data = [['Top\nLeft', '', '02', '03', '04'],
       ['', '', '12', '13', '14'],
       ['20', '21', '22', 'Bottom\nRight', ''],
       ['30', '31', '32', '', '']]
 t = Table(data, style=[
                   ('GRID',(0,0),(-1,-1),0.5,colors.grey),
                   ('SPAN',(0,0),(1,1)),
                   ('SPAN',(-2,-2),(-1,-1)),
 ])
Top Left 02 03 04
12 13 14
20 21 22 Bottom Right
30 31 32

Полезные ссылки

http://www.network-theory.co.uk/docs/pytut/ — краткий справочник по базовым инструкциям и функциям. Такой же как http://docs.python.org/library/, только гораздо понятнее написано.

Линус Торнвальдс о C++

http://article.gmane.org/gmane.comp.version-control.git/57918

На странице опубликован ответ почему git написан на C а не на C++. Переводить полностью мне лень, поэтому напишу тезисы:

  • C хороший;
  • а C++ плохой;
  • и плохо портируется (как я понял, речь идет прежде всего о аппаратной платформе i386, i486, ARM и т.д.);
  • и сложен;

 

 

Установка PIL с поддержкой jpeg и freetype в virtualenv

Столкнулся с такой проблемой: даже если установлены пакеты libjpeg и libfreetype6-dev в конце компиляции PIL пишет такое безобразие:

*** TKINTER support not available
*** JPEG support not available
*** ZLIB (PNG/ZIP) support not available
*** FREETYPE2 support not available
— LITTLECMS support available Читать дальше »

Замена текста во многих файлах

Иногда требуется заменить текст на другой текст в нескольких файлах. Чтобы делать это автоматически использую такой скрипт:

find . -name \*html -print0 | xargs -0 sed ‘s%some_text%new_text%g’ -i

Он ищет фразу some_text в файла, названия которых оканчиваются на html и заменяет фразу some_text на new_text.

Эту штуку написал некто Liz с конференции linux@conference.jabber.ru. Спасибо ему огромное.

 

Установка egenix-mx-base под virtualenv

Несколько человек, в том числе и я столкнулись с проблемой, когда из-под виртуальной среды невозможно установить модуль egenix-mx-base. Читать дальше »

Субдомены в django

На сайте on-day.ru, понадобилось реализовать такую штуку: каждый город должен находиться на своем субдомене. Полезность этого нововведения пусть оценивает СЕО специалист (привет, Евгений!), тут опишу техническую сторону вопроса.

Какие требования:

  1. должна сохраниться легкость управления сайтом;
  2. простота реализации;
  3. при дальнейшем развитии сайта не должно быть проблем, связанных с архитектурой.

Какие варианты реализаций рассматривал:

  1. создать субдомены для каждого города, и для субдомена поставить свой движок сайта;
  2. средствами веб-сервера преобразовывать запросы с subdomain.on-day.ru на on-day.ru/subdomain/
  3. джангу надо научить работать с субдоменами

Достоинства/недостатки:

У первого способа основной недостаток в том, что придется вручную создавать, редактировать и удалять субдомены. То есть научить контент-менеджера работать с панелью управления DNS сервера, настраивать виртуальные хосты на веб-сервере. Достоинство вижу только одно: большая гибкость сайта(-ов).

Во втором способе мне не понравилась жесткая привязка к веб-серверу. То есть, сейчас использую веб-сервер апач. Если захочу заменить веб-сервер на nginx, придется разбираться с настройками преобразования URL-ов.

Как понял дорогой мой читатель, я выбрал третий вариант реализации. Мне нужен готовый модуль с хорошей документацией, поддержкой шаблонных тегов и очень гибкий в настройке. Все, что перепробовал перечислять не буду, я остановился на модуле django-hosts.

Как установить очень хорошо написано в документации. Сейчас я расскажу о его особенностях, вернее о том, что мне было не очевидно. Пусть у нас содержание файла hosts будет таким:

from django.conf import settings
from django_hosts import patterns, host

host_patterns = patterns('',
    host(r'www', settings.ROOT_URLCONF, name='www'),
    host(r'news', 'news.urls', name='news'),
    host(r'(\w+)', 'user.urls', name='user'),
)

а файл user/urls.py будет иметь вот такой код:

from django.conf.urls.defaults import patterns, url

urlpatterns = patterns('user.views',
url(r'^$', 'main_user', name='main_user'),
url(r'^(?P<slug>[^/]+)/$', 'news', name='news'),
)

Формат тега host_url такой: {% host_url название_url параметр1_вьюхи параметр2_вьюхи on название_хоста параметр_хоста1  %} Для примера, нам нужно вывести ссылки на последние новостей всех пользователей. Переменную last_news содержит в себе информацию о последней новости и создателе этой новости. Код шаблона будет таким:

{% load hosts %}

{% for news_item in last_news %}
<a href=»{% host_url news news_item.slug on user news.creator.name %}»>{{ news.name }}</a>
{% endfor %}

При использовании с пакетом django-debug-toolbar модуль django-hosts вел себя некорректно: не всегда понять какой хост от него требуют. Исправить этот косяк можно только отключив мидлварь debug_toolbar.middleware.DebugToolbarMiddleware. Об этом поведении отписался на своем недоанглийском разработчику. Если кто владеет английским гораздо лучше меня и объяснит автору что я имел ввиду, то буду очень признателен

Русские буквы в zip архивах, Ubuntu

Нужно установить доработанную версию архиватора zip.

Для начала нужно добавить репозиторий sudo apt-add-repository ppa:frol/zip-i18n
Потом сделать обновление системы sudo aptitude update && sudo aptitude safe-upgrade