2013년 8월 15일 목요일

배움에는 끝이 없다.

남송(南宋)의 대신(大臣) 장구성(張九成)은 강직하고 충성심이 강한 인물이었다. 그는 늘 나라를 위해 힘써 일했고 자신의 안위를 돌보지 않았다.

그는 궁궐 내에서 권력투쟁이나 일삼고 암암리에 농간을 부리는 소인배들을 몹시 미워했다. 그는 늘 바른 말을 했고 당시 실권을 쥐고 있던 간신 진회(秦檜)에게 반대했다는 이유로 조정에서 쫓겨나 남안군(南安郡)으로 유배되었다. 

비록 몸은 멀리 쫓겨났으나 그는 언젠가는 반드시 조정에 돌아가 충성을 다하리라 확신했다. 때문에 매일 날이 밝자마자 일찍 일어나 부지런히 책을 읽었다. 워낙 책에 빠져 있다 보니 밥을 먹을 때도 아내가 여러 번 독촉한 후에야 비로소 식사를 했다. 

한번은 그를 이해하지 못한 아내가 이해할 수 없다는 듯이 물었다. 

“얼마 안 있으면 오십이 될 양반이, 조정에 있는 것도 아닌데, 책은 읽어 뭐하시게요?” 

그러자 장구성은 부드럽고 인내심 있게 알려주었다. “배움에는 끝이 없고 시간은 사람을 기다려주지 않소. 장차 폐하께 충성을 다하고 백성들을 위해 헌신하자면 배움이 없이 어찌 큰 그릇이 될 수 있겠소?”

그는 이렇게 오랜 세월 동안 쉼 없이 학습했고 해이해지거나 나태해지지 않았다. 이렇게 14년이 지난 어느 날 조정에서 파견한 남안군 태수가 장구성을 만나러 왔다. 태수가 장구성의 서재에 가보니 책상 아래에 깊은 발자국이 나 있었다. 의아하게 여긴 태수가 그 까닭을 묻자 옆에 있던 장구성의 아내가 대답했다. “저 양반이 매일 같이 이곳에서 책을 읽었는데 시간이 오래 되자 이렇게 발자국이 남았습니다.” 

이 말을 들은 태수는 깊이 감동하지 않을 수 없었다. 무려 14년이란 오랜 세월동안 조정에서 쫓겨나 유배된 와중에도 배움에 게을리 하지 않고 정진하는 장구성의 모습에 태수는 고개를 끄덕이며 감탄하지 않을 수 없었던 것이다. 

결국 장구성은 다시 조정에 돌아왔다. 그를 만난 많은 대신들은 그의 학문이 전보다 크게 진보했고 박학다재(博學多才)함을 칭찬하지 않는 이가 없었다. 
사람이 살다보면 누구나 어려운 역경에 처하기 마련이다. 하지만 그것을 극복하는 방법은 사람마다 다르다. 대체로 큰 성취를 이룬 사람들은 역경에 굴복하지 않고 이를 자신에 대한 채찍질로 여겨 더욱 정진한다. 사실 어려움과 역경 앞에서 하늘을 탓하고 사회를 탓하며 남을 탓하는 사람은 스스로 역경을 인정하고 그것에 굴복하는 것이다. 역경 앞에서 남을 탓하지 않고 자신의 부족함을 찾아 보완할 수 있는 사람만이 역경을 넘어 한걸음 더 나아갈 수 있다. 

맹자는 일찍이 다음과 같이 말했다.

“하늘이 누군가에게 중대한 임무를 맡기려고 할 때는 반드시 그들의 마음을 괴롭게 하고, 그들의 근육을 수고스럽게 하며, 그들의 육체를 굶주리게 하고, 그 몸에 가진 것이 없게 해서 그들이 하는 일이 뜻대로 되지 않게 한다. 이는 마음을 분발하게 하고 성질을 참게 하여, 그들이 할 수 없었던 일을 더 많이 할 수 있게 해주기 위함이다. 사람은 대체로 잘못을 범한 뒤라야 고칠 수 있고, 번민과 고뇌가 얼굴과 목소리에 나타난 뒤라야 해결 방법을 깨닫게 된다.” 

만약 지금 혹시라도 어려움에 처한 사람이 있다면 맹자의 위 말을 되새겨 하늘이 자신에게 어떤 중대한 임무를 주시려 하시는 것은 아닐까 생각해보자. 

2013년 6월 24일 월요일

2013년 06월 24일 월요일

어제 1시즈음 숙면하고 일어나니 새벽 4시40분경?
일어나서 물한잔 마시고 음악을 들으니 날이 밝아왔네.
U-20 나이지리아 스페인 축구경기를 보다보니 8시네..

이러면 안되겠다 싶어서 더 자려고 했는데. 딱히 할것도 없고
그래서 이불이나 빨려고 세탁기 돌리고 , 화장실 청소도 깔끔히 하고
샤워를 하고 있었다.

응? 현재시간 9시30분경 이시간에 전화왔던적이 언제였더라를 생각하게끔 만드는
벨소리가 울리더라... 나체로 화장실에서 샤워를 멈추고 나와
휴대폰을 들여다보니 070으로 시작하는 번호... 이건뭔가

아무튼 이시간에 뜻밖의 전화라 다소곳이 통화버튼을 누른다.
금요일에 이력서 작성한 퓨x데이타 회사에서 면접을 보러오라는 것이었던 것이다.

면접보라고 하니 기분이 왠지 좋았다. ㅋㅋㅋㅋ
샤워 완료후 빨래한 이불을 널고
안돼겠다 싶어 노트북들고 중도로 달려갔다.
"구글 IT 취업서" , "프로그래밍 면접 이렇게한다" 책 두권을 빌려
노트북을 사용하기 위해 미디어 실로 향했더니 미디어실은 공사기간이란다 7월까지
어쩔수 없이 2층 로비에 앉아서 면접 준비를 했다.

예전에 인프라xx 면접 준비를 했지만 좌절을 겪었던지라 이번에는
반드시 성공을 맛보려고 준비를 해보자!!!!

추가 이력서를 더 작성하고 프로젝트 포트폴리오를
나름 성의있게 했는데 . 디자인이 별로.... 작성하다보니
어느새 5시가 아니던가.  혼자 저녁밥을 해먹고 침대에 누워 명상(?)을 하던중

우리의 친구 재광이가 학교 랩실에 간단다. 나야 뭐 집에 있으면 빈둥댈게 뻔해서
랩실로 향했다.
허나 재광이가 학생증을 깜빡하고 가져오지 못해 다시 집에 갔다오는 불의의 사건이 발생한다.  에라이 면접준비를 위해 깔끔하게 머리나 깍고 와야겠다는 마음으로 후문으로 이동중.

김재호 친구와의 만남 이친구는 머리를 방금 막 깍고 나왔다.
내가 미용실 같이 가자고 졸라 단골 미용실인 "비달싹뚝"에 갔는데..
오늘은 일찍 문을 닫았더라..
어쩔수 없이 헤메던중 축사 세븐일레븐 바로 옆에 새로생긴 미용실로 돌진!!
이런저런 얘기하다가 맘에들지않는 머리를 부축하며 재광이가 있는 랩실로 오니 9시30분이더라,.......... 재호는 집으로 돌아가고
재광이랑 이런저런 작업을 하다가 헤어지고 새벽 1시경 집에 도착.

내일은 행복한 일만 일어났으면 좋겠다!

2013년 06월 24일 일요일

재호랑 김미, 연희랑 남춘천역 근처 우성닭갈비?에서 저녁식사를
하고 거두리에 있는 레몬그라스에서 커피 한잔씩 하고 집에 가려던 찰나
이렇게 헤어지기 싫었던 우리들은 정문 호반월드로 향했다.

소맥 시원하게 육포를 씹으며 . 대화를 나눴다.
뭔 그렇게 할말이 많던지 내가 이렇게 말을 많이 했었던가?
호반월드에서 아르바이트 하는 큰동현이 ㅋㅋㅋ
그리고 뒤늦게 도착한 신현준이ㅋㅋㅋ
그러다가 좀 마시다가 연희가 너무 취해서  12시즈음 헤어졌다.

이런저런 대화를 하면서 유쾌한 시간을 보냈다.

2013년 06월 22일 토요일

 Tric 운동이 저녁 6시로 잡혀있다.
도균이 차 얻어타고 재호랑 함께 공지천으로 출발.
아마 한달도 더 넘었다. 그때 햄스트링 부상이후 나아졌다고 생각했던 부위가
또 무리가 갔는지 아프구나...

충분히 몸을 풀고 뛰어도 무리하게 뛰면 허벅지 뒷근육이 올라오더라..
흑흑 .. 아무래도 몸관리를 해야겠어ㅠ_ㅠ 이젠 밤도 못새겠어
사치야 밤새는건 ... 농담이고
요즘 안피던 담배를 다시피고 운동을 안해서 그런거 같다.

축구 끝나고 눈주위가 찢어진 성민이와 도균이 재호랑 순대국밥 한그릇 하고
후식으로 아이스크림을 먹고 헤어졌다.

[오늘한일]
논문 조금, 이력서(퓨전데이타) 작성

2013년 06월 21일 금요일

금요일 저녁 다음주까지 제출해야되는 논문을 작성하고 빈둥되고 있는데
진명이랑 은솔이랑 춘천, 강대후문 갈매기집에서 저녁을 먹고 있단다.
아침에 씼었던지라 얼굴만 세수하고 옷입고 후문으로 달려갔다.
출발전 은솔이가 전화통화로 자기친구소개시켜준다고 했었다.
빈말일거 같아 그냥 아무생각없이 갈매기집으로 들어갔더니
뜨악. 은솔이 친구분이 있네.. 진짜네-ㅁ-
첫만남에 몇마디 나누다가 인근 레트로? 카페로 가서
대화를 나눴다. 아름이라고했다. 공대아름이는 아니고
인문대 아름이다 ㅋㅋㅋ 첫인상이 되게 좋다.^-^

불가에 시절인연이라는 말이 있다한다.
모든 인연에는 오고 가는 시기가 있다는 뜻이다. 이하 생략한다.

그렇게 카페에서 나와 진명이랑 은솔이는 터미널근처 가서 잔다고하고
아름이는 집방향도 같고 근처에 살게되서 바래다 주고 집으로 왔다.

좋은 시간이었다. 친구와 친구의 여자친구 정말 보기좋은 사이ㅋㅋㅋ

2013년 5월 24일 금요일

관심사

http://users.sosdg.org/~qiyong/lxr/

더 냉정하게 이야기드리면.

일단 7년차면 이미 두세개정도의 스크립트 언어는 마스터해야했을 시점입니다.

php , perl , python , ruby 중에 2개정도는 익혀두셔야하고.. ( 전 python 은 적당히 하고 나머지 3개는 보고 수정가능한 수준까지는 했습니다. )
c/c++/asm 으로 언어 확장정도는 코딩가능할정도가 되어야합니다.
디비는 mysql/pgsql/oracle 정도는 해야하고..
network 장비는 L3/L4/L7 VPN VLAN 정도 대략 만져야하구요.
스토리지도 san 장비 정도는 매뉴얼 보고 다룬 경험이 있어야합니다.

김정균님 말대로 프로그래머보다 잘해야 SE 라고 부를수 있습니다.

저는 현재 대략 10년차 SE 고.. 현재 여러가지 하지만 잠깐 하고 있는 일이

QOS, L7, DDOS 방어 장비,Flow 장비등 50대 장비를 관리하는 시스템을 만들고 있습니다. ( SI 성이긴합니다. )
개발은 python 으로 하고 웹단은 django 디비는 pgsql
백엔드는 syslogd , snmp , ssh client , ftp client 를 비동기로 엮어서 필요한 데이터를 수집해서 가공하고 웹단에서 조회가능하게 pgsql 에 밀어넣는겁니다.
대부분 라이브러리를 불러다가 쓰지만 많이 짰고 각종의 프로토콜이 어떻게 돌아가는지를 다 이해하고 있습니다.
웹은 html 을 대략 이해하고 css / javascript 를 적당히 쓰고 ( 요즘은 jquery 를 쓰지만 ) comet 을 쓰기위한 cometd 도 직접구현했습니다. ( twisted 기반 )
동접 1000/2000 정도의 tcp 써버는 파이썬으로 구현할수 있고 뭐 그거 넘어가면 그 때 c 로 짜면 된다는 생각으로 뭔가 만듭니다.
물론 코드는 훌륭한건 아니고 그냥 적당히 동작하는 정도입니다.

SE 가 딱히 어떻게 해야한다기보다.. 문제해결에 포커스를 맞춘게 SE 라고 생각합니다.
문제 상황이 주어지면 주어진 자원으로 해결이 가능해야하고.. 그게 코딩이든 솔루션의 조합이든 말이죠.
전 아직까지 사업이나 돈의 개념 그리고 소모자원의 개념이 많이 부족한데 그게 부족한건 저도 알고 있고 나머지는 SE 로 살고 있다고 생각합니다.
아직은 뭔가 사람을 다루는 직급이 아니지만 사람도 시스템의 개념으로 다루기 위해서 많이 공부는 하고 있습니다. ( 일종의 절차를 만드는 거죠 )
다시금 이야기드리지만..
SE 는 프로그래머의 슈퍼셋입니다. ( 코딩은 않하거나 못해도 되지만 어떻게 도는지는 세세히 알아야하니까 결국 해봤어야하는거죠 )
( 알고리즘도 당연히 프로그래머 이상으로 해야한다고 생각합니다. 실천은 못하지만 ㅠㅠ )
사랑하지 않으면 떠나라 라는 책을 추천해드립니다.
http://www.aladin.co.kr/shop/wproduct.aspx?ISBN=8991268358

SE = 프로그래머 + system admin + network admin + 경험

이라고 생각합니다.

심은솔: ㅇ

복권 대신 꽃을 사보세요
사랑하는 가족을ㅇ 위해,
그리고 나 자신을 위해,
꽃 두 세송이라도 사서
모처럼 식탁위에 놓아보면
당첨 확률 백퍼센트인
며칠간의 잔잔한 행복을 얻을수 있습니다.

어느 책에서

최재원: 더 느려지기2

서로들 빨대를 꽂으며 무엇을 취해가고 싶지 않아요 ,
그냥 좋으면 좋은거고 아니면 아닌거겠죠
변함을 내가 어떻게 조정할수 있는 문제가 아닌거 같아요.
그렇다고 사랑받기 위해서 나를 맞추는건 너무 서글프잖아요;;

지금 내모습 그대로 나를 사랑해주세요~

불가 용어에 시절인연 (時節因緣) 이란게 있다.

모든 인연에는 오고 가는 시기가 있다는 뜻이다.

굳이 애쓰지 않아도
만나게 될 인연은 만나게 되어있고,

무진장 애를 써도 만나지 못할 인연은 만나지 못한다는 것이다.

사람이나 일,
물건과의 만남도

또한 깨달음과의 만남도
그 때가 있는 법이다.

아무리 만나고실은
사람이 있어도

혹은 갖고 싶은것이 있어도,

시절인연이 무르 익지 않으면

바로옆에 두고도 만날수 없고,
손에 넣을수 없는 법이다.

만나고 싶지 않아도, 갖고싶지않아도,

시절의 때를 만나면 기어코 만날수밖에 없다.

헤어짐도 마찬가지다.

헤어지는 것은 인연이 딱 거기 까지이기 때문이다.
사람이든 재물이든
내 품안에, 내 손안에서

영원히 머무는 것은 하나도 없다.

그렇게 생각하면 재물 때문에
속상해 하거나 인간 관계 때문에 섭섭해할 이유가 하나도 없다.

2013년 5월 3일 금요일

java split 사용시 문제점

java에서 split 메소드를 사용하는 도중에
String str = "abc:def:ghi:jkl";

String data[] = str.split(":");

이렇게 하면 분리하는데
String str = "abc.def.ghi.jkl";

String data[] = str.split(".");

. 으로 분리를 하면 분리되지 않는다.

split의 인자로 들어가는 String 토큰이 regex 정규식이기 때문이다.
정규식에서 .은 무작위의 한 글자를 의미한다고 한다.

그러면 "모든 문자가 토큰이 되기 때문에" 배열에 남는 게 없게 되는 것이다.

따라서 이스케이프 문자를 앞에 붙여 줘야 한다
. 그런데 String 안에 이스케이프 문자인 \를 써 주려면 \\라고 써 줘야 한다.
따라서 \\라고 쓰는 것이다. 그래서 \\.이라고 쓰면 정규식 쪽에서는 \.라고 인식을 하고 실제 .을 찾게 되는 것이다.

기호를 써서 split를 쓸 때 뭔가 작동을 안 하면 \\을 붙여 보라.

참, 그냥 \라고만 붙여야 하는 것도 있는데, 아래 애들이다.

\b \t \n \f \r \” \’ \\

참고하면 될 것이다.

참고 http://mytory.net/archives/285

2013년 3월 20일 수요일

엔코아의 DA# 토탈데이터 솔루션

디비 구축 단계는 간단하게
요구사항분석, 설계 -> 논리적 설계(정규화) -> 물리적 설계 -> 구축 이런식으로 진행됩니다.

엔코아(이화식 대표)의 DA# 는 토탈 데이터 솔루션으로
손쉽게 모델링을 하고 (Entity Relation Diagram) 다양한 고급기능, 편리한 인터페이스를 지원합니다.
모델링을 끝내고 엑셀로어트리뷰트 속성을 정하고 ERD와 엑셀파일을 가지고
DA# Design 프로그램을 이용하여 합치면 모델링한것을 DDL문장으로 추출이 가능했습니다.(자동 스키마 생성및 Reverse 지원)

- 다양한 벤더별 지원 (개체 관계? 형식이라고해야하나, 대부분의 DBMS를 지원)
- 일단 국산 제품이라 사용하기에 편한것 같아요


그밖에 기억나는것으로 Key, Action, ...

국산제품으로는 엔코아의 DA#과 토마토시스템(eXERD)가 있답니다. (또 있는지 조사는안해봤고 들었습니다.)
일단 국산제품으로 매출액 100억원가량 돌파 했다고 합니다.
멋집니다!
개인적으로 no-sql 제품들도?!?!

엔코아의 DA# 제품과 비교되는 제품은
ERwin(미국) 전문데이터베이스 모델링 도구로, 분석, 설계 , 구현, 유지보수에 활용되고 있다.

알고 쓰자 HBase

2013년 2월 8일 금요일

리스트, 딕셔너리, 튜플 요약


세가지 리스트(List) , 사전(Dictionary), 튜플(Tuple)가 있다.

1. 사전은 { } 활괄호를 사용 Dictionary { "server" : "ds", "database" : "master" }

d = {'server' : 'ds' , "database' : 'master'}
d['server'] = 'doseon' 이렇게 변경한다.
d['uid'] = 'guest' 이렇게 삽입한다.

- 사전은 원소 사이에 순서가 없어서 출력할때 순서개념이 없다.
- 사전의 키는 대소문자에민감하다.
>>> d = {}
>>> d['key'] = 'value'
{ 'key' : 'value'}

>>> d['Key'] = "thrid value'
{'key' : 'value' , 'Key' : 'thrid value'}
기존의 키에 값을 할당하면 그냥 예전 값을 새로운값으로 교체한다.
'key' 와 'Key'는 서로 같지 않다.

- 사전에 데이터 유형 섞어 넣을수 있다 그러므로 문자열 정수,
- 원소 제거하기
del d['Key'] 이렇게 하면 지워짐
- 사전 클리어 하기 모든 원소 삭제한다
d.clear()


2. 리스트 List [ ] 각괄호를 사용한다

>>> li = [ 'a', 'b', 'ds' , 'z', 'example' ]

>>> li[0] # a
>>> li[4] # example
리스트는 배열처럼 첫 요소는 언제나 li[0]입니다.

- 음수 인덱스(음수 지표)를 사용할수 있다.
리스트의 끝에서부터 거꾸로 세어 원소를 접근한다.
리스트의 마지막 요소는 li[-1] 이다
li[-3] == li[5-3] == li[2] 입니다.

- 리스트 조각 썰기
li[1:3] # b ds
li[0:3] # a b ds
li[:3] # a b ds
li[:] # a b ds z example

-리스트에 원소 추가하기
>>> li.append("new")
[ a, b, ds, z , example, new]

>>> li.insert(2, 'new')
[ a, b, new, ds, z , example, new ]

>>> li.extend(["two', 'elements' ])
[ a,b, new, ds, z, example, new, two, elements ]

>>> len(li) # 9
append는 원소 하나를 리스트의 끝에 추가

insert는 원소 하나를 리스트에 끼워넣을수 있다.

extends는 리스트를 결합한다.

- 리스트 검색하기
>>> li.index('example') # 6
>>> li.index('c') # Traceback (innermost last): File"", line 1, in ? 에러가 발생
>>> "c" in li # false


- 리스트 원소 제거하기
>>> li.remove('z')
>>> li.remove('new')
>>> li.pop() # pop()은 리스트에서 가장마지막 원소를 꺼내서 그값을 돌려준다. 단 리스트는 바뀌지 않는다.
# li.remove()는 다르다

- 리스트 연산자 사용가능 li += ['example', 'new']
li *= [1,2] *3 # [1,2, 1,2, 1,2]



3. 터플은 리스트와 같은 방식으로 정의된다. 반괄호를 사용 ( )
터플의 원소는 리스트처럼 순서가 정의 됨. 그래서 터플은 0부터 시작한다.
터플에는 메소드가 없다 그래므로 사용시 상수 로 사용가능하다.?
또한 !!!!!!! 터플은 리스트보다 빠르다. 항상 값을 상수로 정의하고서 반복해 사요할 생각이라면 리스트대신 터플을 사용하라




>>> range(7)
[0, 1, 2, 3, 4, 5, 6]
>>> (MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY) = range(7)
>>> MONDAY # 0
>>> TUESDAY # 2
>>> SUNDAY # 6




2013년 1월 28일 월요일

대용량, 대량의 파일처리관련 글(고민)

쓰레드 여러개 돌려서 파일 읽기
http://blog.daum.net/gdocument/228

하나의 파일을 여러 스레드에서 읽을때 문제없을까요? 글
http://kldp.org/node/99200

내생각. 아무래도 읽기의 경우 파일디스크립트제한(1024)
읽기의 경우는 쓰기(하나의 파일을 여러곳에서 쓸경우)와는 다르게
읽기만 하는것이니 여러스레드에서 하나의 파일을 읽어도 문제가 되지 않을거라고 생각된다.

대용량[수백메가 ~수기가] 파일처리 관련 글
http://kldp.org/node/89220

2013년 1월 25일 금요일

Select() 입출력 다중화

참고
Joinc: select를 이용한 입출력 다중화


입출력 다중화는 단일 프로세스에서 여러개의 파일을 제어할수 잇도록 한다.
입출력 다중화는 "비동기/ 봉쇄입출력 모델"

입출력 다중화는 여러개의 파일을 다루기 위해서 파일기술자를 배열(그룹)으로 관리한다.
개발자는 배열의 값을 검사하는것으로 여러개의 파일을 처리할수잇게된다.

입출력 다중화의 모델의 제한

1. 파일기술자 테이블의 크기 처리할수 잇는 파일의 최대크기는
프로세서가 열수 있는 파일의 최대개수와 별도로 "파일 기술자 테이블의 크기"에 영향을 받느다.
일반적으로 파일 기술자 테이블의 크기는 1024인데 , ulimit(1)등으로 변경할수없다.(?잉 변경할수 없는건가요? -_- 찾아보세요~)
(파일기술자 단일비트필드 테이블이라는것에 주목 변경해야할 필드가 있다면 1을 리턴한다.
그렇다면 111111..111로 AND연산을 하는것인가?)

2. 배열로써 가지는 성능 문제 이벤트 기반이 아니기 때문에
배열을 순차적으로 모든값을 전부검사해야한다.
만약 1000개의 클라이언트가 연결되어있고, 이중 어느 하나에 데이터변경이
이뤄졌다면 최악의 경우 1000개의 필드 모두 검사해야하는...문제가
(연결파일의 목록을 별도의 배열에 유지하는것으로 어느정도 문제를 해결할수 잇기는 하다.-=
완전한 방법은 아니다. 연결된 파일이 하나고 이 파일의 지정번호가 1000이라면
1번만 비교할수있지만 , 연결된 파일이 1000이라면 여전히 1000번의 루프를 돌아야한다. ㅠㅠ)

3. 병렬처리가 아니다. 이 모델은 멀티스레드와 병렬처리가 아니다.
데이터를 읽어서 처리하는 응답시간"동안 다른파일은 대기해야하므로
데이터 처리 과정이 긴 서비스에는 적용하기에는 적당한 모델이 아니다.
즉 데이터처리과정이 짧은 메시지 전달 서비스에 적합한 모델이라는것.

이러한 단점이 있지만 매우 견고한 모델이며, 프로그래밍 기술이 단순하기 때문에
널리 사용되고있다.

2013년 1월 24일 목요일

c# 파일, 디렉토리복사이동삭제 관련


파일관련된 작업을 했습니다.

특정 폴더를 복사, 이동 하려합니다.
특정폴더 밑에는 폴더들과 파일들이 존재하는데
이 모든것들을 대상 경로에 복사, 이동해야합니다.

msdn 파일 및 폴더 복사 , 삭제 및 이동
http://msdn.microsoft.com/ko-kr/library/cc148994.aspx

이동 이나 삭제 같은경우 메소드가 존재 합니다.
Directory.Move()
Directory.Delete()
하지만 파일 복사시 위의 경우처럼 특정폴더 하위에
폴더나 파일들이 존재한다면

폴더들을 CreateDirectory로 일일이 만들어줘야하고
파일들도 각각 Copy해야하는것 같습니다. msdn 참고 한 결과 이렇게 해줘야 되더군요-_-
귀찮게말입니다.

파일삭제나 이동 복사, 삭제 같은경우 권한 등등을 고려해야할것 같습니다.
<권한, 존재유무,등등>
파일보안 관련한 블로그 참고 http://nsinc.tistory.com/43

(윈폼에서는 app.manifest 파일에서 아래의내용을 추가했었습죠
""


디렉토리내의 하위디렉토리까지 검색해야하는경우 재귀나 for문, 스택을 이용합니다.
재귀는 적절한 방식이기는 하지만 디렉토리의 규모가 크고 복잡하게 중첩되어 있으면
스택오버플로우 예외를 발생시킬 위험이 있다고 하는군요

msdn에서 디렉토리 트리반복으로 가이드가 있군요
http://msdn.microsoft.com/ko-kr/library/bb513869.aspx


c#에서 운영체제를 확인하는
OperatingSystem os = Environment.OSVersion;
string osname = os.versionString;

결과값: os.VersionString = "Microsoft Windows NT 6.1.7601 Service Pack 1"
win2008 = "6.0.6002";
win2003 = "5.2.3790";
win7 = "6.1.7601";

2013년 1월 14일 월요일

Encoding 'euc-kr' not support발생...

jmaster.dat 파일(ISO-8859 : 컴퓨터에서 8비트 문자를 나타냄)로 작성됨(file <파일명>으로확인)

이떄 ISO-8859은 한글을 표현할수가 없다고 한다. 그러니까 ISO-8859파일에서의 한글은

그부분을 euc-kr 또는 utf-8로 작성되어 insert되있다고(?) 한다(구글링 검색 KLDP 한 글에서)

이파일을 리눅스(우분투 10.04.4 LTS)에서 파일을 읽었더니 해당 글자가 깨지거나

compile(C# - mono)할시 Encoding Not Supported "euc-kr" 이라는 에러가 출력하는것이 아닌가.

서버이전해서 이문제가 발생...

언어설정이 잘못되어있는지... echo $LANG,

/etc/environment 등 구글링..검색 이전서버와 동일 환경인데 왜 문제가 발생했던 것이다.

30분동안 검색결과 c# 컴파일해주는 Mono에서 문제가 발생했던것.

mono용 i18n 을 업데이트 해주라는말이었다..

잉? 분명히 이전 서버와 동일했는데 말이다.

"apt-get install libmono-i18n2.0-cil " 실행후

컴파일하니까 제대로..나온다.-_-

다행이 빠른시간안에 찾앙서 성공!!!!

ISO-8859 언어셋 euc-kr , utf-8,

bianry 파일읽은것에대해 공부좀 해야겠다.


<변경사항>
아아 이런 위의 Mono문제가 있었을 뿐더라 다른 문제가 발생햇다.

위에서 언급했듯이 ISO-8859파일에서의 한글은 표현할수가 없으므로
euc-kr 혹은 utf-8로 작성되어 인서트되잇다고 했다.

그러므로 파일을 열어서 파일포인터로 해당 위치부분만 euc-kr 혹 utf-8로 읽어서
Encoding하여 처리해야한다는것입니다!!!

그외의 파일부분은 ISO-8859-1로 읽어들었더니 잘 됬습죠
이히히히

2013년 1월 7일 월요일

효과적인 C# 메모리 관리 방법

마이크로소프트웨어 효과적인 c#메모리관리기법

말 그대로 효과적인 C#메모리 관리 방법에대해 알아본다.
1. '+' operator를 통한 문자열 조합
위의 문제는 가비지가 많이 발생한다. '+' 연산자로 두값을 연결할때마다
새로운 string 인스턴스가 생성된다. 연이어 + 연산자가 나오기 때문에
또 string인스턴스가 생성되고 이전에 만들어진 string인스턴스는 가비지가 된다.
=> StringBuilder객체를 생성하여 사용하자

2. 메소드 안에서 생성한 객체
C#은 c++과달리 클래스를 인스턴스하려면 반드시 new를 해줘야한다. (이때 Heap에 메모리할당)
특정 메소드안에서 new로 생성된 인스턴스는 메소드를 빠져나오면 더 이상 사용하지 않게 돼
가비지로 처리된다. 이러한 패턴의 메소드가 자주 호출될수록 가비지도 많이 발생된다.
=> 클래스를 구조체로 바꿔보면 new연산자로 인스턴스를 만들어도 Heap영역에 메모리가
할당되지 않는다 구조체 역시 Value Type이기 때문에 Stack영역에 할당되며 메소드를 빠져나갈경우
자동으로 삭제된다. Heap영역이 아니므로 가비지컬렉션의 대상이 되지않는다.
구조체도 싫다면 맴버변수로 사용한다.


3. 속도 저하가 큰 Boxing
Boxing이란 Value Type객체를 Reference Type객체로 포장하는 과정을 뜼함
c#의 모든 객체는 object로 상속되는데 심지어 상속받지 못하는
int, float등의 Value Type조차도 object로부터 상속된것처럼 사용할수 이싸ㄸ.
하지만 가비지 컬렉션에의한 부하 못지않게 Boxing으로 인한 부하도 크다.

=> 다양한 Type을 처리하는 경우가 아니라면 Collections에 사용된 값의 type을 명시해
주는 Generic Collection 사용을 권한다...
List List 이런것.?
즉 되도록 Boxing과 UnBoxing을 최소화하라는 의미.. Effective C# 정리에서 Boxing, UnBoxing 내용


4. WeakReference로 의도하지 않은 참조를 없애보자
인스턴스를 참조 하는 모듈에서 WeakReference를 사용하면 의도하지 않은 참조로
메모리가 해제되지 않는 실수를 방지할수 있다. 주의할점은 WeakReference.Target값을
보관하면 안된다는것, 만약 보관하고있다면 강한참조(Strong Reference)가 일어나 이를 인식한
가비지컬렉터는 회수를 실행하지 않는다.

5. GC 가비지 컬렉션처럼 원하는 시점에 없애고 싶다면... IDisposal
.IDisposal 인터페이스를 구현한 클래스를 생성하고 Dispose()메소드 내에서 리소스를해제!

2013년 1월 4일 금요일

쓰레드 몇개해야 만들어야될까?

크기가작은 파일이 무수히 많다.(KB)
크기가 큰 파일이 무수히 많은경우
하나의 스레드에서 작업한다면 오래 걸릴것이다.

스레드를 많이 생성하여(Main Thread가 여러개의 스레드를 생성) 이 작업을 한다면 속도가 빨라져
시간을 단축할수있다.(병렬처리의 가장 흔한방식 )

- 스레드개수가 많아질수록 성능향상의 정도는 줄어든다.
- 스레드가 너무 많아지면 속도가 조금 빨라질수 있지만 응답속도가 떨어진다.

즉 프로세스 개수 대비 적당한 스레드개수를 정해야한다(cpu의 성능 , i/o 입출력)
스레드가 필요할때마다 생성해서 사용하기보단
쓰레드풀을 이용하여 사용하고 자원이 반납되어진 즉 대기중인 스레드를 가져와서 사용하면 효율성이 업업
Boss/ Worker
BOss스레드(일반적MainThread)가 여러 개의 Worker스레드에게 작업을 나누어주는방식

Client/Server model
동시에 여러개의 클라이언트들의 요구를 처리하기위해 스레드를 연결된 클라이언트마다 생성한다.

PipeLineModel
각 스레드 또는 스레드들의 그룹은 주어진 작업에 대한 특정한 처리를 수행하고
그것을 다른 스레드에게 넘겨서 나머지 처리가 일어나게한다.
Divide &Conquer 전략이 얼핏보면 비슷한거같다.

웹기반 시스템에서의 성능 관한글 보기

2013년 1월 2일 수요일

Parallel 예제모음

병렬 프로그래밍
Parallel Programming
병렬처리는
Data Parallellism 대량의 데이터를 처리하는데 있어 각 CPU에 일감을 나눠서 주고 동시에 병렬로 처리
즉 대량의 데이터를 분할하여 다중 CPU를 사용하고 다중스레드들이 각각 할당된 데이터를 처리하는데
일반적으로 스레드 당 처리 내용은 동일하다.
(PLINQ와 Parallel클래스(For, Foreach메소드)

Task Parallelism은 큰 작업 Task를 분할하여 각 스레드들이 나눠서 다른 작업 Task들을 실행하는것
Task, TaskFactory (Parallel.Invoke())
PLINQ
PLINQ는 LINQ쿼리들을 병렬로 처리한다.
프레임워크의 작업분할,결과들을 처리하는 부담을 줄이는 이점이 있다?
AsParallel()을 호출하여 3 ~ 100,000 사이의 소수를 구하는 예제를 보자
LINQ 쿼리를 입력으로 하는
AsParallel은 System.Linq.ParallelEnumerable을 확장 메소드로