anton_nazarov: (Default)
Решил тут довольно неприятную проблему при использовании Django с SQLite - невозможность делать регистронезависимые выборки из базы для языков, отличных от английского.
Решение тут.

Поможет всем, кто сталкивался с такой проблемой при использовании SQLite (не только в Django и Python).
anton_nazarov: (Default)
Специальный livecd Thnake содержит emacs 22.3 (включая gnus), python 2.5, tcl/tk 8.5 и sbcl 1.0.20.
Для разработки на lisp есть slime. В качестве браузера используется Conkeror, основанный на движке Firefox-а и использующий сочетания клавиш Emacs, очень быстрый и довольно удобный.
Весит всё это счастье всего 110 мегабайт.
Я поставил на флешку по этой инструкции.
После загрузки у меня заработал звук и wifi, легко подключился диск и русский язык.

vkrss

Nov. 29th, 2008 01:09 am
anton_nazarov: (Default)
Слегка поправил vkrss, новый исходник тут, сборка для windows тут.

Использовать так: vkrss-0.1.exe ваш_email ваш_пароль

В результате у вас на машине по адресу http://127.0.0.1:9999/ будет работать веб-сервер, который при каждом обновлении будет скачивать новости "В Контакте" и отдавать в виде RSS.

Затем добавляем в RSS-читалку адрес http://127.0.0.1:9999/

В гуглоридере, естественно, не работает, так как преобразование происходит на локальной машине :)

Свежие версии буду коммитить в svn на http://code.google.com/p/vkontakte-getter , туда же лучше писать сообщения об ошибках.
anton_nazarov: (Default)
То, о чём так долго говорили большевики, свершилось!
Я написал преобразовывалку вконтактовских новостей в RSS.
Вот код vkrss.py:
#!/usr/bin/python
# -*- coding: utf-8 -*-
from BeautifulSoup import BeautifulSoup
from datetime import *
from cgi import escape
import cookielib, urllib2, urllib, re, os, codecs
import sys
import string,cgi,time
from os import curdir, sep
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer

import random

cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
opener.addheaders = [('User-agent', 'Mozilla/5.0')]


def transform():
	data=opener.open('http://vkontakte.ru/news.php?%d'%(random.randint(1,99999))).read()    

	template='\
	\
	\
	http://vkontakte.ru/news.php\
	Новости друзей\
	ru-RU%(date)s' % {'date':datetime.now()}
        res=template
	soup=BeautifulSoup(data)
	days = soup.findAll('div',attrs={'style':'padding:10px 10px 20px 10px;'})
	theday=date.today()
	for day in days:
	    items=day.findAll('table','feedTable')
	    for item in items:
	        time = datetime.strptime(item.find('td','feedTime').string.strip(),"%H:%M").time()
	        story = item.find('td','feedStory')
                for aTag in story.findAll('a'):
                        aTag['href']='http://vkontakte.ru/'+aTag['href']
	        name = story.first().string
	        text = story.first().next.next
	        dt=datetime.combine(theday,time)
	        res=res+ '%(story)s%(date)s' % {'name':str(name),'text':str(text),'story':escape(str(story)),'date':dt.strftime('%a, %d %b %Y %H:%M:%S +0300')}
	    theday = theday-timedelta(days=1)
	
	res=res+''
        return res

class MyHandler(BaseHTTPRequestHandler):

    def do_GET(self):
        try:
            self.send_response(200)
            self.send_header('Content-type',	'application/rss+xml')
            self.end_headers()
            self.wfile.write(transform())
            return
                
        except IOError:
            self.send_error(404,'File Not Found: %s' % self.path)
     

def main():
    params = urllib.urlencode({'email': sys.argv[1],'pass': sys.argv[2].encode('cp1251')})
    try:
        auth_res=opener.open("http://vkontakte.ru/login.php?%s" %params).read()
        if re.search(u'пароль неверный'.encode('cp1251'),auth_res):
            print "Ошибка авторизации"
            sys.exit(1)
    except:
        print "Ошибка соединения"
        sys.exit(1)

    try:
        server = HTTPServer(('', 9999), MyHandler)
        print 'started httpserver...'
        server.serve_forever()
    except KeyboardInterrupt:
        print '^C received, shutting down server'
        server.socket.close()

if __name__ == '__main__':
    main()



Запускаем так:
python vkrss.py "ваш email" "ваш пароль"

В результате у вас на машине по адресу http://127.0.0.1:9999/ будет работать веб-сервер, который при каждом обновлении будет скачивать новости "В Контакте" и отдавать в виде RSS.

Затем добавляем в RSS-читалку адрес http://127.0.0.1:9999/

В гуглоридере, естественно, не работает, так как преобразование происходит на локальной машине :)

Update:
Небольшие исправления в коде - теперь в теле новости правильные ссылки на картинки и заметки.

Важное дополнение - правильный адрес http://127.0.0.1:9999/ Слеш на конце обязателен!
anton_nazarov: (Default)
Сейчас в нашем проекте мы используем фреймворк Django.

Django - это фреймворк для быстрой разработки веб-приложений на языке Python.
Он следует паттерну MVC. Типичное приложение, использующее Django состоит из следующих частей.


  • Модель - набор классов, содержащих данные, и хранящихся в СУБД посредством ORM, предоставляемого фреймворком.

    Выглядит примерно так:
          class Blog(Model):
             author = ForeignKey(User)
             title = CharField(max_length=200)
    
          class Entry(Model):
             blog = ForeignKey(Blog)
             text = TextField()
             date = DateField()
        



  • View - функции, реализующие логику обработки данных и навигации между страницами. Например:
          def show_entries(request):
             entries = Entry.objects.all()
             return render_to_response("entries.html",{"list":entries})
    
          def post_entry(request):
             if request.user.is_authenticated():
                form = PostEntryForm(request)
                if form.is_valid():
                   form.save()
                   return HttpResponseRedirect("/")
                
                return render_to_response("post.html",{"form":form})
    
             return HttpResponseRedirect("/login")
        


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


  • Шаблоны страниц - шаблоны страниц или других документов, используемых для представления информации пользователям. Django содержит довольно простой и удобный язык шаблонов, странички могут выглядеть так:
          <html><body>
    	  {% for entry in list %}
    	  <div>
    	    {{ entry.text }}
    	  </div>
    	  {{ entry.date }}
    	  {% end for %}
          </body></html>
        




Использование тех или иных возможностей Django не является обязательным. Вместе с тем в Django очень много различных помогающих вещей.

Тем не менее, нельзя сказать, что сейчас разработка идет у нас легко и быстро. Причина состоит в том, что использование мощного фреймворка приводит к желанию реализовывать сложную функциональность сразу. Так, я пару дней потратил на регистрацию/авторизацию по OpenID и автоматическую генерацию паролей с их отправкой по электронной почте.
Создание дизайна страничек по-прежнему требует значительных усилий и умения, а кроме того, с Django не работает любимый java-разработчиков по изучению новых технологий - написать любую букву и нажать Ctrl-Space. Приходится читать документацию.
Документация у Django отличная, почти про все написаны исчерпывающие тексты, в которых описаны различные сценарии использования компонентов. В открытом доступе есть так же и книга, которая во многом повторяет документацию, однако содержит дополнительные разъяснения и комментарии по многим практическим вопросам.

Я думаю, что на следующей неделе наша производительность увеличится, так как участники проекта привыкнут к используемой технологии и к совместной работе :)
anton_nazarov: (Default)
http://www.pythonchallenge.com/?
Позиционируется для желающих изучить питон.
Правда в первых нескольких загадках я не нашел ничего, что сложно было бы написать на любом другом языке.
Но на питоне действительно получается коротко и интересно, причем если решение правильное, то оно умещается в пару строчек кода.
anton_nazarov: (Default)
Кому интересно программирование на Python-е, я написал небольшой пост (на английском): Creating simple yet powerful anonymous downloader in Python
anton_nazarov: (Default)
Сегодня я сделал примитивный пользовательский интерфейс для программы, рисующей красивые картинки, а так же собрал ее в виде экзешника, не требующего установки.

Приглашаю желающих потестировать.
Скачать можно тут

Попробую теперь сделать AJAX-версию :)

Update
К сожалению, виндовая сборка получилась неполная, если python не установлен работать не будет, надеюсь ночью исправлю.

Update2
Теперь вроде должно работать.
Картинки генерируются еще краше.
anton_nazarov: (Default)
Вернулся к своим играм с Вконтактом

По ссылке большая красивая картинка.

Заранее извиняюсь перед владельцами маленьких мониторов и пользователями Internet Explorer 5

Profile

anton_nazarov: (Default)
anton_nazarov

September 2014

S M T W T F S
 123456
78910111213
14 151617181920
21222324252627
282930    

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Sep. 21st, 2017 05:02 am
Powered by Dreamwidth Studios