STL declaration 프로그래밍


STL을 선언하는 방식에 대한 짧은 글을 써볼까 한다.

책에서도 그렇고 보통은 STL을 선언할 때, typedef를 쓴다.

std::vector< class_A >를 type std::vector< class_A > VECClassA라는 식으로 말이다.

하지만, 개인적으로는 이런 방식을 별로 좋아하지 않는다.

typdef를 할 경우에 타자 쳐야하는 수도 줄어들고, 가독성이 높아진다고 하는데, 나는 그렇지가 않더라...

이름을 위에 예처럼 지으면, vector안에 들어가는 것들이 뭔지 알 수 있다고 한다.

하지만, 보통 저런 간단한 형태만을 쓰는 일은 거의 없다.

std::map< std::string, std::vector< class_A > >이건 어떻게 이름을 지을것인가?

어떤 경우 저보다 더 복잡한 경우도 생기기 마련이다.

일이라는 게 책에서 나온대로만 되면 얼마나 좋겠냐만, 실제로는 그렇지가 않은 경우가 많다.

타자치는 건 visual assist를 사용하거나 6.0만 벗어나면, 자동완성기능이 visual studio에 내장되어있다.

굳이 타자 몇개 덜 치는 건 의미가 없다는 얘기다.

std::map< std::string, std::vector< std::vector< class_A > > >같은 골때리는 것들을 써보면 내가 왜 이런 얘기를 하는 지 알 수 있을 거다...

저런 걸 쓰는 이유는 원래 mdb로 된 걸 txt파일로 바꿔야하기 때문이다;;; 64Bit OS에서는 DAO database class가 지원되지 않기에, 울며 겨자먹기로 mdb를 txt파일로 바꿔야했고, 이걸 loading, select, save하는 걸 구현하려면, 저딴식의 STL을 선언할 수 밖에 없다=_=

python 이야기 python


개인적으로는 꽤 좋아하는 언어다.

이유는 주로 이용하는 언어가 스트링 처리가 귀찮아서 죽을 것 같은 c++이기 때문이고, python의 스트링처리는 그야말로 깔끔하다

c++에서도 stl:string을 쓰면 좀 낫긴 하지만, 진짜 별로다....

regular expression도 안될 뿐더러, split/join은 써본 사람만이 그 진가를 안다.
( c++에서 split/join을 직접 만들어서 쓴다. stl:string을 넘겨주고 delemeter를 주면, stl:vector에 담아서 넘기게 만들었다. join은 반대로. regular expression은 직접 만들려다가 gg;;; )

더구나, 강제 indent규칙이 정말 마음에 들 수 밖에 없다.

회사에서 일하다보면, 누가 짠 것인지 조차 알 수 없는 코드들을 보다보면, 주석따위는 바라지도 않고, 부디 제발 indent라도 맞춰져있길 바랄때가 많다.

이제 막 프로그래머를 시작하는 사람들에게 python은 꼭 배우라고 하고 싶다.

indent가 source가독성의 대부분을 차지한다.

예를 굳이 안 들어도 다 알 것이다. indent만큼은 꼭 지켜줘야 본인에게도 편하고 다른 사람들과 공동작업에도 편하다는 걸 잊지 말 길 바란다.

또한, 표현식들이 c++프로그래머들에게는 감탄이 들 수 밖에 없다.

s = '123456'

s[ 1: ] # '23456'
s[ :-2] # '1234'
s[ : ] # deep copy

이런 식이며, 자료형의 대부분이 이런 slicing을 지원한다.

그리고, 어떤 일을 하려고 하건 간에 거의 모든 component들이 다 있다.

win32 com을 사용할 수도 있고, java의 모든 component를 지원하는 Jython도 있다. PyOpenGL과 PyGame등 거의 웬만한 것들을 다 가져다 쓸 수 있을 것이다. DirectX는 지원하지 않는 듯하다;;; 이건 뭐=_= 넘어가자. DirectDraw를 python과 link해서 게임에 적용해본 적도 있다.

더구나 script라서 debugging하기도 쉬운 편이고. ( debug모드에서 잘 돌 던 코드가 Release에서 안 돌아가면, 담배만 늘어간다;; )

그리고, OO개념도 충분히 지원하며, template같은 복잡하기 짝이 없는 기능들은 없다=_= ( template의 개념은 쉽다. 개념만;; STL의 warning이나 error가 뜰 때 나오는 문구들을 보고 있으면 돌아버리는 게 느껴진다;;; )

Ruby도 좋고, perl도 좋고, python도 좋지만, 스트링 처리할 때 c++로 하지 말고, 다른 언어를 하나 익혀라. 세상이 훨씬 편해진다. 또한, prototype이나 예광탄( pragmatic programmer )에 적용하기도 좋다.

directx를 사용하는 게임이 아니라면, prototype이나 예광탄에 이용하기에 좋은 환경이다.

마지막으로 실행파일로 묶을 수 도 있다. script언어이긴 하지만, 이걸 실행파일로 만들어서 제공할 수 있단 얘기다. 물론, python을 깔아야 할 필요는 없다=_=

python + ado로 mdb파일 읽기 python


우선 준비물은 python 2.6 + pythonwin( python버전을 지원하는 녀석으로 골라야 한다. )이다.

odbc로 실행할 경우에는 제어판에서 odbc설정을 해 줘야 하고, database에 mdb파일을 설정해줘야 하는 문제가 발생한다.

이러면, 수동으로 해야하니 잘못되는 경우가 많으므로, ado로 mdb파일들의 list만을 가지고 읽어야 했다.

http://www.ecp.cc/pyado.html

그리고 나면, 여기 나오는 대로 하자. 다만 명심할 것은 mdb파일 path를 적을 때 절대 \가 아니라 /라는 거다. ( 내 하루는 누가 보상해주나ㅠ.ㅠ )

connection = win32com.client.Dispatch( 'ADODB.Connection ' )
DSN = 'PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA SOURCE=c:/a.mdb'
connection.Open( DSN )
rs = win32com.client.Dispatch( 'ADOX.Catalog' )
rs.ActiveConnection = connection

rs.Tables <- 테이블이름과 기타 다른 것들이 들어가 있다.
rs.Table.Type == 'TABLE' 이면 테이블 이름이다.

rs_sql = win32com.client.Dispatch( 'ADODB.Recordset' )
rs_sql.CursorLocation = 3
rs_sql.Open( 'SELECT * FROM %s' %위에서 구한 테이블 이름 )
rs_sql.RecordCount # 레코드수
rs_sql.Fields.Count # 필드의 수
rs_sql.Fields.Item(x).Name, rs_sql.Fields.Item(x).Value # 필드 이름과 실제 값, 여기서 x는 rs_sql.Fields.Count보다 작은 것만 유효하다.
rs_sql.MoveNext() # 다음 레코드로 이동

python에서 unicodeencodeerror : ascii어쩌고;; python


이문제로 꽤나 머리 싸맸다.

python script형태로 실행하면 아무런 문제가 없는 상태에서 py2exe로 실행파일로 만들어서 실행하면, unicodeencodeerror : ascii어쩌고 하는 에러를 내 뱉더라.

site.py를 가져가지 않아서 그렇다는 얘기도 있고 그렇던데, 뭔 짓을 해봐도 안되었지만, 파이썬마을에서 찾아내었다;;;

Unicodeencodeerror: 'ascii' codec can't encode characters in position 0-2: ordinal not in range(128)

이런 에러가 뜨면, .encode("mbcs") 를 붙여보라고 하더라.

덕분에 한번에 해결되었다.

물론, mbcs는 윈도우 전용이라는 걸 잊으면 안된다!!

thread;; 프로그래밍

single thread에서만 코딩하다가 multithread를 사용할 수 밖에 없게 되었다;;

젝;; 이건 culture shock에 버금가는데;;

어찌 말로 설명이 안된다;;;

IWebBrowser2라는 IE와 같은 일을 하게 해주는 interface를 사용하게 되었는데, 문제는 IE가 지맘대로 다운되는 경우가 자주 생긴다는거다.

더구나 몇개일지 예측이 불가능한 IWebBrowser2 interface를 사용해야하니 당연히 STL을 사용하고 있고.

문제는 저 interface를 각각 따로따로 thread에서 돌리려고 하는데, 어디서부터 thread로 돌려야할 지 도통 감을 잡질 못하겠다.

더구나 STL의 경우에는 thread-safe가 된다는 사람도 있고, 아니라는 사람도 있기때문에 섣불리 STL을 multithread에 포함시키고 싶진 않고, STL list의 element의 member로 포함된 IWebBrowser2를 thread로 돌리고 싶은데...

multithread를 처음 써보는 입장에서는 그저 난감할 뿐이다.......

1 2