27 февр. 2010 г.

Python Google Translate снипет

Недавно появился отличный сниппет для перевода через Google Translate AJAX module, питоном. Его текст:


# -*- coding: utf-8 -*-

import re, urllib

import simplejson as json



class UrlOpener(urllib.FancyURLopener):

    version = "py-gtranslate/1.0"



base_uri = "http://ajax.googleapis.com/ajax/services/language/translate"



def translate(phrase, src="uk", to="en"):

    data = urllib.urlencode({'v''1.0''langpair''%s|%s' % (src, to), 'q': phrase.encode('utf-8')})

    resp = json.load(UrlOpener().open('%s?%s' % (base_uri, data)))

    try:

        return resp['responseData']['translatedText']

    except:

        return ""


Стоит ли говорить, что для дорвейщика или черного оптимизатора этот сниппет настоящий подарок.

Пример использования для не человекоприятной уникализации:


phrase = u'Карл у Клары украл кораллы, а Клара у Карла украла кларнет.'

eng_ver = translate(phrase, src="ru", to="en")

phrase = translate(eng_ver, src="en", to="ru")


Получилось:

Карл украл кораллы, Клара, а Клара украла у Карла кларнет.




18 февр. 2010 г.

Автодополнение тэгов в django

Я очарован ещё одним django-приложением django-tagging-autocomplete. Сделать autocomplete(автодополнение/подсказоньки) тэгов с помощью этого приложения очень и очень просто.

4 шага со страницы проекта на Google Code (django-tagging у нас уже установлен, так?):

1. Установите django-tagging-autocomplete. Например так:


easy_install django-tagging-autocomplete


2. Скачайте jquery-autocomplete, положите в папку с вашим media контентом (надо сохранить структуру папок из архива). За нахождение библиотеки отвечает опция TAGGING_AUTOCOMPLETE_JS_BASE_URL, то есть можно её переопределить у себя в settings.

3. Добавляем "tagging_autocomplete" в installed apps в settings.

4. Добавляем строку в urls.py:


(r'^tagging_autocomplete/', include('tagging_autocomplete.urls')),


Использовать так:



from django.db import models

from tagging_autocomplete.models import TagAutocompleteField



class SomeModel(models.Model):

        tags = TagAutocompleteField()








и вот так для форм:




from django import forms

from tagging.forms import TagField

from tagging_autocomplete.widgets import TagAutocomplete



class SomeForm(forms.Form):

    tags = TagField(widget=TagAutocomplete())




Во фронт части надо как-то подключать скрипты jquery-autocomplete. Наверное, можно через form.media, но я тупо написал:





<script src="http://cdn.jquerytools.org/1.1.2/full/jquery.tools.min.js"></script>

<link href="/media/jquery.autocomplete.css" type="text/css" media="all" rel="stylesheet" /> 

<script type="text/javascript" src="/media/jquery.autocomplete.js"></script> 





Естественно, данное решение можно использовать и в django-cms. Если интересно, могу написать как.




16 февр. 2010 г.

Django-cms, WYMEditor: свои стили.

По умолчанию набор стилей ограничен. Вот я и решил добавить свой стиль “center”, центрующий контент. На скрине он “PARA: Center”. Смысл “PARA” я не понимаю, но оставляю как есть.

after

Все доступные настройки данного плагина хранятся в cms/plugins/text/settings.py.

Я добавил в свой settings.py проекта следующие строки:


WYM_CLASSES = ",\n".join([

    "{'name': 'date', 'title': 'PARA: Date', 'expr': 'p'}",

    "{'name': 'hidden-note', 'title': 'PARA: Hidden note', 'expr': 'p[@class!=\"important\"]'}",



    "{'name': 'center', 'title': 'PARA: Center', 'expr': 'p'}",

])



WYM_STYLES = ",\n".join([

    "{'name': '.hidden-note', 'css': 'color: #999; border: 2px solid #ccc;'}",

    "{'name': '.date', 'css': 'background-color: #ff9; border: 2px solid #ee9;'}",



    "{'name': '.center', 'css': 'border: 2px solid #ee9; text-align:center;'}",

])


Приведенные WYM_STYLES определяют то, как контент будет выглядеть в редакторе. Менеджеры контента любят, когда он меняется динамически и WYSWYG оправдывает свое название.

И прописал стиль в css:


.center { text-align: center; }


Естественно, все это можно было сделать иначе…




15 февр. 2010 г.

Глюки Google Buzz

Глюки Google Buzz, обнаруженные в фирменном (а значит априори поддерживаемом) браузере google chrome:

  • при первом заходе в живую ленту видно лишь запись "загрузка" и всё. ждать бесполезно.
  • при втором заходе видно старое состояние ленты и "загрузка..." вверху страницы, при 3-ем, если повезет, видно все, как и должно быть - с обновлениями.
  • при отправке ответа на очередное сообщение Buzz, присланное на email, он (ответ) уходит в неизвестном направлении. В живой ленте его нет. То есть, ответ на Buzz сообщение, это как-бы не письмо. Внимание знатоков! Вопрос: на кой хрен было выносить уведомления в виде почты?
  • аналогично Buzz ведет себя в фирменной мобильной ОС андроид, не смотря на то, что Buzz был с пафосом выведен из Google Labs сразу всем, а не ограниченному кругу гиков-тестировщиков. Видимо Google куда-то сильно боялся опоздать.
  • UPD1: если обновить страницу с открытым в Gmail Buzz’ом, то слева в меню останутся только контакты и задачи.

Забавный факт: я начинал писать этот текст в Google Buzz для своих публичных подписчиков, но затем осознал, что у него бывают периодические проблемы с переносом строк :)




11 февр. 2010 г.

Проблемы с cx_Oracle (python 2.6 под windows, Oracle XE Client)

Долго и нудно мучился с cx_oracle (python 2.6 и windows vista) – каждые второй коннект к базе валился с фатальной ошибкой, а иногда магически вешал все окружение на 3-4 минуты. Гугл не помог. Вариант с ущербностью своей висты я отметаю, т.к. виста за последние два месяца была восстановлена из recovery раздела (до и после cx_oracle работал одинаково).

Смена версии cx_oracle тоже не помогала. Даже последний релиз имеет теже проблемы.

Собственно, решением оказалось возвращение к python 2.5.4. Под ним все удивительным образом работает и никаких проблем нет.

В ошибке было упоминание библиотеки ntdll.dll.




7 февр. 2010 г.

УК Юг, Тюмень. Охуевайтунг.

Внимание: ниже нет ни слова о python, django, web-программировании и прочих всегда значительно в большей степени интересовавших меня вещах. О них я буду писать в следующих постах.

Удивительное рядом - УК Юг придумали новый беспроигрышный вариант проведения заочного голосования дабы и тарифы повысить, и законы соблюсти. Называется это чудо-расчудесное "бюллетень заочного голосования", а самое чудесное в ней то, что если Вы не принесете “свой отказ” от повышения тарифов в рабочее время по адресу УК Юг, будет считаться, что Вы тот самый дебил, который рад платить в 1.5 раза больше.

Если бы такое голосование по другому провести, 100% жильцов голосовали бы против, а так сотрудники УК Юг "потеряют" 60% бюллетеней и “все идет по плану”…

Ниже сканы бюллетени и уведомления (бережно скрепленные степплером), их нам принесли в пятницу, а сдавать надо в понедельник.

Работаешь в понедельник с утра и до вечера? А не колышет! Не принес - плати!

image0

image1

image2

Думали кончились времена лихих наколов?




3 февр. 2010 г.

Сказ о том как загрузить templatetag один раз, не повторяя в наследуемых шаблонах и их кусках.

В твитере все исчирикались ссылкой http://zeroandone.posterous.com/top-10-tips-to-a-new-django-developer.

Я же к ней, как и ко многим подобным вводным статьям, относился прохладно. Но все же посмотрел. Новыми для меня стали следующие пункты: “6.Load template tags  belonging to third party apps  only once” и permalink, который я никак не мог начать использовать.

Итак, чтобы импортировать шаблонные тэги аппликации/приложения всего один раз, без необходимости повторять {% load %} в каждом наследуемом и “инклюженом” ({% include %}) шаблоне, нужно написать


from django import template

template.add_to_builtins('project.app.templatetags.custom_tag_module')


Данный кусок можно вставлять в settings или в файлы моделей, т.к. автор утверждает, что эти файлы загружаются в любом случае…

С permalink следующая ситуация: в models, в get_absolute_url класса модели можно использовать декоратор @models.permalink, который видимо использует reverse.


@models.permalink

def get_absolute_url(self):

    return ('profileurl2',(),{'userid'self.user.id})


PS. Кстати, в твитере все чирикаю. А как будет называться повторение чужого “чирика”? Перечирикивание?




Prank или неправильная работа gtalk виждета?

Второй день мне в джаббер пишут и молчат. Контакт адресата поход на контакт из виджета gtalk у меня в блоге.

Мой вариант происходящего:

  1. Это сетевой пранк. Прыщавые малолетки соединяются и молчат.
  2. Ошибка работы виджета. Мне пишут настоящие люди, но по неведомой причине сообщения не доходят. В данный момент, как и вчера, у меня включены два клиента gtalk. Видимо, из-за этого соединение называется групповым чатом, я на втором клиенте я получаю сообщения первого.
  3. Мне пытаются хакнуть. Возможно, с виджетом связана какая-то уязвимость, при которой методично инициирую подобные чаты можно получить какую-то выгоду. Ну или как-то так :).

Пишите в комменты к этому посту, если с Вами происходило нечто похожее, или Вы знаете что именно происходит!