Кодоблог

May 31

Передернуть экран

Обнаружили случайно стремный забавный глюк в Firefox 4. Если добавлять флешку динамически на страницу - при помощи js - используя тот же SWFObject, то она не сразу начинает отрисовываться. Причем иногда, а не всегда - очень мило с его стороны :)

Это не ошибка верстки. Это, видимо, оптимизация рендера в броузере.

Нашли workaround.

После добавления флешки:

/* seems a bug in FF4 with dynamycally added flash! */
if (navigator.userAgent.indexOf('Firefox/4') >= 0) {
    shakeScreen();
}

И функция.

function shakeScreen() {
    setTimeout('window.scrollBy(0, 1.0)', 50);
    setTimeout('window.scrollBy(0, -1.0)', 100);    
}

Это я назвал “передернуть экран”.

Dec 01

Django: Private File Upload and Serving

Jul 15

Python Spawning -

Ещё один способ запуска веб-приложений на Python. Очень элегантно и, как утверждается, не уступает по скорости связке Apache + mod_wsgi.

Spawning is a fast, easy to use, and flexible HTTP server for hosting python web applications which conform to the WSGI interface.

Jun 18

NIH-синдром

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

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

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

Jun 02

Zachary Voase, крутой парень, python, ruby, web development -

Прекрасно структурированный блог у него :) И вообще :) Ещё, он убрал комментарии из блога вообще - говорит, базар не любит разводить - пишите в почту :) За наводку - спасибо Ворушину.

RSS/Blogs и Wiki

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

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

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

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

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

May 31

Я поражен

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

May 25

iКуча, анонс итерации номер 2

May 22

Преобразование строк из/в 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.

Пример

    >>> 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/

May 18

=> rudi-src.05bit.com -

Все-таки, сменил адрес блога на тот, который хотел сделать с самого начала, но почему-то передумал :)

May 09

Kodoblog in English

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

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

Хостинг. Вопрос жизни -

Итоги прошедших 2-х лет в поиске хостинга написал в ЖЖ. Пока не настроил кросспостинг, да будет так.

Apr 07

Контрибьюшн

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

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

Mar 31

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