Getting Things Done

잡담 2009. 7. 26. 02:25
언젠가부터인가 메일함에 지우지 못한 메일이 천개에 가까워지면서 부터 머리속이 복잡해 지기 시작했습니다. 아마도 TL이 되고 나서부터인듯한데요. 저희 회사 사내메일 시스템은 특별히 메일을 지우지 않으면 메일이 1주일 동안 살아 있습니다. 즉, 하루에 대강 150개 정도의 메일을 받고 있었다는 이야기가 되네요.



이 난관을 벗어나기 위해서는 GTD 방법론을 사용해야할 듯 싶습니다. 처음에는 무심코 넘겼지만 이제는 정말 절실한 시점이 온 것 같습니다. 마침 정진호님이 깔끔하게 정리하신 자료를 보게 되었습니다.



저는 회사메일과 더불어 아웃룩도 병용하고 있기 때문에,
월요일에 출근하면, 일단 xobni와 jello dashboard를 설치해서 사용해봐야겠습니다. :)
업무효율과 시간활용성이 팍팍 증가했으면 좋겠습니다.


ref.
xobni - http://www.choboweb.com/82
jello dashboard - http://futureshaper.tistory.com/345
GTD - http://ko.wikipedia.org/wiki/Getting_Things_Done, http://www.smartplace.kr/blog_post_330.aspx
AND

요즘 뜨는 SNS인 트위터를 회사에서 모니터링하기에는 너무 눈치가 보여서, 브라우저 플러그인이나 독립어플이 아닌 커멘트라인으로 어떻게 바꿀 수 있을까 생각 중이었는데요. 트위터는 open api가 잘 되어있고, python-twitter 모듈이 쉽게 정리되어 있어서 구현이 정말 쉽더군요.

특히 왜 이렇게 스팸들이 많은지 이해할 수 있었습니다. 모니터링하면서 following하고 스팸 뿌리기가 너무 쉽네요 --;

뭐, 하여간 회사에서 약간 투명하게 커맨드라인 설정해 놓고 쓰기 적당하게 대충 짜 보았습니다. 소스 링크는 다음과 같습니다.
[peeping_tweet.zip]
소스는 보시다시피 거의 python-twitter 그대로입니다 --;

peepingtweet.py를 열어보시면 소스 상단에,
login_id = ""
login_password = ""

과 같이 되어있는데요.
이렇게 되어 있는 경우에는 아래 스샷과 같이 public tweet들이 보이게 됩니다,



자신의 친구들 글을 보려면 login_id와 login_password에 적당한 값을 넣으면 아래 스샷과 같이 제대로 나오게 되는 것을 확인할 수 있습니다.


회사에서는 우분투에서 돌려야지... --;

ps1. python 2.5 기반입니다.
그러므로 혹시나 파이썬이 안깔려있다면 까셔야합니다.
http://python.org/download/releases/2.5.4/

ps2. py2exe는 패스...
아, 그리고 이건 모니터링 온리입니다. 글 올리는 기능은 없습니다.
물론 넣기는 쉽겠지만, 제가 그러한 요구사항을 못 느껴서요 ...
필요하신 분들은 걍 추가해서 사용하세요...
AND

peeping tweet

카테고리 없음 2009. 7. 12. 00:11
AND

yes24 판매지수의 로그가 남지 않아서,
판매량의 변화를 알고 싶어서 간단하게 짰습니다.

예약작업이나 시작프로그램에 넣으시거나, crontab 등에 등록해서 돌리면 됩니다.
하루에 한번만 실행되며, 레코드가 이미 존재하는 경우에는 다시 쓰지 않습니다.
sqlite3를 사용하므로, 데이터확인은 직접 콘솔로 확인하셔도 되고, db 클래스의 확인용 함수를 사용하셔도 됩니다. 저는 아래 그림과 같이 firefox용 sqlite manager를 써서 확인합니다.



소스코드는 다음과 같습니다.
수집대상을 바꾸려면 초반의 books 사전정보를 변경하시면 됩니다.

import urllib2, time, traceback
from BeautifulSoup import BeautifulSoup
import sqlite3

books = {
    'python':'http://www.yes24.com/24/goods/3432490',
    'lua':'http://www.yes24.com/24/goods/3081202'
}

def getContent( url ):
    req = urllib2.Request( url )
    response = urllib2.urlopen(req)
    return response.read()

class DB:
    "SQLITE3 wrapper class"
    def __init__(self):
        self.conn = sqlite3.connect('bookDB')
        self.cursor = self.conn.cursor()
        for title in books.keys():
            self.cursor.execute('CREATE TABLE IF NOT EXISTS %s(date text, sale int)'%title)
            self.cursor.execute('CREATE UNIQUE INDEX IF NOT EXISTS IDX001 ON %s(date)'%title)
       
    def __del__(self):
        self.conn.commit()
        self.cursor.close()

    def insertPython(self, title, date, sale):
        try:   
            self.cursor.execute("INSERT INTO %s VALUES ('%s',%d)"%(title,date,sale))
        except:
            print '%s : maybe already inserted'%title
            return 0
        else:
            print '%s: success'%title
            return 1

    def printPythonResult(self, title):
        self.cursor.execute('SELECT * FROM %s ORDER BY date ASC'%title)
        for row in self.cursor.fetchall():
            print row[0],'\t', row[1]

    def printPythonResult(self, title, num):
        self.cursor.execute('SELECT * FROM %s ORDER BY date DESC LIMIT %d'%(title,num))
        for row in self.cursor.fetchall():
            print row[0],'\t', row[1]

db = DB()

if __name__ == "__main__":
    curtime = time.localtime()
    curday = "%d/%02d/%02d"%(curtime[0],curtime[1],curtime[2])
   
    for title,url in books.items():
        content = getContent( url )
        soup = BeautifulSoup( content )
       
        a = soup('dt', {'class':'saleNum'})
        salenum = -1
        if len(a)>0:
            try:
                text = str( a[0].contents[0] ).split('|')[1]
                #print text
                splited = text.split(' ')
                for s in splited:
                    if s.isdigit():
                        salenum = int(s)
                        break           
            except:
                traceback.print_exc()
               
            print title, ': try to insert :',curday, salenum
            db.insertPython( title, curday, salenum )
           
            print title, ': === recent 10 sale points ==='
            db.printPythonResult( title, 10 )
       
    time.sleep(5) # for reading results....

파일 다운로드 : [ salepoint_checker.py ]

ps. python 2.5 기반입니다.
  
AND

AND

오늘 하루종일 꿀꿀했는데,
귀가 후에 강컴 오늘의 베스트를 확인해 보니 1위를 탈환했네요.
덕분에 급방긋모드가 되었습니다. ^^


http://kangcom.com/best/?topId=4

AND

오늘의 베스트 1위...


AND

이전에 잠시 언급한 적이 있었던,
마소에 기고한 글이 드디어 7월호에 나왔습니다.

http://www.imaso.co.kr/?doc=bbs/gnuboard.php&bo_table=article&page=1&wr_id=33214

제목은 "파이썬 이용해 검색엔진 만들기 - 블로그 크롤러 구현" 입니다.

4월 중순에 다움 사이트 템플릿이 바뀌면서 수정을 좀 했었고,
6월 말과 7월1일 현재, 잘 동작하는 것을 확인했습니다. :)
AND

이머전씨

잡담 2009. 6. 29. 23:02
저희 팀에는 누구나 무서워하는 이머전씨라는게 있습니다. ㅎㄷㄷ
여친, 마눌님들도 모두 아는 무서운 분이죠. 그런데 오늘 옆팀에 3달짜리 이머전씨가 떨어졌습니다.
일의 시급성을 모르는 바는 아니지만 여러가지 생각이 듭니다.



"도와주세요 팀장이 됐어요"의 후반부에 보면 다음과 같은 구절이 나옵니다.

창의적인 사고를 팀에 불어넣기 위해서는 팀원들을 기본 좋게 만들어 줘야 합니다. 즉, 데드라인을 정해 놓고 공포 분위기를 조성해서 팀원들을 집에 보내지 않는다고 프로젝트는 끝나지 않습니다. 반대로 이런 공포 정치를 펼치면 팀원들의 사고는 위축되고 생산성은 떨어질 것입니다.

그런데 이와는 반대로 가고 있는 곳이 너무 많습니다.
분명 대장님이 "The Mythical Man-Month"는 읽으셨을텐데, mythical manmonth에는 저런 이야기가 없나부죠? 전 아직 통독을 못해서 기억이 안나네요... (사실은 영문판이라 아직 통독을 못함...)

/애도 옆팀분들
AND

드디어 기다리고 기다리던 Python 3 programming의 예약판매가 시작되었습니다.
이제서야 끝날듯 말듯하며 계속된 교정작업이 끝난 느낌이 드네요.


밤 늦게 까지 교정을 직접하시며 챙겨주신 위키북스 박찬규 대표님, 박찬규님과 함께 저희를 도와주신 위키북스 김윤래 팀장님, 저술 초기부터 꼼꼼하게 수정사항을 짚어주신 이대엽님, 릴리즈 일정으로 바쁜 와중에서도 새벽까지 리뷰 의견을 보내 주신 김용현님, 본인의 번역 일정이 진행 중임에도 최종 원고를 꼼꼼히 검토해 주신 손영수님에게 감사의 말씀을 드립니다.

그리고 주옥과도 같은 데이트 시간을 쪼개가며 휴식시간도 없이 달린 우상정
씨, 최동진씨가 없었다면 이 책은 완성이 안되었을 겁니다. 수고하셨습니다.

마지막으로, 맨날 컴터 앞에 앉아 있는 저를 끝없이 지원해 주는 울 마눌님과 야근과 취미생활로 많이 놀아주지 못하는 아빠를 가장 사랑하는 보연이가 1등 공신입니다.
AND