Обнаружили случайно стремный забавный глюк в 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);
}
Это я назвал “передернуть экран”.
Django: Private File Upload and Serving
Ещё один способ запуска веб-приложений на 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.
Каждый раз, приступая к нетривиальной задаче, я ощущаю приступ NIH-синдрома. Во-первых, иногда хочется попробовать сделать какой-то механизм самому. Во-вторых, очень часто меня не устраивает scope готовых решений - то есть, они берут на себя слишком много, или слишком мало.
То, что это называется них-синдром, я узнал сегодня, случайно. Вот что пишет про это Джоел Спольски в 2001, а вот Джеймс Беннет, разработчик Django, тоже пишет про то, что когда-то их ругали за NIH, почем зря.
В общем-то, я стараюсь использовать чужие библиотеки, если они “живые”, даже пусть они и немного не доработаны.
Zachary Voase, крутой парень, python, ruby, web development -
Прекрасно структурированный блог у него :) И вообще :) Ещё, он убрал комментарии из блога вообще - говорит, базар не любит разводить - пишите в почту :) За наводку - спасибо Ворушину.
Похоже на то, что RSS и блоги обесценивают ценную информацию. То есть, она “проходит” в них на том же уровне, что и не очень ценная информация. Часто приходится нажимать “mark all as read”.
Блог больше подходит для “анонсов” - чтобы поставить “якорь” - что такая информация есть и что найти её можно там-то. Либо, для коротких отчетов об экспериментах.
Но кристаллизировать информацию в блоге не получается - если информация в посте устарела или найдены ошибки, у автора почти нет мотивации исправлять старый пост :) Он лучше напишет новый для привлечения новых читателей.
По этой причине перехожу на новый формат:
И мозг мой будет спокоен :)
Elance.com для подтверждения номера сотового телефона звонит на сотовый и просит сказать код подтверждения голосом. Он его распознает и говорит ‘Thank you! Good Bye!’
В дополнение к посту о 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, про которые нужно знать, в какой они кодировке, если нужно их перевести в строку.
Во время написания 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/
Все-таки, сменил адрес блога на тот, который хотел сделать с самого начала, но почему-то передумал :)
Разные знания и премудрости отныне буду писать на английском здесь: http://kodoblog.05bit.com.
А на русском буду писать всякое разное о программинге и просто так :)
Итоги прошедших 2-х лет в поиске хостинга написал в ЖЖ. Пока не настроил кросспостинг, да будет так.
В библиотеке django-treebeard есть теперь мой небольшой кусочек кода :) Я доволен :)
Кстати, я сначала прицепил к своему сниппету лицензию BSD, но когда Густаво посмотрел код и решил его внедрить к себе, то попросил поменять лицензию на Apache2 чтобы prevent a headaches. Я был конечно не против, но я думал, что эти лицензии разрешают все и совместимы поэтому. Оказывается, не совсем.
Обычно, 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