NIH-синдром

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

То, что это называется них-синдром, я узнал сегодня, случайно. Вот что пишет про это Джоел Спольски в 2001, а вот Джеймс Беннет, разработчик Django, тоже пишет про то, что когда-то их ругали за NIH, почем зря.

В общем-то, я стараюсь использовать чужие библиотеки, если они “живые”, даже пусть они и немного не доработаны.

RSS/Blogs и Wiki

Похоже на то, что RSS и блоги обесценивают ценную информацию. То есть, она “проходит” в них на том же уровне, что и не очень ценная информация. Часто приходится нажимать “mark all as read”.

Блог больше подходит для “анонсов” - чтобы поставить “якорь” - что такая информация есть и что найти её можно там-то. Либо, для коротких отчетов об экспериментах.

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

По этой причине перехожу на новый формат:

  • в блог: ссылки, анонсы, наброски, небольшие посты - сюда либо в английский
  • в вики: руководства, примеры и другие большие материалы - на rudi.05bit.com

И мозг мой будет спокоен :)

Я поражен

Elance.com для подтверждения номера сотового телефона звонит на сотовый и просит сказать код подтверждения голосом. Он его распознает и говорит ‘Thank you! Good Bye!’

Преобразование строк из/в Unicode

В дополнение к посту о funny characters.

Преобразование utf-8 в cp866 (в ASCII кодировку)

    >>> u'ы'.encode('cp866')
    '\xeb'

Преобразование cp866 в utf-8

    >>> 'ы'.decode('cp866')
    u'\u044b'

decode - декодирует последовательность байтов в юникод, encode - кодирует юникод в последовательность байтов. Последовательность байтов всегда должна интерпретироваться с учетом кодировки - в примере получаются последовательности байтов в кодировке cp866. :)

PS. А в Python 3 концепция работы с юникодом круче, как обещает документация :)

Cтрока (str) - всегда UTF-8, то есть действительно строка, в универсальной кодировке. А все остальное - последовательности байт bytes, про которые нужно знать, в какой они кодировке, если нужно их перевести в строку.

Опасаться funny characters

Предыстория

Во время написания iКучи я столкнулся с несовершенством мира. У меня появилась такая задача: по ссылке узнать title страницы. Теоретически, задача не сложная, но проявились нюансы, связанные с кодировками.

Чтобы сразу проверять работу парсера, я тестировал все в консоли. И иногда print вылетал с UnicodeEncodeError. Это явление известно как funny characters.

Пример

  • символ ‘ы’ имеет код U+044B
  • символ ‘©’ имеет код U+00A9
    >>> a = u'ы'
    >>> a
    u'\u044b'
    >>> b = u'\u00a9'
    >>> b
    u'\xa9'

Пробуем напечатать:

    >>> print a
    ы
    >>> print b
    ...
    UnicodeEncodeError: 'charmap' codec can't encode character u'\xa9' in position 0: character maps to <undefined>
    >>>

Пробуем сложить сроки и записать в файл:

    >>> f = open('test.txt', 'w')
    >>> f.write((a + b).encode('utf-8'))
    >>> f.close()

Работает!

Выводы

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

Вот здесь предлагается “вычищать” эти символы из текста: http://code.activestate.com/recipes/546517-accent2htmlcodepy-convert-accents-and-special-char

Но, похоже, что вычищать не совсем правильно, так как они проходят через encode без ошибок.

Почитать для знания

http://www.joelonsoftware.com/articles/Unicode.html http://www.stereoplex.com/2009/nov/8/python-unicode-and-unicodedecodeerror/

Kodoblog in English

Разные знания и премудрости отныне буду писать на английском здесь: http://kodoblog.05bit.com.

А на русском буду писать всякое разное о программинге и просто так :)

Контрибьюшн

В библиотеке django-treebeard есть теперь мой небольшой кусочек кода :) Я доволен :)

Кстати, я сначала прицепил к своему сниппету лицензию BSD, но когда Густаво посмотрел код и решил его внедрить к себе, то попросил поменять лицензию на Apache2 чтобы prevent a headaches. Я был конечно не против, но я думал, что эти лицензии разрешают все и совместимы поэтому. Оказывается, не совсем.

Nicedit wysiwyg

Обычно, wysiwyg - это какая-то боль. Зачем-то нужно качать 1 мегабайтовую библиотеку и получить 100 кнопок, а потом методично отключать 90% ненужного функционала. И все равно будет тормозить и глючить. Не люблю wysiwyg. :)

Nicedit мне понравился, по первому впечатлению. Весит 35 кб, кнопочек всего 16 и все компактно лежат в gif-ке размером 3 кб. Можно конфигурировать. Синтаксис для подключения - симпатичный.

Вот так например, можно подключить его на все textarea в Django:

<script type="text/javascript" src="{{ MEDIA_URL }}js/nicEdit.js"></script>
<script type="text/javascript">
bkLib.onDomLoaded(function() {
    nicEditors.allTextAreas({iconsPath : '{{ MEDIA_URL }}js/nicEditorIcons.gif'});
});
</script>

Nicedit wysiwyg: http://nicedit.com