반복되는 수작업은 무조건 자동화로 해결.

오늘도 에어컨이 너무 빵빵한 실험실에서 하루종일 실험을 반복했다.

그래도 다행인 것은 문제로 보이는 현상의 원인이 우리쪽이 아니라 상대방 장비 쪽이라는 것을 확인했다는 점이다.

그 과정에서 매번 로그 정보를 분석해야 하는데 하도 짜증나고, 실수하기 쉬운 일이라(복잡한 파일에서 정확한 숫자 정보만을 읽어서 처리해야 한다) 결국 로그 파일을 분석해서 내가 원하는 형태로 포매팅하는 python script를 작성했다

덕분에 그 전에는 로그 파일을 편집기로 열어서 눈으로 필요한 정보를 찾아서 일일이 엑셀 파일에 숫자를 입력하는 작업을 반복했는데 나중엔 그냥 로그 파일을 python script의 인자로 넘기기만 하면 엑셀에 바로 붙여놓기 할 수 있는 결과가 나오게 했다.
결국 script 실행 한번, 복사 2번(서로 다른 엑셀 cell에 입력해야 하는 정보라)만 하면 결과 분석이 끝난다.

물론 여기에는 엑셀에 미리 수식 기능을 이용해서 데이터 분석을 하도록 해 놨고.

ㅎㅎ

실험 나중에는 짜릿한 느낌까지 들었다. 데이터 처리를 자동화하고, 문제의 원인을 찾았다는 기쁨에 🙂

내일이나 모레 있을 추가 시험에서도 이 여새를 몰아가자! 아자!

log activity with launchy

1. make a directory named c:scratch

2. create a python script log.py and save the same directory
import time
import sys

now = time.localtime(time.time())
tim=time.strftime(“%Y/%m/%d %H:%M:%S”, now)

fp = open(“c:scratchmyLog.txt”, “a”)
message = ” “.join(sys.argv[1:])
print >>fp, tim+” “+message

fp.close()

3. register that directory and *.py in launchy category and rescan

4. Restart launchy

5. invoke launchy and type “log” and type tab

6. jot down log message and enter

Reference
http://benkraal.wordpress.com/2007/05/16/launchy-append-text-to-a-file-from-anywhere/

Python CSV 파일 사용하기 등

1. CSV 파일 읽기/쓰기

writer = csv.writer(open("test.csv", "wb+"))
writer.writerow(csvRow)

2. 간단한 샘플 프로그램을 볼 수 있는 곳

SimplePrograms

아주 사소하지만 유용한 프로그램들이 많이 있다.

3. 정규식 사용하기

정수건 소수건 음수건, 양수건 숫자란 숫자는 모두 뽑아서 리스트로 돌려주기

m = re.findall(r"-?d+.?d*",oneLine)
via http://mail.python.org/pipermail/python-list/2004-September/284235.html

4. 파일명에서 확장자 제외한 파일 이름 얻어내기

>>> import os
>>> os.path.splitext(‘this.is.my.file.avi’)

('this.is.my.file', '.avi')

"Hello World" from ipod touch

iMac:~ cychong$ ssh root@10.0.1.198
root@10.0.1.198’s password:
Last login: Wed Dec 26 22:31:55 2007 from 10.0.1.200
# ls
HanRSS_20071225.opml Library Media root.zip

# python
Python 2.5.1 (r251:54863, Jul 27 2007, 12:05:57)
[GCC 4.0.1 LLVM (Apple Computer, Inc. build 2.0)] on darwin
Type “help”, “copyright”, “credits” or “license” for more information.
>>> print “hello world”
hello world
>>>

써놓고 보니 뭔 의미가 있는 지 애매해서 제목 수정. 하긴 태그가 있구나

Today's hack

python을 이용한 flickr uploader.

코드를 보니 이 녀석 역시 지정된 디렉토리 이하에서 파일들(확장자가 jpg, gif, png인 놈)을 찾아서 리스트를 만든 후 그 리스트에 있는 것들을 하나씩 flickr로 올리는 방식이다.

지금 2005년도 사진을 올리라고 했는데 전체 몇 개중에 몇 개나 올라갔는지 확인하는 기능이 없어 쬐금 아쉽다. 진작 알았으면 간단하게 몇 줄 추가하면 될 것인데…

수정본: 미리 업로드할 사진 파일의 갯수를 표시한 후 매번 업로드할때마다 전체 갯수대비 현재 작업수를 표시해줌.(퍼센트로 표시하면 더욱 좋겠구만)

추가) 근데 flickr는 중복된 사진을 업로드하는 경우 그냥 계속해서 추가해 버린다. 쩝. 이상하게 2005년 사진을 올리라고 한 스크립트가 죽어버렸다. 그래서 다시 올리라고 했더니 이미 업로드한 사진을 다시 올린다. 혹시나 해서 봤더니 flickr에 똑같은 사진이 2번 올라와 있다. 쩝.

아하~  원래 해당 스크립트가 특정 디렉토리의 내용이 변경된 경우 변경된 파일만 골라서 업로드를 해주는 기능이 있다.이를 위해서 프로그램은 자신이 작업한 내용을 history db 파일에 저장해 놓는다. 근데 어제 내가 한 일은 3개의 창을 열어놓고 서로 다른 디렉토리를 업로드한 것이다. -_- history 파일은 하나인데. 결국 db 파일이 서로 다른 3개의 instance에 의해 건드려졌으니 단단히 꼬였을 것이고, 결국 매번 올릴 때마다 기존 db와 다르다고 생각하고 파일을 새로 올린 듯하다. 이를 우째

Python으로 작성한 맥/리눅스용 photoworks

맥에서 가장 아쉬운 것 중의 하나인 photoworks의 부재. 비슷한 프로그램이 몇 몇 있지만 아무리 봐도 기능이 photoworks만 못하고, 액자도 아쉬웠다. 그런데 국내 Python 사용자 모임의 글을 보니 멋진 방법으로 photoworks의 액자를 사용하는 소스가 올라왔다.

이미지 파일 처리를 잘 몰라 정확한 내용은 잘 모르겠지만 대충 본 봐로는 액자 파일과 이미지 파일을 하나의 파일에 중첩으로 paste하는 형식을 띄고 있다. 우선 원본 파일을 적은 후에 그 위에 액자 파일을 덧씌우는 형식.

아직 해보지는 않았지만 잘 되리라 보고 조금만 손을 보면 배치작업등도 할 수 있겠다.

오늘 멋진 툴을 두 가지나 발견해서 뿌듯하다.

Zen of Python

정말 주옥같은 말 들이다.
항상 마음속에 새기고 있어야지~~

> cychong@LinuxFun cychong $ python
> Python 2.2 (#1, Apr 12 2002, 15:29:57)
> [GCC 2.96 20000731 (Red Hat Linux 7.2 2.96-109)] on linux2
> Type “help”, “copyright”, “credits” or “license” for more information.
> >>> import this
> The Zen of Python, by Tim Peters
>
> Beautiful is better than ugly.
> Explicit is better than implicit.
> Simple is better than complex.
> Complex is better than complicated.
> Flat is better than nested.
> Sparse is better than dense.
> Readability counts.
> Special cases aren’t special enough to break the rules.
> Although practicality beats purity.
> Errors should never pass silently.
> Unless explicitly silenced.
> In the face of ambiguity, refuse the temptation to guess.
> There should be one– and preferably only one –obvious way to do it.
> Although that way may not be obvious at first unless you’re Dutch.
> Now is better than never.
> Although never is often better than *right* now.
> If the implementation is hard to explain, it’s a bad idea.
> If the implementation is easy to explain, it may be a good idea.
> Namespaces are one honking great idea — let’s do more of those!
> >>>

헛. Python이란…

딱 세줄의 코드로 HTTP 웹서버를 띄울 수 있다.

> #!/usr/bin/env python
> import SocketServer, SimpleHTTPServer, BaseHTTPServer
> class HTTPServer(SocketServer.ThreadingMixIn, BaseHTTPServer.HTTPServer):
> pass
> HTTPServer((”, 8096), SimpleHTTPServer.SimpleHTTPRequestHandler).serve_forever()

심지어는 CGI 서버까지.
> #!/usr/bin/env python
> # http://nohmad.sub-port.net/moniwiki/wiki.php/CodeSnip/Daemonize.py 참조
> import CGIHTTPServer, BaseHTTPServer, daemon
> class CGIHandler(CGIHTTPServer.CGIHTTPRequestHandler):
> cgi_directories = [‘/cgi-bin’]
> daemon.daemonize()
> BaseHTTPServer.HTTPServer((”, 8080), CGIHandler).serve_forever()

출처 : 파이선위키

역시 대단한 파이썬~