Блог lorien

web-brains.com posts: Удобная ловля AJAX ошибок

Вы пробовали отлаживать ошибки возникающие в обработчиках ajax-вызовах? Например, через firebug. Там можно посмотреть в мониторинге сети ответ ajax-запроса. Проблема в том, что когда случается ошибка в серверном коде, то django выбрасывает traceback в HTML-виде, который и приходится разглядывать в окошке firebug. При должной сноровке получается достаточно быстро форматировать мозгом этот html, но ощущение себя быдлом имеется.

Я сейчас придумал, одну штуку прикольную. Обычно как работают в django с ajax-вызовами — пишут декоратор, который наподобие render_to обрабатывает возвращаемый dict, только не строит по нему context объект, а просто сериализует в JSON-формат, лепит нужный content type и пуляет в браузер. Дык вот, можно в этом декораторе завернуть вызов view в try/except блок и в случае исключения, возвращать traceback. А далее уже можно разглядывать его тем же firebugом (он будет без html-форматирования или же делать alert в браузер. Вот такая идея.

Декоратор может быть чем-то вроде этого:

def ajax_request(func):
"""
Checks request.method is POST. Return error in JSON in other case.

If view returned dict, returns JsonResponse with this dict as content.
"""
def wrapper(request, *args, **kwargs):
if request.method == 'POST':
try:
response = func(request, *args, **kwargs)
except Exception, ex:
response = {'error': traceback.format_exc()}
else:
response = {'error': {'type': 403, 'message': 'Accepts only POST request'}}
if isinstance(response, dict):
return JsonResponse(response)
else:
return response
return wrapper


Ну и вот пример JS кода для алерта этого трейсбека:

function onSelectChange(select, movie_id) {
$.ajaxSetup({dataType: 'json', error: function(r, e) {alert(e)}});
args = {movie: movie_id, like: $(select).val()} ;
$.post('{% url mark_exists %}', args, function(data) {
if (data.error) {
alert(data.error);
}
});
return false;
}

Ссылка на оригинал: http://web-brains.com/2008/08/26/udobnaya-lovlya-ajax-oshibok/



Комментировать   Добавить в избранное   

web-brains.com posts: ack клон

На днях мне в очередной раз понадобилось заменить в куче файлов одну строчку на другую. Нужно было сделать 30 замен. Обычно надо меньше замен и я делаю это руками, но на этот раз я подумал, что буду выглядеть как идиот, делая 30 замен. Я понял — мне нужен инструмент для массовой замены строк в файлах.

Я решил посмотреть в гугле. Ничего хорошего с ходу найти не удалось. Я решил поискать в гентушных портах. Там тоже ничего не нашлось. Вернее, нашлось но оно уходило в бесконечную рекурсию и жрало всю мою память. Или хотело 30 метров зависимостей, чтобы вывести мне диалоговое окошко с опциями. Я понял — время велосипеда пришло! Чтобы велосипед был 100% велосипедным я решил заодно воплотить в нём фунциональность утилиты ack.

Ack — в свою очередь является велосипедом, реализующим функции утилиты grep. Но в отличие от grep ack по умолчанию:

  • ищет рекурсивно
  • игнорирует .svn, .hg и другие директории
  • игнорирует swap файлы vim и прочие мусорные файлы
  • раскрашивает вывод
Казалось бы мелочи, но до чего приятные! В общем, я решил, что мой велосипед помимо массовой замены должен уметь просто искать строки в стиле a la ack. Приятные мелочи вдвойне приятней, когда они сделаны собственными руками 

После тяжёлых мозговых потуг я придумал имя своей двухколёсной утилите: sr. Почему sr? Потому что: а) две буквы набирать легко и приятно, б) это акроним от search replace.

На данный момент утилита умеет:

  • рекурсивный поиск по умолчанию
  • искать подстроку и делать раскрашенный вывод результатов (слизано с ack)
  • искать строку и заменять её на другую. Проверено, работает.
  • искать только/фильтровать по типу файлов (используя стандартный расширения). Например, sr —python fook будет искать строку fook в текущей директории рекурсивно только в python файлах. А sr —noperl fook будет искать строку fook в текущей директории рекурсивно во всех файлах кроме перловых.
  • если строка в файле очень длинная, то выводится сообщение, что строка очень длинная. При использовании ack у меня бывали случаи, когда ack пытался вывести строку из mysql дампа и на экран выбрасывалось всё содержимое это длииинной строки. В своём велосипеде хотелось бы исправить эту досадную багафичу.
  • для всех заменяемых файлов автоматически генерируется backup файл
Код программы доступен здесь: http://hg.pydev.ru/sr/

Ссылка на оригинал: http://web-brains.com/2008/07/31/ack-klon/



Комментировать   Добавить в избранное   

web-brains.com posts: bash скрипт для dumpz.org

Мне тут darkk подкинул полезный bash-скрипт для заливки файлов на dumpz.org. И я подумал, что добру пропадать — пускай народ увидит

Код скрипта

#!/bin/bash

# curl dumpz.org/ | grep option | sed 's/.*option value="([^"]*)".*/1/' | fmt
lexers=(
apacheconf bash bat bbcode befunge boo brainfuck c cpp csharp css
css+django css+erb css+genshitext css+mako css+myghty css+php css+smarty
d delphi diff django dylan erb genshi genshitext groff haskell html
html+django html+genshi html+mako html+myghty html+php html+smarty ini
irc java js js+django js+erb js+genshitext js+mako js+myghty js+php
js+smarty jsp lua make mako minid mupad myghty objective-c ocaml perl
php pycon pytb python raw rb rbcon redcode rhtml rst scheme smarty
sourceslist sql tex text trac-wiki vb.net vim xml xml+django xml+erb
xml+mako xml+myghty xml+php xml+smarty
)

if [ -n "$1" ]; then
use_lexer=""
for lexer in "${lexers[@]}"; do
if [ "$1" == "$lexer" ]; then
use_lexer="$1"
break
fi
done
if [ -z "$use_lexer" ]; then
echo "Unknown lexer: $1" 1>&2
exit 1
fi
else
use_lexer="text"
fi

exec curl –include
–form "code=

Ссылка на оригинал: http://web-brains.com/2008/07/25/bash-skript-dlya-dumpzorg/



Комментировать   Добавить в избранное   

web-brains.com posts: Настраиваем раздачу множества mercurial репозиториев через fastcgi

Я уже писал раньше про то, как сделать веб-доступ к меркуриал репозиториям через fastcgi, но там было несколько извращённое решение, для того чтобы привязывать репозитории к корням доменов/поддоменов, а не к каталагам на одном домене. Сейчас же я расскажу именно про привязку к разным директориям т.е. про функциональность которая доступна из коробки без всяких извращений.



Итак, для начала нам понадобится написать простенький скрипт-обёртку, который будет через fastcgi (посредством flup) связывать с веб-сервером wsgi-приложение, идущее в поставке меркуриала, для раздачи репозиториев.



Скрипт очень простой:



#!/usr/bin/env python

import sys

from mercurial.hgweb.hgwebdir_mod import hgwebdir

from mercurial.hgweb.request import wsgiapplication

from flup.server.fcgi import WSGIServer



def make_web_app():

return hgwebdir('/web/hgwebdir.conf')



WSGIServer(wsgiapplication(make_web_app),

umask=0000,

bindAddress='/var/run/www/hg.pydev.ru.sock').run()





Этот скрипт запускает wsgi-приложение и с помощью flup обрабатывает fastcgi-запросы веб-сервера через указанный сокет. Обратите внимание на файл hgwebdir.conf, в котором лежат указания, какие репозитории можно раздавать, а какие нет. Мой файл выглядит так:





[paths]

django-account = /web/django-account

django-captcha = /web/django-captcha

django-auth-openid = /web/django-auth-openid

django-flash = /web/django-flash





Это значит, что по адресу somedomain.com/django-account мы сможем получить доступ к веб-интерфейсу для работы с репозиторием, лежащим в /web/django-account. Ну, и, конечно, hg clone может также работать с этим адресом.



Учтите, этот файл нужно запустить. lighttpd умеет запускать fcgi-скрипты сам, nginx (который я юзаю) не умеет. Поэтому я не мудрствуя лукаво просто выполняю в консоли следующую команду



nohup ./hgwebdir.py &





Конечно, со стороны веб-сервера надо тоже сделать кой-какие телодвижения

Вот мой nginx-конфиг:



server {

server_name .hg.pydev.ru;

include fastcgi.conf;

location / {

auth_basic "closed site";

limit_except GET {

auth_basic_user_file /web/hg.passwd;

}

fastcgi_pass unix:/var/run/www/hg.pydev.ru.sock;

}

}





Кстати — позор на мою голову — я до сих пор не решил проблему прикручивания http-авторизации для того, чтобы позволить push’ить через http. К сожалению, сейчас нет настроения описывать проблему. Могу лишь сказать, что в вышеуказанном конфиге она есть



Усё. Конец.

Ссылка на оригинал: http://web-brains.com/2008/07/18/nastraivaem-razdachu-mnozhestva-mercurial-repozitoriev-cherez-fastcgi/



Комментировать   Добавить в избранное   

web-brains.com posts: Настраиваем раздачу множества mercurial репозиториев через fastcgi

Я уже писал раньше про то, как сделать веб-доступ к меркуриал репозиториям через fastcgi, но там было несколько извращённое решение, для того чтобы привязывать репозитории к корням доменов/поддоменов, а не к каталагам на одном домене. Сейчас же я расскажу именно про привязку к разным директориям т.е. про функциональность которая доступна из коробки без всяких извращений.



Итак, для начала нам понадобится написать простенький скрипт-обёртку, который будет через fastcgi (посредством flup) связывать с веб-сервером wsgi-приложение, идущее в поставке меркуриала, для раздачи репозиториев.



Скрипт очень простой:



#!/usr/bin/env python

import sys

from mercurial.hgweb.hgwebdir_mod import hgwebdir

from mercurial.hgweb.request import wsgiapplication

from flup.server.fcgi import WSGIServer



def make_web_app():

return hgwebdir('/web/hgwebdir.conf')



WSGIServer(wsgiapplication(make_web_app),

umask=0000,

bindAddress='/var/run/www/hg.pydev.ru.sock').run()





Этот скрипт запускает wsgi-приложение и с помощью flup обрабатывает fastcgi-запросы веб-сервера через указанный сокет. Обратите внимание на файл hgwebdir.conf, в котором лежат указания, какие репозитории можно раздавать, а какие нет. Мой файл выглядит так:





[paths]

django-account = /web/django-account

django-captcha = /web/django-captcha

django-auth-openid = /web/django-auth-openid

django-flash = /web/django-flash





Это значит, что по адресу somedomain.com/django-account мы сможем получить доступ к веб-интерфейсу для работы с репозиторием, лежащим в /web/django-account. Ну, и, конечно, hg clone может также работать с этим адресом.



Учтите, этот файл нужно запустить. lighttpd умеет запускать fcgi-скрипты сам, nginx (который я юзаю) не умеет. Поэтому я не мудрствуя лукаво просто выполняю в консоли следующую команду



nohup ./hgwebdir.py &





Конечно, со стороны веб-сервера надо тоже сделать кой-какие телодвижения

Вот мой nginx-конфиг:



server {

server_name .hg.pydev.ru;

include fastcgi.conf;

location / {

auth_basic "closed site";

limit_except GET {

auth_basic_user_file /web/hg.passwd;

}

fastcgi_pass unix:/var/run/www/hg.pydev.ru.sock;

}

}





Кстати — позор на мою голову — я до сих пор не решил проблему прикручивания http-авторизации для того, чтобы позволить push’ить через http. К сожалению, сейчас нет настроения описывать проблему. Могу лишь сказать, что в вышеуказанном конфиге она есть



Усё. Конец.

Ссылка на оригинал: http://web-brains.com/2008/07/18/nastraivaem-razdachu-mnozhestva-mercurial-repozitoriev-cherez-fastcgi/



Комментировать   Добавить в избранное   

web-brains.com posts: Реализация профиля пользователя через наследование моделей

Сегодня решил в качестве эксперимента пощупать наследование в джанги, которое с относительно недавних пор появилось в trunk.



До этого для реализации профиля я пользовался нескольки брутальным способом: я просто патчил модель пользователя Выглядело это примерно так:



from django.contrib.auth.models import User



new_fields = {

'agency': models.ForeignKey(Agency, blank=True, null=True, verbose_name=u'Агенство', related_name='managers'),

'group': models.CharField(u'Группа', max_length=20, null=True),

}



# Ok, OMG begins!



for name, field in new_fields.iteritems():

User.add_to_class(name, field)



User.get_absolute_url = lambda self: reverse('account.views.user', args=[self.id])

User.get_edit_url = lambda self: reverse('account.views.edit_user', args=[self.id])



Что-то в этом роде



Сегодня я решил поправить OMG и заюзал наследование. Для этого понадобилось сделать три шага:



1) Создать модель UserProfile, унаследовав её от User



class UserProfile(User):

agency = models.ForeignKey(Agency, blank=True, null=True, verbose_name=u'Агенство', related_name='managers')

group = models.CharField(u'Группа', max_length=20, null=True)



get_absolute_url = lambda self: reverse('account.views.user', args=[self.id])

get_edit_url = lambda self: reverse('account.views.edit_user', args=[self.id])





2) Заменить во всём проекте User на UserProfile.



3) Заменить использование ‘django.contrib.auth.middleware.AuthenticationMiddleware’ на самописную account.middleware.AuthenticationMiddleware для того, чтобы в request.user попадал объект UserProfile, а не User



class LazyUser(object):

def __get__(self, request, obj_type=None):

if not hasattr(request, '_cached_user'):

from django.contrib.auth import get_user

from account.models import UserProfile

user = get_user(request)

if user.is_authenticated():

userprofile = UserProfile.objects.get(user_ptr=user)

else:

userprofile = user

request._cached_user = userprofile



return request._cached_user



class AuthenticationMiddleware(object):

def process_request(self, request):

assert hasattr(request, 'session'), "The Django authentication middleware requires session middleware to be installed. Edit your MIDDLEWARE_CLASSES setting to insert 'django.contrib.sessions.middleware.SessionMiddleware'."

request.__class__.user = LazyUser()

return None





Хм, собственно, всё Я активно ничего не юзал ещё, но пока всё кажется чики-пуки. Если я чего не заметил, плиз, разочаруйте меня

Ссылка на оригинал: http://web-brains.com/2008/07/17/realizaciya-profilya-polzovatelya-cherez-nasledovanie-modelej/



Комментировать   Добавить в избранное   

web-brains.com blog posts: Django приложение для вывода сообщений

Оформил ещё одну часть кода в отдельное приложение - на этот раз приложение для вывода сообщений. Оно решает две распространённые проблемы:

1) Часто в шаблон нужно вывести какое-то сообщение, резюмирующее итог совершённых действий, но создавать ради этого сообщения место в шаблонах для каждого view неудобно.

2) После редактирования или создания объекта, нужно сделать редирект и уже на следующей странице вывести сообщение об успешности действия.



Обе этих проблемы решает приложение flash, название для которого я спёр из рельсов. Над названием я думал целый час т.к. не хотелось использовать название messaging, messages, ибо они больше подоходят для личных сообщений и других вещей. Потом стал гуглить и вспомнил, что в рельсах подобная фунциональность реалиюзуется с помощью штуки под названием flash.



Итак, чтобы использовать мою библиотеку, нужно:

* прописать flash в INSTALLED_APPS

* активировать flash.middleware.FlashMiddleware

* прописать в нужном месте базового шаблона вызов {% flash %}, не забыв сделать {% load flash_extras %} в начале этого шаблона



Всё, теперь можно выводить сообщения, для этоно надо сделать import flash в нужном view и затем использовать фунции?

* flash.notice

* flash.error

* flash.notice_next

* flash.error_next

Последние две будут выводить сообщения на страницах после редиректа. По умолчанию шаблон для вывода сообщений выглядит так.



Библиотеку можно скачать отсюда: http://hg.pydev.ru/django-flash/

Ссылка на оригинал: http://web-brains.com/2008/07/08/django-prilozhenie-dlya-vyvoda-soobshenij/



Комментировать   Добавить в избранное   

web-brains.com blog posts: YAML для создания тестовых данных

Сегодня в качестве эксперимента я пощупал формат описания данных YAML и успешно заюзал его для наполнения проекта тестовыми данными. В начале я хотел просто хранить множество данных в YAML-файле, затем скриптом доставать известные заранее ключи и записывать их в нужные модели, но затем как всегда душе захотелось большего и я решил хранить в YAML также информацию о названиях моделей и полей. То есть теперь одним скриптом я могу парсить разные YAML-файлы.



Конечно, хотелось бы это всё красочно расписать, да больно неохото палец сосать, так что выкладываю код и баста!



Вот это YAML-файл, по которому генерятся данные для различных моделей. Обратите внимание, это не просто модели в себе, они связаны друг с другом отношениями.



meta:

order: [Agency, Client, User, Compaign]

defaults:

User:

is_active: True



Agency:

- name: Суперстар Агенство

ref: star

- name: Unlimited Success

ref: success



User:

# Agency managers

- username: mars

agency: {Agency: star}

is_staff: True

is_superuser: True

- username: boss

agency: {Agency: success}

is_staff: True

is_superuser: True



# Client managers

- username: balt_manager

client: {Client: baltika}

- username: blat_manager

client: {Client: gazprom}



Client:

- name: Балтика

ref: baltika

- name: Газпром

ref: gazprom



Compaign:

- name: Пей, пока жив

client: {Client: baltika}

- name: Наше пиво не токсично

client: {Client: baltika}

- name: А у нас на кухне газ

client: {Client: gazprom}





А вот собственно скрипт для парсинга:



#!/usr/bin/env python

"""

This module fill project database with objects described in YAML file.

"""



import os

os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'



import yaml

import logging

from itertools import chain



from agency.models import Agency

from django.contrib.auth.models import User

from task.models import Compaign

from client.models import Client



def parse():

conf = yaml.load(open('init.ya').read())

meta = conf.pop('meta')

objects = {}



for model_name in meta['order']:

model = globals()[model_name]



logging.debug('Deleting all %s instances' % model_name)

model.objects.all().delete()



defaults = meta['defaults'].get(model_name, {})



for item in conf[model_name]:

if 'ref' in item:

ref = item.pop('ref')

else:

ref = None



obj = model()

for key, value in chain(item.iteritems(), defaults.iteritems()):

if not isinstance(key, dict):

setattr(obj, key, value)

else:

fk_model, fk_ref = vlaue

setattr(obj, key, objects[fk_model][fk_ref])

obj.save()

logging.debug(u'New %s instance: %s' % (model_name, obj))



if ref:

objects.setdefault(model_name, {})[ref] = obj





if __name__ == '__main__':

logging.basicConfig(level=logging.DEBUG)

parse()





Ну как, это какой-то велосипед аццкий или здравое зерно всё таки есть?

Ссылка на оригинал: http://web-brains.com/2008/07/08/yaml-dlya-sozdaniya-testovyh-dannyh/



Комментировать   Добавить в избранное   

web-brains.com blog posts: Django прилжение для регистрации

Последние несколько недель я раздумывал над тем, не продолжить ли мне работу над pybb, разработку которого я заморозил в декабре 2007 года. Думаю, всё же стоит довести этот проект до ума. Однако, за время прошедшее с начала года, я приобрёл новый опыт и поменял точку зрения на некоторые вещи, так что pybb я буду переписывать чуть ли не с нуля.



В этом подходе я изначально буду придерживаться нескольких вполне конкретных вещей:

* возможность *легко* встроить pybb в сторонний рабочий проект

* тредовость обсуждений: близкие примеры это google groups, livejournal. Тредовость данных скорее всего будет организована c помощью механизма nested sets, и поможет мне в этом django-mptt

* плагинная система: я надеюсь мы что-нибудь придумаем с dottedmag'ом т.к. он перидически грозится написать плагинную систему для byteflow. Думаю, на pybb её переложить будет нетрудно.

* качественная поддержка OpenID



В целях улучшения встраиваемости в сторонний проект модуль регистрации/авторизации/редактирования базовых свойств аккаунта я вынесу в отдельное приложение, чтобы при желании можно было использовать тот модуль, что уже существует в работающем сайте. Собственно, поводом к написанию этого сообщения стало то, что я вырефакторил из своего кода отдельное приложение для регистрации и выложил его в opensource. Итак, встречайте django-account. Это приложение предоставляет: регистрацию, авторизацию, активацию по email, напоминание пароля, изменение пароля.



Документации к django-account пока нет. Читайте INSTALL.txt, README.txt и докстринги в коде . Попозже я создам trac-проект, где всё опишу. Далее на очереди на выкладывание в opensource модули для каптчи и для OpenID-авторизации. Да, я знаю, что все три вышеназванных модуля - это велосипеды, у которых уже есть аналог и не один. Но, сами знаете, своя рубашка ближе к телу. Кроме того, как всегда, меня не устроил код и идеи в чужих приложениях, так что я изобрёл в очередной раз колесо

Ссылка на оригинал: http://web-brains.com/2008/07/03/django-application-for-registration/



Комментировать   Добавить в избранное   

web-brains.com blog posts: Новое django приложение: django-captcha

Итак, второе приложение из серии приложений, который я решил заопенсорсить перед тем как приступить непосредственно к pybb. Django-captcha предоставляет поле, которые вы можете включить в свою форму и получить работающую каптчу!



Порядок установки:

* импортируйте и добавьте в вашу форму поле captcha.fields.CaptchaField

* добавьте новый middleware: captcha.threadlocals.ThreadLocalsMiddleware

* добавьте новый urlconf: captcha.urls



Всё. Теперь в форме появится каптча и если пользователь введёт неправильный ответ, то форма не провалидируется и сгенерируется новая каптча.



Код можно поглядеть/скачать здесь: http://hg.pydev.ru/django-captcha

Ссылка на оригинал: http://web-brains.com/2008/07/04/novoe-django-prilozhenie-django-captcha/



Комментировать   Добавить в избранное   

web-brains.com blog posts: Перенос разделов с помощью dd

Вчера один мой знакомый заинтересовался в покупке старенького компьютера, за которым я до недавнего времени работал и не успел до конца перенести всю систему на новый ноутбук. Дабы не торопиться и не пихать весь старый хлам на новую машину я решил просто скопировать старую систему на отдельный винчестер для дальнейших разбирательств. Итак, у меня были 60Гб (/dev/hda) винчестер со старой системой, который надо было освободить для продажи с компьютером и 200Гб (/dev/hdb) винчестер куда надо было перенести файлы. Далее я напишу, что я сделал, чтобы скопировать рабочую систему. Может быть, кому-то окажется полезным.



Для начала с помощью fdisk я удалил все разделы на большом винчестере и создал там копии разделов со старого т.е. маленький /boot, swap и большой / (root). Для новых разделов я указывал те же самые начальные и конечные сектора, что были в выводе fdisk для разделов старого винчестере. Единственное замечание, что новый root раздел я сделал больше, так чтобы он занял всё место на 200Гб винчестере.



Далее, командой dd я скопировал содержимое разделов /boot и /



dd if=/dev/hda1 of=/dev/hdb1

dd if=/dev/hda3 of=/def/hdb3



swap раздел я не копировал, просто сделал mkswap /dev/hdb3. Т.к старый root раздел был меньше нового root раздела, я обработал файловую систему на новом разделе следующим образом:



e2fsck -f /dev/hdb3

resize2fs /dev/hdb3



Для /dev/hdb1 я тоже сделал на всякий случай e2fsck.



Заключительным шагом была установка grub загрузчика. Я запустил grub –no-floppy и выполнил следующие команды:



root (hd1,0)

setup (hd1)

quit





Результатом этих действий стала работающая на новом винчестере старая gentoo система

Ссылка на оригинал: http://web-brains.com/2008/06/26/perenos-razdelov-s-pomoshyu-dd/



Комментировать   Добавить в избранное   

web-brains.com blog posts: Паттерны в веб-программировании

Я думаю, все знают заезжанный паттерн MVC, причастностью к которому стремится похвастаться чуть ли не каждый веб-фреймворк - кстати, было бы интересно поглядеть на фреймворки, не базирующиеся на MVC. То бишь, MVC - это общеизвестный паттерн, но помимо него существуют десятки (сотни?) других паттернов, часть из которых, несомненно присутсвует и в веб-разработке.



Так вот, веб-разработчику было бы интересно и легко изучать эти паттерны на примерах веб-приложений. Я клоню к тому, что было бы круто организовать такой ресурс - а может он уже есть? - где перечислить паттерны, дать краткое описание каждому и снабдить каждый паттерн примерами из Django, Rails, абстрактными примерами поведения веб-приложения. Для простого программиста - типа меня - не знающего никаких паттернов - такой подоход оказал бы весьма благотворное влияние на расширение кругозора в этой области. :o)

Ссылка на оригинал: http://web-brains.com/2008/06/23/Web-developing-patterns/



Комментировать   Добавить в избранное   

web-brains.com blog posts: rupy 2008 завершилась

Ура, завершилась вторая rupy 2008. На этот раз прибыло больше народу, как мне показалось, хотя я особо не считал Считать я был не особо в состоянии т.к. накануне мы с ребятами из inventure.ru усиленно готовились к докладу с помощью пива, а затем текилы. Текила, надо сказать, довольно интересная штука - совсем иной уровень опьянения, нежели от пива/дешёвой водки - голова оставалась довольно таки ясной, в результате чего я как всегда стал размышлять о принципах жизни. К сожалению, меня никто не понял т.к. единственным моим тезисом было то, что никто друг друга не сможет понять, пока мы будем использовать слова. А вот если всем замолчать, то тогда через некоторое время можно достичь понимания - через несколько (десятков?) лет.. Т.е. монахи и отшельники, как видите, не совсем дураки, обет молчания/отсутствие собеседников помогает им постигать внутрениий мир, ибо всё что снаружи - это лишь производная нашего внутреннего Я…



Так.. о чём я? Ах, да, о rupy. На этот раз конференция была разделена на два потока, что мне показалсь не совсем удобным т.к. иногда хотелось бы побывать одновременно в двух местах. Было бы прикольно проводить конференцию в один поток два дня, например. Однако, это создаёт дополнительные сложности для всех: и для организатора (Юрий Юревич, если кто не знает), так и для участников, живущих не в Омске т.к. тогда придётся искать место для ночлега, а гостиницы, сами знаете, не самый дешёвое место жительства. Хотя, конечно, некоторую часть гостей участники-омичи смогут приютить временно в своих квартирах )



Ещё у меня возникла следующая идея, было бы прикольно по wifi транслировать слайды, чтобы можно было слушать докладчика и смотреть слайды на ноутбуке. Может быть, это наивное предложение, но просто у меня не шибко хорошее зрение, а очки/линзы я не ношу, поэтому смотреть слайды мне было несколько некомфорно, когда шрифт был слишком мелкий. По этом же wify можно транслировать через жабер или ещё как-нить объявления типа "Большой перерыв. Идём кушать" или "Круглый стол по джанго будет там-то, по strokedb там-то" Правда, если честно, я не заметил чтобы народ шибко юзал ноутбуки - по крайней мере, в перерывах т.к. разговаривать вживую гораздо интересней )



В целом всё было достойно, ждём rupy 2009 Возможно, к новой конференции нарисуются спонсоры, до сих пор, как я понимаю, всё держалось на энтузиазме Юры, которому, конечно, следует отдать должное и похвалить - когда человек проявляет инициативу и сплочает людей в одном месте - это очень-очень замечательно.

Ссылка на оригинал: http://web-brains.com/2008/06/22/rupy-2008-zavershilas/



Комментировать   Добавить в избранное   

web-brains.com blog posts: Конференция по python/ruby в Омске

В Омске второй год подряд проводится конференция RuPyRu по Ruby и Python.



В этом году она пройдет 21 июня.



Мы постарались пригласить интересных людей, которые используют Ruby или Python в своей практике. В этом году основные доклады выглядят примерно так:



* Юрий Бабуров «Архитектура и плагины Trac» / Новосибирск

* Михаил Гусаров «Интерфейсы и плагины в Python» / Новосибирск

* Олег Дашевский «StrokeDB» / Новосибирск

* Алексей Дмитриев «Ruby on Rails» / Челябинск

* Андрей Орлов «Компонентная архитектура Zope» / Москва

* Григорий Петухов «Django. Работа с newforms.» / Омск

* Геннадий Пузырёв «Cheetah Templates. Разработка отчетов» / Казахстан, Павлодар



Список докладов пока полностью не утвержден, так что если у вас есть идеи по докладам — велкам, срок подачи заявок на доклады — 1 июня. Срок подачи заявок на участие — 19 июня.



Официальный сайт конференции: rupy.ru



Я буду читать доклад про newforms. Радует, что у меня ещё есть месяц чтобы понять, что это такое и как это лучше всего готовить Рад буду услышать предложение, что можно рассказать по этой теме. На данный момент хочу упомянуть про:

* принципы работы newforms

* основные приёмы при работе с newforms

* написание виджета, содержащего несколько элементов ввода

* написание поля на базе MultiValueField и MultiValueWidget

* newforms и AJAX

Ссылка на оригинал: http://web-brains.com/2008/05/24/konferenciya-po-pythonruby-v-omske/



Комментировать   Добавить в избранное   

web-brains.com blog posts: Семантическая вёрстка

Сюрприз, сюрприз! Новая тема под названием zen. Её вы можете лицезреть в данный момент на блоге. Изюминка темы в том, что оформление отсутствует как таковое Я подумал, что подобный ход конём позволит мне сосредоточиться на семантической вёрстке



Суть дела в том, что byteflow, как любой порядочный блогодвижок, стремящийся стать тяжёлым неповоротливым монстром, нуждается в механизме настраиваемых тем оформления. Очень важно, чтобы этот механизм позволял лёгко создавать новые темы. После раздумий мы решили двигаться в следующем направлении: в byteflow будет ядро базовых шаблонов не привязанное ни к какой теме, не несущее вообще никакой оформительской нагрузки. Чтобы создать тему на основе ядра, нужно как минимум… а ничего, собственно, не нужно Именно это и представляет из себя тема zen — нулевое расширение базовых шаблонов.



Если вам нужно не такое вырывающее глаз оформление, то вы можете положить в специальное место свои css-файлы, которые подхватятся базовыми файлами и голый html украсится в соответствии с вашими вкусами. Хотите пойти дальше и изменить какой-то шаблон? Это тоже можно. Просто кладёте этот шаблон в ещё одно специальное место и он подгружается заместо соотвествующего ему базового шаблона. При желании можно переопределить все базовые шаблоны.



А относительно базовых шаблонов возникла идейка разметить их в духе времени — то бишь, семантически. Что я сегодня и попытался сделать, вынеся многие последовательности элементов в контейнеры, добавив и в формы, сделав sidebar одним большим DL списокм.



Если у кого-то есть свободное время, то вы можете посмотреть внутрь html кода этого блога и предложить свои семантические пожелания Ещё я не откажусь от ссылок на true статьи про семантическую вёрстку.



UPD: поставил обратно lite

Ссылка на оригинал: http://web-brains.com/2008/05/13/semanticheskaya-vyorstka/



Комментировать   Добавить в избранное   

web-brains.com blog posts: Google Social Graph API

Оказывается, у Google есть сервис Social Graph API. Он предоставляет информацию о XFN и FOAF связях.



Вот здесь можно ввести URL своего блога и посмотреть исходящие и входящие XFN-связи. К сожалению, google показывает только прямые входящие XFN-сылки, но эта проблема легко решается ручками. Сервис позволяет делать 50000 запросов в сутки — это достаточно, чтобы построить гигантский граф )



Я ввёл свой блог и увидел, что на меня стоит две XFN-ссылки:

* it4it.ru/ contact

* sotakone.com/ friend met



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

Ссылка на оригинал: http://web-brains.com/2008/05/09/google-social-graph-api/



Комментировать   Добавить в избранное   

web-brains.com blog posts: rupy 20008 завершилась

Ура, завершилась вторая rupy 2008. На этот раз прибыло больше народу, как мне показалось, хотя я особо не считал Считать я был не особо в состоянии т.к. накануне мы с ребятами из inventure.ru усиленно готовились к докладу с помощью пива, а затем текилы. Текила, надо сказать, довольно интересная штука - совсем иной уровень опьянения, нежели от пива/дешёвой водки - голова оставалась довольно таки ясной, в результате чего я как всегда стал размышлять о принципах жизни. К сожалению, меня никто не понял т.к. единственным моим тезисом было то, что никто друг друга не сможет понять, пока мы будем использовать слова. А вот если всем замолчать, то тогда через некоторое время можно достичь понимания - через несколько (десятков?) лет.. Т.е. монахи и отшельники, как видите, не совсем дураки, обет молчания/отсутствие собеседников помогает им постигать внутрениий мир, ибо всё что снаружи - это лишь производная нашего внутреннего Я…



Так.. о чём я? Ах, да, о rupy. На этот раз конференция была разделена на два потока, что мне показалсь не совсем удобным т.к. иногда хотелось бы побывать одновременно в двух местах. Было бы прикольно проводить конференцию в один поток два дня, например. Однако, это создаёт дополнительные сложности для всех: и для организатора (Юрий Юревич, если кто не знает), так и для участников, живущих не в Омске т.к. тогда придётся искать место для ночлега, а гостиницы, сами знаете, не самый дешёвое место жительства. Хотя, конечно, некоторую часть гостей участники-омичи смогут приютить временно в своих квартирах )



Ещё у меня возникла следующая идея, было бы прикольно по wifi транслировать слайды, чтобы можно было слушать докладчика и смотреть слайды на ноутбуке. Может быть, это наивное предложение, но просто у меня не шибко хорошее зрение, а очки/линзы я не ношу, поэтому смотреть слайды мне было несколько некомфорно, когда шрифт был слишком мелкий. По этом же wify можно транслировать через жабер или ещё как-нить объявления типа "Большой перерыв. Идём кушать" или "Круглый стол по джанго будет там-то, по strokedb там-то" Правда, если честно, я не заметил чтобы народ шибко юзал ноутбуки - по крайней мере, в перерывах т.к. разговаривать вживую гораздо интересней )



В целом всё было достойно, ждём rupy 2009 Возможно, к новой конференции нарисуются спонсоры, до сих пор, как я понимаю, всё держалось на энтузиазме Юры, которому, конечно, следует отдать должное и похвалить - когда человек проявляет инициативу и сплочает людей в одном месте - это очень-очень замечательно.

Ссылка на оригинал: http://web-brains.com/2008/06/22/rupy-20008-zavershilas/



Комментировать   Добавить в избранное   

web-brains.com blog posts: Конференция по python/ruby в Омске

В Омске второй год подряд проводится конференция RuPyRu по Ruby и Python.



В этом году она пройдет 21 июня.



Мы постарались пригласить интересных людей, которые используют Ruby или Python в своей практике. В этом году основные доклады выглядят примерно так:



* Юрий Бабуров «Архитектура и плагины Trac» / Новосибирск

* Михаил Гусаров «Интерфейсы и плагины в Python» / Новосибирск

* Олег Дашевский «StrokeDB» / Новосибирск

* Алексей Дмитриев «Ruby on Rails» / Челябинск

* Андрей Орлов «Компонентная архитектура Zope» / Москва

* Григорий Петухов «Django. Работа с newforms.» / Омск

* Геннадий Пузырёв «Cheetah Templates. Разработка отчетов» / Казахстан, Павлодар



Список докладов пока полностью не утвержден, так что если у вас есть идеи по докладам — велкам, срок подачи заявок на доклады — 1 июня. Срок подачи заявок на участие — 19 июня.



Официальный сайт конференции: rupy.ru



Я буду читать доклад про newforms. Радует, что у меня ещё есть месяц чтобы понять, что это такое и как это лучше всего готовить Рад буду услышать предложение, что можно рассказать по этой теме. На данный момент хочу упомянуть про:

* принципы работы newforms

* основные приёмы при работе с newforms

* написание виджета, содержащего несколько элементов ввода

* написание поля на базе MultiValueField и MultiValueWidget

* newforms и AJAX

Ссылка на оригинал: http://web-brains.com/2008/05/24/konferenciya-po-pythonruby-v-omske/



Комментировать   Добавить в избранное   

web-brains.com blog posts: Семантическая вёрстка

Сюрприз, сюрприз! Новая тема под названием zen. Её вы можете лицезреть в данный момент на блоге. Изюминка темы в том, что оформление отсутствует как таковое Я подумал, что подобный ход конём позволит мне сосредоточиться на семантической вёрстке



Суть дела в том, что byteflow, как любой порядочный блогодвижок, стремящийся стать тяжёлым неповоротливым монстром, нуждается в механизме настраиваемых тем оформления. Очень важно, чтобы этот механизм позволял лёгко создавать новые темы. После раздумий мы решили двигаться в следующем направлении: в byteflow будет ядро базовых шаблонов не привязанное ни к какой теме, не несущее вообще никакой оформительской нагрузки. Чтобы создать тему на основе ядра, нужно как минимум… а ничего, собственно, не нужно Именно это и представляет из себя тема zen — нулевое расширение базовых шаблонов.



Если вам нужно не такое вырывающее глаз оформление, то вы можете положить в специальное место свои css-файлы, которые подхватятся базовыми файлами и голый html украсится в соответствии с вашими вкусами. Хотите пойти дальше и изменить какой-то шаблон? Это тоже можно. Просто кладёте этот шаблон в ещё одно специальное место и он подгружается заместо соотвествующего ему базового шаблона. При желании можно переопределить все базовые шаблоны.



А относительно базовых шаблонов возникла идейка разметить их в духе времени — то бишь, семантически. Что я сегодня и попытался сделать, вынеся многие последовательности элементов в контейнеры, добавив и в формы, сделав sidebar одним большим DL списокм.



Если у кого-то есть свободное время, то вы можете посмотреть внутрь html кода этого блога и предложить свои семантические пожелания Ещё я не откажусь от ссылок на true статьи про семантическую вёрстку.

Ссылка на оригинал: http://web-brains.com/2008/05/13/semanticheskaya-vyorstka/



Комментировать   Добавить в избранное   

web-brains.com blog posts: Google Social Graph API

Оказывается, у Google есть сервис Social Graph API. Он предоставляет информацию о XFN и FOAF связях.



Вот здесь можно ввести URL своего блога и посмотреть исходящие и входящие XFN-связи. К сожалению, google показывает только прямые входящие XFN-сылки, но эта проблема легко решается ручками. Сервис позволяет делать 50000 запросов в сутки — это достаточно, чтобы построить гигантский граф )



Я ввёл свой блог и увидел, что на меня стоит две XFN-ссылки:

* it4it.ru/ contact

* sotakone.com/ friend met



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

Ссылка на оригинал: http://web-brains.com/2008/05/09/google-social-graph-api/



Комментировать   Добавить в избранное   

web-brains.com blog posts: Файловый мэнеджер с веб-интерфейсом

Сегодня задался организовать в одном проекте работу с файлами через браузер. У меня было три пути:

- найти решение на python

- найти решение на php

- написать всё самому на Django



Последнее я отмёл сразу т.к. велосипедостроение - это не есть good. На python ничего дельного не нашёл, если заблуждаюсь, ткните носом, пожалуйста. С лёгким сердцем я принялся изучать файл мэнеджеры на языке php и с удивлением заметил, что все они представляют из себя гавнецо.



Я перебрал несколько штук, натыкаясь каждый раз на специфические грабли:

- так прост, что не умеет распаковывать zip-архив файлов

- глазодробительный дизайн, да ещё и на html-фреймах (sic!)

- просто не запускается из коробки

- названия файлов имеют французские корни, комментарии на нём же - понять что-то абсолютно нереально

- нужна база данных для работы o_O

- просит бабла



Уже отчаявшись я наткнулся - о чудо - на работающий file manager, понимающий zip arhives, запускающийся из коробки и внятную инструкцию по установке, которую впрочем можно не читать, там всё достаточно понятно. Называется эта софтинка Dolphin.php file manager.



Собственно, этот пост пишу, дабы поблагодарить автора за труды.

Вот ссылка на php file manager с поддержкой zip.

Ссылка на оригинал: http://web-brains.com/2008/03/09/web-file-manager/



Комментировать   Добавить в избранное   

web-brains.com blog posts: Клиент для брокера ссылок mainlink.ru

На днях сделал клиент для работы с сайтом mainlink.ru (аналог sape.ru). Пока фунциональность очень простая (нет кеширования). Работает, как для морд, так и для внутренних страниц.



Посмотреть код можно здесь: http://dja.pydev.ru/browser/dja/mainlink

Скачать здесь (mercurial репозиторий): http://hg.dja.pydev.ru

Ссылка на оригинал: http://web-brains.com/2008/03/06/klient-dlya-brokera-ssylok-mainlinkru/



Комментировать   Добавить в избранное   

web-brains.com blog posts: Exception Conference #07


Открыта регистрация на Exception Conference #07



Дорогие друзья!



Рады сообщить, что седьмая всеукраинская конференция по динамическим языкам программирования “Exception Conference #07” состоится 15 марта 2008 года в Киеве в гостинице “Русь”. В конференции примут участие лучше украинские и российские специалисты в области разработки GUI- и Web- приложений. Это первая в своём роде конференция, которая «под одной крышей» объединит языки программирования Python, Ruby, SmallTalk, Groovy и REBOL. Аналогов Exception Conference, на данный момент нет нигде.



Типа объявка такая ) Подробности на сайте Exception

Ссылка на оригинал: http://web-brains.com/2008/03/04/exception-number-seven/



Комментировать   Добавить в избранное   

web-brains.com blog posts: Клиент sape.ru на python: новый код

Сегодня у меня наконец-то дошли руки довести рефакторинг клиента sape.ru до конца. Нового он не стал делать ровным счётом ничего, код разросся в несколько файлов, тесты пока не готовы… Вот такой вот рефакторинг )



Зато я добавил много docstring’ов и спроектировал структуру клиента так, чтобы можно было в дальнейшем расширять его реализациями кэша в базе данных или где-то ещё. Я изменил шаблонные тэги sape_links и sape_links_list: теперь второй параметр включает или отлючает (по умолчанию) вывод информации для отладки, которая выглядит, примерно, так:





User

74947f25f25d6eb17e910005cbeaa8e6

Host

allsubmitter.org

Error

None

URI in cache

10

Cache updated

False



где cache_updated означает обновлялся ли кэш с сервера или был использован локальный файл. URI in cache - это количество страниц(вашего сайта) в кэше.



Теперь, если в settings.py не задана настройка SAPE_DOMAIN, то домен определяется автоматически по переменным HTTP_HOST и SERVER_NAME. Также в случае ошибки работы с файлами или чем-либо ещё код ошибки показывается вместо ссылок )



Теперь на очереди создание клиента для показа ссылок в контекстном режиме, ну и доведение текущего клиента для ума (надо тесты переписать заново, например).



Посмотреть код можно здесь: http://dja.pydev.ru/browser/dja/sape



Скачать здесь (mercurial репозиторий): http://hg.dja.pydev.ru

Ссылка на оригинал: http://web-brains.com/2008/03/03/sape-ru-client-refactoring/



Комментировать   Добавить в избранное   

web-brains.com blog posts: Мои инструменты

Я вижу, питонеры вовсю пишут об инструментах, без которых они как без рук. Подобные списки замечены на блогах daevaorn, piranha, maniac, glader. В принципе, хороший повод, для создания поста “из ничего”. ) Я намерен воспользоваться им.



Итак, хит-парад мои любимых инструментов:



1. vim - редактор, в котором я набиваю весь код. IDE не юзаю из принципа. Я буквально не вылажу из vim т.к. помимо работы с кодом на домашней машине, я очень часто использую vim для правки файлов на удалённых серверах через ssh.



2. ack - маленькая утилитка, аналог grep. Отличительные особенности: игнорирует служебные каталоги систем контроля кода (.svn, например), по-умолчанию ищет рекурсивно. Рекомендую попробовать.



3. firefox - банальщина, конечно, но от правды никуда не деться. Firefox + firebug + web developer рулят не по-детски ) Советую попробовать firefox3 - хоть он ещё beta3, но я его юзаю без проблем. Прирост скорости заметен невооружённым взглядом. Я бы даже сказал, что его и слепой заметит )



4. mercurial - децентрализованная система контроля версий кода. На службе уже полгода (ранее использовал subversion). Использовать действительно проще, чем subversion, в силу некоторых причин. Каких именно спрашивайте у piranha, он mercurial ещё больше меня любит )



5.urxvt - эмулятор терминала с поддержкой табов и юникода, тормоза в комплект не включены.



Такие дела )

Ссылка на оригинал: http://web-brains.com/2008/03/01/tools/



Комментировать   Добавить в избранное   


[1..25] [26..34] Показывать по 


Вход / Регистрация
Время регистрироваться
Неизвестный пользователь,
назовите себя или зарегистрируйтесь!
+13°C
Погода в Москве:
Температура воздуха +13 °C
кратковременный дождь

Ветер 1 м/с
Давление 745 мм. рт. ст.
Влажность 95 %
28 августа, четверг