• 30Nov

    Сегодня обновил вордпресс, и заодно добавил плагин, который давно искал – для рейтингования постов. Получилось заюзать только один “Vote the Post”.

    А также “Homepage Excerpts” Теперь только первые два поста будут выведены полностью.

    ShareThis – это для всяких букмарк сервисов. Ну малоли…

    Убрал из коментов капчу.

    Rating 3.00 out of 5
    [?]

    Tags: ,

  • 21Nov

    По сути мы к урлам привязываем функции, а значит получается мы используем простое функциональное программирование, и не очевидно, как в такой ситуации воспользоваться всем обилием объектно-ориентированого программирования, которое предоставляет Python.

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

    Вопросы расширяемости. Это вопрос объектно-орентированого программирования, о котором я говорил выше. Его по сути нет. Вам дали апликейшен – пользуйтесь. Все, что можно менять в его работе – лежит в настройках ВСЕГО проекта, либо в параметрах передаваемых самому инклюду. А хотите больше? Копайтесь в моих исходниках и пишите то, что вам надо.

    Вот мое решение.

    1.  
    2. from django.conf.urls.defaults import url
    3.  
    4. class AddNewUrl(object):
    5.     def __init__(self,prefix,view,*t):
    6.         self.prefix = prefix
    7.         self.view = view
    8.         self.t = t
    9.     def __call__(self,*t,**k):
    10.         if 'before' in self.prefix :
    11.             self.prefix['before'](*t,**k)
    12.         return self.view(*t,**k)
    13.  
    14. def newpatterns(prefix, *args):
    15.     pattern_list = []
    16.     for t in args:
    17.         pattern_list.append(newurl(prefix, *t))
    18.     return pattern_list
    19.  
    20. def newurl(prefix,regex,view,*t):
    21.     return url(regex,AddNewUrl(prefix,view,*t),*t)
    22.  
    23.  
    24. def classpatterns(cp):
    25.     o_cp = cp()
    26.     cp_prefix = {}
    27.     if hasattr(o_cp,'before_cp'):
    28.         before_cp = getattr(o_cp,'before_cp')
    29.         if callable(before_cp):
    30.             cp_prefix['before'] = before_cp
    31.     func_list = ()
    32.     for item in dir(o_cp):
    33.         if item.startswith('cp__'):
    34.             item_func = getattr(o_cp,item)
    35.             if callable(item_func):
    36.                 func_list = func_list + ((r'^'+item[4:]+'/$',item_func),)
    37.     #raise str(func_list)
    38.     return newpatterns(cp_prefix,*func_list)

    Теперь урлы и вьювы – объединены в одном классе.
    Если вы хотите написать обработчик урла «^home/$» , то вам можно просто написать функцию cp_home в которой и будет вестись обработка вашего запроса.

    Если у вас есть функция, которую необходимо дергать перед запускам каждого обработчика, то назовите ее before_cp

    Но есть и ограничения, которые я еще не преодолевал, т.к. они пока особо меня не касались:

    Нельзя в полной мере воспользоваться регекспами в урлах.
    Нельзя использовать инклюды внутри такого аппликейшена. А вы думаете они правда нужны при таком построении приложения?
    Приложения такого типа типа лучше не использовать на «первом уровне» а только инклюдить в основное.

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

    Вот пример использования:

    файл ajax/vurl.py

    1.  
    2. from newpatern.defaults import newpatterns, classpatterns
    3. django.http import HttpResponse
    4. class Views(BaseViews):
    5.     def cp__connect(self,request):
    6.           return HttpResponse('HI ALL')
    7.     def cp__NO(self,request):
    8.           return HttpResponse(reqest.GET.get('n'))
    9.  
    10. urlpatterns = classpatterns(Views)

    Обратите внимание, что в этих урлах первым парамером передается self. Да, это экземпляр класса, который создается один раз

    В Ваш файл с урлами просто вставте:

    1. (r'^flashajax/',include('ajax.vurls')),

    Теперь по запросу flashajax/connect/
    в ответ получить “HI ALL”

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

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

    Rating 4.00 out of 5
    [?]

    Tags: , , , ,

  • 13Nov

    Впервые увидел такое безумное количество букмарк сервисов.

    Rating 2.50 out of 5
    [?]
  • 12Nov

    Сейчас для одного моего проекта мне надо рыть инфу по сокетам в питоне. “Рыть инфу” – это конечно громко сказано, просто надо ознакомится с возможностями базовых классов и начать решать первые задачи.

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

    PS: На эту тема сразу вспомнил еще один хороший ресурсец, который поможет не только питонщикам но и всем всем всем. Поиск по примерам программ из книг

    Rating 3.00 out of 5
    [?]

    Tags: , , ,

  • 09Nov

    Надеюсь, все из вас понимают, что на python manage.py runserver … продакшен работать не будет. Это хорошо. На самом деле ответы на все эти вопросы можно накапать в гугле.

    Создавая проект на, к примеру, на перле у меня был fcgi скрипт, в котором и обрабатывались все запросы. Этот скрипт писался мной либо Catalyst сам генерил этот файл. На внешнем сервере я просто лайти указывал путь на этот файл и все. Удобно это было хотя бы тем, что лайти сам следил за тем, чтоб скрипт не отваливался и в случае необходимости доподнимал необходимое количество скриптов.

    В случае джанго – вы отдельно поднимаете скрипты, указываете им сокет а лайти уже указываете на этот сокет. По крайне мере второго решения я не нашел пока, т.к. и это пока устраивает.

    1. $HTTP["host"] == "yourwebsite.com" {
    2.  
    3. server.document-root = "/home/www/website/static/"
    4.  
    5. fastcgi.server = (
    6.     "/manage.fcgi" => (
    7.         "main" => (
    8.             # Use host / port instead of socket for TCP fastcgi
    9.             # "host" => "127.0.0.1",
    10.             # "port" => 3033,
    11.             "socket" => "/home/www/website/manage.sock",
    12.             "check-local" => "disable",
    13.         )
    14.     ),
    15. )
    16. alias.url = (
    17.     "/static/" => "/home/www/website/static/",
    18. )
    19.  
    20. url.rewrite-once = (
    21.     "^(/static.*)$" => "$1",
    22.     "^/favicon\.ico$" => "favicon.ico",
    23.     "^(/.*)$" => "/manage.fcgi$1",
    24. )
    25. }

    Что тут происходит? Сначало направляем фаст “/manage.fcgi” на сокет “/home/www/website/manage.sock”.
    В алиасах прописываем пути к вашим папкам со статикой.

    Реврайты лайти проверяет поочереди. Поэтому сначала записываются статика с favicon. А потом реврайт на fastcgi. Т.е. на фаст попадают только не статические запросы.

    По модулям lighttpd – проверте, чтоб у вас были активны следующие: mod_alias, mod_rewrite и mod_fastcgi

    Далее скрипт, который создает непосредственно сокет. Его можно положить в папку с manage.py

    1. #!/bin/bash
    2.  
    3. # Replace these three settings.
    4. PROJDIR="/home/www/website/"
    5. PIDFILE="$PROJDIR/manage.pid"
    6. SOCKET="$PROJDIR/manage.sock"
    7.  
    8. cd $PROJDIR
    9. if [ -f $PIDFILE ]; then
    10.     kill `cat$PIDFILE`
    11.     rm -f — $PIDFILE
    12. fi
    13.  
    14. ./manage.py runfcgi socket=$SOCKET pidfile=$PIDFILE
    15. chmod a+w $SOCKET

    В принципе и скрипт и конфиг лайти, с небольшими поправками, можно нарыть в доках по джанго.

    Но этого будет мало.
    Во первых необходимо сразу указать в settings.py:

    1. FORCE_SCRIPT_NAME = ''

    иначе вас ждут несколько неприятных сюрпризов с редиректами. Далее проконтролируйте урлы и пути в файле settings.py. Хотябы LOGIN_URL у вас точно должен был поменятся.

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

    1. DEBUG = False
    2.  
    3. ADMINS = (
    4.      ('Alexander Lyabah', 'alexander@lyabah.com'),
    5. )
    6.  
    7. EMAIL_HOST = 'smtp.gmail.com'
    8. EMAIL_PORT = 587
    9. EMAIL_HOST_USER = 'support@lyabah.com'
    10. EMAIL_HOST_PASSWORD = '***'
    11. EMAIL_SUBJECT_PREFIX = '[My-Web-Site]'
    12. EMAIL_USE_TLS = True

    Пока все… если что еще всплывет, буду еще об этом писать.

    Rating 3.00 out of 5
    [?]

    Tags: , , , ,

  • 09Nov

    Ездил на этих выходных к своему деду. Не был у него уже довольно давно. Стыдно сказать, сколько я уже у него не был. Еле узнал меня. Но я не об этом. В дороге дочитал «пикник на обочине» Стругацких. Все наверняка читали, еще в детстве, но Саша как всегда после всех. Мне просто очень понравился диалог Нуана с Пильманом, и решил сюда его и сбросить.

    - Скажите по чести, Ричард, – явно развлекаясь, сказал Валентин. -
    Вот для вас, дельца, что изменилось с Посещением? Вот вы узнали, что во
    Вселенной есть еще по крайней мере один разум помимо человеческого. Ну и
    что?
    – Да как вам сказать? – промямлил Нунан. Он уже жалел, что затеял
    этот разговор. Не о чем здесь было разговаривать. – Что для меня
    изменилось?.. Например, вот уже много лет я ощущаю некоторое неудобство,
    неуютность какую-то. Хорошо, они пришли и сразу ушли. А если они придут
    снова и им взбредет в голову остаться? Для меня, для дельца, это, знаете
    ли, не праздный вопрос: кто они, как они живут, что им нужно?.. В самом
    примитивном варианте я вынужден думать, как мне изменить производство. Я
    должен быть готов. А если я вообще окажусь ненужным в их системе? – он
    оживился. – А если мы все окажемся ненужными? Слушайте, Валентин, раз уж к
    слову пришлось, существуют какие-нибудь ответы на эти вопросы? Кто они,
    что им было нужно, вернутся или нет?..
    – Ответы существуют, – сказал Валентин, усмехаясь. – Их даже очень
    много, выбирайте любой.
    – А сами вы что считаете?
    – Откровенно говоря, я никогда не позволял себе размышлять об этом
    серьезно. Для меня Посещение – это прежде всего уникальное событие,
    чреватое возможностью перепрыгнуть сразу через несколько ступенек в
    процессе познания. Что-то вроде путешествия в будущее технологии. Н-ну,
    как если бы в лабораторию к Исааку Ньютону попал современный квантовый
    генератор…
    – Ньютон бы ничего не понял.
    – Напрасно вы так думаете! Ньютон был очень проницательный человек.
    – Да? Ну ладно, бог с ним, с Ньютоном. А как вы все-таки толкуете
    Посещение? Пусть даже несерьезно…
    – Хорошо, я вам скажу. Только я должен предупредить вас, Ричард, что
    ваш вопрос находится в компетенции псевдонауки под названием ксенология.
    Ксенология – это некая неестественная помесь научной фантастики с
    формальной логикой. Основой ее метода является порочный прием -
    навязывание инопланетному разуму человеческой психологии.
    – Почему порочный? – сказал Нунан.
    – А потому, что биологи в свое время уже обожглись, когда пытались
    перенести психологию человека на животных. Земных животных, заметьте.
    – Позвольте, – сказал Нунан. – Это совсем другое дело. Ведь мы
    говорим о психологии _р_а_з_у_м_н_ы_х_ существ…
    – Да. И все было бы очень хорошо, если бы мы знали, что такое разум.
    – А разве мы не знаем? – удивился Нунан.
    – Представьте себе, нет. Обычно исходят из очень плоского
    определения: разум есть такое свойство человека, которое отличает его
    деятельность от деятельности животных. Этакая, знаете ли, попытка
    отграничить хозяина от пса, который якобы все понимает, только сказать не
    может. Впрочем, из этого плоского определения вытекают более остроумные.
    Они базируются на горестных наблюдениях за упомянутой деятельностью
    человека. Например: разум есть способность живого существа совершать
    нецелесообразные или неестественные поступки.
    – Да, это про нас, про меня, про таких, как я, – горестно согласился
    Нунан.
    – К сожалению. Или, скажем, определение-гипотеза. Разум есть сложный
    инстинкт, не успевший еще сформироваться. Имеется в виду, что
    инстинктивная деятельность всегда целесообразна и естественна. Пройдет
    миллион лет, инстинкт сформируется, и мы перестанем совершать ошибки,
    которые, вероятно, являются неотъемлемым свойством разума. И тогда, если
    во Вселенной что-нибудь изменится, мы благополучно вымрем, – опять же
    именно потому, что разучились совершать ошибки, то есть пробовать разные,
    не предусмотренные жесткой программой варианты.
    – Как-то это все у вас получается… унизительно.
    – Пожалуйста, тогда еще одно определение, очень возвышенное и
    благородное. Разум есть способность использовать силы окружающего мира без
    разрушения этого мира.
    Нунан сморщился и замотал головой.
    – Нет, – сказал он. – Это не про нас… Ну а как насчет того, что
    человек, в отличие от животных, существо, испытывающее непреодолимую
    потребность в знаниях? Я где-то об этом читал.
    – Я тоже, – сказал Валентин. – Но вся беда в том, что человек, во
    всяком случае, массовый человек, тот, которого вы имеете в виду, когда
    говорите “про нас” или “не про нас”, – с легкостью преодолевает эту свою
    потребность в знаниях. По-моему, такой потребности и вовсе нет. Есть
    потребность понять, а для этого знаний не надо. Гипотеза о боге, например,
    дает ни с чем не сравнимую возможность абсолютно все понять, абсолютно
    ничего не узнавая… Дайте человеку крайне упрощенную систему мира и
    толкуйте всякое событие на базе этой упрощенной модели. Такой подход не
    требует никаких знаний. Несколько заученных формул плюс так называемая
    интуиция, так называемая практическая сметка и так называемый здравый
    смысл.
    – Погодите, – сказал Нунан. Он допил пиво и со стуком поставил пустую
    кружку на стол. – Не отвлекайтесь. Давайте все-таки так. Человек
    встретился с инопланетным существом. Как они узнают друг о друге, что они
    оба разумны?
    – Представления не имею, – сказал Валентин веселясь. – Все, что я
    читал по этому поводу, сводится к порочному кругу. Если они способны к
    контакту, значит, они разумны. И наоборот: если они разумны, они способны
    к контакту. И вообще: если инопланетное существо имеет честь обладать
    психологией человека, то оно разумно. Вот так.
    – Вот тебе и на, – сказал Нунан. – А я-то думал, что у вас все уже
    разложено по полочкам…
    – Разложить по полочкам и обезьяна может, – заметил Валентин.
    – Нет, погодите, – сказал Нунан. Почему-то он чувствовал себя
    обманутым. – Но если вы таких простых вещей не знаете… Ладно, бог с ним,
    с разумом. Видно, здесь сам черт ногу сломит. Но насчет Посещения? Что вы
    все-таки думаете насчет Посещения?
    – Пожалуйста, – сказал Валентин. – Представьте себе пикник…

    Rating 3.00 out of 5
    [?]

   

Recent Posts

Recent Comments

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