Сообщество Python
Лента блогов Python

Дизайнер-маньяк
Vurtseed, 19.03.2010В компанию занимающуюся созданием интернет стартапа на постоянную работу в долгосрочный проект требуется профессиональный дизайнер интерфейсов. Фанат своего дела и маниакальный перфекционист.
Требования:
- Опыт работы с дизайном веб-интерфейсов
- Понимание специфики отображения веб страниц
- Любовь к методичной проработке деталей и перфекционизм
- Наличие профессионального портфолио
- Знание всего необходимого программного обеспечения для комфортной реализации задуманного
- Наличие свежих идей и амбиций делать сайты которыми можно гордиться
Плюсами является знание иностранных языков, опыт работы с Flash
Обязанности:
- Разработка макетов страниц
- Создание прототипов интерфейсов
- Создание иллюстраций или координация работы иллюстраторов
- Превращать прототипы в конфетку
Условия работы:
- Офис в центре города
- Полный рабочий день
- Новый проект и перспективы роста
- Профессиональное общение с увлеченными людьми
- Достойная оплата труда
- Современный подход к управлению проектами
Контакты либо мои, либо Тараса Бездетного (048) 799-05-41, (063) 202-46-41, email: bezdetniy@iparkcorp.com
Мои контакты без труда найдете сами.
Всяким тупорылым нищебродам чтобы заткнуть их сраные глотки специально попросил возможность указывать, что под "достойной зарплатой" подразумевается сумма от 1.5k usd в месяц. Теперь можете рассказывать, что Одесса не стоит того чтобы сюда переехать.
Google Maps API vs API Яндекс.Карт
Alexander Solovyov, 15.03.2010Описанный в прошлом посте сервис Дислокации использовал с самого начала Яндекс.Карты как движок карт. Причин на то было несколько - я думал, что они будут распознавать адреса лучше, чем гуглевские; у них значительно лучше документация, чем у Мапии; нет вопросов с получением ключика к АПИ, в отличии от Визикома.
В результате я написал всë с их использованием, и в основном был доволен - в документации описано всë подробно, с кучей примеров. Всë работало, я был доволен. :)
Но мне предложили перейти на карты от гугля - у них значительно больше охват по территориям (геокодер знает о моëм родном Кривом Роге, в отличии от яндексового :), плюс они лучше распознают адреса (которые встречаются, как оказалось, в довольно стрëмном виде). Почему сервис не перешëл - я в принципе всë сделал и оно заработало - это отдельный вопрос: гугль ограничивает количество запросов к геокодеру в 15000 в день (это мало, текст со страницы адресов отделений ВТБ24 - 1500 строк) плюс ограничивает частоту запросов - 5 запросов в секунду уже перебор, два - обычно всë ок, но бывают траблы. Это по-моему неприемлемо, ждать пару минут, пока оно раздуплится. :)
Но в посте я хотел затронуть совсем другой вопрос - о разнице в АПИ. В
некоторых местах логичнее гугль: функция обработы результатов поиска адреса в
виде коллбека к геокодеру это явно более стандартный подход, чем использование
событий; в некоторых - яндекс: мне кажется более логичным на карту добавлять
оверлей (map.addOverlay(mark)), а не обратное (mark.setMap(map)).
Но проблема лежит глубже. Во-первых, документация АПИ у гугла значительно хуже - хуже структурирована, в некоторых местах приходилось догадываться экспериментально (не могу вспомнить, где), примеров меньше. Базовых возможностей (всякие крутые штуки типа прокладывания маршрутов я не щупал, но у яндекса они только для Москвы - минус серьëзный) тоже меньше - к примеру, внешний вид карты надо предопределять до создания карты. После того уже изменить ничего невозможно, в отличии от яндексовых карт - там всë на лету меняется без проблем.
Но самое плохое - это наличие абсолютно дурацких глюков. Например, если выключить панель навигации, панель зума исчезает сама и добавить еë невозможно. Если передвинуть панель зума направо, расположению элементов управления на карте сносит крышу и оно принимает очень странный вид - даже в примерах от гугля, где они показывают, как это клëво работает. :)
С другой стороны, центр Киева (на счëт других городов лень смотреть :) у Яндекса явно смещëн на юг - можно зайти на сайт и полюбоваться отрезанным севером. :) Но улица Мазепы у гугла отсутствует и это настораживает - не Путин ли покопался? :D
В общем и целом должен сказать, что бекенд у Google Maps лучше - у него куда более обширная база и (в большинстве случаев) лучше работающий геокодер. Зато у Яндекса лучше фронтенд - кроме всего прочего, увеличение региона, выделенного правой кнопкой мышки, меня просто прëт. :) А учитывая нечеловечность ограничителя геокодера у гугла, остаëтся ждать улучшений сервиса Яндекса. ;)
UPD. Надо, правда, сказать, что я совсем пропустил мимо глаз то, что я пользовался 3 версией API, которая еще находится в бета-тестировании, что несколько извиняет гугль. :)
Дислокации
Alexander Solovyov, 14.03.2010В жизни частенько приходится сталкиваться с тем, чтоб найти какое-то учреждение - например, ближайшее отделение банка. И обычно этот процесс связан с просмотром списка из кучи адресов и попыткой выудить глазами знакомые улицы - потому что проверить все эти адреса по карте не представляется возможным вообще.
Иногда у меня в голове появлялась мысль, что было бы хорошо это как-то поправить. :) И вот последний раз, как мне пришлось срочно искать отделение своего банка, я вернулся к ноуту и за пару часов набросал страничку, где можно ввести десяток адресов и получить картинку их размещения на карте - и увидеть визуально, куда податься. Встречайте - locations.in.ua.
Что клëво - оно совсем не требует работы мозга (или рук). Просто вставляете в поле ввода кусок текста, в котором встречаются строки с адресами, сервис немного зачищает их и пытается найти на карте. Те, что получилось найти, показывает на карте и помечает зелëным маркером; те, что не получилось - помечает красным маркером. Всë просто. :)
Для еще большего упрощения на страничке about можно найти букмарклет, который помогает даже не париться с копированием.
В общем-то это и всë, welcome. :) На сайте есть кнопка Feedback, где можно написать отзыв или оставить идею, если таковые появятся.
Перезагрузка блога
Alexander Solovyov, 07.03.2010Ну что, привет, в очередной раз на новый лад - я опять сменил себе движок блога. :) И на этот раз уже не очень важно, что это - потому что он просто генерирует статический сайт. ;)
Я даже пошëл на столь экстремальный шаг, как отсутствие комментариев - обдумав ситуацию, я понял, что пишу не ради комментариев, а ради того, чтоб поделиться с читателями мнением, новостью и т.п.
Надеюсь, что дизайн вам понравится, как нравится он мне - он достаточно ненапряжный и чистый. Единственное, что мне не нравится - это иконка, которая является ссылкой на блог в заголовке (третья справа). Заодно я планирую писать почаще (3 поста за последние полгода - это не очень клëво, да?), потому что это теперь сделать проще - все посты являются файлами в репозитории, которые без проблем можно обновлять в редакторе, не открывая никакого сайта.
В любом случае, как говорит Джереми Кларксон - hello and welcome! И прошу прощения, если старые посты вдруг оказались новыми в ваших фидридерах. :)
Lets go
Alexander Solovyov, 06.03.2010Первый пост в этот блог. Это уже вроде третий блог, не считая жж-шного, но два предыдущих как-то не прижились...
Ну посмотрим на этот.
UPD от 11.10.2007: импортировано в четвёртый блог, в первый раз запущенный 4-го апреля 2007 года. ;)
Зачётная шутка
Alexander Solovyov, 06.03.2010В последнем КВН была:
- Теперь уже русская традиция смотреть сериал "Не родись красивой" происходит от древней осетинской традиции не смотреть по сторонам, оставаться таким как есть, воу-воу.
;))))))
Оптимизация в питоне
Alexander Solovyov, 06.03.2010Есть тут у нас на сервере скрипт, который занимается относительно простым с виду делом - выводит в том формате, котором нам хочется, файлики в определённом каталоге. Ну чтоб качать их можно было. Написан был мной и Саней еще в марте, просто чтобы иметь возможность гибко управлять выводом - никакие реализации автоиндексов в различных веб-серверах никакой такой гибкости не обеспечивают. Ну написали - и он лежал себе, работал. Но вот несколько дней назад я окончательно разобрался с nginx'ом, сделал пару интересных штук, и понял, что и как нужно улучшить в скрипте. ;) Ну, нашёл его версию, работающую в FastCGI, всё завёл, запустили - и впустили на него реальных юзеров. ЛА поднялось до 3-4, а top писал, что питон отжирает 20-25% проца. Ну да, в принципе понятно - туда добавилось достаточно много функций, а также работа с БД - он имел право на более долгое исполнение... но не на торможение всей системы!
В общем, юзеров спихнули обратно, и я пошёл разбираться - первым делом отыскал советы по оптимизации, и начал их читать. Поубирал конкатенацию строк с помощью +, сделал всё через списки и .join.
В итоге - время исполнения скрипта на вывод одной из директорий (в которой много файлов) занимал целую секунду. Путём оптимизации с этой конкатенацией время стало 8 десятых - в принципе, 20% производительности - это неплохо... Но я просто задницей чуял где-то подвох. ;) И я таки нашёл его: взял и закомментировал функцию определения типа файла (да, эти самые image/jpeg и text/plain). Результат меня просто поразил: время исполнения снизилось до 3-5 сотых секунды! То есть практически в 20 раз...
Ну и на радостях я побежал смотреть другие директории: в корне оказалось 15 сотых, а вот в том месте, где было полтора десятка каталогов, время возросло (вот сейчас уже не уверен в точности чисел, лишь в их порядке) где-то до 45-60 сотых. Поразмышляв, я понял, что наверное просто сильно тормозят вызовы функции определения размера директории - а она у нас злая, определяет размер директории, пробегаясь по ней рекурсивно. Ну и, понятное дело, я решил переделать, чтоб эту функцию нужно было вызывать только 1 раз - а почитав те самые советы, убедился в этом. Переделал функцию так, что на входе получает список директорий, а на выходе отдаёт словарь с размерами - и время исполнения понизилось до 15 сотых. ;)
Вот так красиво скрипт ускорился во много раз. ;)
Text Editors
Alexander Solovyov, 06.03.2010Выбор текстового редактора - это однозначно очень напряжная штука.
Помню, когда-то давно, окончилось это где-то на первом курсе - я использовал Aditor, и был вполне доволен. Но как раз и отказался от него потому, что как раз начал в консольке рыться - на вииях, и начал использовать vim. Угу, некоторое время я его даже на своём компе в качестве дефолтного редактора держал, пока случайно не попал на EmEditor - и вот эта штука у меня прижилась надолго.
Примерно через год (несколько больше двух лет назад - в марте вроде это было) Хейз с Дымом заразили меня Емаксом. И до конца того семестра я точил и точил свой конфиг. ;) Отлично помню обмен удачными находками в конфигах, потраченными на это дело выходными, ну и так далее. ;) В результате получился довольно удобный конфиг, плюс на некоторое время прекратили своё существование (в качестве моих утилит, естественно ;) mutt и vim. Плюс пытался заменить EmEditor, который упорно сопротивлялся. ;)
После того произошло еще много чего, в том числе и полгода jed'а в никсах, но сейчас всё опять по-прежнему: vim в качестве редактора в консоли, EmEditor в качестве редактора по дефолту в винде и Emacs в качестве ньюсо/почточиталки - и, естественно, редактора.
Но у них у всех есть свои недостатки:
-
Emacs - ну тут понятно. Это был бы идеальный вариант, если бы он не весил в озухе туеву хучу мегов. Или хотя бы запускался быстро. Но - увы - оно толстое и прожорливое, что в качестве почитать почту катит - я его один раз запускаю, но в качестве редактора всяких конфигов и мелких файлов - аж никак.
-
vim - его модальность последнее время меня всё больше и больше достаёт. С одной стороны - удобно, что вроде как комбинации клавиш проще, с другой - я и так Емаксовые знаю неплохо, а Ctrl-K мне в виме не хватает. ;) А времени на редактирование уходит больше
-
EmEditor - это в принципе отдельная история, и он не подходит для редактирования конфигов (под никсами не работает ;), но его, похоже, тоже нужно менять.
И я, перещупав кучу редакторов, так и не смог найти такой, который бы понравился. :( Ну вот какой редактор в никсах есть, чтоб нормально работал со скринами, чтоб имел нормальные бинды, ну и был достаточно функционален в стиле "заменить всё в этом выделении"? Такое вообще реально?
Переключатель раскладки клавиатуры
Alexander Solovyov, 06.03.2010Обычно все для этого используют две различных комбинации - Alt+Shift или Ctrl+Shift. Я же, спасибо Линуху, уже года три использую в этом качестве кнопку Caps Lock.
Плюсов куча - во-первых, это всего одна кнопка, а не комбинация. Во-вторых, её никогда не нажмёшь случайно - как бывает, нажимается Ctrl+Shift, если хотел использовать какую-то комбинацию с этими кнопками, но передумал. В-третьих, она расположена удобнее для руки - на том самом частоиспользуемом среднем ряду.
В общем, с какой стороны ни глянь - сплошные плюсы. ;) Однако есть одна проблема - если в X11 это всё настраивается легко, то в винде - хрена, МС предоставила крайне малый набор хоткеев. :( Первое время я выкручивался с помощью Punto Switcher'а, у которого было два недостатка. Он толстый (до 8 метров в памяти) как для маленькой утилитки, и Shift+CapsLock в нём не переключали раскладку, а включали сам CapsLock. Что раздражало, конечно.
Однако с полтора года назад я наткнулся на маленькую, но очень полезную утилиту, которую как будто для меня и сделали. ;) Называется она lswitch, и делает всего одно необходимое действие - биндит переключение раскладки на произвольную клавишу. Ну и "lswitch 20" в автозагрузке убирает все проблемы. ;)
Да, натолкнул меня на мысль написать это всё - пост Ивана Сагалаева, который пишет, что для него индикатором является лампочка Капслока. К сожалению, в винде либо работает она, либо переключатель раскладки - да еще и сам виндовый индикатор раскладки бывает подглючивает, и перестаёт корректно отображать.
Спасает то, что я привык в любой программе возвращаться на английский. ;) Не то чтобы даже привык, а просто рефлекс такой развился - не знаю, от чего, но уже давненько оно такое. ;)
Так что вот - рекомендую использовать. Куда удобнее стандартных комбинаций.
Web servers
Alexander Solovyov, 06.03.2010Н-да... Однако nginx и lighttpd - нельзя сравнить. Конечно, у lighttpd есть поддержка cgi (что, в принципе, очень удобно и хорошо), однако во всём остальном (особенно учитывая, что у nginx'а наконец появился параметр weight для бэкендов) - nginx на голову выше. По стабильности, по удобству конфига и вообще по ощущениям (которым я склонен обычно доверять - ощущения кгамистости чего-то возникают не так часто, но обычно по делу) lighttpd куда более бестолковый.
В общем, хорошо что я знаю русский. ;) А то с нгинксом не смог бы разобраться. :]
P.S. Да и lighttpd имел лично для меня очень неприятный глючок.
zsh
Alexander Solovyov, 06.03.2010Несмотря на то, что большинство знакомых моих пользуются tcsh или bash, есть люди - и я среди них ;) - которые просто знают, что zsh лучше. ;)
Даже если не упоминать пресловутое автодополнение (его вроде в bash'е в третьей версии кардинально улучшили?) - есть куча вещей, которые существенно облегчают жизнь. К примеру, есть такая полезная команда which - вряд ли кто-то редко пользовался ей. ls -l `which ping` - не самая редкая комбинация. Но в zsh есть такая замечательная штука, как "=", и вся эта уродливая конструкция легко превращается в ls -l =ping.
Еще можно вспомнить про глобальные алиасы. То есть делается такая штука: alias -g C="| ccze -A" и получаем возможность намного короче смотреть расцвеченные логи: tail -f mainlog C.
Есть еще одна поражающая просто штука - дополнение команд по расширению. Типа такого: alias -s mp3=mpg123. Ну и при наборе test.mp3 запускается сразу его проигрывание. ;)
И - спасибо, напомнили мне - есть такая вещь, как zmv. Включается простым autoload -U zmv, а фичи просто невероятные. Грубо говоря - это просто переименовывалка по паттернам. Хелп можно заценить в первом комментарии. :-)
В общем, zsh рулит неимоверно. ;) Переходите.
P.S. На всякий случай - тут лежит мой конфиг.
Emacs
Alexander Solovyov, 06.03.2010Ясное дело, любой человек, который достаточно плотно общается с компами - ищет себе подходящий редактор. Но если у большинства людей эта проблема не стоит достаточно остро, у программистов вообще IDE обычно есть, то для никсового админа редактор - основной инструмент производства. И лидером у большинства из них является vim, который хоть и модальный, но зато после небольшого разбирательства очень простой и лёгкий (быстро запускающийся) редактор. Есть, конечно, некоторое количество отступников - которые используют, к примеру, joe (превед, Антонз ;), или там еще какой jed/nano/etc.
Особняком стоит Emacs, который создавался как инструмент для программиста - но в действительности он содержит столько удобных вещей, что является реально удобным инструментом. Раньше я его использовал в основном только как почтовый клиент да xml-редактор, а потом забросил - уж больно тяжко запускался. Но тут пришлось редактировать файлики с кодом, а нормальных редакторов на замену найти не могу (из лучшего - EmEditor и SCiTE, но они оба и в подмётки :)), потому достал емаксище с полки.
Ну и заодно зашёл на emacswiki.org, который, как оказалось, достаточно сильно обновился. Ну я и решил сюда позаписывать на всякий случай всякие удобные фичи.
Первым делом - переключалка буферов. Кинуть в load-path, и написать в конфиг такую вот фигню:
(require 'prh-bufsw)
(setq stesla-hated-buffer-regexps '("^ " "*Buffer" "^\\*trace" "^\\*tramp" "^\\*"))
(pc-bufsw::bind-keys [C-tab] [C-S-tab])
(pc-bufsw::bind-keys [f12] [f11])
(setq pc-bufsw::quite-time 1)
Переопределяю тут регулярное выражение, маскирующее лишние буферы (я себе убрал все, что начинаются на *), плюс биндятся стандартные по другим программам клавиши C-tab/C-S-tab и, для удобства, F11 и F12. Ну и ставится таймаут на время показывания списка буферов переключаемых в 1 секунду.
Вот с такой штукой в минибуфере будет появлятся список буферов (которые не попали под исключающие правила), среди которых будет выделен текущий выбранный.
Теперь немножко GnuServ'е. Это такая дрянь, которую я не знаю, где скачать, и у меня сильно дурной инет, для того чтобы выкладывать. Называется gnuserv.exe и gnuclientw.exe. Плюс gnuserv.el.
В .emacs пишется (require 'gnuserv), и Емакс запускается программой gnuclientw.exe. Теперь будет один емакс, а всё остальное - его фреймы. Что быстро. ;)
Плюс можно сделать так, чтоб не появлялось их большое количество, а всё открывалось в одном (первом) фрейме.
(defadvice server-find-file (before server-find-file-in-one-frame activate)
"Make sure that the selected frame is stored in `gnuserv-frame', and raised."
(setq gnuserv-frame (selected-frame))
(raise-frame))
(defadvice server-edit (before server-edit-in-one-frame activate)
"Make sure that the selected frame is stored in `gnuserv-frame', and lowered."
(setq gnuserv-frame (selected-frame))
(lower-frame))
Эти функции заодно и поднимают его окошко наверх, когда в каком-то тотале его повесишь на F4. И нажмёшь эту кнопку. ;)
Теперь - парочка полезных комбинаций клавиш.
- M-z - спрашивает символ, и удаляет до его первого появления в тексте дальше. С префиксом - удаляет до н-ного (соответственно, можно и до негативного - удалить назад).
- C-M-k - удаляет так сказать завершённую фразу. Ну, к примеру, от кавычки до соответствующей кавычки. Или от открывающей скобки до соответствующей ей закрывающей скобке.
- C-u M-! - вставляет результат исполнения шелл-команды в текущий буфер.
- C-u M-| - берёт выделенный регион как stdin для программы, и заменяет его её stdout'ом.
Всякая фигня, которую я написал, чтоб было веселее жить. ;)
;; kill current buffer
(defun prh:kill-current-buffer ()
(interactive)
(kill-buffer (current-buffer)))
(global-set-key (kbd "C-x w") 'prh:kill-current-buffer)
;; set right ;) font and maximizes
(defun prh:ajust-frame ()
"Ajusts current frame to display properties"
(interactive)
(set-default-font "-outline-Unifont-normal-r-normal-normal-16-120-96-96-c-*-*")
(w32-send-sys-command 61488))
(global-set-key [C-f12] 'prh:ajust-frame)
И собственно разные неочевидные фичи.
- Всякие замены при выделенном регионе производятся конкретно над ним.
Позже, может, еще допишу. Да и выложу конфиги + всякую всячину.
Установка django
Alexander Solovyov, 06.03.2010Попросили написать о том, как поставить django в WinXP. В принципе, достаточно простая вещь.
-
Поставить Python 2.4 (хотя, теперь уже наверное можно и 2.5 ставить? ;)
-
Скачать либо последний релиз, либо svn Django.
-
Реально есть два варианта действий.
-
Попроще:
setup.py install -
Как-то... приятней? ;) Просто скопировать поддиректорию django (оно выглядит часто как ../django/django/ :) в директорию $PYTHON/lib/site-packages. ($PYTHON - это там, где установлен Питон. Обычно
c:\program files\python24). Важный момент -djangoдолжно быть в любом случае с маленькой буквы. Python различает регистр букв даже в Windows.
-
-
Последний штрих - пойти в
Control Panel -> System -> Advanced -> Environment Variablesи там изменить (или добавить, если такой еще нету) переменнуюPATH- можно в пользовательских, можно в системных переменных. Там вписать$PYTHON\lib\site-packages\django\bin. Это делается для того, чтобы django-admin.py работал в любом месте системы, не требуя входа вот именно в эту директорию.
Собственно, после этих действий уже можно делать django-admin.py startproject TruSite. ;)
Если есть какие проблемы - ниже есть комментарии, в которых всё можно спросить. По мере решения каких-то траблов буду обновлять пост... (Если эти траблы таки у кого-то возникнут)
Грамотность
Alexander Solovyov, 06.03.2010Последнее время всё чаще замечаю, что чем безграмотнее человек - тем он бестолковее программирует, проектирует, пишет конфиги... Тем более дурацкие вопросы задаёт, тем сложнее после него разобраться, где что как и почему, и т.д.
Именно когда безграмотен, а никагда пытаецо кагто отжыгать, типотаво.
Учение - свет (с)
Alexander Solovyov, 06.03.2010Читаю и рыдаю. ;)
From: Odhiambo Washington
Subject: Re: [vexim] Unknown User
To: vexim mailing list
* On 02/11/06 09:36 +0000, Adam Sweet wrote:
| Alexander Solovyov wrote:
| > Ave, Mark Tinka.
| > According to your message:
| >
| >> I've tried working with the 'local_part_suffix = +* : -*' and
| >> 'local_part_suffix_optional' Exim directives, with no joy.
| >
| > Try 'local_part_suffix = +*' or delete local_part_* lines completely.
| >
|
| Is this change in the nightly snapshot?
It's in the default configure file!
Changing it in the default is not a good idea. It stops guys from ever
getting to learn about suffixes ;)
-Wash
Истории о Ходже Насреддине
Alexander Solovyov, 06.03.2010Однажды, когда Ходжа Hасреддин был муллой, люди попросили у него помолиться, чтобы Аллах послал дождь для хорошого урожая. Ходжа исправно молился, но дождя все не было. Hаконец, люди стали говорить, что молитвы нового муллы не доходят до Аллаха.
- Мои молитвы прекрасно доходят, - не выдержал как-то раз мулла Hасреддин, - просто, очевидно, на небесах проблемы с кодировкой.
Однажды Эмир заказал Ходже Hасреддину веб-сайт про свое паломничество в Мекку.
- Сделай побольше java-апплетов, - заявил он, - я обожаю java-апплеты!
- И я тоже, мой повелитель, - ответил Ходжа.
- Хотя, может, не стоит чересчур перегружать страничку, - подумав, сказал Эмир, - я считаю, что хорошего должно быть в меру.
- И я тоже, мой повелитель, - ответил Ходжа.
Эмир внимательно посмотрел на Ходжу и сказал:
- Мода на java-апплеты прошла. Я думаю, что один - два будет в самый раз.
- И я тоже, мой повелитель, - ответил Ходжа.
- Если ты сделаешь хоть один, я велю отрубить тебе голову! - заорал Эмир. - Я ненавижу java-апплеты!
- И я тоже, мой повелитель, - ответил Ходжа.
- Ты что, не имеешь собственного мнения? - возмутился Эмир. - То ты обожаешь java-апплеты, то ты их ненавидишь!
- Деньги мне платишь ты, а не java-апплеты, - пожал плечами Ходжа Hасреддин.
Однажды Ходжа Hасреддин поменял мечеть. Встретив его на базаре, мулла прежней мечети стал стыдить Hасреддина.
- Ты мудрый человек, - говорил он, - неужели ты думаешь, что из новой мечети твои молитвы к Аллаху будут доходить лучше?
- Многое зависит от провайдера, - улыбнулся Ходжа Hасреддин.
Однажды односельчане спросили Ходжу Hасреддина, почему он не сделает себе персональную страничку?
- Все очень просто, - ответил Ходжа, - когда у меня есть Благословение Аллаха, у меня нет "Front Page"...
- А когда есть "Front Page"? - спросили его.
- У кого есть "Front Page", у того не может быть Благословенья Аллаха... - ответил мудрый Ходжа.
И еще про грамотность
Alexander Solovyov, 06.03.2010Skive: Хотя, может быть, безграмотность это как расстегнутая ширинка, указывать на нее во всеуслышание тоже вроде хамства, нужно намеками или с глазу на глаз, тогда я не прав выше. Но я с трудом представляю себе ситуацию, когда обладатель этой ширинки в ответ на намек еще и достанет оттуда свое хозяйство, скажет: "Хамло!" и пойдет дальше, размахивая во все стороны. Под аплодисменты, причем.
The Pirate Bay
Alexander Solovyov, 06.03.2010...кросавчеги. ;) Я этого раньше как-то не видел.
P.S. Кому будет напряжно прочесть весь текст, читать со слов "instead of simply". ;)
LiLaLo
Alexander Solovyov, 06.03.2010Замечательная программа для записи того, что происходит в консоли. Заодно генерит потом HTML, чтобы можно было удобно посмотреть/показать.
5 баллов. ;)
P.S. Ей бы еще английский вариант описания...
Поворачиваемость
Alexander Solovyov, 06.03.2010Когда ты видишь дерево, о которое сейчас ударишься, - это называется недостаточная поворачиваемость. А вот когда только слышишь и чувствуешь - это избыточная. ;)
Django render_to_response
Alexander Solovyov, 06.03.2010Есть в Django одна очень часто используемая мной функция - шорткат render_to_response. По сути, её параметрами является имя темплейта и словарь передаваемых в него переменных. И вот переменные можно передать двумя путями. Либо явно указать его здесь в словаре, либо заставив рендерер использовать в качестве обработчика контекста класс django.template.RequestContext и в переменной TEMPLATE_CONTEXT_PROCESSORS в settings указав необходимые функции. Все переменные, которые вернут эти функции, будут видны в любом темплейте, который отрисовывается с помощью RequestContext'а.
И вот тут начинается куча лишнего кода. Потому что каждый вызов render_to_response начинает выглядеть так:
return render_to_response('cool/template.html',
{'people': people, 'things': things},
context_instance=RequestContext(request))
Меня реально очень раздражала необходимость писать каждый раз этот самый context_instance. И сегодня придумался декоратор, который делает всю нудную работу. :]
from django.shortcuts import render_to_response
from django.template import RequestContext
def render_to(tmpl):
def renderer(func):
def wrapper(request, *args, **kw):
output = func(request, *args, **kw)
if not isinstance(output, dict):
return output
return render_to_response(tmpl, output,
context_instance=RequestContext(request))
return wrapper
return renderer
Теперь отрисовывать всё можно с помощью декоратора:
@render_to('cool/template.html')
def view(request):
return {'people': people, 'things': things}
Если функция вернёт словарь - render_to обернёт его в render_to_response и отпустит на волю, а если что-то другое (к примеру, HttpResponse - перенаправление какое-нибудь) - то просто отпустит на волю. :] Для меня это оказалось очень удобным решением.
P.S. Ну и как водится, через минут 10 после всего я обнаружил, что в принципе изобрёл велосипед - вот тут уже есть подобный декоратор. Хотя мой велосипед просто проще. ;)
Bugatti
Alexander Solovyov, 06.03.2010Bugattis flooded European racetracks for almost two decades, winning more races than any other marque. But in those instances when Bugatti went head-to-head with Alfa, Bugatti usually lost.
The P2 quickly dominated racing and continued to be competitive over a period of six years. The Type 35 Bugatti also dates from 1924, but in virtually every instance where the Alfa and Bugatti raced together, the Alfa won.
Korn - UNplugged
Alexander Solovyov, 06.03.2010В большинстве случаев я слушаю вообще довольно тяжёлую музыку (преобладающее направление - industrial metal/rock, но походу даже до death-metal и metalcore'а дохожу), и среди неё обретается в том числе и Korn (http://www.last.fm/user/p1r4nh4/) - особенно после выхода последнего альбома, See You on the Other Side (они значительно уклонились с музыкой в ту сторону, которая мне как раз и нравится ;)).
И в то же время мне часто нравятся акустические обработки знакомых песен - в большинстве случаев, если она хороша, она не рушит всей идеи смешения жанров (а гитары/пианино сочетаются точно так же интересно, как электрогитары/синтезатор), и выходят очень интересные песни. К сожалению, хороших попадается не так уж и много.
Но вот этот самый UNplugged - это просто что-то с чем-то! Это акустический альбом, в котором песни стали лучше! Причём те песни, которые я у Korn'а изначально не очень люблю (в основном то, что с ранних альбомов пришло - Blind и иже с ним) звучат просто невероятно!
Достаточно вообще просто прочитать список инструментов:
- Две виолончели
- Два чимбассо (cimbasso, духовой инструмент такой)
- Два тромбона (бас и контрабас)
- Хоровые колокольчики (хм, я ничего не напутал? ;))
- Пианино
- Шесть человек, играющих на тайко (японские барабанщики, хе-хе)
- Музыкальная пила (поразительно, а? ;)
- Стеклянная гармоника (я с подбора инструментов в осадок просто выпадаю :)))
Ну и гитар великое разнообразие. ;)
Всё это вместе звучит просто невероятно. [Слушать](http://thepiratebay.org/tor/3629390/Korn_-Unplugged(2007), слушать и еще раз слушать! Песни усложнились порядочно. Даже если учитывать то, что, видимо, Корн со временем взрослеет, и последние альбомы сложнее первых музыкально, тут всё равно прям резкий прыжок.
P.S. Lossless пока не нашёл. Буду рад, если вдруг кто-то найдёт.
iTunes
Alexander Solovyov, 06.03.2010Попробовал в очередной раз (уже 7.0). В очередной же раз убедился в совершеннейшей неюзабельности сего продукта для нормального человека. Глобальные хоткеи - отсутствуют, а посторонние программы глючат и работают бестолково в большинстве случаев. Интерфейс достаточно тяжёлый, чтоб тормозить на неплохих компах. Масстаггера нету, переименовывальщика - тоже.
Мне вот интересно - есть ли жизнь на Mac OS X? Или там все такие неприхотливые, что пользуются этим монстром? Честное слово, не лучше WMP.
Django newforms
Alexander Solovyov, 06.03.2010Сама по себе Джанга замечательна именно тем, что многие, очень многие вещи в ней делать намного проще, чем где-либо ещё. То есть практически любой компонент сделан так, что использовать его невероятно удобно. Но вот обработка форм (в Джанге ею занимались так называемые манипуляторы) была... не слишком удобная для меня лично. ;-)
И где-то примерно в январе в trunk'е Джанги появилась новая подсистема - newforms. Она позволяет многие вещи упростить очень сильно, и она сделана именно в духе самого фреймворка в том смысле, что она действительно проще и удобнее чего-либо другого. Самая большая проблема новых формочек ;) заключается в том, что документации как таковой по ней не было вообще - только доктесты (хотя они были достаточно хорошо написаны, чтобы понять начала пользования системой).
Чуть погодя появилась документация, которая толком не давала хороших примеров работы с newforms, и я в это время большинство форм (которые у меня не получались достаточно простые, чтобы можно было легко применить form_for_model/form_for_instance, которые генерируют форму из модели автоматом) делал руками. Чуть позже я узнал (из форумов и исходников Джанги), каким образом можно с помощью form_for_model создать такую форму, которая не полностью повторяет модель (сначала callback_function, а вот не так давно добавили параметр fields).
Но вот недавно с помощью форумов softwaremaniacs.org и тех самых исходников Джанги я-таки разобрался с созданием довольно сложных форм (когда нужно создать модель со ссылкой на текущего залогинившегося пользователя). Чтобы долго не распинаться, просто покажу код:
BaseRoomForm = forms.form_for_model(Room,
fields=('name', 'description', 'image', 'products'))
class RoomForm(BaseRoomForm):
def __init__(self, user, *args, **kwargs):
super(RoomForm, self).__init__(*args, **kwargs)
self.fields['image'] = forms.Field(label=u'Image', widget=forms.FileInput())
self.user = user
def save(self):
room = forms.save_instance(self, Room(user=self.user),
fields=('name', 'description', 'products'))
room.save_image_file(self.cleaned_data['image']['filename'],
self.cleaned_data['image']['content'])
return room
Вот так вот замечательно можно наследоваться от формы, созданной с помощью form_for_model. :) Спасибо Ивану за подсказку. :)
Собственно, основная штука здесь - это save_instance. Ему надо передать инстанс, который будет сохраняться - а так как в данном случае происходит создание, то вот я и передаю новосозданный объект. :) fields я передаю, чтоб избежать передачи картинки в save_instance - он их ещё нормально обрабатывать не умеет. Вызов этой формы происходит примерно так:
if request.POST:
data = request.POST.copy()
data.update(request.FILES)
form = RoomForm(request.user, data)
if form.is_valid():
room = form.save()
else:
form = RoomForm(request.user)
Тут, конечно, надо учитывать, что форма непроста ещё и тем, что картинка передаётся. Без неё всё было бы проще (просто form = RoomForm(request.user, request.POST)). Возникает только один вопрос - таким ведь образом form_for_instance никак не используешь. Тут нужно просто заменить процесс создания формы form = RoomForm(request.user) на form = RoomForm(request.user, initial=room.__dict__) - передать начальные значения.
Хотелось бы ещё отметить одну штуку, которую сегодня нашёл Илья - если в модели есть ForeignKey, то form_for_model абсолютно корректно для него создаёт SelectBox, корректно заполняет его значениями, но не устанавливает стартовое значение, которое передаётся в initial. Решение довольно простое, но с одной загвоздкой - нужно в init класса установить initial нужного поля из набора base_fields в id. Т.е., если бы пользователя можно было бы выбирать, получилось бы что-то вроде этого:
self.base_fields['user'].initial = room.user.id
Я так до конца и не разобрался, почему оно не ловит само и почему никак не помогает установка initial в fields['user']. :)
Вот так вкратце и обстоят дела. Есть, конечно, некоторые недочёты и недоработки, однако в общем это всё невероятно облегчает мне жизнь. Чего и всем остальным желаю! :)
Emacs tabbar
Alexander Solovyov, 06.03.2010Какое-то время назад я писал про то, как я переключаю буферы в Emacs'е. Но в конце-концов меня задолбало отсутствие табов и я решил поставить и разобраться в таббаре (я его раньше ставил, но он раздражал своим внешним видом и странным поведением :)).
Самая неочевидная штука заключается в том, что брать его надо однозначно из CVS, потому что файлик, который лежит в виде релиза на SF, просто-напросто на 3 года старше CVS'ового.
Ну а дальше всё оказалось просто - надо его кинуть в диру к остальным *.el, и немного поднастроить под себя. Немного - у нового поведение в разбрасывании табов по группам куда более адекватное, чем у старого - он их раскидывает по основному режиму, что при редактировании в основном Питоновских файлов удобно - не приходится лазить по остальным, ненужным, буферам.
Вот настройки:
;;;;;;;;;
;; Tabbar
(require 'tabbar)
(global-set-key [C-S-tab] 'tabbar-backward-tab)
(global-set-key [C-tab] 'tabbar-forward-tab)
(set-face-foreground 'tabbar-default "LightSteelBlue")
(set-face-background 'tabbar-default "DarkSlateGray")
(set-face-foreground 'tabbar-selected "pale green")
(set-face-bold-p 'tabbar-selected t)
(set-face-attribute 'tabbar-button nil :box '(:line-width 1 :color "gray72"))
(setq tabbar-buffer-groups-function
(lambda ()
(list
(cond
((find (aref (buffer-name (current-buffer)) 0) " *") "*")
(t "All Buffers"))
)))
(tabbar-mode)
;; tabbar end
;;;;;;;;;;;;;
tabbar-buffer-groups-function - раскидывает все буферы по двум группам: все, начинающиеся с пробела или астериска - в *, остальные - в All buffers. За функцию спасибо Хейзу, потому что я сам не осилил написать. ;)
Ну а тут лежит весь мой .emacs.
UPD. Функция группировки, конечно, порядочно усовершенствовалась со времени написания этого поста...
Сложность языка
Alexander Solovyov, 06.03.2010Чем дальше, тем больше я сталкиваюсь с английским (а понемногу и с другими иностранными) языком. И вот у этого самого английского есть одна очень заметная штука - он заметно проще русского (ну с чем я ещё могу сравнивать? ;)). Рассуждать можно много, об исключениях (которые в английском - правило :)), о системе построения предложений (которая в английском в разы проще, чем в русском - аналитический он, что скажешь) и так далее, но одного нельзя отрицать - он проще. У него (упс, могу быть неправ, но доказательств неправоты не вижу) заметно меньше словарный запас. Нет, ну конечно, берём профессиональный словарь - и всё ок, но я имею в виду именно общеупотребительные слова.
Слов меньше, предложения строить проще, слова не изменяются, и т.п., и т.д.
Некоторое время назад у меня родилась мысль, почему так. Англия - это пикты, которых вытесняли (успешно) кельты (и, соответственно, как-то общались, причём наверняка, как доминирующее население, насаждали свой язык, который пиктам давался тяжело - они его упрощали), которых прогнали юты, саксы и англы (которые, хоть и родственные племена, но всё же как-то различались - наверняка по языку тоже, а общаться-то надо было), которых через полтыщи лет начали ассимилировать норманны (и опять насаждение языка). Это ещё не всё, но этого достаточно - каждый раз завоеватели (которых было много) оказывались сильнее (может сильнее не каждый раз, но достаточно и оказавшихся), и в какой-то степени ко всему населению применялся язык завоевателей - а население, как толпа иноязычников, упрощала его для разговора.
Тот же русский со времён начала формирования языка (ну я не знаю, что взять за точку отсчёта - точно раньше основания Киева, ну скажем 2-5 вв. н.э.) завоеванию подвергался только со стороны монголов, которые на территории самой страны свой язык не внедряли, и вообще оказался порядочно изолированным от других языков (ну в Европе-то мужи путешествовали между странами как хотели, а по Московии - ни разу). Так что даже если он изменялся, то в большей степени просто преображался, чем упрощался. Самое сильно упрощение - это большевики, которые упразднили кучу букв, потому не приходится тут думать, как слово "писать" писать правильнее - "писать" или "пісать". Я думаю, что никаких проблем у меня лично это не вызывало бы, если бы я с детства таким пользовался, но это однозначно сложнее.
Сейчас обратил внимание, что из украинского-то никаких ятей и еров не убирали, так что наверное он слегка больше русского упростился в процессе развития - те же поляки вполне сильно влияние оказали (хотя они и больше на западе, чем в Полтаве - откуда взят стандарт литературного украинского языка, но всё же влияние-то было), хоть и не такое разрушительное (на сложность языка), как на английский.
Кстати, читал Википедию - это количество заимствованных слов (к примеру, из норманно-французского) как раз и есть следствие всех этих завоеваний. В общем, норманны язык не сменили, но покоцали изрядно.
UPD. Чтоб не показалось моё отношение к русскому фанатичным, вот ссылочка о латинском. В моей голове роются мысли о поиске курсов латыни. :)
Апдейт
Alexander Solovyov, 06.03.2010Что-то забросил я этот блог.
За последние два дня таки взялся и проапдейтил софт: теперь всё работает под последним транком Django (и последним же pytils ;), поубирал разные нестыковки в коде, причесал его (всё же за последние четыре месяца мой взгляд на то, как и что должно быть сделано, поменялся - да и Джанга на месте не стоит).
Теперь в планах прикрутить openid, который был бы привязан к стандартной модели пользователя Джанги, построить комментарии тредами (а вот этого я никогда не делал, придётся что-то читать - не знаю, в какую сторону смотреть) и приделать теги. Ну а тогда уже можно и опенсорсить. :)
Правда, никак у меня не получается сделать blog отдельным аппликейшеном... Т.е. таким, которому бы ничего не было нужно, чтоб можно было просто взять и встроить его куда угодно. Функциональность основная в нём, но вкусные фичи все вокруг (регистрация пользователей - никуда не денешься, тот же опенид, типографика и рутилсы). А, ну и ничего. :)
Markdown
Alexander Solovyov, 06.03.2010Совсем забыл написать - естественно, в комментариях можно использовать маркдаун. :)
Светлое будущее
Alexander Solovyov, 06.03.2010Пятница вечер и суббота утро - отличная вещь. Именно она мне позволила сделать иерархические комментарии и фиды ко всему, чему надо.
На очереди OpenID и теги! :)
Таги
Alexander Solovyov, 06.03.2010Когда я впервые употребил при Поле (мой CTO) слово "тег", он меня поправил и сказал "таг". Но я всё никак не могу привыкнуть и начать его произносить. :-( Однако ж написать его намного проще - больше времени на контролирование себя (ну и плюс бекспейс спасает :-)).
Это я к тому, что я прикрутил таги к блогу. Ещё без облака, которое конечно будет, но пока мне непонятно в каком виде оно впишется в стиль (не хочу добавлять боковые панели однозначно).
Для тагов было использовано творение Джонатана Бучанана django-tagging, за которое я ему весьма признателен (правда, пришлось немного подточить generic view оттуда, ну да я патч заслал - надеюсь, примет).
Вот, так что продвигается всё достаточно живо. :) Надеюсь завтра сделать OpenID (сегодня забил, потому как не могу применить патч один на винде, было лень разбираться) и таки морду для добавления поста (всё же джанговая админка не слишком для этого приспособлена).
Редактирование комментариев
Alexander Solovyov, 06.03.2010Отлично, к концу дня стало возможным редактирование комментариев. Итого из возможностей нормального блога сейчас не хватает только pingback'ов.
Если меня случайно не пробьёт в какой-то из вечеров заняться, то придётся ждать пару недель до реализации... потому что на следующих двух обоймах выходных свободного времени не намечается совершенно.
Но на самом деле и так уже неплохо довольно. :]
P.S. Ещё внёс в планы написание переносилки из Wordpress'а. И мне полезно будет, и вдруг кому-то таки захочется переехать... :)
jQuery
Alexander Solovyov, 06.03.2010JavaScript - это такая злая и непонятная мне штука, и только jQuery помогает мне его побороть. Без этого фреймворка я бы просто забил бы, наверное, на все аяксовые и джавоскриптовые примочки, потому что мне самому дзен такой дряни не даётся ни в какую. :)
Поддержка OpenID
Alexander Solovyov, 06.03.2010Что-то меня прям пробило на код. :-) 4 месяца ничего не трогал, а за последние два дня прям сделал выше всяких норм. :-) В общем, OpenID работает. Причём он привязан к собственной джанговой системе аутентификации.
При логине с новым опенидом предлагается либо создать нового пользователя, либо привязать этот опенид к существующему пользователю (только введя пароль, иначе никак :)). К одному пользователю, что естественно и удобно, может быть привязано несколько OpenID'шных аккаунтов.
При том же первом логине сервер просит у провайдера опенида никнейм и мыло пользователя, а если не отдаёт - пытается угадать его (ну, угадывание достаточно тупое - он просто берёт первую часть имени домена опенида, сделано это как воркэраунд для ЖЖ, которая не отдаёт ни под каким видом ничего).
P.S. Сама поддержка OpenID - это django-openidconsumer Саймона Виллисона с патчем Benoit'а Chesneau (ух, затрудняюсь это на русском написать ;))
P.P.S. Если будут замечены глюки или баги, просьба отписать в комментариях или создать новый тикет в траке.
Изменения
Alexander Solovyov, 06.03.2010Хе-хе, вчера написал вечером про то, что комментарии можно редактировать, изменения в репозиторий закоммитил, а обновить блог - забыл. :) Теперь всё на месте и работает.
Только, правда, оно как-то не слишком быстро меняет на текстареа и обратно. Это похоже потому, что текстовое поле создаётся (и убирается) после AJAX-запроса... Не представляю, можно ли ускорить. А ещё немного анноит то, что я не знаю, как создать текстовое поле высотой ровно в комментарий, чтоб не слишком изменялась высота страницы - вот эта штука меня слегка напрягает. :)
Ссылочка
Alexander Solovyov, 06.03.2010Добавил в меню сверху ссылочку, чтобы было понятно, куда идти в случае жажды увидеть исходный код и когда я его закоммитил. И вообще куда можно написать баг-репорт или пожелание (я таки понемногу начинаю надеяться, что не только я буду использовать эту штуку :)).
Плюшки
Alexander Solovyov, 06.03.2010Вечер, естественно, таким продуктивным, как два целых выходных, быть не мог, но всё же немножко добавилось - во-первых, толковое отображение того, где просматривающий сейчас находится (архив он смотрит или отфильтровал по тагу), и, во-вторых, фиды по тагу.
Теперь есть 4 вида фидов (вообще 3, но, я думаю, их корректно будет разделить на четыре):
- все посты
- все комментарии
- комментарии на определённый пост
- посты по определенному тегу (чёрт, сложно себя заставить писать "таг" ;))
P.S. Итого из необходимых фич - имеется в виду внешняя морда, админку и импорт из вордпресса оставляя за бортом - остался только pingback, или я что-то пропустил может? Хотя, надо его толком перевести. А то он у меня наполовину русский, а наполовину - английский.
Django queryset refactoring
Alexander Solovyov, 06.03.2010Адриан сегодня написал в рассылку, что хочет ускорить проведение рефакторинга QuerySet'a! Так что есть надежда, что в джанговом ORM'е скоро появится group by и прочие вкусные штуки. :)
KMFDM
Alexander Solovyov, 06.03.2010Одна из немногих групп, которые растут с каждым альбомом, ИМХО. Как началось в '92 всё с Money, так до этого момента музыка как минимум не падала в качестве, а так и поднималась.
Огромной художественной ценности, в силу отсутствия каких-то сложных запилов или выкрутасов, я не вижу (а, впрочем, большинство слушаемой мною музыки слушается не за свою паранормальную сложность), но в целом музыка отличная. Жаль, не получается сейчас подобрать слов, но действительно очень нравится. Ну а слова традиционно для них - всё отлично, и не забыли песенку "о себе". ;)
The one unparalleled germanizer вернулся с отличнейшим альбомом. Res ipsa loquitur. 5 из 5 за альбом. Почему Раммштайн так не может?
Pingback client
Alexander Solovyov, 06.03.2010Ну, вот вроде и внедрил клиента pingback'а себе в блог. Реализацию, естественно, спёр из Cicero. :) Вот сейчас попробую послать его сам себе. Правда, там (в Cicero) он был жестко привязан к модели данных, а я немного его подточил, чтоб он был конфигурируемым (и можно было его вешать через сигналы). По-моему, достаточно приятно получилось. :)
Pingback server
Alexander Solovyov, 06.03.2010Фух, наконец-то сделал я его. Если говорить откровенно, самая плохая часть в нём - выдирание контента. Я б не против её переделать (а то там бьютифулсуп неоднократно парсит :( ), но сейчас я уже не в состоянии, хочу просто проверить, что оно вообще работает. Не то, чтоб много сомнений было, но всё-таки стрёмно. :)
Порядочно с этой дрянью провозился, уже давно ни XML-RPC не трогал, ни парсенье документов... Ну зато он получился универсальный. :) Бери - и пользуйся. Не только на посты из блогов можно прикрутить, но и на всякие форумы, странички вики и т.д.
P.S. Вывода пингбеков в статью ещё пока нету. :) P.P.S. Кстати, таки работает! :)
lighttpd angel
Alexander Solovyov, 06.03.2010Похоже, лайти наконец-то научился (хоть пока только в транке, но всё же) делать нормально graceful перезагрузку. Теперь его можно будет использовать и не напрягаться чрезмерно по поводу его рестартов и падений. :)
Апгрейд пингбека
Alexander Solovyov, 06.03.2010Django's ORM
Alexander Solovyov, 06.03.2010Наткнулся тут (спасибо реддиту) на блог замечательного учаснега Адама Гомаа, последний пост которого вещает о том, что Джанговский ОРМ - мертвяк и припарки не помогут, потому он решил писать свой собственный декларативный слой над SQLAlchemy (потому как текущие действительно просто ужасны).
Однако ж рефакторинг query.py - уже близко и я чую, что должно всё стать заметно лучше. :) Джеймс Беннетт, имхо, ответил совершенно правильно. :)
Nine Inch Nails
Alexander Solovyov, 06.03.2010Всё-таки Трент Резнор - не самый ординарный человек. Почитал и снова убедился. :)
def mySqrt(x): return x*x
Alexander Solovyov, 06.03.2010Ну они там и курят, мозги в трубочку сворачиваются. :D
Импорт из WP
Alexander Solovyov, 06.03.2010При всех плюсах настоящих пользователей у них есть один огромный минус - что-то я никак не придумаю, как из вордпресса импортировать комментарии. :( Они ведь там не имеют реальных пользователей, а здесь мне - придётся создавать... И если человек придёт второй раз комментировать?
Или послать всем письма на предмет активации? Но что-то мне это решение не кажется особенно удачным... ;)
Или может импортировать только посты? Но это уже не так весело и интересно... :(
Написание и отображение постов
Alexander Solovyov, 06.03.2010Сегодня прикрутил последнюю, похоже, часть в цепочке от написания поста до его отображения - highlight.js. И теперь пост проходит markdown, typogrify и уже в браузере код расцвечивается хайлайтом. :)
Правда, сначала он показал мне баг в smartypants (который входит в состав typogrify) - он превращал кавычки в красивые ("") не только в тексте, но и в коде. А я хорошо помнил, что он уже два года не обновлялся, и просто чуял, что придётся мне сейчас рыться в его коде. :( Но всё же не поленился залезть в гугль, и увидеть что автор после двухлетнего перерыва обновил его и этот баг починен. :)
Вообще, из всего этого набора больше всего мне не нравится именно markdown, потому что он однозначно рассчитан на английский язык - квадратных скобочек (для расставления ссылок) в русской раскладке нету. И ещё не нравится выделение кода четырьмя пробелами перед ним - неудобно в обычном текстедите их вставлять. :( Но альтернативы не вижу - Textile хуже имхо, а ReST - ничем не лучше маркдауна, у него обратные апострофы используются, которых точно также нету в русской раскладке. :(
Предпросмотр
Alexander Solovyov, 06.03.2010mod_wsgi
Alexander Solovyov, 06.03.2010Всё, перевёл все свои виртуалхосты, использующие питон, на mod_wsgi, который куда лучше и проще настраивается, чем mod_python.
Кроме того, он позволяет запускать процессы в таком себе daemon-режиме, благодаря чему теперь мой меркуриал запущен из-под моего юзера - а это значит, что репозитории, которые в нём лежат, одновременно и доступны для записи, и принадлежат мне (и без всяких предоставлений юзеру www-data прав на запись). Очень удобно.
Меркуриал, кстати, невероятно рулит. Позволяет через браузер ходить по репозиторию (и смотреть не только последние версии, как svn), clone/pull проходит на порядок быстрее, чем в svn'е, а скорость annotate сравнить вообще нельзя - оно же всё локально происходит. :)
Работает на базе feedparser.
