1080 3330000200901705 1270146494 23 2010



<1080>
서울시 강남구 역삼동 KB테헤란로지점 개인금고번호
<3330000200901705> 보건복지부등록번호 / 이번호를 내주민번호로 나눈 몫 4자리는 비밀번호
<1270146494> 생명보험증권번호 / 보장금액 KRW 600,000,000 원 (자의에 의한 사망시는 보장금액의 70%)
<23> 마음의빚 금전의빚을 갚아야 할 사람 / 위 모든걸열람할수있는사람

 

김영칠 배익복 박명규
김진아 곽철민 정봉곤
이광호 김상득 백봉길 유대은
김철    박규호 배수현 조영범

최연기 김준우 김주연 박성열
이성현 백지훈 김민석 임문현

<2010>
 경인년 / 내마음속의데드라인
 

아직 인생의 여정이 많이 남았다고 하지만,, 
내일도 오늘처럼 살아야하고,
한달뒤도 오늘처럼 살아야하고,
일년뒤도 오늘처럼 살아야하고,
십년뒤도 오늘처럼 살아야하는 인생이라면, 

그 인생이 나의 인생이라면 나는 벌써 그 인생의 여정을 그만뒀을거다. 성인이 된 이후의 10년동안의 내 인생은 굴곡은 있었을 지언정 어제와 같은 오늘, 오늘과 같은 내일은 아니였기에 힘들어도 헤쳐나왔던 것이 아니었을까? 

 

하지만, 내 인생에 누구도 간섭하고 방향을 바꿀수는 없겠지만,, 
내가 고집스럽게 걷는 이 길이 누군가에게 힘이 되고, 피해를 주고, 마음에 상처를 주는 길이라면,, 
한달 뒤, 일년 뒤, 십년 뒤에 아무리 큰 성공과 비전이 기다리고 있을지라도,, 고마운 사람, 사랑하는 사람, 믿어주는 사람에게 그 동안의 시간이 고통이라면..? 

나 스스로 고집스레 가던 길을 포기하던지, 길의 방향을 바꾸던지 해야하는 것 아닐까? 

새해에는 내 주위에 모든 이들의 건강과 행복이 가득하길 진심으로 기원하고.. 
나에게는 복잡한 머릿속과 심란한 마음속을 정리해나가는 것에 만족하는 한해가 되었으면 한다.

by 홍야루 | 2010/01/01 19:14 | 일상, 그리고 생각 | 트랙백(1) | 덧글(0)

Multi Thread, Multi Process, Thread 몰라!?

프로그램이 동작하기 위해서는 두 가지의 메모리 공간이 필요하게 되는데 이것이 바로 코드공간데이터 공간이다.

코드공간이란, 특정 프로세스의 동작상태를 기록하는 것으로 하나의 프로세스가 독립적인 코드포인터를 가지고 동작하기 위해 꼭 필요하다.

데이터공간이란, 하나의 프로세스가 작동중에 필요로 하는 데이터를 저장해 두기 위한것으로 프로그램 변수나 메모리 스택공간등을 말한다.

하나의 프로세스는 동작하기 위해 이러한 두가지의 공간을 모두 요구하고, 다수개의 쓰레드는 하나의 프로세스 하부에서 나타나는데 이들은 독립적인 코드공간을 가지고 개별적으로 동작할 수 있지만, 독립적인 데이터 공간을 가지지 않으므로 하나의 프로세스 아래에 있는 모든 쓰레드들은 해당 프로세서의 데이터 공간을 각각 공유하게 된다. Multi Thread란, 이런 방식으로 하나의 프로세스가 다수 개의 작업을 가각 쓰레드를 이용하여 동시에 작동시킬 수 있는 것을 말하는데 보통 쓰레드의 생성과 파괴는 코드공간의 관리만을 필요하기 때문에 프로세스의 생성과 파괴보다 훨씬 적은 자원을 소모한다. 이때문에 멀티쓰레드는 동일 작업을 위한 멀티프로세스보다 효율적이라고 이야기하는 것이다.


Thread (쓰레드) : 코드의 실행흐름, 혹은 처리단위 등으로 해석할 수 있다 

Process(프로세스) : 실행중인 프로그램을 의미한다. 쓰레드와 비슷하게 생각할 수도 있지만, 프로세스가 쓰레드를 가지고 있는것이다. 한개의 프로세스는 적어도 반드시 한 개 이상의 쓰레드를 가진다. 프로그램이 실행되면 명령어 코드, 필요한 데이터 등이 메모리에 올려지게 되는데 이 주소를 프로세스가 가지고 있다.


1. Multi Thread

가. Multi Thread의 개념

여러개의 쓰레드를 사용하여 하나의 수행업무를 동시에 처리함으로 컴퓨터의 처리속도를 증가시키는 프로세스 제어기법.
CPU가 매우짧은 단위시간인 시분할 방식으로 복수의 Thread에 차례로 활당하여 복수의 처리가 동시에 이루어지는 것 처럼보임.

나. Multi Thread의 특징
예측불가 : 각 Thread는 독립적이며, 실행/종료순서는 예측불가.
동기화 : 한 프로세스내의 다른 Thread들과 Sync.
우선순위 : Thread는 자신의 Stack, PC, 레지스터등의 다양한 우선순위 가짐.
자원공유 : 프로세스의 일부로서 데이터공유가 용이하고 Local 자원임.
성능 : 한 프로세스가 Sequencial하게 수행되는 것보다 월등한 처리성능 가짐.


2. Multi Thread의 문제점 및 해결기법

가. Multi Thread의 문제점
프로그램복잡성 : Thread의 동기화등으로 프로그램이 복잡해짐
경쟁상태돌입 : 동기화가 불확실 할 경우 Race Condition 발생 (DEADLOCK)
우선순위역전 : 우선 순위가 높은 Thread가 실행정지 또는 후순위 처리 될 수 있음
사용자예측불능 : Response Time, 실행순서등을 예측할 수 없음

나. Multi Thread의 문제점 해결기법
주로 Multi Thread 수행시 둘이상의 Thread가 공유자원 접근함으로써 발생되는 문제해결을 위해 공유자원의 접근제어 필요

임계영역(Critical Section) : 사용자객체로부터 공유자원에 대해 하나의 쓰레드만 접근허용
세마포어(Semaphore) : P연산(자원점유상태), V연산(자원해제상태)으로 이루어지며, 자원의 점유와 해제를 통제
상호배제(Mutex, Mutual Exclusive) : 시스템의 어떠한 자원(임계영역)을 한 시점에서 한 개의 프로세스 만이 사용할 수 있도록제어


3. Multi Thread 활용시 고려사항

가. 운영자 측면
Multi Thread의 사용전에 효율적인 프로세스 운영방안 수립이 필수
원하는 수준의 Multi Thread를 지원하는 O/S 탑제 제품의 선택중요

나. 프로그래머 측면
Thread간 자원사용으로 Deadlock 발생하지 않도록 설계 및 프로그래밍 필요


Multi Thread에 대한 개념과 내용을 간단하게 정리해 보았다.

그런데 문제는 실무에서 사실 Multi Thread 프로그래밍이 쉽지 않다는 것이다.
멀티쓰레드 프로그래밍을 잘 하면 성능 좋은 프로그램이 만들어지지만, 조금만 실를 하면 프로그램에 시한폭탄을 설치한것처럼 에러가 발생한다. 

개인적으로 생각하는 좋은 멀티쓰래드 프로그래밍이란,

Task가 병행 또는 병렬로 실행
공유 데이터의 동기화
공유 데이터 Lock의 최소화

라고 생각하고 물론 위 셋 중 어느하나 쉽지 않는 것 또한 사실이다.  

그리고 멀티쓰레드는 성능 개선을 위해서 하는 부분보다 꼭 멀티 쓰레드를 써야만 쉽게 구현할 수 있는 경우가 있다.
항상  멀티쓰레드 = 성능향상 이라는 등식이 성립하는 것은 아니다 라는 것이다. 

Multi Thread에서 문제가 되는 건 쓰레드 생성이나 Context Swith 비용이 아니다. 이는 현재도 충분히 작고, 더더욱 Multi Core라면 어차피 각 쓰레드가 별도의 코어에서 도니까 Context Switch 비용은 큰 의미가 없다고 하겠다.

핵심적인 이슈는, Multi Thread에서 어떻게 과도한 Locking Overhead가 생기지 않도록 일을 잘 나눌 것인가 하는 거고, 다시 말해 Single Thread로 짜는 것보다 프로그램이 훨씬 더 복잡해진다는 것이다. 이를 어떻게 하면 버그없이 과도한 Lock Overhead 없이 잘 구현할 것인가 하는 방법론이 아직 제대로 나와 있지 않아서, 그냥 프로그래밍을 하는 개발자의 천재성(?)에 의존한다라는 것이다.


by 홍야루 | 2009/10/14 05:14 | 프로그래밍? 내공? | 트랙백(2) | 덧글(0)

이런 이해심과 헤아림을 주는 사람을 위해..



사실 관계를 떠나서 나에게 무조건적인 지지와 응원을 해 주는 사람..
부모님을 제외하고 이런 고마운 사람이.. 

지질이 못 난 나지만.. 여러명이있다..
그런 사람들에게.. 좋은 모습을 보여주고..

내가 받은 사랑을 나 또한 베풀어야기에..
조금 힘들고 어려워도, 아직까지는 버티고 헤쳐나갈만하다 싶다..

이런게 존재의 이유가 되지않을까..





by 홍야루 | 2009/06/02 16:39 | 일상, 그리고 생각 | 트랙백 | 덧글(0)

故노무현 前대통령님 영면하세요..

개인적으로 이런 저런 많은 일들이 있는 와중에,,  한국으로 부터 슬픈 소식을 접했다..


며칠을 기사를 보던 중에 와 닿는 게시물이 있어 갈무리를 한다.


대통령 임기 중에도,
이제는 이 세상을 떠나서도, 

여러가지로 많은 것을 느끼고 반성하도록 만드는 故노무현 前대통령을 마음속으로나마 영면하시길 기원한다. 


부디 평온한 세상에서 영면하시옵고,
10여년전 부산 초량의 한 식당에서 우연히 뵈었던 그 모습과 영정사진의 모습과,, 만감이 교차하네요..


그렇게 단단한 바윗돌에 몸을 던지셨다는 사실에..

타국땅에서의 작은 어려움과 힘듦에, 그런 마음과 생각을 머릿속에 가졌던 제 자신이 부끄러워집니다..


"부패한 사람은 부패와 더불어 살 수 있지만, 정치 개혁가는 부패와 더불어 살 수 없어 한 몸을 던졌다"는 한 외신의 코멘트가 무언가 메세지를 전하는듯 하다.


-------------------------------------------------------------------------------------------------
[박연미]노무현의 죽음, 그래서 할 일은… 
 
박연미기자 change@inews24.com
 
 
코 끝이 싸하게 춥던 2003년 2월25일.

휴가를 냈다. 손꼽히는 보수 신문에서 일하던 시절이다. 취재진 아닌 새천년민주당 자원봉사자 신분으로 16대 대통령 취임식에 참석했다.

인터넷 자봉단 모집에서 당당히 선발된 내 임무는 폼나게 말해 내빈 안내, 실은 화장실이 어디에 있는지 가르쳐주는 일이었다.

국회 앞마당에서 한 시간, 두 시간….

한기에 손발이 오그라들고, 바람따라 간이 화장실의 얄궂은 냄새가 밀려왔다. 그렇지만 괜찮았다. 거기 모든 비주류의 희망, 노무현 전 대통령이 있었으니까.


살며 처음 정치후원금을 내 본 대선이었다. "원칙을 바로세워 신뢰 사회를 만듭시다. 정정당당하게 노력하는 사람이 성공하는 사회로 나아갑시다."(노 전 대통령 취임사 中) 대통령의 목소리는 사이다처럼 청량했다. '사필귀정(事必歸正)'. 격언이 진실임을 깨닫게 한 산 증인, 그를 위해 추위에 떤 날, 기뻤다.

 

그러나 정치는 동화가 아니었다.

기득 세력은 새 정부를 인정하지 않았다. 보수 신문들은 파격에 반대했다. 다른 누구도 아닌 대통령 자신의 특권을 줄이는 데서 시작된 개혁은 보수세력의 목줄을 죄었다.

새 정부는 청춘(靑春) 같았다. 속도와 통증을 조절하는 데 미숙했다. 언론들은 이 젊은 정부의 투박한 국정 운영을 '무능'이라고 했다. 노 전 대통령의 직설화법도 끝없이 말거리를 주었다. 콘텐츠가 아니라, 그걸 담은 말이 문제되는 날이 많았다.

이라크 파병 결정, 한미 자유무역협상 개시. 정치적 이해관계를 초월한 정책 추진에 지지자들은 사분오열했다. 재벌 사돈도, 막강한 집안 배경도, 든든한 학연도 없는 대통령은 헌정 초유의 탄핵 시도에도 방탄조끼 없이 포탄을 맞았다. 그야말로 논쟁의 시절이었다.

하지만 격정은 멀고, 일상은 가까운 법.

노무현의 승리에 울고 웃던 지지자들은 어느새 생활인으로 돌아가 있었다. 정가에서 벌어지는 지리한 입씨름이 점점 지겨워졌다. '노짱'을 부르짖던 이들은 피로해졌다. 보수 언론들은 "무능한 청류보다 유능한 탁류가 낫다"고 속삭였다. 그 사이 '노무현 놀이'가 시작됐다.

월드컵 대표팀이 가나에 완패했다는 기사에도, 유명 할리우드 배우가 결혼생활에 실패했다는 외신 아래에도 "이게 다 노무현 때문"이라는 맥락없는 댓글이 달렸다. 민심의 향배가 읽혔다. 2006년 5.31 지방 선거 이후 크게 유행한 이 놀이는 결국 세계 최대의 온라인 백과사전인 '위키피디아'에 등재되고 만다. 영어, 중국어 등 세계 10개국 언어로 개설돼 매일 수백만명이 방문하는 인터넷 UCC백과사전에 대한민국의 첫 인터넷 대통령 '노무현'의 이름이 조롱거리로 남았다.


그리고 정권이 바뀌었다.

17대 대선은 노련함과 부가가치 창출 계획이 승리한 선거였다. 국민들은 아마추어리즘에 지쳐있었다.

노회함을 산 대가는 컸다. 촛불을 들고 거리로 나가거나 인터넷에서 하고 싶은 말을 거침없이 하다간 철창 신세를 지는 세상이 되었다. 입은 있으되 말 할 수 없는 조용한 세상. 국민들은 새 정권이 들어선 이 시대를 '신(新) 공안정국', '제2의 유신시대'라 부르기 시작했다.

그렇게 1년이 지났고, 2009년 5월 23일 전직 대통령이 투신했다.

 

푸근한 시골 할아버지로 살던, 그러나 여전히 하고 싶은 말이 많았던 인터넷 정객 노 전 대통령은 고향 마을 단단한 바위에 몸을 던져 생을 부러뜨렸다. 구속된 박연차 태광실업 회장에게서 재임 중 600만달러를 받은 혐의로 검찰 조사를 받은 뒤다.

전직 대통령이 기업인에게 거액의 돈을 받은 건 분명 석연치 않은 일이었다. 영부인이 건네 받았다는 자금은 대부분 제 앞가림을 하고도 남을 나이의 자녀들에게 전해졌다. 답답한 노릇이다. 액수를 떠나 대통령이 재임 중 알았다면 법적 처벌을, 몰랐다면 도덕적 비난을 받아 마땅하다.

문제는 과정이었다.

노 전 대통령은 쿠데타로 정권을 잡고, 광주대학살을 벌인 전두환, 노태우 두 전직 대통령에 이어 사상 세 번째로 검찰 조사를 받았다. 도덕성을 생명으로 삼던 그의 평생이 무너졌다.

상식적인 일이었을까. 노 전 대통령의 혐의가 확정되었다 치자. 죄의 경중을 묻는다. 그들 셋, 과연 한 줄에 세울만 한가.

영국의 유력 일간 더 타임스는 노무현의 죽음을 일러 그랬다. "부패한 사람들은 부패와 함께 살아갈 수 있지만 정직한 개혁 운동가였던 노무현은 그러지 못했다"고.

다시 묻는다.

검찰의 수사는 불편부당했는가, 그들이 자신하던 정황 증거들은 전직 대통령을 검찰로 불러들일 만큼 믿을만 한 것이었는가, 검찰과 언론은 과연 무죄추정의 원칙을 지킬 의지가 있었는가, 그걸 보는 국민들은 이성을 차갑게 식혀 단단히 붙들고 있었는가. 모두가 모두에게 면목없어 마땅한 때다.

이제 하루 뒤면 영결식.

존경 아니라 사랑을 받았던 대통령 노무현과 내일이면 안녕이다.

그가 숨을 거둔 지 이제 엿새, 국민들의 염원에도 서울광장은 끝내 '명박산성'에(이명박 정부가 시위나 군중 결집을 막기 위해 전경차로 특정 지역을 가로막은 모습을 빗댄 말. 2008년 6월 위키피디아에 등재되었다 삭제됨) 가로막혀 열리지 않았다.

해묵은 사진까지 꺼내들고 고인과의 인연을 상기하던 여당 원내대표는 식지 않는 추모열기에 "국민들이 북핵 위기감이 없는 것 같다"며 이내 속내를 드러냈다. 안간힘쓰고 있지만, 여당과 이명박 대통령의 지지율은 추락 중이다.

그리고 국민들은, 대선과 총선 때 나들이 가거나 늦잠을 잔 젊은이들은, 참으로 아프게 '투표의 경제학'을 되뇌는 중이다. 거대한 노무현 추모게시판이 돼버린 유력 포털사이트에선 "다음부턴 꼭 투표합시다"가 백 마디 성토를 대신하는 인사말이 돼버렸다.

포털사이트 다음에서 ID '잎싹'은 말했다. "투표를 해야하는 날에는 꼭 빠지지 않고 투표를 하고… 그래서 오늘을 기억하는 많은 젊은이들이 투표를 꼭 하고, 제대로 하고, 상식적인 세상이 되기를 바랍니다." 마지막으로 노희경을 베낀다.

화장실 안내마저 자랑스럽게 만들었던, 와장창 무너져내릴 땐 포장마차에서 소주잔이라도 나누고 싶었던 노 전 대통령의 명복을 빌며.

"참 묘하다. 살아서는 노무현이 그냥 노무현이더니, 그 이상은 아니더니, 돌아가시고 나니 그가 희망의 다른 이름이었다는 생각이 든다."
 

 

by 홍야루 | 2009/05/29 11:49 | 일상, 그리고 생각 | 트랙백 | 덧글(0)

XML과 JSON 변환하기 - 이런거 나는 어렵고 귀찮고 싫다.ㅎ

한 영국업체 외주프로젝트로 XML 데이터를 JSON 으로 화면에 뿌려줘야 하는 파트가 하나 생겼다.

영국업체 개발팀장 왈 : "XML 데이터 받아서 JSON으로 렌더링 해" 

Skype 메신저를 통해 딱, 한 문장으로 얘기를 건네왔는데.. 참.. 거기다 JSON으로? 어떻게? 하고 되묻기가 민망하고,
그 업체 개발팀장 하고 사이도 안좋고 해서,, 그냥 삽집을 좀 했다.

한빛미디어 웹에서 얻은 정보를 가지고 프로젝트는 마치고, 내용을 퍼왔다.

[제공: 한빛미디어 네트워크 기사 저자: Stefan Goessner, 한동훈 역]

보다 많은 웹 서비스 제공업체들은 자사의 XML API에 JSON API를 제공하려 하는 것 같다. JSON API를 사용할 때 얻을 수 있는 가장 큰 장점은 XmlHttpRequest 객체가 동일 도메인에서만 사용할 수 있다는 제한을 우회해서 다른 도메인간의 요청(cross-domain requests)을 제공할 수 있다는 점이다. 클라이언트 단에서 JSON은 네이티브 언어와 호환되는 데이터 구조를 갖게 되며, XML 처리를 위해 필요한 DOM 호출 보다 훨씬 더 빠르게 수행된다. 마지막으로, JSON 구조를 화면에 표시하기 위한 데이터로 변환하는 것도 JSONT와 같은 도구를 사용해서 쉽게 할 수 있다.

만약, 이 분야에서 일하고 있다면, 다음 정보들을 유지하면서 기존 XML 문서를 JSON 구조로 변환해야 할 필요가 있을 것이다.
  • 문서구조
  • 순서
  • 정보

이상적인 세상이라면 생성된 JSON 구조는 원본 XML 문서로 쉽게 역변환할 수 있을 것이다. 따라서, XML과 JSON의 양방향 변환에 대한 기초적인 내용들을 기본 패턴으로 논의할 필요가 있다. 이와 비슷한 논의는 BadgerFish야후에서 찾을 수 있다.

실용주의 접근

파일 하나로 구성된 XML 문서의 요소들은 다음과 같은 7가지 특징을 갖는다.

  1. 빈 요소
  2. 순수 텍스트로 구성된 요소
  3. 속성을 갖는 빈 요소
  4. 순수 텍스트와 속성으로 구성된 요소
  5. 다른 이름으로 된 요소들을 포함하는 요소
  6. 같은 이름으로 구성된 요소들을 포함하는 요소
  7. 요소와 연속된 텍스트를 포함하는 요소

다음 테이블은 XML과 JSON 사이에 변환 패턴을 정리한 것이다.

Pattern XML JSON Access
1<e/> "e": null o.e
2<e>text</e> "e": "text" o.e
3<e name="value" /> "e":{"@name": "value"} o.e["@name"]
4<e name="value">text</e> "e": { "@name": "value", "#text": "text" } o.e["@name"] o.e["#text"]
5<e> <a>text</a> <b>text</b> </e> "e": { "a": "text", "b": "text" } o.e.a o.e.b
6<e> <a>text</a> <a>text</a> </e> "e": { "a": ["text", "text"] } o.e.a[0] o.e.a[1]
7<e> text <a>text</a> </e> "e": { "#text": "text", "a": "text" } o.e["#text"] o.e.a


패턴7의 요소가 반구조화된 요소(Semistructured element)로 알려져있지만, 모든 패턴들은 구조화된 요소들을 기술하기 위한 것이다. XML 문서를 JSON 구조로 변환하거나 그 반대로 변환하기 위한 실용주의 접근은 위의 7가지 패턴에 기초한다. 항상 정규화된 XML 문서가 입력된다고 가정하며, 다음과 같은 경우는 고려하지 않는다.

  • XML 선언
  • 처리 명령(processing instruction)
  • 네임스페이스 선언의 명시적인 처리
  • XML 주석

순서 보존하기

JSON은 두가지 내부 자료구조로 구성되어 있다.

  • 유일한 이름으로 된 이름/값 쌍의 집합(연관배열)
  • 값들의 정렬된 리스트(배열)

다음과 같이 구조화된 XML 문서는

<e>  <a>some</a>  <b>textual</b>  <a>content</a></e>

다음과 같은 JSON 객체로 변환하는 시도는

"e": {  "a": "some",  "b": "textual",  "a": "content"}

잘못된 결과를 만들어 낸다. "a"는 연관 배열에서 유일한 이름이 아니다. 따라서, 배열에서 같은 이름을 갖는 모든 요소들을 모아야 한다. 패턴 5와 6을 사용해서 다음과 같은 결과를 만들어 낼 수 있다.

"e": {  "a": [ "some", "content" ],  "b": "textual"}

이제, 요소 순서를 보존하지 못하게 된 구조를 갖고 있다. 이 결과는 XML 요소의 순서가 중요한가에 따라 허용할 수도 있고, 허용할 수 없는 것이 될 수도 있다. 따라서, 우리의 일반적인 목표는 다음과 같다.

다음 조건을 만족하는 경우에 한 해서 구조화된 XML 요소는 역변환이 가능한 JSON 구조로 변환할 수 있다.

  • 모든 하위 요소가 정확히 한 번만 등장하거나 또는…
  • 동일한 이름(identical names)을 갖는 하위 요소들이 순차적으로 나열된 경우

그리고

다음 조건을 만족하는 경우에 한해 구조화된 XML 요소는 역변환 가능하며, 의미적으로도 동일한 JSON 구조로 변환할 수 있다.

  • 같은 이름을 같지만 의미는 다른 하위 요소들(homonymous subelements)이 순서에 관계없이 등장하는 경우와 …
  • 요소들의 순서가 중요하지 않은 경우

위 두가지 조건중에 어느 하나라도 만족하지 않는다면 앞에서 본 패턴을 사용해서 XML과 JSON을 변환할 수 있는 실용적인 방법은 없다. 내부적으로 요소들의 순서에 의존하는 SVG와 SMIL 문서를 살펴보자.

반구조화된 XML(Semi-Structured XML)

XML 문서는 일반적으로 문서 표기에서 흔히 볼 수 있는, 텍스트 내용과 자식 요소들의 혼합으로 구성된 반구조화된 요소들을 포함할 수 있다. 텍스트 내용은 다음과 같이 연속적일 수 있다.

<e>  some textual  <a>content</a></e>

패턴7을 적용해서 다음과 같은 결과를 얻을 수 있다.

"e": {  "#text": "some textual",  "a":  "content",}

그러나, 어떻게 하면 요소들과 혼합된 텍스트 요소를 변환할 수 있는가? 예를 들어:

<e>  some  <a>textual</a>  content</e>"e": {  "#text": ["some", "content"],  "a": "textual"}

이는 배열에서 모든 텍스트 요소들을 수집하는 대부분의 경우에 아무 의미도 없으며, 순서나 맥락정보를 보존하지 않는다.

따라서, JSON에서 혼합된 반구조화된 문서를 다루는 가장 좋은 방법은 XML이 CDATA 섹션을 다루는 방법과 같은 방법을 사용하는 것이다. 즉, 알려지지 않은 표기법(markup)을 사용하는 것이다.

"e": "some <a>textual</a> content"

다음과 같이 구성된 XML 요소들의 규칙은

  • 텍스트 내용과 요소 노드들로 혼합된 것과
  • CDATA 섹션

패턴 2와 4에 따라 완전한 XML 표기법을 포함하고 있으며, 역변환 가능한 JSON 문자열로 변환할 수 있다는 점이다.

예제

지금까지 살펴본 내용을 토대로 두 가지 예제를 살펴보자. 마이크로포맷을 예제로 살펴볼 것이다. 마이크로포맷은 오픈 표준이며, 간단한 설명을 위해 사용할만큼 간결하기 때문에 예제로 가장 적합하다.

XOXO는 XHTML기반의 문서개요 포맷이며, 마이크로포맷중에 하나다. 다음은 초안에 있는 예제를 약간 수정한 것이다.

<ol class="xoxo">  <li>Subject 1    <ol>        <li>subpoint a</li>        <li>subpoint b</li>    </ol>  </li>  <li><span>Subject 2</span>    <ol compact="compact">        <li>subpoint c</li>        <li>subpoint d</li>    </ol>  </li></ol>

XML 문서 조각을 JSON 구조로 변환하기 위해 위 패턴을 적용해보자.

  1. 두 리스트 항목으로 구성된 바깥 요소는 패턴6을 사용해서 변환할 수 있다.
  2. 첫번째 리스트 항목은 하나의 텍스트 내용 "Subject 1"과 그 내부 리스트 요소로 구성되어 있다. 따라서, 패턴7에 따라 이를 처리할 수 있다.
  3. 첫번째 내부 리스트는 패턴 6에 따라 변환할 수 있다.
  4. 바깥쪽 목록의 두번째 항목은 패턴5를 적용한다.
  5. 두번째 내부 리스트는 패턴3과 6을 조합해서 변환할 수 있다.

변환된 JSON 구조는 다음과 같으며, 이 구조는 어떤 정보 손실없이 역변환이 가능하다.

"ol": {  "li": [     {      "#text": "Subject 1",      "ol": {        "li": ["subpoint a", "subpoint b"]      }    },    {      "span": "Subject 2",      "ol": {        "@compact": "compact",        "li": ["subpoint c", "subpoint d"]      }    }  ]}

hCalendar는 iCalendar 표준에 기반한 마이크로포맷이다. iCalendar 포맷이 JSON 포맷으로 더 쉽게 변환할 수 있다는 사실은 무시하고, hCalendar 이벤트 예제를 살펴볼 것이다. 이 예제는 혼합된, 반구조화된 문서 조각들을 포함하게 수정하였다.

<span class="vevent">  <a class="url" href="http://www.web2con.com/">    <span class="summary">Web 2.0 Conference</span>    <abbr class="dtstart" title="2005-10-05">October 5</abbr>    <abbr class="dtend" title="2005-10-08">7</abbr>    <span class="location">Argent Hotel, San Francisco, CA</span>  </a></span>

패턴 2, 3, 4, 5, 6을 사용해서 다음 JSON 구조로 변환할 수 있다.

"span": {  "a": {    "@class": "url",    "@href": "http://www.web2con.com/",    "span": [      { "@class": "summery", "#text": "Web 2.0 Conference" },      { "@class": "location", "#text": "Argent Hotel, San Francisco, CA" }    },    "abbr": [      { "@class": "dtstart", "title": "2005-10-05", "#text": "October 5" },      { "@class": "dtend", "title": "2005-10-08", "#text": "7" }    }  }}

이 예제는 원본 요소 순서를 보관하지 않고 변환한 것이다. 의미적인 순서는 바뀌지 않지만, 다음과 같은 내용을 고려해야 한다.

  1. 변환이 완전하지 않다는 것
  2. 순서가 중요하지 않은 경우라면 결과를 수용할 것
  3. XML 문서를 JSON으로 변환하기 쉬운 구조로 작성해보기

대부분의 경우에 있어서, 최소한 XML 문서가 이미 표준에 기초한 것인 경우 마지막은 수용하기 어려울 것이다. 그러나, 다른 경우라면 XML과 JSON을 보다 조화롭게 사용할 수 있도록 XML에 변화를 주는 것을 고려해볼 수 있다. hCalendar 예제에서 <abbr> 요소를 <span> 요소로 변환하는 것으로도 개선될 수 있다.

XML은 문서 중심 포맷이며, JSON은 구조화된 데이터를 위한 포맷이다. XML은 구조화된 데이터를 기술할 수 있기 때문에, 이 근본적인 차이점은 관계없는 것일 수 있다. XML은 구조화된 문서를 기술하기 위해 사용되기 때문에 JSON과 함께 사용할 수 있을 것이다.

XML 문서가 다음과 같은 경우에 문제가 일어날 수 있다

  • 암시적으로 요소들의 순서에 의존하는 경우
  • 반구조화된 데이터를 많이 포함하고 있는 경우

지금까지 설명한 내용을 증명하기 위해 위 6가지 패턴을 기반으로 다음과 같은 자바스크립트 함수 2개를 구현했다.

  • xml2json
  • json2xml

이들 함수는 다음과 같은 경우에 사용할 수 있다

  • 클라이언트측 변환
    • DOM을 통해 읽어들인 XML 문서를 JSON 구조로 변환
    • JSON 구조를 XML 문서(텍스트형식)로 변환
  • 어떤 서버측 언어에서도 사용할 수 있는 변환기의 구현

앞으로 나오게 될 XML 문서 설계는 XML과 JSON 양쪽에서 쉽게 사용할 수 있도록 이들 패턴 또는 이와 유사한 패턴의 영향을 받게 될 것이다.

by 홍야루 | 2009/04/16 02:38 | 프로그래밍? 내공? | 트랙백 | 덧글(0)

인터콘티넨탈 마닐라 - 젝일슨! 이런 황당한 일이..

체크아웃도 안했는데.. 보기에는 낙서장 같았었도..
귀중한 서류와 빈박스지만 노트북 박스 버려놓구선...  

50,000 USD 짜리 계약과 관계된 서류인데..

달랑,,, 사과 편지 하나.. 그리고 1년 무료숙박, 식사??  제길 다 필요없어!! ㅠ_ㅠ

왜 중요한 순간에 이런 사고가,, 나한테 생기냐구 ㅠ


by 홍야루 | 2009/03/18 00:01 | Without intention!? | 트랙백 | 덧글(0)

세상을 내 발 아래에 두려는 어리석음


이렇게 크고, 넓고, 높은 세상을 이렇게 내 두 발 아래에 두려고 했던 것을 이제는 반성해야 하지 않을까?

그저 이 넓은 세상에서 다른 사람과 함께 같은 공기를 마시며 숨을 쉬고,

주위에 모든 것을 함께 공유하는 것 만으로도 행복해 해야 할 것 아닌가.


그만 쉬고 싶다, 내려 오자 이렇게 높고 어지러운 곳에서...

by 홍야루 | 2009/03/05 02:16 | 트랙백 | 덧글(0)

내가 있잖아.. 너를 사랑하고 존경하는 이유는..

나는 말이야..

시간이 흐르면서 점점더..

내가 너 아닌 다른사람을 사랑할 수 없다는 걸 깨달아가..

너의 순수함을 사랑하기도 했지만

무엇보다 니가 내 부족한 점을 보완해 줄 만큼 넉넉한 사람임을 알았기에..


나는 어릴 때도
어리다고 생각하지 못 한 채 나이 든 사람인양 생각하고 행동을 했고..

 

성격도 너무 너무 급해 무슨일이든 빨리 해치우지 않으면 안되고,,

덤벙 덤벙 해서 실수하고, 빠뜨리기 일쑤였고..

그러니 일상에 쌓이는 스트레스 또한 만만치 않았는데..


이런 부족하고, 어리석은 나에 비하면.. 

넌.. 너에게 주어진 일들과 시간을 아주 여유롭고 즐거운 마음으로 항상 맞이했고.. 

부족하고 못난 나를 이해해주는 정말 몇 안되는 사람중에 한 사람이었고, 
특히나 이런 나를 이해해주는 몇 안되는 사람중에 여성을 가진 사람이 네가 유일했지..  

실제로 너를 만나면서 내가 너를 조금씩 닮아가고.. 
나의 부족한 인내심도 어느덧 길러지고.. 

네가 좋아하는 것들은 나도 따라 좋아하면서 부족한 내가 채워져가는 느낌이었어.. 


그러면서 자연스레 부족했던것들은 채워지고, 넘쳤던것은 덜어내고.. 
뭐랄까.. 놀이터에 있는 시소가 신기하게도 평형에 멈춰 선것처럼.. 
내 마음은도 평형한듯 편안해졌어..  

 

그러나 무엇보다 중요한 것은 나는 이렇게나 멀리 떨어져 있고.. 


여전히 내가 너에게 해줄 수 있는 것은 아무것도 없다는 것이고..


하지만, 내 마음만큼은 이런 너에대한 감사함과 존경함으로 사랑을 대신하고 있으니..

그래서 이렇게 새삼 느끼고 반성하는 마음에..
남녀사이에는 반짝 좋았다가 시들해지는 그런 정열적임 보다는..

살면서 점점 좋아지고, 서로를 존경할 수 있는 그런 산들바람같은 감정이 더 중요하다 생각을 해본다.

더 이상 너와 내가 믿음이나 사랑의 깊이와 크기를 함께 키울 수는 없을지 몰라도..

짧은 시간에나마 함께 했던 그때 만큼은..

이렇게 감사하고 추억할 수 있으니 이 또한 나에겐 큰 행복이라 생각한다.


지금 내 상황에 이런 사색은 사치일지도 모르고,
공개 된 곳에 이런 글로써 비난받을 지도 모르지만..

힘든만큼 나는 내가 하고 싶은 말과 행동을 좀 더 솔직하게..

그러고 싶다..

by 홍야루 | 2008/10/21 00:43 | I got a crush on her | 트랙백 | 덧글(1)

병원엘 가야하는데, 해야할 일들 만나야 할 사람이 너무 많다


병원에 가서 좀 누워있어야 하는데, 왼쪽 발목 - 다리 - 엉덩이 - 어깨로 이어지는 부상을 입고도
책상에 앉아 있어야 하는상황.

물론, 내가 이루고자 하는 무언가를 위해서 하는 일이고 투자지만..

가끔은 이런 현실에 끌려가듯 살아야 한다는게,, 아주 가끔은 곤혹스러울 때가 있다.


지금 내 옆에 있는 함께있는 친구가 조금만 내 짐을 덜어줬으면 하는 응석도 부리고 싶고..

나도 어쩔 수 없는 사람이니까..


언제나 그렇듯, 결론은 버킹검! 이다.

힘내자.

by 홍야루 | 2008/10/16 15:03 | 일상, 그리고 생각 | 트랙백 | 덧글(4)

SQL Injection - 정말 쓰레기 같은 인간에게 한 방 먹었다 제길

정말, 프로젝트를 힘들게 엔딩하고 런칭을 해놓구선, 서버를 옮겨놓고 인젝션 처리를 하지 않아서 눈뜨고 크래킹을 당했다.
일단 Web Night 와 같은 공개보안툴과 아래의 인젝션 처리만 해도 어지간한 크래킹시도는 막을 수 있는데 말이다.

일단, SQL자체에서 인젝션 처리를 하는 내용을 기재하고, Web Night 설정에 대한 내용도 따로 포스팅 하겠다.

기업 보안이 중요시 되고 있는 지금 SQL 인젝션에 인한 피해 또한 급증하고 있는 추세이다.  권한 제거라는 간단한 방법이 있으나 자칫 한순간의 방심으로 기업 방화벽만을 믿고 이를 묵고한다면 엄청난 피해를 초래할 수 있기에 다음과 같은 내용을 서술하고자 한다.  DB Owner Account로 생성된 어플리케이션들의 공통된 특징 중 하나가 바로 System Object 들에 대한 권한제어가 적절하게 이루어 지지 않는다는 점이다. DB Owner Account가 아닐지라도, System Object중에 불필요하게 public 계정에 대해 실행권한이 있는 것들이 있다. 따라서, SQL Server를 설치한 후에 해당 object들에 대해 권한 제거 작업을 진행하길 바란다.

 

 서버 관리에 있어 가장 치명적인 문제로 꼽을 수 있는 서버 패스워드 유출이 단 한줄의 쿼리문으로 발생할 수 있다면 믿겠는가?  물론 패스워드 뿐만 아니라 시스템상의 파일 트리를 조회하거나 중요 파일들을 삭제할 수도 있다.

 

 이를 가능하게 하는 대표적인 저장 프로시저가 바로 xp_cmdshell 이다. master db의 확장 프로시저 중 하나인 xp_cmdshell은 지정된 문자열을 Shell을 통해 실행할 수 있는 기능을 가지고 있다. 따라서, 이 확장프로시저에 대한 권한을 가지고 있다면 앞서 언급한 피해를 타겟이 되는 기업 서버에 줄 수 있다. 

 

 아래 3가지 항목을 토대로 한 SQL Injection 기법을 이용하여 해당 시스템을 공격할 수 있게 된다.
1 ) exec master..xp_cmdshell 'net user administrator password'
   디폴트 유저인 administrator의 패스워드 변경 혹은 신규 Server Admin계정 추가
2 ) exec master..xp_cmdshell 'dir c:\'
   C 드라이브에 대한 정보 및 디렉토리 정보 반환
3 ) exec master..xp_cmdshell 'del c:\ /q/s'
   C 드라이브의 중요 파일 삭제

 

 만약, 현재 서버에서 3389 포트를 사용하는 원격 지원 서비스가 실행중이라면 xp_cmdshell을 통한 비밀번호 변경 혹은 Server Admin 유저를 신규로 추가하는 등의 방법으로 원격지에서 서버 접속이 가능하게되며 이러한 경우 마치 서버 앞에서 서버를 조작하는것과 동일한 방식으로 해당 서버를 제한없이 컨트롤 할 수 있게 된다.

 

 이러한 확장 프로시저의 노출로 야기될 최악의 사태를 방지하기 위해 사용이 불필요할 경우 아래 쿼리문을 실행하여 xp_cmdshell 프로시저를 임시로 Drop하기 바란다.

 

USE master
GO
IF OBJECT_ID('[dbo].[xp_cmdshell]') IS NOT NULL BEGIN
   EXEC sp_dropextendedproc 'xp_cmdshell'
END
GO

 

 여기에 덧붙여 System Admin계정의 ID를 administrator로 사용하는 사례가 많은데, 각 서버 사용사의 고유한 ID를 등록하여 사용 하는 것이 보다 나은 보안 효과를 기대할 수 있겠다.

 

 그러나 앞서 다룬 xp_cmdshell을 통한 SQL Injection 이외에도 public 계정들에 대한 확장 프로시저로 권한을 획득하여 시스템을 공격할 수 있으니 아래 나열한 쿼리문의 실행을 통해 불필요한 프로시저를 Drop하도록 하자.  (프로시저들을 Drop하더라도 필요에 따라 재등록할 수 있다.)

 

1) master database
·  확장 프로시저 퍼미션 삭제
·  REVOKE EXECUTE ON xp_regread FROM public
·  REVOKE EXECUTE ON xp_instance_regread FROM public GO
·  sp_runwebtask 접근을 통한 web task 실행 권한 획득 방지
·  REVOKE EXECUTE ON dbo.sp_runwebtask FROM public GO

 

2) msdb database
·  Agent Job 접근을 통한 권한 확대 방지
·  REVOKE EXECUTE ON sp_add_job FROM public
·  REVOKE EXECUTE ON sp_add_jobstep FROM public
·  REVOKE EXECUTE ON sp_add_jobserver FROM public
·  REVOKE EXECUTE ON sp_start_job FROM public
·  mswebtasks 테이블을 통한 web task 관리 권한 획득 방지
·  REVOKE ALL ON dbo.mswebtasks FROM public
·  DTS packages 를 통한 administrator 패스워드 유출 방지
·  REVOKE EXECUTE ON sp_enum_dtspackages FROM public
·  REVOKE EXECUTE ON sp_get_dtspackage FROM public
·  SQL Agent Password 노출 방지
·  REVOKE EXECUTE ON sp_get_sqlagent_properties FROM public

 

 프로시저들의 Drop후에도 dll 파일은 남아 있으니 아래 쿼리를 실행하여 제거한다.

 

·  dbcc xp_cmdshell(free)
·  dbcc xp_dirtree(free)
·  dbcc xp_regdeletekey(free)
·  dbcc xp_regenumvalues(free)
·  dbcc xp_regread(free)
·  dbcc xp_regwrite(free)
·  dbcc sp_makewebtask(free)
·  dbcc sp_adduser(free)

 

 다음으로 SQL Injection을 유발시킬 수 있는 시스템 DB상에 존재하는 프로시저들의 EXCUTE권한을 DENY하겠다.  해당 프로시저들을 통해 시스템의 정보를 조회하고 변경할 수 있으니 필수적으로 DENY해야 할 권한들이다.
 
·  DENY  EXECUTE  ON [master].[dbo].[xp_subdirs] TO [guest] CASCADE 
·  DENY  EXECUTE  ON [master].[dbo].[xp_dirtree] TO [guest] CASCADE
·  DENY  EXECUTE  ON [master].[dbo].[xp_availablemedia] TO [guest] CASCADE
·  DENY  EXECUTE  ON [master].[dbo].[xp_regwrite] TO [guest] CASCADE
·  DENY  EXECUTE  ON [master].[dbo].[xp_regread] TO [guest] CASCADE
·  DENY  EXECUTE  ON [master].[dbo].[xp_regaddmultistring] TO [guest] CASCADE
·  DENY  EXECUTE  ON [master].[dbo].[xp_regdeletekey] TO [guest] CASCADE
·  DENY  EXECUTE  ON [master].[dbo].[xp_regdeletevalue] TO [guest] CASCADE  
·  DENY  EXECUTE  ON [master].[dbo].[xp_regremovemultistring] TO [guest] CASCADE
·  DENY  EXECUTE  ON [master].[dbo].[xp_regaddmultistring] TO [guest] CASCADE
 
 마지막으로 일반 User의 물리적 파일 접근을 제한하기 위해 아래 쿼리를 실행한다.

·  DENY  EXECUTE  ON [master].[dbo].[xp_fileexist] TO [guest] CASCADE
·  DENY  EXECUTE  ON [master].[dbo].[xp_fixeddrives] TO [guest] CASCADE
·  DENY  EXECUTE  ON [master].[dbo].[xp_getfiledetails] TO [guest] CASCADE

 

 SQL Injection은 본편에서 접했던 내용 이외에도 다양한 방법이 존재한다.  한순간의 방심으로인해 기업내 보안 취약점이 노출되기 쉽상이다.  조금만 더 관심을 가져본다면 완벽에 가까운 서버 보안을 기대할 수 있지 않을까?

by 홍야루 | 2008/10/10 20:17 | 프로그래밍? 내공? | 트랙백 | 덧글(0)

◀ 이전 페이지 다음 페이지 ▶