• 15Dec

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

    Resources for web designers
    www.forwebdesigners.com
    bluevertigo

    пожалуй, последний, мне понравился больше всех.

    Rating 4.00 out of 5
    [?]

    Tags: , ,

  • 14Dec

    Сегодня попробовал, пришел в легкий экстаз….

    В какойнить вьюхе, данные которой вам интересны напишите просто

    1. import pdb
    2. pdb.set_trace()

    импорт, ясен, можно вынести за вьюху. Это питоновский дебагер. Теперь, когда вы откравить зепрос к этой вьюхе, и он дойдет до указаного места – выполнение остонавливается и в консоле, в которой у вас запущена джанга вы переходите в дебаг.

    1. [14/Dec/2008 14:40:21] "GET /myview/ HTTP/1.1" 200 2
    2. > /home/oduvan/www/AppDjango/views.py(10)index()
    3. -> if request.user.is_anonymous:
    4. (Pdb)

    и в консоле поддерживаются следующие основные комманды:
    n – следующая сомманда
    s – зайти в рутину
    r – выйти из рутины
    l [first,[last]] – вывести код, и место, где ты сейчас находишся. Если не указан first и last то выводится текущая позиция. first и last определяет с какой по какую строчки необходимо вывести.
    p – вывести результат операции
    c – продолжать выполнения программы до следующего брейкпоинта
    w – показать текущий стек вызова
    q – выйти.

    Этого мне пока в полне достаточно. Натолкнулся тут. А еще можно почитать на python.org.

    Если чесно, узнай я про енту фикчу прикольную раньше – и спал бы по дольше, и выглядел бы лучше.

    Rating 3.00 out of 5
    [?]

    Tags: , , ,

  • 12Dec

    Всем привет.

    Знаете, что мне понравилось в питоне, и что я не видел в других языках — это то его Exceptions. Кроме того, что вы можете узнать строчку кода, где он возник , так вы можете ещё получить весь стек вызова до этого эксепшена, в виде массива, и для каждого из вызовов получить массив всех локальных переменных в этом вызове. По сути, если сразу при ошибке вываливать всю эту инфу, то, как правило, рытца, и трейсить все переменные — просто нет необходимости.

    И если б не джанга, то я бы так и не узнал о этой возможности. Во время ошибки она вываливает пользователю всю инфу, о которой я рассказывал, и даже немножечко больше. Ну если быть точным, то не «ошибки», а эксепшена, который «вырвался» из вьюхи о не отловился не в одном из мидлов. Т.е. Грубо говоря – после всех мидлов ексепшен ловит уже сама джанга.

    Вот, а теперь по сути. Получить всю эту инфу можно с помощью sys.exc_info(). Про него я подробно рассказывать не буду, т.к. Лучше мана я все равно не расскажу. А сама джанга под это сделал отдельный класс, в конструктор которого и передаются все эти данные

    1. from django.views.debug import ExceptionReporter

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

    Сразу скидываю текст мидла. Думаю в описании структуры базы — необходимости нет. Но на всякий случай, я приложил исходничек, на котором я тестил это.

    1. import sys
    2. from django.views.debug import ExceptionReporter
    3. from django.http import HttpResponseRedirect
    4. from models import ErrInfo,ErrStack
    5. from django.conf import settings
    6. class GetUserErrorInfo(object):
    7.     def process_exception(self, request, exception):
    8.         exR = ExceptionReporter(request,*sys.exc_info())
    9.         frames = exR.get_traceback_frames()
    10.         er_info = ErrInfo(etext=str(exception),etype=type(exception).__name__)
    11.         er_info.save()
    12.         for item in frames:
    13.             ErrStack(err=er_info,function=item['function'],vars=str(item['vars']),filename=item['filename'],context_line=item['context_line'],lineno=int(item['lineno'])).save()
    14.         return HttpResponseRedirect(settings.ERR_INFO_PREFIX+'?id='+str(er_info.id))

    Основательно я его еще не юзал — это пока только самая первая пред альфа версия :)
    dj_errinfotar

    Ну и конечно же, жду ваших отзывов.

    Rating 3.00 out of 5
    [?]

    Tags: , , , , ,

  • 12Dec

    Наверно, не очень хорошо, менять часто дизайн своего блога, но просто заметил, что в Iceweasel у меня дизайн налазит.

    Кстате, наконецто решился и перешел полностью в линух на дестопной тачке. До этого у меня весела винда, на ней вмварка, в вмварке дебиан, самба сервер расшаривал папки для работы, в винде подключал сетевой диск и работал как лакально (…. в сундуке яйцо, в яйце игла … ).  Винда согнулась, я понял, что от нее мне особо для работы ничего не надо. И теперь у меня вот только Дебиан.

    Ну вообщето не совсем “только”. Винда осталась, второй системой поставил, вопервых мне нужен флеш, а во вторых я раз в месяц шпилю в Героев 5. Но чтото мне подсказывает, что скоро и она займет свое место в вмварке )

    Rating 3.00 out of 5
    [?]

    Tags: , ,

  • 09Dec

    это именно то, как назвал это автор в хабре статье. Их 1689. Откуда столько?

    1689-free-file-hosters

    Rating 3.00 out of 5
    [?]

    Tags: , , ,

  • 03Dec

    Буквально пару строк кода добавили массу дополнительных возможностей.

    теперь если функция cp_before возвратит значение – это значит это и будет результатом всего запроса. Появилась функция cp_after которая вызывается в конце всей обработки

    результат работы функций cp__* может быть не обязательно наследник HttpResponse, но и любая другая структура языка, которая уже будет преобразована к оному с помощью функции cp_prepare

    Вот собственно необходимые доработки в классе AddNewUrl :

    1.      def __call__(self,*t,**k):
    2.         if 'before' in self.prefix :
    3.             ret = self.prefix['before'](*t,**k)
    4.             if ret:
    5.                 return ret
    6.         ret =  self.view(*t,**k)
    7.         if 'prepare' in self.prefix:
    8.             newret =   self.prefix['prepare'](ret,*t,**k)
    9.             if newret: ret = newret
    10.         if 'after' in self.prefix:
    11.             self.prefix['after'](*t,**k)
    12.         return ret

    теперь, к примеру задача вывода JSON структуры сводится к

    1. from django.http import HttpResponse
    2. import simplejson as json
    3. class BaseViews(object):
    4.     def prepare_cp(self,response,request):
    5.         return HttpResponse(json.dumps(response))
    6.     def cp__all_rooms(self,request):
    7.         return {'hi':'World','id':request.GET.get('id')}
    Rating 3.00 out of 5
    [?]

    Tags: , , , , ,

  • 01Dec

    Сегодня из интереса написал небольшой модуль сериализации в ХМЛ. На скорую руку. Как по мне – довольно элегантное решение. Как думаете?

    1. def xml_escape(text):
    2.     return str(text).replace('&','&amp;').replace('<','&lt;').replace('>','&gt;').replace('"','&quot;').replace("'",'&apos;')
    3.  
    4. def xmlSerial(name,attr=None,inner=None):
    5.     if attr:
    6.         name_attr = name+' '+' '.join(map(lambda (a,b):a+'="'+xml_escape(b)+'"',attr.items()))+' '
    7.     else:
    8.         name_attr = name
    9.    
    10.     if inner:
    11.         if type(inner) == list:
    12.             inner_str = ''.join(map(lambda a: xmlSerial(*a),inner))
    13.         else:
    14.             inner_str = inner
    15.         return '<'+name_attr+'>'+inner_str+'</'+name+'>'
    16.     else:
    17.         return '<'+name_attr+'/>'

    Вот, как его мона юзать:

    1. print xmlSerial('HI',{'a':'1','c':3,'d':'WOW'},[['RR'],['WOW',{'and_attr':'45t'}],['WIN',{'a':1},'HI IT IS INNER']])
    2. print xmlSerial('HI',{'a':'1','c':3,'d':'WOW'},[['RR'],['WOW',{'and_attr':'45t'}]])
    3. print xmlSerial('HI',{'a':'1','c':3,'d':'WOW'},[['RR'],['WOW']])
    4. print xmlSerial('HI',{'a':'1','c':3,'d':'WOW'},'AND INNER')
    5. print xmlSerial('HI',{'a':'1','c':3,'d':'WOW'})
    6. print xmlSerial('HI',{'a':'1'})
    7. print xmlSerial('HI')
    Rating 3.00 out of 5
    [?]

    Tags: , , , ,

   

Recent Posts

Recent Comments

  • Я просто оставлю это тут: ...
  • спасибо...
  • Если вдуматься в каждое слово, то время беСконечно в русском...
  • Спасибо, Евгений, исправленно.P.S.: перехал на диску...
  • за опечатку - спасибо...