구글 리더가 서비스 종료한다는 소식을 듣고
By SeukWon Kang
버럭! 한 사람이 어디 저 뿐만이겟습니까만;; ^^
저 역시 소식을 접한 후부터 계속해서 대안을 찾고 있기는 했습니다.
일단 feedly로 임시 도피를 해서 살고 있긴 합니다.
쓰는 소감을 말하자면 뭐 그냥 그냥..이란 느낌입니다.
최근 집에 오래된 노트북으로 서버를 구축하고 그를 중심으로 사용 패턴을 정리해서,
unison 으로 개인 파일들을 반자동 sync 한다던지 하는 설정을 하다 보니 , 외부 서비스를 점점 사용 하지 않게 되더군요.
그래서 다음 클라우드,box.com,그리고 dropbox 마져도 더이상은 사용하지 않고 살게 되었습니다.
이런식으로 개인 정보들을 홈 서버에 올리는 형태로 살게 되니까 그럼 뉴스 리더도 개인 서버에서 운영해 볼까? 하는 생각이 들더군요.
그래서 이런 저런 것들을 일단 찾아 봤습니다.
쓸만해 보이는 것( 추천도 많고 ) 은 http://tt-rss.org/redmine/projects/tt-rss/wiki 것 이더군요.
그래서 설치를 해볼까하니.. apache에 php 입니다. 흠… 맘에 안듭니다. ^^;;;
( 전 개인 서버에 nginx , python 위주로 세팅하고 삽니다. )
어차피 수정할것도 아니니 그냥 설치해서 살아도 문제 없을테지만.. 엔지니어로써의 자존심이 있지요. ^^;;;;;;
그래서 검색해 봤습니다.
완제품 수준으로는 딱히 눈에 띄는 것이 없고 이런 저런 라이브러리는 있더군요.
일단 feedparser 가 처음 보입니다. 다양한 feed들을 읽어 들이는데는 이것 만 한 것이 없나 봅니다.
그리고 저는 google reader에서 export한 opml xml 을 읽어 들이는 기능을 원해서 적당한 파서를 찾았습니다.
BeautifulSoup 4 라는 것이 좋아 보이는 군요.
흠 대충 기본 기능은 되는 것 같은데 뭔가 feed스펙을 조사하며 작업 하자니 귀찮습니다.
누군가 만든 코드가 없을까 찾아봤습니다. https://github.com/DownGoat/FeedServer 이런 것이 있군요.
이분도 저랑 똑 같은 이유로 작업을 시작했다고 써 있습니다. ^^ ( 사람들 생각하는게 다 똑같지요 뭐. )
문서를 보니 UI는 나중에할 생각으로 일단 서버만 만든 것이라고 써있습니다. 즉 feed aggregation 기능만 있는 거지요. 저도 일단 비슷한 기능이 필요했던 지라 코드를 받았습니다.
그대로( 내지는 조금만 수정해서 ) 써볼까 했는데 구조가 별로 맘에 안듭니다. multiprocess 가 아니라 thread를 사용한 것도 그렇고 디렉토리 구조나 소스 수가 너무 많은 것도 맘에 안듭니다.
그동안 파이썬으로 작업해 오다 보니 파이썬 스러운 프로그래밍 이란 것에 대해 약간의 철학 같은 것이 생겼는데.
이분도 다른 언어를 쓰다 오신 분 같습니다. ( 아마 C/C++ 인듯 ) 일단 mktime 이나 time.struct_time 을 쓰고 있다는 것은 아직 python에 익숙하지 못하다는 뜻이지요. ^^ ( 당연히 datetime 을 사용합니다. )
소스파일 수가 많은 것도 아마 그 영향이겠지요. 파이썬에서는 특별한 경우가 아니면 그렇게나 소스를 잘게 분리할 필요가 없습니다..
그래서 코드를 처음부터 작성하고 필요한 부분만 가져다 쓰기로 했습니다.
재미 있는 것은 이분은 DB 접근을 sqlalchemy를 사용하고 있습니다. 이름만 들어 봤지 전 아직 한번도 써본적이 없는 것이라 이참에 공부도 하면서 만들어 가기로 했습니다.
추가로 제가 쓰는 python라이브러리 import 형태는 나중에 읽을 사람을 위해서 import modulename 형태를 취합니다.
내부 코드를 쓸때 modulename.functionname 형태로 사용해야 해서 타이핑치기는 귀찮지만 namespace를 외우거나 할 필요가 없어서 코드가 명확해 지는 장점이 있습니다 . 코드 중간에 모르는 함수/클래스 이름이 나오면 이게 어디에서 나온건지 생각/검색 하는게 상당히 짜증 나는 일이지요. 정 타이핑 치기 싫으면 import verylongmodulename as shortname 형태로 import합니다.
이 이야기를 이렇게 길게 하는 이유는 이분이 바로 제가 싫어 하는 from blabla import blabla 형태로 코드를 작성했기 때문입니다. from blabla import * 이 아닌게 다행이긴 합니다만..
새로 작성하면서 이분 코드를 참고(?)해서 작성을 했습니다. 시간이 많이 절약되더군요. 일단 DB는 빠르게 테스트 해야 하니 sqlite를 사용하고 . 제 google opml 파일을 테스트 용으로 사용해서 opml import 하는 기능을 만들고 해서 어제/오늘 해서 대충 작동하는 코드가 완성되었습니다.
google opml import / multi-process feed download / sqlalchemy data save feed down throttling 정도 기능이 만들어 졌습니다.
일단은 콘솔 프로그램인데 만들고 나니 서버로 만들어 볼까 하는 생각이 들었습니다. 추가 해야 할 기능들은 read UI 만들다가 알았는데 feed spec에 update 일시 이후에 추가 된것만 새로 받아 오는 기능이 있더군요. 참고한 소스에 그 기능이 없어서 아직 못만들었지만 ( 지금은 1시간 이내에는 다시 받아 오지 않는 형대로만 제한 하고 있습니다. ) 추가 해야 할것 같습니다.
만들면서 테스트 할 때마다, feed 서버에 너무 자주 요청하면 그쪽에서 abuser 로 찍혀서 ip block 당할지도 모른다는 글들이 많아서 공포에 떨면서 작업 했습니다.
주말 작업의 결과를 정리해 보면 제 opml 에는 145 개의 feed 사이트가 등록되어 있었고 그중 20여개는 죽어있었습니다. 실행 한 결과인 DB는 약 25Mbyte의 sqlite파일이 만들어 졌으며 만들어진 코드는 단 한개의 파일에 라인수는 237라인 입니다. 클래스는 2개 함수는 5개 입니다.
업데이트된 내용. github에서 가져 왔으니 github에 돌려 주었습니다. https://github.com/kasworld/rssreader 에 올려 두었습니다.