2013년 2월 17일 일요일

티무르 제국



몽골제국의 해체
중국을 지배하였던 대원-울루스의 몽골인 들은 1368년 명나라에 의해 중국에서 쫓겨나 몽골고원으로 돌아갔다. 그 후 그들은 몽골고원에서 서로 싸웠다. 중앙아시아의 차가타이-울루스도 1340년에는 파미르고원을 경계로 동서로 분열되었다. 이란의 일칸국도 1330년 이후 정국이 혼란에 빠져 몇 개의 지방정권으로 분열되었다. 남 러시아의 킵착칸국도 14세기의 후반기에는 티무르 제국의 종주권을 인정할 수밖에 없었다.
몽골제국연합체가 부스러져 해체된 원인은 황금씨족의 칸위 쟁탈전을 들 수 있다. 칭기스칸 일족은 유목민의 전통에 따라 정복지역을 일족의 공유재산으로 생각하였다. 그 결과 광대한 정복지역에 일족이 분산 파견되었으며 이들의 현지 독립화 경향은 피하기 어려웠다. 여기에 유목국가에서 볼 수 있는 실력주의 계승법이 이어져, 제국에 흩어진 황금씨족 중 유력한 자들은 칸이 사망함과 함께 자신들의 계승권을 경쟁적으로 주장하였던 것이다.
칭기스칸의 사후에는 몽골제국을 세운 칸의 권위로 제2대의 오고타이 만은 수월하게 즉위할 수 있었으나 나머지 제3대 구유크, 제4대 몽케, 제5대 쿠빌라이는 일족간의 내란을 거쳐 칸으로 되었다. 이와 같은 싸움으로 제국내부의 통일은 약화되고 무너지기 쉽게 되었다. 여기에다 몽골은 어디까지나 유목민적 전통을 중요하게 여겨 초원생활을 해야한다는 논리와 새로이 획득한 중국, 이란 등 정착사회를 아우르는 새로운 생활을 할 수밖에 없다는 논리가 대립하였다. 결국 이러한 대립을 해소시키지 못하고 몽골제국은 지역별로 해체되어 갔다.

티무르(1336 ~1405. 2. 19)
티무르 Timur. Timour. 별칭은 Timur Lenk, Timurlenk(터키어로 '절름발이 티무르'라는 뜻).
이슬람 신앙을 지닌 투르크인 정복자. 중국 이름은 첩목아(帖木兒)이다. 주로 인도에서 러시아를 거쳐 지중해까지 정복하는 과정에서 행한 야만적 행위와 그가 세운 왕조의 문화적 업적으로 널리 알려져 있다.
티무르의 시대의 투르크-몽골의 전통은 칭기즈 칸의 후예가 아닌 사람이 칸이 되는 것을 허락하지 않았기 때문에 그는 칸을 자칭할 수 없었다. 그는 대신 ‘아미르’(지휘관)라는 호칭을 사용했고, 때때로 그 앞에 ‘부주르그buzurg’ 또는 ‘칼란kalān’, 즉 ‘위대한’을 붙여 ‘위대한 아미르’라 자칭했다.
그가 칭기스 칸의 후손들을 허수아비 칸으로 세워 그의 이름으로 통치한 뒤에는 ‘부마‘이라는 호칭을 사용했다. 이는 ‘사위’라는 의미인데, 그가 칭기스 가문의 공주와 결혼했기 때문에 이런 호칭을 사용할 수 있었다. 티무르의 후손들인 무굴 제국의 군주들은 이를 근거로 스스로의 왕조를 ‘구르칸Gurkān(‘후르겡’의 이란어형) 왕조’라고 불렀다.
이란의 사서들에서 그는 ‘티무리 랑’이라고 불렸는데, 이는 절음발이 티무르라는 의미이다. 그의 적들은 그의 분노를 불러일으키고 싶을때 그를 이렇게 불렀다. 유럽에서 그를 부를때 사용하는 태멀레인(Tamerlane)은 ‘티무리 랑’의 변형이다.
14세기 후반 서(西)차가타이 한국(汗國) 출신의 티무르는 스스로를 칭기즈 칸의 자손이라 칭하고 몽골 제국의 재건을 기도했다. 그는 사마르칸트에 수도를 두고 1380년에 카르토 왕조를 멸망시키고, 1393년에는 자라일 왕조의 군주 아마드를 바그다드에서 몰아냈으며 동서 차가타이 한국·일 한국을 병합하였고, 킵차크 한국과 북인도에 침입했다. 이어 소아시아 방면에서 일어난 오스만 투르크를 앙고라에서 격파해 구(舊)몽골 제국의 서반부를 영유하는 제국을 건설했다. 티무르는 다시 몽골인의 구적(仇敵) 명(明)의 정복을 기도했으나 원정 도중에 병사했다. 티무르의 사후 왕실의 상속 싸움이 계속되었는데 샤 루흐 시대에 일시 번영을 되찾았다. 그런데 울루그 베그가 암살된 뒤 쓰러진 뒤에는 제국의 분열이 표면화되어 사마르칸트와 헤라트에 두 세 개의 정권이 대립했다. 그리고 킵차크 한국에서 나온 북방의 우즈베크족이 침입하여 1500년에는 사마르칸트가 함락되고, 2년 뒤 헤라트도 함락되었다.
16세기에는 티무르 왕조의 왕자 바부르가 페르가나왕이 된 뒤, 인도에 침입하여, 무굴 제국을 수립하였다.
오스만 제국의 연대기 작가들은 티무르 왕조가 칭기스 칸과 티무르의 혈통을 이었다는 이유로 칭송했다.

티무르 제국
Timurid Dynasty는 티무르에 의해 14세기 중엽에 세워진 중아시아의 무슬림 왕조, 오늘날 이란, 아프가니스탄, 파키스탄, 메소포타미야, 카프카스 산맥등을 통치했다.

1370년 티무르는 먼저 심복의 아미르들을 군대와 여러 관청의 요직에 배치하여 신정권의 조직을 굳히고 사마르칸드에 요새와 성곽 및 궁전의 건축을 명령하여 수도에 어울리는 체제를 정비하였다. 한편 불온한 움직임을 나타내는 차가타이 아미르들을 숙청하고 여러 부족군을 해체, 재편하여 심복 아미르들의 지휘하에 집어넣었다. 이러한 내부 정리 후 그때까지 억눌려있던 차가타이인의 왕성한 에너지를 티무르는 외부로 분출시켰다.
티무르는 사마르칸드를 보급기지로 삼아 자신은 오르도를 이끌고 끊임없이 이동하면서 정복전을 감행하였다. 티무르는 탁월한 군사 지도자였으며 한번 내린 명령은 결코 취소하는 법이 없는 무서운 지도자였다. 그는 수도 사마르칸드를 세계제국의 수도에 걸맞게 하려 하였다. 이에 그는 장엄하고 화려한 왕궁을 비롯하여 모스크와 마두라싸를 차례차례 건립하고 관개망도 정비하였으며 바자르(시장)도 크게 확장시켰다.
수도 사마르칸드는 유럽, 중동과 중국을 연결하는 동서의 교역간선로와 러시아 및 킵착초원과 인도를 연결하는 남북의 교역로가 교차하게 되어 경제적 번영을 이룩하게 되었다. 이란, 시리아, 동투르키스탄, 중국 등에서 온 기술자들은 유리 기기, 도자기, 융단, 자수, 제지, 무구등 각종 공예방면에서 기술을 겨루었고 도로, 시장(바자르), 대상숙박소등을 정비하여 사마르칸드는 모든 내륙아시아를 관통하는 실크로드의 중추가 되었다.
티무르가 즉위한 이후 킵착칸국, 인도, 타타르 등 여러 나라에서 사마르칸드로 가져온 상품은 실로 엄청나서 판매진열장이 동이나 버릴 정도였다. 그리하여 티무르는 기술관리에게 명하여 사마르칸드 성을 가로지르는 시장 을 건설하여 그곳에 상인을 초치시키도록 하였다. 시장을 건설하는 비용은 사마르칸드의 전 시민이 부담케 하고 공사는 작업반을 2반으로 나누어 주야로 시행했기 때문에 20여일 남짓한 단기간에 완성되었다. 이 바자르는 사마르칸드성 한쪽 끝에서 다른 쪽 끝에 이르는 대 시장으로 규모는 상당히 크고 천정은 돔으로 덮여 있는데 광선이 들어올 수 있도록 곳곳에 창문이 열려 있었다.
그러나 티무르와 그의 부하들은 도시에 살지 않았다. 그들은 도시 주변의 초원이나 정원에 텐트를 치고 살았다. 사마르칸드 교외의 목초지에 세워진 티무르의 텐트는 한마디로 성이라고 할 정도로 거대하고 호화스러운 것으로 그 주위에는 4만-5만 정도의 부하 들의 텐트가 가지런히 세워졌다. 이들이 한번 원정에 나서면 일제히 텐트를 접고 가족과 가축 모두 전쟁터로 이동하였다.
그들은 도시주변에 살면서도 정착민으로 동화하지 않고 유목민의 생활양식을 유지함으로서 말을 이용한 기동성을 계속 유지하였다. 그리고 이와 같은 유목군단을 능숙하게 자유자재로 움직일 수 있었다. 이러한 점에서 티무르의 성공은 칭기스칸의 그것과 거의 같은 성격을 가지고 있었다. 그러나 티무르는 정착사회의 발전에 깊은 관심을 나타내고 많은 건축활동을 한 것에 비하여 칭기스칸에게 정착사회는 보호 육성의 대상이 아니고 약탈의 대상으로 파괴가 목표였다. 초원지대에서 자란 칭기스칸은 정착사회의 성질이나 이용가치를 잘 몰랐던 것이다
수도인 사마르칸트는 국제적인 상업 도시로서 번영하여 왕년의 바그다드를 능가할 정도로 번영했다. 예술·문화면에서는 이란 문화의 영향이 강하고 역대 군주의 보호 및 장려에 의해서 티무르풍(風)의 이슬람 문화가 발달했다. 건축 양식에서는 중국식의 탑과 유목 민족의 천막을 조합한 독특한 사원(寺院)이 만들어졌고, 회화(繪畵)에서는 이란풍의 미니아튀르(세밀화細密畵) 예술이 발달했다. 이란 문학에서는 시인 자미의 이름이 가장 알려졌고 아라비아 수학·천문학·의학· 지리학·역사학 등도 발달하여 이슬람 세계에 커다란 영향을 주었다.

대외원정
티무르는 대외전쟁에서 승리하여 전리품을 나누어주어야 하는 유목국가를 수립한 이상 대외원정은 피할 수 없었다. 결국 티무르는 끊임없이 정복전에 나섰다. 중앙아시아 통일 후 티무르가 고향 땅에 머문 기간은 전부해서 몇 년 밖에 안되었다. 그는 사마르칸드에 대 바자르(공동시장)를 건설하여 통상활동을 활성화시켜 대외원정을 경제적으로 뒷받침하였으며 상인을 각지에 파견하여 여러 나라의 지도와 기록을 제공하도록 하였기 때문에 외국의 정세에는 더없이 정통하여 그의 외정은 전광석화와 같이 재빨랐다.
주치가의 푸른오르도에서 톡타미쉬가 망명해 왔을 때 티무르는 톡타미쉬를 도와 울루스칸과 싸워 톡타미쉬를 푸른오르도의 칸으로 세웠다. 톡타미쉬칸은 나아가 본가인 황금오르도에 개입하여 1378년 볼가강변의 아스트라칸과 사라이를 점령하였다. 톡타미쉬칸의 성공과 함께 티무르와의 관계는 차갑게 되었다. 1385년 톡타미쉬칸은 타브리스를 습격하여 약탈을 감행하였다.
그러자 티무르는 1380년에 먼저 이란 고원으로 진군하여 아제르바이잔의 잘라이르 왕가를 격파하고 술타냐와 타브리스를 점령하였다. 이어서 티무르는 먼저 이란고원과 카프카즈를 정복하고 1395년 카스피해 근처의 테레크(Terek)강변에서 킵차크 한국의 토크타미쉬칸군을 분쇄하고 사라이와 아스트라칸을 불태웠으며 모스크바까지 진군하였다. 이렇게 서방을 석권한 후 티무르는 군대를 남쪽으로 돌려 인도원정을 감행하였다. 1398년의 인도원정은 풍부한 인도의 물자와 교역타개가 목적이었다. 펀잡과 갠지스강 상류지역은 간단하게 티무르에게 유린되어 투굴룩 왕조의 수도 델리는 철저하게 약탈당하였다.
이어서 다음해 1399년 그루지아를 정복하고 잘라이르 왕가로부터 이라크의 바그다드를 뺏고 시리아에 진격하여 알레포, 다마스커스를 급습하여 맘룩 왕조를 굴복시켰다. 이때 오스만투르크제국의 바야지드 1세는 이집트의 맘루크왕조와 결탁하여 아마드를 도와서 서경을 위협하였기 때문에, 군사를 시리아에서 아나토리아로 진군시켜,1402년 7월, 티무르는 강적 오스만투르크의 바야지드1세와 앙카라에서 회전하였다.  바야지드술탄은 12만명의 군대를 동원했고 티무르는 코끼리병을 포함한 20만명을 동원했다. 오스만터키의 술탄 바야지드 1세는 대단한 군주였는데 1396년 니콜폴리스전투에서 유럽의 작은 약소국인 세르비아의 기사단을 용병으로 사용하여 자신의 군대와 함께 프랑스, 스페인, 왈라키아, 독일,헝가리의 연합기사단을 격파했다.하지만 티무르의 군단은 유럽의 기사단이 깰수 없는 막강한 군대였다.
바예지드 1세는 세르비아기사단에게 정면돌파를 명했다. 앙고라전투는 시작되었다. 그러나 세르비아기사단은 티무르의 중무장기병대와  경무장기병대에게 가볍게 격파당하고 전원 전사했다. 화가난 바예지드1세는 다수의 궁병과 궁기병을 모아 화살을 퍼부었고 티무르 역시 자신의 궁병들에게 대량의 화살을 퍼붓게 하였다. 오스만 터기군대는 유럽을 공포에 떨게하면 연전연승하는 무시무시한 정예부대가 있었다. 최고의 정예부대는   예니체리부대와 시파히도기병대였다. 양군은 화살로 다수를 살육한 다음 화살을 다 소모하자 백병전을 벌였고 이 전투에서 키무르군의 코끼리병대가 중무장기병의 호위를 받으며 오스만군에 상당한 타격을 주었고 오스만군의 예니체리와 시파히도기병대도 티무르군에게 엄청난 타격을 주었다. 티무르와 바예지드도 말을 타고 직접 칼을 들어 적의 목을 쳤으나 결국 싸움은 코끼리를 앞세운 티무르군이 압도하게 되었고 저녘 무렵 바예지드가 자랑하던 예니체리와 시파히도기병대도 전원 전사하고 말았다.바예지드는 포로가 되었으며 티무르는 그 여세를 몰아 에게해까지 진출하였다. 전후사절 요하네스를 영국과 프랑스에 파견하였는데, 카스틸라로부터 클라비호가 사신으로 왔다. 이리하여 서는 소아시아, 시리아로부터 동은 천산산맥, 델리에 걸친 광대한 지역이 티무르의 직접, 간접의 지배하에 들어가 일대 제국이 성립되었다.
1335년 일칸국의 붕괴후 군소정권이 난립한 이란을 티무르는 탈환한 것이었다. 본래 이란땅은 차가타이가의 것이었다는 생각으로 원정이 이루어졌으며 이를 침해하는 존재(오스만투르크, 맘룩조, 킵착칸국등)에 대한 공격은 당연하였다. 결국 티무르의 성공은 유목민의 군사력과 정착민의 경제력이 잘 맞아 들어갈 때 강력한 국가가 탄생할 수 있으며 이러한 조화가 깨질 때 내륙국가는 망한다는 사실을 잘 말해준다 하겠다.

샤르흐 시대
오스만투르크를 격파함으로써 서쪽의 걱정이 사라진 티무르는 몽골제국의 원수이며 이슬람교의 적인 명제국으로의 대원정을 기도하였다. 이 원정이 성공한다면 그는 몽골제국 칭기스칸의 유업을 계승하게 되는 것이었다. 티무르는 20만의 군대를 이끌고 사마르칸드를 출발하였다. 그러나 그해 겨울은 큰눈이 쌓이고 심한 찬바람이 불었다. 1405년 1월에 결빙한 시르다라아강을 건너 오트랄에 이르른 70세의 티무르는 추위를 녹일 술을 너무마셔 책상에 앉은채 2월 18일 쓰러졌다. 즉시 중국원정은 중단되고 티무르의 유해는 사마르칸드의 구르이미르묘에 매장되었다.
티무르가 명나라를 정복하려고 시도한 1405년경 티무르는 당시 세계 최강이라는  오스만 터키군대를 격파해서 사기가 등등했고 명나라는 한창 잘 나가는 영락제 주체가 통치하고 있었다. 영락제는 5차에 걸쳐 몽골제국을 공격했으나 2차례만 승리했고 나머지 싸움에서는 아다이칸에게 모두 패배했다.  그는 몽골초원에서 병이들어 죽었다. 티무르와 영락제가 싸웠다면 누가 승리했을까를 예측하기는 어려우나 티무르가 승리했을 가능성이 높다. 티무르는 10만의 기병대와 보병으로 인도의 투글루크왕조의 군대, 이란을 비롯한 중동의 모든 군대, 이집트의 포악한 군대 마멜루크군단과 러시아지역의 캅차크칸국의 군단을 물리친 군대이다. 그의 군대는 징기스칸군대의 전투력에 맞먹는 실력을 가지고 있었고 패배를 몰랐다. 그의 죽음으로 명나라는 지옥의 나락에서 구제되었다.
권력의 핵이 빠진 티무르 제국에서는 자연 정권을 둘러싸고 혼란이 일어났다. 그의 손자 칼릴샤가 뒤를 이었는데, 칼릴샤는 폭정을 펴 1409년에 폐위되었다. 이후 혼란에 빠졌으나 1409년에 티무르의 4남 샤르흐가 사마르칸드를 점령함으로서 내란이 겨우 진정되었다. 샤르흐 자신은 헤라트(아프가니스탄)에 살면서 사마르칸드에는 아들인 울룩-벡을 두어 다스리게 하였다. 그는 학문, 예술의 보호자여서 사마르칸드나 헤라트 등의 도시를 중심으로 화려한 궁정문화가 발전하였다. 이들 여러 도시에서는 장려한 모스크, 마드라싸, 공동 숙박시설, 공동 목욕탕, 궁정에 딸린 정원이 만들어져 방문객을 놀라게 하였다. 샤르흐는 동아시아의 중국과 서아시아의 오스만투르크와 오랫동안 친선관계를 유지하여 실크로드를 둘러싼 동서교역은 더욱 번창하였다. 내륙아시아가 하나의 강대한 국가에 의해 통치되고 있던 15세기는 몽골제국의 전성기와 같은 동서교통이 이루어졌다. 그의 38년간의 치세는 티무르왕조의 전성시대를 이우었으며, 일한국을 멸망시켰다.

2013년 2월 14일 목요일

모바일 보안 취약점 및 대책

모바일 보안 취약점

스마트폰 확산으로 인한 보안 위협 환경 변화
오픈 마켓

  • 개발자 혹은 오픈 마켓 제공자의 관리 부주의로 인한 피해 가능성 확대
  • 악성 코드 및 바이러스 감염 경로
모바일 망 개방
  • 양질의 다양한 컨텐츠 공급 가능
  • 악의적인 컨텐츠 피해 우려
컨버전스 서비스
  • 단말기 및 네트워크 진화에 따른 복합 상품의 등장
  • 단말 내 개인정보의 중요성 부각
오픈 플랫폼
  • 개발자 양성으로 양질의 컨텐츠 제공
  • 표준 오픈 플랫폼상의 악의적 바이러스 제작 기회 확대
다양한 네트워크 환경
  • 와이파이/블루투스 탑재 단말기 확산
  • PC Sync 서비스 활용 요구 증대
  • 바이러스/악성코드 감염 경로 확대

스마트폰 보안 위협 분류
응용프로그램
  • 개발자, 오프 마켓 응용 프로그램 관리 문제
  • 악성 코드
플랫폼
  • 운영체제의 보안취약점
  • Jailbreak(탈옥)등 자의적 해킹
서버 및 네트워크 인프라
  • 와이파이 등 다양한 접속 환경으로 인한 도청
단말기
  • 도난 및 분실
  • 이동저장 매체 감염

모바일 악성 코드 증가 추이


전세계 스마트폰 판매량
모바일 악성 코드의 공격 목표
단말 장애 유발형
  • 단말의 사용을 불가능하게 만들거나 장애를 유발
베터리 소모형
  • 단말의 전력을 지속적으로 소모시켜 배터리를 고갈
과금 유발형
  • 단말의 메시징 서비스나 전화 시도를 지속적으로 시도하여 과금을 발생
정보 유출형
  • 감염된 단말의 정보나 사용자 정보를 외부로 유출
크로스 플랫폼형
  • 모바일 단말을 통해 PC 감염

최근 악성 코드 사례
아이폰
  • Ikee.B, 정보유출, 바이러스/웜
  • poc-bbot, 배터리 소모, 바이러스/웜
  • Privacy.A, 정보유출, 바이러스/웜
  • Duh Worm, 정보유출, 피싱

안드로이드
  • 09Droid, 정보유출, 피싱
  • Girlfriend Text Message Viewer, 정보유출, 도청
  • Vodafone HTC Magic, 크로스 플랫폼, 바이러스/웜
  • 월페이퍼 앱, 정보유출, 바이러스/웜

스마트폰 보안 취약점 분석
아이폰

안드로이드

모바일 보안 대책
스마트폰 보안 기술
플랫폼 보안
  • 악성코드 실행방지 기술 개발
서비스 보안
  • 모바일 SW 보안성 검증 및 안전한 전자결제 서비스 지원
데이터 관리
  • 단말 데이터 보호 및 원격관리 기술
네트워크 보안
  • 악성코드 확산 방지 및 무선 침입탐지 기술

스마트폰 보안 대책 분류
응용프로그램
  • 응용프로그램 자동검증 시스템 구축
  • 악성 응용프로그램 정보 공유
  • 안전한 SW 유통환경 조성
  • 주요 SW 검증센터 구축
  • 안전 개발 가이드
  • 개발 기능 제한
  • 개발 가이드 준수
  • 개발자 인증
  • SW 코드 서명
플랫폼
  • 보안 취약점 및 업데이트 공지
  • 사용자 안전사용방법 홍보
  • 펌웨어 업데이트
  • 메모리 보호(Secure OS)
  • SW 안전설치/실행
  • 비밀번호 설정
서버 및 네트워크 인프라
  • 암호 프로토콜 이용
  • 인증된 무선 AP 이용
단말기
  • 분실 대비 원격 관리 방안
  • 백신 등 보호 대책 마련
  • TPM(Trusted Platform Module)등 안전한 저장소 마련
  • 도난 및 분실 신고

스마트폰 보안 기술 현황

2013년 2월 6일 수요일

MongoDB, 설치와 간단 사용법

MongoDB(from “humongous”)는 전통적인 RDBMS의 대안인 NOSQL Family의 일부로 오픈 소스 “Document-Oriented Database”을 지향하고 있습니다.
MongoDB에서 Data는 JSON과 같은 Dynamic Schema 형태의 Document(문자열로 구성된 단위라고 생각하면 됩니다.)구조로 저장 되는데 MongoDB에서는 이를 BSON 이라 합니다.
MongoDB가 다른 문서 데이터베이스와 구별되는 한 가지 기능은 SQL문을 MongoDB 쿼리 함수 호출로 매우 간단하게 변환하는 기능있어 기존 RDBMS를 쉽게 마이그레이션 할 수 있다고 합니다.
MogoDB가 최근에 주목을 받게 된 이유는 Mobile 환경의 확대와 SNS의 활성화로 설명 할 수 있을 것 같습니다.

Mobile환경의 확대

  1. 최근 모바일 어플리케이션은 Hybrid 형태을 띄며 Data을 기본적으로 Server Side에 저장하기 때문에 지속적으로 Server Side로 부터 Data을 받아오는게 사용자 사용성에 중요한 척도가 되었다.
  2. 모바일 어플리케이션 개발 기술 중 Server/Client 통신 기술은 Open API 형태로 WebService을 사용하며 그 중 RESTFul 방식으로 전문형태는 JSON을 사용하는 것이 거의 표준으로 잡혀 있음.
  3. MogoDB와 같은 Document 기반 DB는 JSON형태로 저장되기 때문에 Data와 어플리케이션간 통합에 최적의 구조를 가진다.

SNS의 활성화

  1. 모바일 환경에서 SNS가 활성화 되고 나서 엄청난 규모의 Data가 발생한다.
  2. 전통적인 RDBMS로는 현재 규모의 Big Data을 저장하고 관리하기 어렵다.
  3. 새로운 형태의 NoSQL 기술이 필요하게 되었고 가장 적합한 형태가 MongoDB이다.

설치하기
Download(현재버전 2.2.3) : http://www.mongodb.org/downloads
환경에 맞는 설치 파일을 다운로드 받는다.(저는 Linux 32-bit) 64bit용을 받게되면 메모리 사용에 제약을 받지 않지만 32bit을 사용하는 경우 2G이상 사용할 수 없다고 한다. 일반적인 경우 64bit을 사용하기를 권장하고 있다.
또한 다양한 language의 Driver을 지원하고 있기 때문에 필요한 Driver도 다운 받는다.

Ubuntu OS에 설치해보기
Step 1 ‘.deb’ 페키지를 설치하기 위해 GPG 키를 등록 한다.
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv 7F0CEB10
Step 2 command ‘sudo apt-get update’
Step 3 command ‘sudo apt-get install mongodb’

MongoDB 설정
  • 설정 파일 : /etc/mongodb.conf
  • 실행 설정 파일: /etc/init.d/mongodb.
  • 라이브러리 위치: /var/lib/mongodb
  • 로그 위치: /var/log/mongodb

시작과 종료
  • Start: command ‘sudo service mongodb start’
  • Stop: command ‘sudo service mongodb stop’
  • Restart: command ‘sudo servcie mongodb restart’

초간단 사용해보기
  • local 접속: ‘mongo’
  • remote 접속: 'mongo localhost:27017/test’ 27017은 default port, test는 기본생성 DB

yunchang-lee@HSK01-INTER999:/var/log/mongodb$ mongo localhost:27017/test
MongoDB shell version: 2.0.6
connecting to: localhost:27017/test → Connection
> db → 현재 접속한 DB 확인
test
> show dbs → 모든 DB 확인
local (empty)
test (empty)
> use mydb → 사용할 DB 지정, 없는 경우 자동 생성된다.
switched to db mydb
> db → 정말 바꿔졌는지 확인
mydb
> help → 도움말 보기
db.help()                    help on db methods
db.mycoll.help()             help on collection methods
rs.help()                    help on replica set methods
help admin                   administrative help
help connect                 connecting to a db help
help keys                    key shortcuts
help misc                    misc things to know
help mr                      mapreduce

show dbs                     show database names
show collections             show collections in current database
show users                   show users in current database
show profile                 show most recent system.profile entries with time >= 1ms
show logs                    show the accessible logger names
show log [name]              prints out the last segment of log in memory, 'global' is default
use <db_name>                set current database
db.foo.find()                list objects in collection foo
db.foo.find( { a : 1 } )     list objects in foo where a == 1
it                           result of the last line evaluated; use to further iterate
DBQuery.shellBatchSize = x   set default number of items to display on shell
exit                         quit the mongo shell
> db.help() → DB 메소드 도움말 보기
DB methods:
db.addUser(username, password[, readOnly=false])
db.auth(username, password)
db.cloneDatabase(fromhost)
db.commandHelp(name) returns the help for the command
db.copyDatabase(fromdb, todb, fromhost)
db.createCollection(name, { size : ..., capped : ..., max : ... } )
db.currentOp() displays the current operation in the db
db.dropDatabase()
db.eval(func, args) run code server-side
db.getCollection(cname) same as db['cname'] or db.cname
db.getCollectionNames()
db.getLastError() - just returns the err msg string
db.getLastErrorObj() - return full status object
db.getMongo() get the server connection object
db.getMongo().setSlaveOk() allow this connection to read from the nonmaster member of a replica pair
db.getName()
db.getPrevError()
db.getProfilingLevel() - deprecated
db.getProfilingStatus() - returns if profiling is on and slow threshold
db.getReplicationInfo()
db.getSiblingDB(name) get the db at the same server as this one
db.isMaster() check replica primary status
db.killOp(opid) kills the current operation in the db
db.listCommands() lists all the db commands
db.logout()
db.printCollectionStats()
db.printReplicationInfo()
db.printSlaveReplicationInfo()
db.printShardingStatus()
db.removeUser(username)
db.repairDatabase()
db.resetError()
db.runCommand(cmdObj) run a database command.  if cmdObj is a string, turns it into { cmdObj : 1 }
db.serverStatus()
db.setProfilingLevel(level,<slowms>) 0=off 1=slow 2=all
db.shutdownServer()
db.stats()
db.version() current version of the server
db.getMongo().setSlaveOk() allow queries on a replication slave server
db.fsyncLock() flush data to disk and lock server for backups
db.fsyncUnock() unlocks server following a db.fsyncLock()
> j={name:"mongo"} → 데이터를 넣어보기 위해, JSON 형태의 DATA 생성
{ "name" : "mongo" }
> k={x:3} → 처음과 다른 형태의 JSON 형태 생성, MongoDB는 JSON 형태가 다르더라도 같은 Collection에 넣을 수 있다.
{ "x" : 3 }
> db.things.insert(j) → 생성한 ‘j’ collection 'things’에 넣는다.
> db.things.insert(k) → 생성한 ‘k’ collection 'things’에 넣는다.
> show collections → 어떤 collection들이 있는지 확인해본다.
system.indexes
things → j, k 가 포함된 things가 보인다.
> db.things.find() → things에 포함된 Document을 조회 한다, "_id”는 MongoDB가 collection에 입력되는 순간 자동으로 부여하며, mogoDB내에서 유니크 하다.
{ "_id" : ObjectId("5111e871abd47e5e659ee261"), "name" : "mongo" }
{ "_id" : ObjectId("5111e8f1abd47e5e659ee262"), "x" : 3 }
> for(var i=1; i<=20; i++) db.things.insert({x:4,j:i}) → for 문을 이용해서 다중 문서를 넣어본다.
> db.things.find()
{ "_id" : ObjectId("5111e871abd47e5e659ee261"), "name" : "mongo" }
{ "_id" : ObjectId("5111e8f1abd47e5e659ee262"), "x" : 3 }
{ "_id" : ObjectId("5111e97babd47e5e659ee263"), "x" : 4, "j" : 1 }
{ "_id" : ObjectId("5111e97babd47e5e659ee264"), "x" : 4, "j" : 2 }
{ "_id" : ObjectId("5111e97babd47e5e659ee265"), "x" : 4, "j" : 3 }
{ "_id" : ObjectId("5111e97babd47e5e659ee266"), "x" : 4, "j" : 4 }
{ "_id" : ObjectId("5111e97babd47e5e659ee267"), "x" : 4, "j" : 5 }
{ "_id" : ObjectId("5111e97babd47e5e659ee268"), "x" : 4, "j" : 6 }
{ "_id" : ObjectId("5111e97babd47e5e659ee269"), "x" : 4, "j" : 7 }
{ "_id" : ObjectId("5111e97babd47e5e659ee26a"), "x" : 4, "j" : 8 }
{ "_id" : ObjectId("5111e97babd47e5e659ee26b"), "x" : 4, "j" : 9 }
{ "_id" : ObjectId("5111e97babd47e5e659ee26c"), "x" : 4, "j" : 10 }
{ "_id" : ObjectId("5111e97babd47e5e659ee26d"), "x" : 4, "j" : 11 }
{ "_id" : ObjectId("5111e97babd47e5e659ee26e"), "x" : 4, "j" : 12 }
{ "_id" : ObjectId("5111e97babd47e5e659ee26f"), "x" : 4, "j" : 13 }
{ "_id" : ObjectId("5111e97babd47e5e659ee270"), "x" : 4, "j" : 14 }
{ "_id" : ObjectId("5111e97babd47e5e659ee271"), "x" : 4, "j" : 15 }
{ "_id" : ObjectId("5111e97babd47e5e659ee272"), "x" : 4, "j" : 16 }
{ "_id" : ObjectId("5111e97babd47e5e659ee273"), "x" : 4, "j" : 17 }
{ "_id" : ObjectId("5111e97babd47e5e659ee274"), "x" : 4, "j" : 18 }
has more
> it → 더 있는 경우 ‘it'
{ "_id" : ObjectId("5111e97babd47e5e659ee275"), "x" : 4, "j" : 19 }
{ "_id" : ObjectId("5111e97babd47e5e659ee276"), "x" : 4, "j" : 20 }
>

2013년 2월 5일 화요일

Android 메모리 관리 문제

모바일 어플리케이션이 개발됨에 따라 고화질의 이미지 및 다양한 시스템 자원을 포함하는 등 점점 중량화 되어 가고 있다. 모바일 단말의 경우, 성능 및 메모리 등에 큰 제약이 있기 때문에 이를 고려한 개발이 필요시 된다. 특히 안드로이드의 시스템은 비트맵 관련 이미지 및 자원들의 메모리 할당에 큰 제약이 있는데 원인은 안드로이드 메모리 구조에 바탕을 두고 있다. 안드로이드 메모리 영역은 크게 두 가지 영역으로 나눌 수 있다.

1. Allocation Heap(VM Heap, Java에서 사용)
2. Native Heap(C에서 사용)

비트맵 객체들은 다른 자원들과 달리 ‘Native Hep’에 할당되어 관리된다. 아무리 VM Heap 메모리 사이즈가 크다 하더라도 Native Heap 메모리 사이즈가 부족할 경우, 다량의 비트맵 이미지를 사용할 수 없게 된다.
또한 자바의 경우, 가비지 컬렉션(GC)을 통해 더 이상 참조되고 있지 않은 객체를 자동으로 메모리에서 해제하는 방식인데 Native Heap에 할당된 비트맵 객체의 경우, 이러한 GC을 통해 자동으로 관리 및 해제가 되지 못하여 메모리 소진 문제가 발생하기도 한다.

메모리 관리 기법
Heap Size 옵션
안드로이드 3.0 부터 더 큰 힙 메모리 사이즈를 사용하기 위한 방법으로 ‘largeHeap’ 옵션이 생겼으나 이와 같은 옵션을 사용하는 경우, 그 만큼 GC 시간을 더 소모하게 된다는 것을 유념해야 한다.

메모리 누수 방지
메모리 누수의 경우,
1. 사용자 인터페이스를 구성하는 기본 단위인 Activity의 생명주기와 비트맵 객체의 생명주기 차이에 기인하여 발생한다.
2. 액티비티 외부에서  static 변수가 해당 액티비티를 참조하고 있는 상황이 생길 수 있는데, 참조하고 있는 변수가 살아 있는 동안 액티비티 해제가 이루어질 수 없으므로 메모리 누수가 발생하게 된다
3. 단말기 화면의 방향 전환으로 인한 메모리 누수 문제가 발생할 수 있는데, 안드로이드의 경우 단말기 화면의 방향 전환 과정이 반복될 경우, 매번 화면 구성을 위한 액티비티가 생성 및 소멸 된다. 이 과정에서 비트맵 객체등 멤버 객체들이 적시에 소멸도지 못하여 메모리 누수가 발생할 수 있다.

이를 해결하기 위해서는 액티비티를 해제할 때 액티비티 내부의 모든 뷰들의 참조를 끊어주고 명시적으로 비트맵 객체를 해제해주어야 한다. 'recursiveRecycle'라는 함수를 구현함으로서 액티비티 내부의 모든 뷰의 참조를 끊어줄 수 있다. 또한 context가 자신의 범위 외에서 사용되지 않도록 해야 하는데, 액티비티의 'context' 대신 어플래케이션과 동일한 라이프사이클을 가지는 'application contex't를 사용하는 방법이 있다.
화면 방향 전환 위해서 'configChanges=”orientation”'을 설정하면 액티비티가 매번 생성 소멸하지 않게 하거나 비트맵 관련 객체들을 static으로 구성하는 방법 등이 있다.

2013년 2월 3일 일요일

훈 족

훈 족은 중국 국경 부근에서 서쪽으로 이동하여 유럽에 이르렀다. 한 시대의 사서들에는 흉노로 알려진 호전적인 민족에 대해 서술한 부분들이 나오는데 바로 그 흉노 족을 훈 족이라고 볼 수 있다. 흉노 족은 중국 군주들을 대단히 골치 아프게 했다. 그들은 한나라와 여러 차례 싸웠으며, 그 중 한번은 크게 승리해서 엄청난 양의 금과 비단 여자 노예 같은 공물을 얻었다.  

AD 5세기 경, 역사적으로 가장 크게 중상당해왔고 오해 받아온 민족 가운데 하나인 훈 족은 티소강 중류 근방에 본부를 차렸다. 티소 강은 도나우강 동쪽에서 그 강과 거의 나란히 흐르면서 헝가리를 북에서 남으로 관통한다.
훈 족은 5세기에 이 평원을 기점으로 우랄로부터 론 지방(프랑스의 중도부 지방)에까지 이르는 드넓은 제국을 주로 자기네와 손을 잡은 민족들이나 자기네에게 종속된 민족들을 통해서 다스렸다. 그중 가장 알려진 인물은 아틸라(Attila)이다.
아틸라는 불과 8년 동안만 훈 왕국을 통치했다. 그러나 당시 그가 발휘하는 군사력은 대단해서 동.서 로마 제국을 거의 파멸 직전까지 몰고갔다. 한때 그는 콘스탄티노플 성벽 앞까지 쳐들어가 막대한 양에 달하는 황금 공물을 요구하기도 했다. 그 후 당대 사람들은 다양한 민족으로 이루어진 군대를 이끌고 저 멀리 오를레앙까지 진격하는 그의 모습을 목도 할 수 있었다. 그 이듬해 그는 로마에 진격해 번창하던 이탈리아 도시를 하나하나 점령해갔다.
주고 기독교인이었던 아틸라의 적들은 그를 ‘신의 정벌자’로 여겼지만 , 한 로마 황제의 누이는 아틸라에게 자신의 반지를 보내 구혼의 뜻을 전했다.  후세 사람들은 대체로 아틸라를 피에 굶주린 폭군에 묘사해 왔다.

그들의 지도자 아틸라가 이끄는 훈족의 서진은 첫 번째로 기록된 기마 민족의 대규모 이동으로, 그 당시 우월한 기동성과 발달한 활을 무기로 삼아 유럽으로 서서히 진격했다. 그들은 진격하면서 알란족, 스키리족, 사르마트족, 게피타이족, 헤룰리 족, 콰디 족, 슬라브족, 동고트족 등을 정복하게 되었는데 자발적으로 합류한 민족들도 있었고 일부는 도망가고, 나머지는 끝까지 싸우다가 정복당한 민족들도 있었다. 예로 알란족은 처음엔 훈족과 맞서 싸웠느나 크게 패한 뒤 훈족에 흡수되어 전투에서 큰 역할을 하였고, 슬라브족 또한 용감하게 싸웠으나 패배하고 훈족에게 흡수된다. 훈족은 피지배층들에게 그리 가혹한 지배자들은 아니였다. 그들의 노예들은 로마 제국과 사실상 마찬가지로 노예 또한 자유민이 될수 있는 기회가 있었다. 그들은 농부들에게 농사를 짓도록 배려하였으며 그들의 생활방식을 유지하도록 해주었다. 게르만족의 대이동을 촉발시킨 훈족은 5세기 중엽에 가장 세력을 떨쳐 아틸라의 지휘 아래 서쪽은 라인강에서 동쪽은 카스피해에 이르는 대제국을 이루었다.

453년 아틸라가 죽은 후 그의 맏아들인 엘라크가 왕위를 이어 받았다. 처음엔 그의 아버지 아틸라와 같은 단 하나의 권력을 쥐고 있는 왕으로 즉위 했지만, 그들의 두 동생인 뎅기지크와에르나크는 아틸라 치세 이전에 블레다와 아틸라가 권력을 나누어 가졌던것 처럼 권력을 여러명이서 나눠가지길 원하고있었다. 그 결과로 두 동생들은 일부 권한을 받게 되었지만, 이것은 오히려 불안하던 정치 체체의 혼란을 야기했고 결국엔 당파 싸움으로 이어지게 되었다. 그 싸움에서 엘라크가 승리 했고 두 동생들은 훈 제국에서 추방당하게 된다.
그 사태를 수습 한 뒤에도 훈족의 정치 체체는 불안하긴 마찬가지였는데 결국엔 게피타이 족이 반란을 일으켰다. 훈족은 게피아티 족과 여러 게르만 민족의 연합과 싸웠으나 패배하여 훈족 제국은 내분으로 정복당한다.
추방 당했던 두 왕자 뎅기지크와 에르나크는 각자 그들의 추종자들을 이끌고 도나우 강 하류로 이동했다. 그 중 뎅키지크는 아틸라가 옛날에 요구하던것 처럼 동로마의 황제 레오 1세에게 여러 가지를 요구하며 거절할경우 전쟁도 불사할것이라 단언했다. 하지만 동로마가 훈족을 보는 시각은 아틸라 치세때와는 달라진 후였다. 오히려 동로마는 공물은 커녕 훈족이 동로마에게 충성하라며 요구했고, 뎅기지크는 동로마와 전쟁상태에 돌입한다. 하지만 뎅기지크의 훈족은 전쟁에서 크게 패배하였고 뎅기지크는 전투에서 사망한다.
한편, 그의 동생 에르나크는 그의 형과는 달리 동로마 황제 레오 1세에게 땅을 요청하며 제국의 속주가 되겠다고 청했다. 레오는 그들에게 청을 받아들여 땅을 떼어주었고 에르나크의 훈족은 도브루자 지역에 정착하여 동로마의 일부분이 된다. 그 후로 동로마 군사에 중요한 역할을 하며 동로마에게 충성한다. 그후로 불가르족이 침입때 불가르족과 혼혈화 되었다.
일견에는 훈족 자체가 없어진 것으로 봐야 한다고 보는 시각도 있으나 현재 훈족의 후계 민족은 누구인지 확실하지 않다. 헝가리인과 터키, 몽골은 이들을 자기 민족의 역사라고 가르치고 있다.

Which Mobile App Development Option is Better?

Different alternatives to native code development have their own advantages and philosophy behind. No one tool or approach can be clearly ma...