Рабочая суббота

13 ноября 2010

Это самое настоящее вселенское зло!

работа убивает

Сижу уже который час читаю БОР, потому что просто безобразно нечем заняться.

это бесполезнейшее времяубивание! я тупею! я скоро стану как вареный овощ!!

овощ

Вообщем отпустите меня пораньше! не могу больше заниматься этой фигней! причем в прямом смысле этого слова!

ЛопатаСмеяться тут 🙂

Надо сваливать домой, там очередная серия хауса, сегодня вероятно выйдет The Big Bang Theory, вообщем есть над чем оттопыриться.

П.Сы.: А у гугла сегодня логотипчег хорош

Роберт Льюис Стивенсонне правда ли? 😉

Хочу домой!!!

Опубликовал:
Раздел: Мои новости

Python: Простой пример использования twisted

Надо мне написать небольшой сервер, который будет принимать некие данные, сохранять их, а потом по определеным командам отдавать. Сейчас есть нечто такое же, только реализованное на LAMP, работает прямо скажем не очень быстро. Можно конечно сделать какое-то кеширование, memcache и т.д., но мне не хватает свободы маневра в текущей структуре, поэтому я решил таки переписать серверную часть, ибо клиентская вполне себе меня удовлетворяет.

Вообще решил сделать отдельный сервис, висящий на отличном от 80 порту и выполняющий все что мне надо. Писать решил с использование сетевого фреймворка twisted. Штука прикольная, но вот незадача, нормальной документации и примеров как то нету, того что на их сайте есть, мне явно не хватает, для того чтобы понять как и что нужно делать. Поэтому решил для начала написать простенький примерчик, который будет висеть и слушать запросы и в зависимости от url увеличивать или уменьшать внутренний счетчик.

Вот что получилось:

__author__="mrdaark"
__date__ ="$15.07.2009 21:31:01$"
 
from twisted.web import server, resource
from twisted.internet import reactor
import string
 
class Consult():
    count= 0
        def add(self,x=1):
            self.__class__.count+=x
        def remove(self,x=1):
            self.__class__.count-=x
 
class Server(resource.Resource):
    isLeaf = True
        def getChild(self, name, request):
            if name == '':
                return self
            return Resource.getChild(self, name, request)
        def render(self, request):
            urlpath=string.split(request.path[1:],'/')
            path=urlpath[ 0]
            if len(urlpath)>1:
                r=int(urlpath[1])
            else:
                r=1
 
            str='<html><head></head><body>'
            c=Consult()
            if (path=='add'):
                c.add(r)
            elif (path=='remove'):
                c.remove(r)
            str+= "x: %d<br />" % (c.count)
            str+='<a href="/add/1">add 1</a><br /><a href="/remove/1">remove 1</a></body></html>'
            return str
 
def main():
    site = server.Site(Server())
    reactor.listenTCP(8080, site)
    reactor.run()
 
if __name__ == "__main__":
    main()
 

Штука запускается, вешается на 8080 порт и принимает http запросы. Увеличивает и уменьшает внутренний счетчик в зависимости о второго параметра в урл, т.е. формат урл таков: /<функция>/<параметр>. По-умолчанию, параметр равен единице.

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

Опубликовал:

Он издевается!

1 июля 2009

Сейчас дир приволок денежку за мою подработку. Я честно мерзко хихикал когда он ушел.

Мало того что денег там кот наплакал, так видимо чтобы мне казалось что денег дофига, он выдал мне 610 рублей десятками!

Это 61 (шестьдесят одна) бумажка!

стопка денег

стопка денег

Не хилая такая стопка денежков, только куда ее девать теперь 🙂

Опубликовал:
Раздел: Мои новости

Python: RSS to Twitter

29 июня 2009

С недели 2 назад для одного хитрого сайта понадобилось сделать автоматический репост статей в твиттер. Решил не писать на php, а попробовать на python’е наваять. Откровенного говоря очень понравилось! Получилось очень просто и легко.

Написал наверное за пол часа, что с учетом того, что python я вообщем то не знаю совсем не плохо.

  1. #!/usr/local/bin/python
  2. # -*- coding: utf8 -*-
  3.  
  4. import urllib
  5. import libxml2
  6. import pickle
  7. import twitter
  8. import os
  9. from time import sleep
  10.  
  11. bit_api="bit.ly.api"
  12. bit_login="bit.ly.login"
  13. twit_login="name"
  14. twit_pass="pass"
  15. rss_url="http://feed"
  16.  
  17.  
  18. def shorten_url(long_url, login_user, api_key):
  19.     try:
  20.         longUrl = urllib.urlencode(dict(longUrl=long_url))
  21.         login = urllib.urlencode(dict(login=login_user))
  22.         apiKey = urllib.urlencode(dict(apiKey=api_key))
  23.  
  24.         encodedurl="http://api.bit.ly/shorten?version=2.0.1&%s&%s&%s" % (longUrl, login, apiKey)
  25.  
  26.         request = urllib.urlopen(encodedurl)
  27.         responde = request.read()
  28.         request.close()
  29.         responde_dict = eval(responde)
  30.         short_url = responde_dict["results"][long_url]["shortUrl"]
  31.         return short_url
  32.     except IOError, e:
  33.         raise "urllib error "
  34.  
  35.  
  36. if __name__ == '__main__':
  37.     doc = libxml2.parseFile(rss_url)
  38.     links=[]
  39.     for item in doc.xpathEval('//channel/item/link'):
  40.         links.append(item.content)
  41.  
  42.     titles=[]
  43.     for item in doc.xpathEval('//channel/item/title'):
  44.         titles.append(item.content)
  45.  
  46.     rss_path = os.path.join(os.path.dirname(__file__), 'rss.db')
  47.     file = open (rss_path)
  48.     old_links=pickle.load(file)
  49.     file.close()
  50.  
  51.     items=[]
  52.     f=0
  53.     for x in xrange(0,len(links)):
  54.         for old in old_links:
  55.             f=0
  56.             if (old==links[x]):
  57.                 f=1
  58.                 break
  59.         if (f==0):
  60.             items.append(x)
  61.  
  62.     api = twitter.Api(username=twit_login, password=twit_pass)
  63.  
  64.     for x in items:
  65.         title=titles[x].decode("utf8")
  66.         if len(title)<=120:
  67.             print "link %s: %s" % (x,links[x])
  68.             if x!=0:
  69.                 sleep(15)
  70.             api.PostUpdate(title+" "+shorten_url(links[x], bit_login, bit_api))
  71.  
  72.     file=open(rss_path,"w")
  73.     ser=pickle.dump(links,file)
  74.     file.close()
  75.  

Какие трудности вылезли в процессе:

1. Нужно как-то было не постить то что уже отправлено. Решилось сохранением списка ссылок в сериализованном виде в файл

2. Размер сообщение в твиттере не больше 140 символов, а надо бы в твитты еще и ссылки на статьи вставлять, притом что заголовки у статей я бы сказал не маленькие. Решилось регистрацией на bit.ly (сервис укорачивания ссылок) и собственно укорачивание. Не помню уже сам написал или с сайта их взял функцию, ибо там все так просто что даже неинтересно.

3. Невероятно, но встала проблема с кодировкой. Решилось за 5 минут гугления и пробования нескольких комбинаций. Что-то не понимал я откуда куда функции перекодируют. Вобщем вот так надо

title.decode(«utf8»)

4. Ну и задержку пришлось поставить, иначе bit.ly говорило зайдите позже 🙂

Дальше все это безобразие запихал в крон:

*/12 * * * * /usr/local/bin/python /usr/local/www/rss2twitter/rss2twit.py

За время пока это дело работает, уже сделан репост 1256 твиттов, так что красота.

А вообще все очень просто и легко, особенно учитывая что twitter api уже написано. хотя если бы его небыло, думаю я бы просто логинился, сохранял куки и постил обычным POST запросом.

Ну и файлик со скриптом на последок: rss2twit.tar.gz

З.Ы. с удовольствием выслушаю критику, потому как первое не Hello, world! приложение на python’е. 🙂

Опубликовал:

Хозяйке на заметку: замечания детям от посторонних

27 июня 2009

На баше вычитал, надо будет попробовать

Моему ребенку делают замечания посторонние люди! Как реагировать?
Обучите ребенка волшебному заклинанию: «Меня мама учит, что не всякое оценочное суждение должно служить модификатором поведения». Будучи произнесено с четкой дикцией и доброжелательно-уверенной интонацией оно действует аналогично заклинанию: «Окаменей!», причем более надежно, хотя и ненадолго, и без опасных побочных эффектов.

Думаю действительно сработает 🙂

Опубликовал:
Раздел: Мои новости

Яндекс vs Google или устами младенца…

10 мая 2009

Сейчас мелкий (8 месяцев) сидел и колошматил рученками по клавиатуре ноутбука и водил пальчиками по тачпаду, я чтоб время зря не пропадало, решил показать ему картинки в яндексе, набрал куку, и показал как искать. Мелкий посмотрел, 10 секунд активно колошматил по клавиатуре, и вуаля, тот же запрос в гугел.картинках!!!

вот такие пироги :)))

Опубликовал:
Раздел: Мои новости

Ubuntu на Asus X55SV и звук в наушники

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

Немного порыскав в интернете, нашел решение. Нужно в файлик/etc/modprobe.d/alsa-base.conf добавить строчечку:

options snd-hda-intel model=lenovo-ms7195-dig

после чего перезагрузился и все заработало 🙂

PS. как вариант предлагалась еще вот такая строчка:

options snd-hda-intel model=3stack-6ch

PPS. пользуясь случаем попиарю блог товарища seo-оптимизатора, мне пофик, а ему приятно буит 🙂

Опубликовал:
Раздел: Мои новости