인텔이 바라본 '2013년 IT시장'

등록일:2012-12-19 16:17:06 | 조회수:1748
<meta name="generator" content=" 6.0.0.70">


PC시장을 이끌어 온 인텔이 지난 18일, 2013년 PC시장이 어떻게 움직일 것인지 내다보는 자리를 가졌다. 2012년 한 해를 돌이켜보며, 2013년 이후의 미래를 엔터프라이즈 부문과 컨슈머 부문으로 나눠 정리한 것. 이날 행사장에서 발표한 인텔의 이야기를 중심으로 2013년을 내다봤다.

컨슈머와 엔터프라이즈 경계 허물어진다

IT시장에서 컨슈머(일반 소비자)시장과 엔터프라이즈(기업용) 시장은 철저하게 분리되어 왔다. 기술 발전 또한 서로 다르게 개발되고 적용되는 일이 많았다. 하지만 최근 IT시장은 두 시장의 경계가 허물어지고 있다. 일반 소비자 시장에서 이용되어 오던 디바이스가 기업용 시장에도 적용되고, 기업에서 적용되던 기술이 일반 소비자 시장에도 적용되고 있다.

대표적인 예가 태블릿PC다. 태블릿PC는 일반 소비자를 중심으로 빠르게 시장이 확대되고 있다. 또 이러한 편의적인 경험이 기업용 시장에도 적용되고 있다. 특히 인텔은 윈도우8 이후에 나온 태블릿이 엔터프라이즈로 적용되면서 더 확대될 것으로 보고 있다. 집에서 느끼던 경험을 회사에서도 그대도 이어가려는 이들이 많아질 것이라는 내용이다.
1355898708_thumb.gif


기업용 시장에서 많이 이용되던 보안 기술 또한 일반 소비자 시장에 영향을 미치고 있다. 잃어버린 지갑만큼 패닉의 수위가 높은 휴대폰(스마트폰)에 안심할 수 있는 다양한 보안 기능이 적용된다. 단순 잠금 상태에서 벗어나 잃어버린 폰 속에 있는 콘텐츠를 삭제하고 끌어오는 기능이 들어갈 예정이다. 이를 위해 인텔은 세계적인 보안회사인 '맥아피'와 손잡고 PC를 비롯한 모바일 기술에 보안 기술력을 더한다는 계획이다.

아시아권 영향력의 확대

인텔은 미국을 비롯한 서양권 중심의 시장에서 아시아 중심으로 IT시장이 재편되고 설명했다. 에이서, 에이수스 등 PC기업에서 영향력이 높은 ‘대만’ 이외에도, 모바일을 비롯해 PC 시장까지 크게 영향력이 높아진 삼성전자와 LG전자 덕분에 해외시장이 한국을 다르게 보고 있다. 특히 모바일이 한국 중심으로 돌아가면서, 2013년 트렌드가 될 터치와 모바일 시장의 영향으로 아시아권의 힘은 더 강력해질 것으로 내다봤다.

인텔 본사 또한 삼성전자를 최대 고객으로 고려해 새롭게 조직개편을 하는가 하면, 한국지사인 인텔 코리아에 힘을 더 실어주고 있다. 이에 따라 인텔은 현대적인 정책과 제도에 맞게 투자를 하고, 관련 시장 발전을 독려해야 한다고 밝혔다. 현재 싱가포르와 호주, 뉴질랜드, 말레이시아 등의 아시아권 국가는 이러한 계획에 따라 국민들간의 연결성과 창조에 힘을 실어주고 있다.

영국 경제전문지인 이코노미스트에 따르면, 다국적 기업은 이미 이머징 시장에서 발생한 아이디어를 차용해 서양에 적용하고 있고, 예산의 많은 부분을 IT가 이끄는 혁신에 투자하고 있다. 시장조사전문기관 IDC에 따르면 인도네시아, 말레이시아, 싱가포르, 태국에 대한 투자가 2013년 기업 예산의 평균 39.8%에 이를 것으로 전했다.
1355898760_thumb.gif


1인 및 중소기업 시장의 활성화

중소기업 시장 규모 또한 더 커질 전망이다. 기술력이 발전하면서 IT인프라스트럭처가 마련돼 혼자 기업을 꾸질 수 있는 ' 1인 기업 시대'가 더 확대될 것으로 보인다. 특히 국내 시장은 기업을 꾸리겠다는 의지가 타 국가와 다르게 ‘성장’에 초점이 맞춰져 있다.

기업가정신에 초점을 맞춘 연구 기관 '카프만 파운데이션(Kauffman Foundation)'의 연구 결과에 따르면 한국 젊은이들은 기업적인 성공에 크게 관심을 보이는 것으로 나타났다. 한국의 1인 기업자 수는 약 23만5000개로 빠르게 증가하고 있다. 한편 인도에서는 기업 설립 이유를 묻는 질문에 ‘스스로 결정을 내리고 싶어서’라는 대답을 가장 많이 했다.

모바일 및 PC 기술력의 확대

2013년에는 4세대 인텔 코어 프로세서를 탑재한 새로운 노트북이 등장할 것으로 보인다. 특히 기존에 가지고 있던 노트북 두께보다 더 얇으면서 기능이 더해진 것들이 쏟아질 예정이다. 음성인식을 비롯해 인스턴트 온, 안티-말웨어 보호와 얼굴 인식 및 터치, 그래픽 기능이 더 강력해지는 것은 물론, 하루 종일 사용할 수 있는 배터리와 컨버터블PC의 모양새도 다양화될 전망이다. 보안 기술도 더 탄탄하게 들어간다.
1355898478_thumb.gif


인텔은 2013년 울트라북 시장을 '모빌리티 재조명의 해'로 잡았다. 2011년이 울트라북이 소개되는 해였다면, 2012년에는 메인스트림으로 진입하는 시대라며, 내년에 모빌리티의 새로운 면모를 볼 수 있는 기술들을 볼 수 있을 것이라고 밝혔다. 특히 10W이하의 전력으로 구동되는 메인스트림PC와 2W 가량의 아톰PC를 내놓을 것이라고 설명했다.

정소라 기자 ssora7@it.co.kr

상품지식 전문뉴스 미디어잇

 

 

기사 주소: 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배로 증가한다는 법칙이다.]도 한계에 다가가기 시작하고, 네트워크도 세대별 진화에 진화를 거듭하여 속도를 향상시켜 왔지만, 이젠 네트워크 속도 경쟁보다는 운용에 무게중심이 이동하는 것 같네요.
 소프트웨어 정의 네트워크도 흥미로운 주제이며 기술이지만, 네트워크관리자에게 네트워크 관리의 편리성을 가져오는 것 같습니다.
기술의 발전이 사람들에게 윤택한 삶을 가져오는 믿음을 준 건 사회 구성원 전체에게 혜택을 주었을 때인데, 소프트웨어 네트워크에 대한 시설투자로 개개인에게도 많은 도움이 될 수 있는 방향도 고민해 봐야 할 것 같네요.
 
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         

 

 

[출처] http://www.bloter.net/archives/32840#

 

[기획-PCC] (1) ‘퍼스널 클라우드 컴퓨팅’이 다가온다

도안구 | 2010.06.20

퍼스널 클라우드 컴퓨팅(Personal Cloud Computing; PCC) 서비스 시장이 뜨고 있다. PCC는 수많은 디바이스들을 보유한 이용자가 언제 어디서나 자신이 사용하던 사진, 동영상, 주소록, 오피스 문서, 게임, 메일 등의 콘텐츠들을 최신의 상태에 접근해 사용할 수 있도록 해주는 서비스다. 초기 시장에선 IT 분야의 포털과 통신사, 제조사들이 움직이고 있지만 클라우드 컴퓨팅 인프라를 통해 전통적인 기업들도 이 시장에 눈을 돌릴 것으로 보인다. 블로터닷넷은 이번 기획을 통해 우선 IT 업계에서 PCC 시장에 대한 어떤 움직임이 있는 지, PCC가 우리의 디지털라이프를 어떻게 바꾸게 될 지 조명해 볼 계획이다.

스타벅스가 부진에 빠진 이유는 무엇일까? 나만의 커피를 팔던 문화 공간에 흠뻑 취했던 고객들은 어느 날부턴가 샌드위치와 초콜릿이 등장하고 사람 대신 기계가 커피를 뽑아내기 시작하면서 또 하나의 패스트푸드점으로 전락한 ‘스타벅스’를 외면하기 시작했다. 서울의 스타벅스 매장에서 맛보던 ‘카페라떼’를 중국 상하이의 ‘스타벅스’에서도 똑같이 맛볼 수 있다는 그 ‘경험’은 여전히 유효하지만 ‘나만을 위한’ 커피에 대한 경험은 사라져버렸다.

스타벅스의 창업자 하워드 슐츠가 복귀했지만 스타벅스는 다시 살아날 수 있을까?

뜬금없이 스타벅스를 등장시킨 이유가 있다. 전통 산업에선 일반화 돼 있는 ‘동일한 사용자 경험’에 IT 업계가 눈을 돌리면서 본격적인 경쟁이 수면 위로 떠오랐기 때문이다. 사용자들은 PC 한대를 사용할 때와는 다르게 자신이 사용하는 애플리케이션이나 다양한 콘텐츠와 서비스들을 MP3 플레이어, 노트북, 휴대폰, 내비게이션, 휴대용멀티미디어플레이어(PMP), 태블릿, 디지털TV, 게임기 등 수많은 디지털기기에서도 동일하게 이용하고자 한다.

IT 기기 제조업체, 소프트웨어 업체, 인터넷 서비스 업체, 통신업체 등이 수없이 쏟아지는 다양한 기기들에 사용자들의 동일한 경험을 유지해 주기 위한 경쟁에 뛰어들었다. 서로 다른 영역에서 출발했지만 목표는 같다. 바로 ‘동일한 사용자 경험’을 제공하겠다는 것이다.

 

[1]시장조사 업체인 포레스터리서치는 이런 시장을 ‘PCC’(Personal Cloud Computing 이하 PCC)라고 명명하고, 2013년에 PCC 시장이 157억 달러(18조원) 규모로 성장할 것으로 예상했다.

신동윤 메타트렌드연구소 수석연구원은 “최근 발표된 아이폰의 운영체제인 iOS4에 ‘동기화’ 기능이 들어갔다. 아이북스도 아이폰에서 사용할 수 있다. 이건 무엇을 하기 위해서일까? 아이패드에서 책을 읽다가 메모하거나 체크해 놓은 것을 아이폰을 통해 읽을 때도 확인할 수 있도록 한 것”이라며 “아마존이 자신의 클라우드 인프라와 이북 리더인 ‘킨들’을 사용하는 고객들에게 동기화를 통해 북마크와 콘텐츠의 경험을 동일하게 제공하고 있는 것도 바로 이런 이유 때문”이라고 전했다.

그는 또 “다양한 기기들에 동일한 경험을 제공하기 위해선 클라우드 컴퓨팅이 없으면 구현 자체가 거의 불가능해 집니다. 클라우드를 사회의 인프라로 인식하지 못한다면 새로운 경쟁 시대에 제대로 대응하지 못할 것”이라고 덧붙였다.

PCC 시장이 주목받고 있다. 경쟁 업체들도 쟁쟁하다. 애플, 구글, 마이크로소프트를 비롯해 SK텔레콤, NHN, 노키아, 삼성전자, LG전자, 시만텍, HP, EMC 등 IT 업계 전체가 이 시장을 주목하고 있다고 해도 과언이 아니다.

스마트폰을 비롯한 제조사들은 자사의 제품에 대한 차별화된 서비스 요소로 부각시켜 경쟁우위를 확보하기 위해 PCC에 주목하고 있다. 통신사들은 자사 통신 서비스에 가입한 고객들의 데이터 사용량을 극대화하려는 전략이 숨어있다. 포털 업체들은 새로운 서비스의 출현으로 이탈할 지 모를 고객들을 묶어두면서 전통적인 광고 수익을 유지하기 위해, IT 장비와 소프트웨어 업체들은 기업 시장의 영향력을 개인 시장으로 확대하기 위해 PCC를 넘보고 있다.

애플은 ‘아이튠즈’라는 프로그램을 통해 게임, 음악, 동영상, 팟캐스트, e북과 같은 콘텐츠들을 자사의 PC, 노트북, 휴대폰, MP3, 아이패드와 같은 태블릿 기기를 하나로 묶으려 하고 있다. 아직까지 가시적인 성공 모델을 보여주지는 못하고 있지만 ‘모바일미’라는 동기화 서비스도 제공하고 있다. 아이디스크라는 저장공간도 제공하고 있다. 최근에는 미국 워싱턴주에 대규모 데이터센터를 구축하면서 본격적인 클라우드 서비스를 위한 작업에 착수한 상황이다. 관련 업계에서는 애플의 향후 전략을 대규모 데이터센터를 통한 PCC 서비스가 될 것으로 예측하고 있다.

구글은 구글닥스와 지메일, 캘린더, 구글토크, 웨이브 등 이미 광범위한 서비스들을 다양한 기기들에서 동일한 방식으로 접근할 수 있도록 하고 있다. 가장 큰 인터넷 서비스 플랫폼을 만들어 놓은 입장이기 때문에 상대적으로 우위에 있다.

마이크로소프트는 ‘준’이라는 유료 서비스를 통해 게임과 뮤직비디오, 팟캐스트와 같은 서비스를 제공하고 있고, ‘마이폰’이라는 서비스도 선보이면서 휴대폰에 저장된 연락처, 동영상, 사진 같은 콘텐츠를 동기화 시켜나가고 있다. 게임 분야에서는 x박스 360 라이브를 통해 접근하고 있다. 윈도우 폰 7을 통해 아이튠즈와 같은 클라이언트 프로그램인 ‘준’도 선보이는 등 사용자들이 통합 환경에서 모든 정보들을 관리할 수 있도록 다가서고 있다.

서진호 한국마이크로소프트 부장은 “어떤 기기를 사용하든 상관없이 서비스를 동일하게 제공되기 위해서는 클라우드 인프라가 꼭 필요합니다. 이런 인프라를 통해 개인화된 서비스를 누가 더 효율적이고 경쟁력 있게 제공할지의 경쟁이 시작된 것”이라고 밝혔다.

SK텔레콤은 PCC 시장을 위해 한국클라우드컴퓨팅연구조합, ETRI, KAIST, 넥스알, 나눔기술 등과 개방형 기술혁신 방식으로 4년간 공동 연구개발을 진행해 나갈 계획이다. SK텔레콤은 PCC 서비스를 이용하면 이용자가 사진과 동영상, 주소록, 오피스 문서, 게임, 메일 등 다양한 콘텐체를 인터넷 서버에 저장하고 스마트폰, 태블릿 PC, 전자책 리더, IPTV 등 인터넷이 가능한 IT 기기에서 언제든 자유롭게 꺼내 쓸 수 있게 된다고 설명한 바 있다.

김경환 SK텔레콤 B2B 기술팀 매니저는 “일정에 ‘미국 뉴욕 출장’이라고 체크해 놓으면 뉴욕의 날씨와 사용자가 가볼 만한 공간 정보, 맛집 정보 등을 자연스럽게 제공해 줄 수 있을 것”이라며 “만약 SKT의 PCC 서비스를 받던 고객이 휴대폰을 잃어버려 새로운 폰을 개통한 후 자신의 아이디로 로그인을 하면 잃어버린 휴대폰에 설치돼 있던 프로그램이나 주소록 등이 새로운 휴대폰에 그대로 셋팅 되는 것”이라며 향후 PCC 서비스가 제공할 사례를 소개했다.

이 시장을 팔짱만 끼고 볼 NHN이 아니다. NHN은 국내 최대 포털과 검색 서비스 업체답게 2007년부터 하나씩 관련 서비스를 준비해 왔다.

NHN은 올 4월 6일 ‘네이버 쉬프트 2010′ 행사를 열고 PCC 시장에 대한 야심작에 대해 슬쩍 공개했다. NHN의 무기는 ‘데스크홈’. 데스크홈은 개인화 서비스로 이 시장에 대응할 준비를 하고 있다. 데스크홈에는 ▲네이버 웹메일과 쪽지 등 기본 기능 ▲캘린더, 가계부, 계좌조회, 포토앨범, 주소록 등 개인화 서비스 ▲개인 파일 저장 공간인 N드라이브 ▲미투데이나 블로그, 카페의 새소식과 댓글을 확인하고 글을 남길 수 있는 커뮤니케이션 캐스트가 들어선다. 최근엔 주소록 동기화 서비스를 위해 베타테스터들을 대거 모집해 클로즈 서비스에도 나서고 있다.

또한 6월부터 네이버가 선보일 예정인 ‘웹오피스 워드’를 이용하면 N드라이브에 저장된 파일을 데스크홈에서 곧바로 수정·편집할 수 있으며, 한 문서를 다른 지인들과 동시에 편집·공유하는 기능도 선보일 예정이다.

데스크홈이라고 명명되긴 했지만 다양한 서비스 중 가장 유심히 살펴봐야 될 서비스는 N드라이브다. 혹시 최근 네이버가 선보인 엔드라이브 CF[2]를 본 적이 있는가?

“내 문서를, 내 음악을, 내 사진을, 내 동영상을

내 엔드라이브에 올려두면

강의실에서, 작업실에서, 지하철에서

점심먹다, 새벽에도

내 PC나 USB가 없어도 다 꺼내 볼 수 있다.

나만의 무료 웹 저장공간, 엔드라이브”

라는 멘트가 나오는 네이버의 광고를 볼 수 있다. 이 엔드라이브는 NHN PCC의 가장 핵심이 되는 서비스이자 기간 인프라다.

정현주 NHN 포털전략1팀 팀장은 “해외 경쟁 업체들에 뒤지지 않는 속도로 다양한 서비스들을 준비해 가고 있습니다. 엔드라이즈는 NHN의 모든 서비스의 근간이 되는 데이터 저장소입니다. 앞으로도 재미난 서비스들을 계속해서 하나씩 선보일 계획입니다”라고 밝혔다.

이런 서비스 경쟁이 시작되면서 향후 PCC 서비스에 대한 수익 모델에 대한 관심도 자연스럽게 모아지고 있다.

구글처럼 개인들에겐 무료로 풀고 대신 광고수익을 노리거나 기업 고객들에겐 소정의 사용료를 받는 모델을 떠올릴 수 있다. 애플이나 마이크로소프트처럼 일정 저장 공간을 넘어설 때 과금하는 프리미엄 서비스 모델, 통신사처럼 부가 서비스로 월정액을 받고 제공하든가 몇몇 서비스는 무료로 제공하고 유료 서비스를 차별화할 수 있다. 사용자가 어떤 수익 모델을 지지할 지가 관건이다.

PCC 시장을 놓고 IT 업계 전체가 ‘총성없는 전쟁’을 시작했지만, 이런 요구가 비단 IT 업체에게만 해당되는 것은 아니다. PCC 시장의 파괴력이 상상 이상이 될 것이라는 관측이 나오는 이유다.

신동윤 수석연구원은 “지금은 IT 기기 위주로 시장이 형성되겠지만 조금 시간이 지나면 전 산업에 PCC 바람이 불 것”이라고 확신한다.

얼마 전 이탈리아의 세계적인 커피머신 제공 업체인 쎄코(www.saeco.com[3])가 2,500달러 짜리 지문인식 제품을 선보였다. 6명의 지문을 인식해서 각자 원하는 취향의 커피를 등록해 사용자마다 맞춤 커피를 만들어준다. 만약 이 서비스가 클라우드 서비스와 결합된다면 전세계 어디를 가든 이 기계만 만나면, 내가 집에서 한번 등록해 놓은 커피를 마실 수 있게 된다.

신 수석은 “또 렌트카 업체들이 자사 손님들의 정보를 클라우드 서비스와 연계하면 또 어떤 일이 벌어질까”라며 클라우드 인프라를 활용한 개인화 서비스는 IT 업체에게만 해당되는 게 아니라고 강조한다. 서비스 업체들이라면 모두가 PCC를 통한 서비스 극대화를 꾀할 수 있다는 얘기다.

그는 “클라우드 컴퓨팅을 단순히 전산실 총소유비용(TCO) 절감 수준 정도로 인식하고 있는 우리나라 기업들의 의사결정자들이 클라우드의 파괴력을 제대로 인식하지 못하고 있다”며 “클라우드가 없으면 자신들의 서비스를 고객들에게 제대로 전달할 수 없는 시간이 코 앞으로 다가 왔다”고 강조했다.클라우드 컴퓨팅이 단지 IT 업계를 넘어 전통 산업의 경쟁력까지 좌우할 순간이 머지 않았다. PCC에 주목해야 하는 진짜 이유다.

 

 

 

 

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>

[파이썬] scrapy 로 웹 사이트 크롤링

[출처] http://isbullsh.it/2012/04/Web-crawling-with-scrapy/

Crawl a website with scrapy

Written by Balthazar

Introduction

In this article, we are going to see how to scrape information from a website, in particular, from all pages with a common URL pattern. We will see how to do that with Scrapy, a very powerful, and yet simple, scraping and web-crawling framework.

For example, you might be interested in scraping information about each article of a blog, and store it information in a database. To achieve such a thing, we will see how to implement a simple spider using Scrapy, which will crawl the blog and store the extracted data into a MongoDB database.

We will consider that you have a working MongoDB server, and that you have installed the pymongo and scrapy python packages, both installable with pip.

If you have never toyed around with Scrapy, you should first read this short tutorial.

First step, identify the URL pattern(s)

In this example, we’ll see how to extract the following information from each isbullsh.it blogpost :

  • title
  • author
  • tag
  • release date
  • url

We’re lucky, all posts have the same URL pattern: http://isbullsh.it/YYYY/MM/title. These links can be found in the different pages of the site homepage.

What we need is a spider which will follow all links following this pattern, scrape the required information from the target webpage, validate the data integrity, and populate a MongoDB collection.

Building the spider

We create a Scrapy project, following the instructions from their tutorial. We obtain the following project structure:

isbullshit_scraping/
├── isbullshit
│   ├── __init__.py
│   ├── items.py
│   ├── pipelines.py
│   ├── settings.py
│   └── spiders
│       ├── __init__.py
│       ├── isbullshit_spiders.py
└── scrapy.cfg

We begin by defining, in items.py, the item structure which will contain the extracted information:

from scrapy.item import Item, Field

class IsBullshitItem(Item):
    title = Field()
    author = Field()
    tag = Field()
    date = Field()
    link = Field()

Now, let’s implement our spider, in isbullshit_spiders.py:

from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.selector import HtmlXPathSelector
from isbullshit.items import IsBullshitItem

class IsBullshitSpider(CrawlSpider):
    name = 'isbullshit'
    start_urls = ['http://isbullsh.it'] # urls from which the spider will start crawling
    rules = [Rule(SgmlLinkExtractor(allow=[r'page/\d+']), follow=True), 
    	# r'page/\d+' : regular expression for http://isbullsh.it/page/X URLs
    	Rule(SgmlLinkExtractor(allow=[r'\d{4}/\d{2}/\w+']), callback='parse_blogpost')]
    	# r'\d{4}/\d{2}/\w+' : regular expression for http://isbullsh.it/YYYY/MM/title URLs
    		
    def parse_blogpost(self, response):
        ...

Our spider inherits from CrawlSpider, which “provides a convenient mechanism for following links by defining a set of rules”. More info here.

We then define two simple rules:

  • Follow links pointing to http://isbullsh.it/page/X
  • Extract information from pages defined by a URL of pattern http://isbullsh.it/YYYY/MM/title, using the callback method parse_blogpost.

Extracting the data

To extract the title, author, etc, from the HTML code, we’ll use the scrapy.selector.HtmlXPathSelector object, which uses the libxml2 HTML parser. If you’re not familiar with this object, you should read the XPathSelector documentation.

We’ll now define the extraction logic in the parse_blogpost method (I’ll only define it for the title and tag(s), it’s pretty much always the same logic):

def parse_blogpost(self, response):
    hxs = HtmlXPathSelector(response)
    item = IsBullshitItem()
    # Extract title
    item['title'] = hxs.select('//header/h1/text()').extract() # XPath selector for title
    # Extract author
    item['tag'] = hxs.select("//header/div[@class='post-data']/p/a/text()").extract() # Xpath selector for tag(s)
    ...
    return item

Note: To be sure of the XPath selectors you define, I’d advise you to use Firebug, Firefox Inspect, or equivalent, to inspect the HTML code of a page, and then test the selector in a Scrapy shell. That only works if the data position is coherent throughout all the pages you crawl.

Store the results in MongoDB

Each time that the parse_blogspot method returns an item, we want it to be sent to a pipeline which will validate the data, and store everything in our Mongo collection.

First, we need to add a couple of things to settings.py:

ITEM_PIPELINES = ['isbullshit.pipelines.MongoDBPipeline',]

MONGODB_SERVER = "localhost"
MONGODB_PORT = 27017
MONGODB_DB = "isbullshit"
MONGODB_COLLECTION = "blogposts"

Now that we’ve defined our pipeline, our MongoDB database and collection, we’re just left with the pipeline implementation. We just want to be sure that we do not have any missing data (ex: a blogpost without a title, author, etc).

Here is our pipelines.py file :

import pymongo

from scrapy.exceptions import DropItem
from scrapy.conf import settings
from scrapy import log
class MongoDBPipeline(object):
    def __init__(self):
        connection = pymongo.Connection(settings['MONGODB_SERVER'], settings['MONGODB_PORT'])
        db = connection[settings['MONGODB_DB']]
        self.collection = db[settings['MONGODB_COLLECTION']]
        
    def process_item(self, item, spider):
    	valid = True
        for data in item:
          # here we only check if the data is not null
          # but we could do any crazy validation we want
       	  if not data:
            valid = False
            raise DropItem("Missing %s of blogpost from %s" %(data, item['url']))
        if valid:
          self.collection.insert(dict(item))
          log.msg("Item wrote to MongoDB database %s/%s" %
                  (settings['MONGODB_DB'], settings['MONGODB_COLLECTION']),
                  level=log.DEBUG, spider=spider) 
        return item

Release the spider!

Now, all we have to do is change directory to the root of our project and execute

$ scrapy crawl isbullshit

The spider will then follow all links pointing to a blogpost, retrieve the post title, author name, date, etc, validate the extracted data, and store all that in a MongoDB collection if validation went well.

Pretty neat, hm?

Conclusion

This case is pretty simplistic: all URLs have a similar pattern and all links are hard written in the HTML code: there is no JS involved. In the case were the links you want to reach are generated by JS, you’d probably want to check out Selenium. You could complexify the spider by adding new rules, or more complicated regular expressions, but I just wanted to demo how Scrapy worked, not getting into crazy regex explanations.

Also, be aware that sometimes, there’s a thin line bewteen playing with web-scraping and getting into trouble.

Finally, when toying with web-crawling, keep in mind that you might just flood the server with requests, which can sometimes get you IP-blocked :)

Please, don’t be a d*ick.

See code on Github

The entire code of this project is hosted on Github. Help yourselves!

델파이 프로그래밍 소스 사이트(유용한 델파이 사이트)

[출처] http://aptinfo.tistory.com/80

유용한 델파이 사이트

Posted at 2009/12/24 16:20// Posted in 개발자 인생/프로그래밍 팁



델마당 : http://www.delmadnag.com

http://delphiforfun.org/

많은 델파이 예제를 다루고 있으며, 상당히 어려운 부분에 대해서도 기술하고 있습니다.

문제는 영어로 된 사이트라는 것이지만,

프로그램과 소스가 있어서, 델파이 코드를 뒤져볼 수 있으면 짧은 영어에도 많은 것을 배울 수 있습니다.

http://www.cobans.net/

RPN 파서라던가

혼자 플레이하는 테트리스

그리고 프렉탈 등등의 여러가지 내용들이 있습니다.

러시아 대학생이 만든 사이트.

http://www.koders.com/

상당히 많은 소스를 제공하는 사이트입니다.

어지간한 소스는 다 있다고 해도 무방합니다.

공부하는데 도움이 되는 사이트

출처 : http://delphi.icm.edu.pl/

델파이 컴포넌트와 프로그램들을 모아놓은 사이트입니다.

많은 컴포넌트들이 있으며, 많은 분류 항목으로 나누어져 있습니다.

찾아보면 좋은 컴포넌트들이 많습니다.

쉐어웨어/프리웨어/데모 등등을 찾을 수 있습니다.

가끔 대박을 건지기도 한답니다.

http://mapage.noos.fr/qnno/pages/delphi_en.htm

몇몇의 컴포넌트와 유닛이 있습니다.

spidergraph hotlog는 아주 좋은 컴포넌트입니다.

hotlog는 에러log 대용으로 사용할 수 있으며, d5~d7까지 지원합니다.

D7을 지원하는 관계로 D2006으로 컨버팅은 아주 쉽습니다.

첨부파일은 hotlog 2.2입니다.

http://www.codebot.org/delphi/

델파이 셀 컨트롤과 오픈 소스 라이브러리가 있는 곳입니다.

약간의 셀에 대한 설명도 있습니다.

오픈 소스 라이브러리는 다른 RTL 유닛의 도움을 받지 않은 순수한 라이브러리입니다.

5, 7, 2006을 지원합니다.

6는 약간의 문제가 있는 듯 하더군요.

약간의 스샷과 예제에 대한 플래시 동영상도 있습니다.

http://www.wilsonc.demon.co.uk/delphi.htm

윌슨의 델파이 관련 사이트.

리소스 편집기라던지 몇몇 특별한 유틸이니 소스가 있습니다.

메신져 - 파일 전송 가능한 메신져. LAN 환경. 클로즈 소스. GPL

http://sourceforge.net/projects/achat

확대경 - 화면 부분 확대, 소스, GPL

http://sourceforge.net/projects/magnifier

colored library - 문법 강조 , LGPL/MPL1.1, 이글립스 플러그인

http://sourceforge.net/projects/colorer/

아레스 갤럭시 P2P - 슈퍼P2P, 소스, GPL

http://sourceforge.net/projects/aresgalaxy

delphicodetodoc - 델파이 코드를 문서로, 소스, GPL

http://sourceforge.net/projects/dephicodetodoc

dev-php IDE - php IDE 개발 환경, 소스, GPL

http://sourceforge.net/projects/devphp

crash point - worms 아류, 소스, GPL

http://sourceforge.net/projects/crashpoint

delphi code analyser - 델파이 코드 분석툴, 소스, MPL1.1

http://sourceforge.net/projects/dca

Scintilla Project 컴포넌트 - Scintilla 컴포넌트, 소스, LPGL/MPL1.1

http://sourceforge.net/projects/delphisci

프로메테우스 프로젝트 - 라크나로크 서버, 소스, GPL

http://sourceforge.net/projects/prometheusproj

Recognition And Vision Library - 패턴인식 라이브러리, 소스, LGPL

http://sourceforge.net/projects/ravl

소코반 - 게임, 소스, 라이센스 없음

http://sourceforge.net/projects/sokobanyasc

LCD Smartie - LCD 개발 프로그램, 소스, LGPL/GPL/MPL1.1

http://sourceforge.net/projects/lcdsmartie

Legend of Mir2 Diamond Emulator - 미르의 전설 2 서버/클라이언트 에뮬레이터, 소스, GPL

http://sourceforge.net/projects/diamondm2server

InstantObjects - DB 관련 컴포넌트 패키지, 소스, MPL1.1

http://sourceforge.net/projects/instantobjects

HomeNet PhoneNet - VOIP, 소스, GPL/Nethack General Public License

http://sourceforge.net/projects/hnpnren

shundown monster - 컴퓨터 종료 어플, 소스, GPL

http://sourceforge.net/projects/shutdown

iSafer firewall - 방화벽, 소스, GPL (한국)

http://sourceforge.net/projects/winsockfirewall

PTISC - 턴베이스 게임엔진(2D Isomatric) 소스, GPL

http://sourceforge.net/projects/ptisc

Klipboard - 클립보드툴, 소스, LGPL

http://sourceforge.net/projects/klipboard

델파이 Indy(9,10)데모, 소스, MPL1.1

http://sourceforge.net/projects/internetdemos

Packetyzer - 패킷 분석기, 소스, GPL

http://sourceforge.net/projects/packetyzer

Programmer's Notepad - 편집기, GPL

http://sourceforge.net/projects/pnotepad

Charset Detector - 문자 코드 검출기, 소스, LGPL

http://sourceforge.net/projects/chsdet

GenIconXP - 다중 아이콘 파일 생성기, 소스, GPL

http://sourceforge.net/projects/geniconxp

파이썬 코드 50라인으로 웹 크롤러 만들기

[출처] http://theanti9.wordpress.com/2009/02/14/python-web-crawler-in-less-than-50-lines/

Python Web Crawler in Less Than 50 Lines

I got kind of bored today, and wrote a pretty simple web crawler with python and it turned out to be less than 50 lines. It doesn’t store output, I’ll leave that up to anyone who wants to use the code, because, well, theres just too many ways to choose from. Right now you pass it a starting link as a parameter and it will crawl forever untill it runs out of links. But that is not a likely condition. So here ya go. Have fun. Feel free to ask questions

import sys
import re
import urllib2
import urlparse
tocrawl = set([sys.argv[1]])
crawled = set([])
keywordregex = re.compile('<meta\sname=["\']keywords["\']\scontent=["\'](.*?)["\']\s/>')
linkregex = re.compile('<a\s*href=[\'|"](.*?)[\'"].*?>')

while 1:
	try:
		crawling = tocrawl.pop()
		print crawling
	except KeyError:
		raise StopIteration
	url = urlparse.urlparse(crawling)
	try:
		response = urllib2.urlopen(crawling)
	except:
		continue
	msg = response.read()
	startPos = msg.find('<title>')
	if startPos != -1:
		endPos = msg.find('</title>', startPos+7)
		if endPos != -1:
			title = msg[startPos+7:endPos]
			print title
	keywordlist = keywordregex.findall(msg)
	if len(keywordlist) > 0:
		keywordlist = keywordlist[0]
		keywordlist = keywordlist.split(", ")
		print keywordlist
	links = linkregex.findall(msg)
	crawled.add(crawling)
	for link in (links.pop(0) for _ in xrange(len(links))):
		if link.startswith('/'):
			link = 'http://' + url[1] + link
		elif link.startswith('#'):
			link = 'http://' + url[1] + url[2] + link
		elif not link.startswith('http'):
			link = 'http://' + url[1] + '/' + link
		if link not in crawled:
			tocrawl.add(link)

** EDIT **

This was a very early draft of this program. As it turns out, I revisited this project a few months later and it evolved much more.
If you would like to check out the more evolved form, feel free to have a look here at my github

[프로그래밍 Tip] 아래는 프로그램 소스코드를 공개하는 사이트를 모아둔 것입니다.
[출처] http://promisej7.tistory.com/294


1. Visual C++, C# and Visual Basic 및 윈도우즈 .Net에 관련된 소스코드들이 공유되는 대표적인 사이트
http://www.codeguru.com/

2. 인터넷 상의 돌아다니는 코드들을 모아놓은 사이트
http://www.planet-source-code.com/

3. Codeguru와 더불어 많은 소스코드와 튜토리얼을 제공하고 있는 사이트
http://www.codeproject.com/

4. 전세계를 석권하고 있는 구글에서 제공하는 오픈소스 사이트
http://code.google.com/
http://code.google.com/projects.html

5. C++, Visual Basic, ASP, sourcecode, programming, javascript, code, delphi, ... 일반적인 조그만 코드들이 많이 모여있음.
http://www.programmersheaven.com/

6. OSI에 대한 정보가 나와 있는 사이트
http://www.opensource.org/

7. 프로젝트 단위의 소스코드를 오픈해주는 세계에서 가장 유명한 사이트
http://sourceforge.net/index.php

8. 자바스크립트가 많이 오픈되어 있는 사이트
http://javascript.internet.com/

9. Gamelan.com is a leading site for Java articles, tutorials, news, discussions, and other resources. ...
http://www.developer.com/open/

10. 세계적인 오픈소스에 대한 라이센스 정책을 세우는 GNU 사이트
http://www.gnu.org/copyleft/gpl.html

11. 세계적인 모바일 업체인 노키아에서 공유하고 있는 소스코드 사이트
http://opensource.nokia.com/projects/S60browser/

12. 애플컴퓨터를 위한 오픈소스 사이트
http://developer.apple.com/opensource/index.html

13. 영국의 개발자들의 소스코드 공유 커뮤니티 사이트
http://www.developerfusion.co.uk/

14. 한국의 대표적인 VS 개발자 공유 사이트
http://www.devpia.com/

15. 개발자 포럼 및 소스공유사이트, BREW에 대한 정보 제공을 잘해주고 있는 사이트
http://www.developer.com/ws/brew/

+ Recent posts