'old > Pattern' 카테고리의 다른 글
Observer Pattern (0) | 2010.11.15 |
---|
Observer Pattern (0) | 2010.11.15 |
---|
data center ; 데이터 센터
|
default ; 디폴트 (0) | 2010.11.09 |
---|---|
data transfer rate (또는 data rate) ; 데이터 전송 속도 (0) | 2010.11.09 |
COTS (commercial off-the-shelf) ; 상용 기성품 (0) | 2010.11.08 |
compression ; (파일) 압축 (0) | 2010.11.08 |
CMOS (Complementary Metal-Oxide Semiconductor) (0) | 2010.11.08 |
COTS (Commercial Off-The-Shelf) ; 상용 기성품
COTS는 쉽게 획득할 수 있도록 미리 만들어진 제품들을 가리킨다. 이 용어는 때로 국방 조달 규격에도 사용된다.
data transfer rate (또는 data rate) ; 데이터 전송 속도 (0) | 2010.11.09 |
---|---|
data center ; 데이터 센터 (0) | 2010.11.08 |
compression ; (파일) 압축 (0) | 2010.11.08 |
CMOS (Complementary Metal-Oxide Semiconductor) (0) | 2010.11.08 |
clustering ; 클러스터링 (0) | 2010.11.08 |
compression ; (파일) 압축
압축이란 저장공간을 절약하거나 데이터 전송시간을 줄이기 위하여 데이터 크기를 줄이는 것이다. 데이터통신에서, 여러 가지 요소에 따라 데이터 내용에 대해서만 압축을 하거나 또는 헤더 정보를 포함한 전송단위 전체에 대해 압축할 수도 있다. 내용 압축은 모든 여분의 공란 글자를 제거하거나, 연속된 글자들의 스트링 대신 연속글자 한 개로 삽입함으로써 표현하고, 자주 나타나는 글자들을 의한 보다 적은 량의 비트 스트링으로 대체하는 등의 간단한 방법으로 할 수 있다. 이런 종류의 압축을 통해 텍스트 파일을 원래의 크기에서 약 50%까지로 줄일 수 있다. 압축은 데이터를 어떻게 압축하고, 또 풀어낼 것인지를 결정하는 공식이나 알고리즘을 사용하는 프로그램에 의해 행해진다. 그래픽 이미지 파일 형식은 텍스트 파일에 비해 매우 크기가 큰 파일이 되는 경향이 있기 때문에, 정보를 가능한 한 많이 압축할 수 있도록 설계된다. 인터넷을 통해 정보를 주고받을 때, 커다란 텍스트 파일들은 하나씩 단독으로 전송되기도 하지만, zip이나, gzip 등의 압축 포맷 속에 여러 개의 파일을 통합하여 하나의 압축파일로 전송하기도 한다. WinZip은 윈도우 환경에서 여러 개의 파일들을 하나로 압축할 수 있는 유명한 압축 프로그램이다. |
data center ; 데이터 센터 (0) | 2010.11.08 |
---|---|
COTS (commercial off-the-shelf) ; 상용 기성품 (0) | 2010.11.08 |
CMOS (Complementary Metal-Oxide Semiconductor) (0) | 2010.11.08 |
clustering ; 클러스터링 (0) | 2010.11.08 |
client/server ; 클라이언트/서버 (0) | 2010.11.08 |
CMOS (Complementary Metal-Oxide Semiconductor)
CMOS[씨모스]는 최근 대부분의 컴퓨터 마이크로칩 내에 집적되어 있는 트랜지스터들에 사용된 반도체 기술이다. 반도체는 실리콘과 게르마늄과 같은 반도체성 물질로 만들어진다. 불순물을 더함으로써 처리된 이러한 재질부위는 음전기로 충전된 여분의 전자들(N형 트랜지스터) 또는 양전기로 충전된 캐리어(P형 트랜지스터) 둘 중 하나의 전도체가 된다. CMOS 기술에서는 두 종류의 트랜지스터들이 효과적인 전기제어의 방법인 전류게이트를 이루기 위해 상호 보완적인 방법으로 사용된다. CMOS 트랜지스터들은 사용되지 않을 때에는 전력을 거의 소모하지 않는다. 그러나, 전류의 방향이 더 빨리 바뀌기 때문에 트랜지스터들이 뜨거워지며, 이러한 특성은 마이크로프로세서들이 동작될 수 있는 속도를 제한하는 경향이 있다. |
COTS (commercial off-the-shelf) ; 상용 기성품 (0) | 2010.11.08 |
---|---|
compression ; (파일) 압축 (0) | 2010.11.08 |
clustering ; 클러스터링 (0) | 2010.11.08 |
client/server ; 클라이언트/서버 (0) | 2010.11.08 |
CIO (Chief Information Officer) ; 정보관리 책임자 (0) | 2010.11.08 |
clustering ; 클러스터링
클러스터링은 가변적인 업무부하를 처리하거나, 또는 그 중 한 대가 고장이 났을 경우에도 운영이 계속되도록 여러 대의 컴퓨터 시스템을 서로 연결하는 것을 지칭한다. 두 개 이상의 컴퓨터를 마치 하나의 컴퓨터처럼 행동하도록 서로 연결함으로써, 병렬 처리나, 부하 배분 및 고장 대비 등의 목적에 사용할 수 있다. 클러스터링은 기업이 PC와 워크스테이션 등에 이미 집행한 투자 효과를 볼 수 있게 하기 때문에 병렬 처리 프로그램을 구현하기 위한 보편적인 전략이다. 그 밖에도, 새로운 PC를 네트웍에 추가하기만 하면 되므로, 새로운 CPU를 추가하기가 비교적 쉽다는 장점이 있다. |
compression ; (파일) 압축 (0) | 2010.11.08 |
---|---|
CMOS (Complementary Metal-Oxide Semiconductor) (0) | 2010.11.08 |
client/server ; 클라이언트/서버 (0) | 2010.11.08 |
CIO (Chief Information Officer) ; 정보관리 책임자 (0) | 2010.11.08 |
checksum ; 체크섬 (0) | 2010.11.05 |
client/server ; 클라이언트/서버
클라이언트/서버는 두 개의 컴퓨터 프로그램 사이에 이루어지는 역할 관계를 나타내는 것이다. 클라이언트는 다른 프로그램에게 서비스를 요청하는 프로그램이며, 서버는 그 요청에 대해 응답을 해주는 프로그램이다. 클라이언트/서버 개념은 단일 컴퓨터 내에서도 적용될 수 있지만, 네트웍 환경에서 더 큰 의미를 가진다. 네트웍 상에서의 클라이언트/서버 모델은 여러 다른 지역에 걸쳐 분산되어 있는 프로그램들을 연결시켜주는 편리한 수단을 제공한다. 클라이언트/서버 모델을 이용하여 거래내용을 처리하는 것은 매우 보편적인 일이다. 예를 들어, 누군가 자신의 은행계좌 내역을 조회하려고 하는 경우, 먼저 자신의 PC에 있는 클라이언트 프로그램이 은행에 위치한 거래 서버에 그 요구사항을 전송하게 되고, 거래 서버는 다시 계좌내역을 검색해주는 일을 하는 데이터베이스 서버에 그 요구사항을 보내게 된다. 데이터베이스 서버가 계좌내역을 검색하여 그 내용을 거래 서버에 보내면, 거래 서버는 다시 그 내용을 계좌 내역을 요구한 PC의 클라이언트 프로그램으로 보냄으로써, 최종적으로 화면에 나타나게 된다. |
|
클라이언트/서버 모델은 네트웍 컴퓨팅의 주요 개념이 되었다. 오늘날 만들어지고 있는 대부분의 업무용 프로그램들은 클라이언트/서버모델을 적용하고 있으며, 인터넷의 주요 프로그램인 TCP/IP 또한 마찬가지다. 인터넷의 경우를 예를 들면 웹 브라우저는 인터넷상의 어딘가에 위치한 웹서버에게 웹 페이지나 파일의 전송을 요구하는 클라이언트 프로그램이다.
일반적인 클라이언트/서버 모델에서는, 보통 데몬(daemon)이라 불리는 서버프로그램이 먼저 활성화된 상태에서 클라이언트의 요구사항을 기다리는데, 대체로 다수의 클라이언트 프로그램이 하나의 서버 프로그램을 공유한다.
컴퓨터를 판매하기 위한 마케팅 측면에 있어서 클라이언트/서버란 용어는 여러 대의 소형 컴퓨터들로 구성된 분산 컴퓨팅 구조와, 하나의 메인 컴퓨터로 구성된 중앙집중식 컴퓨팅 구조를 구별하기 위해 사용되어 왔다. 그러나 이런 차이점은 메인프레임과 그 응용프로그램들이 클라이언트/서버 모델과 혼합되어 네트웍 컴퓨팅 구조의 일부분이 되면서 거의 사라졌다.
CMOS (Complementary Metal-Oxide Semiconductor) (0) | 2010.11.08 |
---|---|
clustering ; 클러스터링 (0) | 2010.11.08 |
CIO (Chief Information Officer) ; 정보관리 책임자 (0) | 2010.11.08 |
checksum ; 체크섬 (0) | 2010.11.05 |
canonical and non-canonical (0) | 2010.11.05 |
CIO (Chief Information Officer) ; 정보관리 책임자
CIO[씨아이오]는 한 기업의 정보기술 및 컴퓨터 시스템 부문을 책임지고 있는 사람에게 보편적으로 부여되는 직무 명칭이다. 정보기술과 시스템이 더욱 중요해짐에 따라, 많은 조직 내에서 전략적 목표를 세우는데 있어 CIO가 주요 공헌자로서 부각되고 있다. 많은 회사들에서, CIO는 회사의 대표인 CEO에게 직접 보고하며, 일부 회사들에서는, CIO가 중역진에 포함되기도 한다. 대체로, 대기업의 CIO는 기술적인 결정사항을 세부적인 업무에 정통한 직원들에게 위임하기도 한다. 대개, 정보기술을 기업에 제의한 CIO는 목표를 달성할 필요가 있으며, 주어진 예산 범위 내에서 가능한한 많은 계획을 이행하기 위해 일한다. 일반적으로, CIO는 기존의 비즈니스 프로세스의 분석 및 개정, 새로운 도구들을 사용하는 능력의 식별 및 개발, 기업의 물리적인 기반시설과 네트웍 접속의 개량, 기업의 지식 자원들을 식별히고 개척하는 등의 업무에 관련된다. 많은 CIO들은 기업의 인터넷과 월드와이드웹 등을 장기전략과 중기 비즈니스 계획에 통합하기 위한 노력들을 지휘한다. |
clustering ; 클러스터링 (0) | 2010.11.08 |
---|---|
client/server ; 클라이언트/서버 (0) | 2010.11.08 |
checksum ; 체크섬 (0) | 2010.11.05 |
canonical and non-canonical (0) | 2010.11.05 |
cache ; 캐시 (0) | 2010.11.05 |
checksum ; 체크섬
체크섬은 수신자가 같은 수의 비트가 도착했는지를 확인 할 수 있도록 전송단위 내의 비트 수를 세는 것이다. 만약 계산이 맞으면, 에러없이 원만하게 수신된 것으로 간주된다. TCP와 UDP 통신계층 모두에서 체크섬 계산 및 검증 서비스가 제공된다.
client/server ; 클라이언트/서버 (0) | 2010.11.08 |
---|---|
CIO (Chief Information Officer) ; 정보관리 책임자 (0) | 2010.11.08 |
canonical and non-canonical (0) | 2010.11.05 |
cache ; 캐시 (0) | 2010.11.05 |
byte ; 바이트 (0) | 2010.11.05 |
canonical and non-canonical
canonical이란, "규정대로"하는 프로그래밍을 의미하며, non-canonical이란 "규정에 따르지 않고"하는 프로그래밍을 의미한다. 초기의 교회에서, "canon" 즉 교회의 법규는 공식적으로 선정된 성구(聖句)였다. New Hacker's Dictionary의 저자인 에릭 레이몬드에 따르면, 이 단어는 그리스와 라틴 어원에서 "갈대"를 의미했으며, 일정한 길이의 갈대는 표준 척도로 사용되었다고 한다. 음악이나 문학과 같은 일부 지식 영역에서, "canon"은 모든 사람들이 공부하는 주요 저작품을 의미한다. 이 용어들은 때로 프로그래밍 인터페이스가 특정한 표준을 따르는지, 아니면 전례를 따르는지, 또는 그런 것들로부터 무관한지 여부를 식별하기 위해 사용된다. |
CIO (Chief Information Officer) ; 정보관리 책임자 (0) | 2010.11.08 |
---|---|
checksum ; 체크섬 (0) | 2010.11.05 |
cache ; 캐시 (0) | 2010.11.05 |
byte ; 바이트 (0) | 2010.11.05 |
burst ; 버스트 (0) | 2010.11.05 |
cache ; 캐시
캐시란 데이터를 임시로 저장해두는 장소를 말한다. 이를테면, 사용자가 요구한 웹 페이지는 하드디스크 내의 캐시 디렉토리에 저장된다. 이런 방법으로, 사용자가 최근에 열어본 페이지로 다시 돌아왔을 때 브라우저는 시간을 줄이고 네트웍에 추가 부담을 덜기 위해, 원래의 서버에서 정보를 찾아오는 대신에 캐시로부터 데이터를 가져오는 것이다. 컴퓨터는 운영상의 수준에 따라 몇가지 캐시들을 유지하는데, 캐시 메모리나 디스크 캐시 등이 바로 그것이다. 또한 캐시는 같은 정보를 여러 개의 서버에 분산시켜놓고 주기적으로 최신의 것으로 갱신시키는 방법을 통해 인터넷 정보에 대해서도 구현될 수 있다. 전반적으로 알려져 있는 캐시의 종류들에는 다음과 같은 것들이 있다:
|
checksum ; 체크섬 (0) | 2010.11.05 |
---|---|
canonical and non-canonical (0) | 2010.11.05 |
byte ; 바이트 (0) | 2010.11.05 |
burst ; 버스트 (0) | 2010.11.05 |
buffer ; 버퍼 (0) | 2010.11.04 |
byte ; 바이트
대부분의 컴퓨터 시스템에서, 8 비트 길이를 가지는 정보의 기본 단위를 바이트라고 한다. 영어와 숫자 그리고 특수문자(아스키 문자표에 있는) 등의 경우 한 글자를 표현하는데 1 바이트가 필요하지만, 한글이나 한자 등은 한 글자를 표현하는데 2 바이트가 소요된다. 바이트는 또한 활용 목적에 따라 - 좀더 큰 단위로 사용될 필요가 있을 때 - 비트 스트링(string of bits)을 유지할 수 있다 (예를 들면, 이미지를 표현하는 프로그램을 위한 시각적 이미지를 구성하고 있는 연속된 비트들이 필요할 때). 어떤 컴퓨터 시스템에서는 4 바이트를 1 워드로 구성함으로써, 프로세서가 보다 효율적으로 각 명령어를 읽고 처리할 수 있도록 설계되지만, 어떤 컴퓨터 프로세서들은 2 바이트 또는 1 바이트 명령어를 취급할 수 있다. 바이트는 표기할떄는 영문 대문자 "B"를 쓰고, 소문자 "b"는 대개 비트를 나타낸다. 컴퓨터 저장장치는 그 크기를 보통 바이트 단위로 산정하는데, 예를 들어 850 MB 하드디스크에는 통상 850,000,000 바이트 정도의 정보를 담을 수 있다. 56 Kbps 모뎀은 1 초에 56,000 비트를 전송하는 속도로 동작한다 (저장공간은 바이트 단위로, 전송용량은 초당 비트 수로 산정한다). |
canonical and non-canonical (0) | 2010.11.05 |
---|---|
cache ; 캐시 (0) | 2010.11.05 |
burst ; 버스트 (0) | 2010.11.05 |
buffer ; 버퍼 (0) | 2010.11.04 |
BSRAM (Burst Static Random Access Memory) (0) | 2010.11.04 |
burst ; 버스트
버스트는 정보기술의 여러 가지 상황에서 사용되는 용어로서, 간헐적으로 특정 량의 데이터를 주고받는 것을 의미한다. 이 용어는 "스트림"이라든가, "연속적인", "고른 보조로" 등의 용어와 대비될 수 있다. 일반적으로, 버스트 동작에는 버스트를 일으키는 어떤 시초나 발단이 트리거에 도달했음을 은연중에 암시한다. 버스트 운영은 간헐적인 동작이지만, 개개의 기술에 따라 그 속도는 규칙적이거나 또는 불규칙적일 수 있다.
cache ; 캐시 (0) | 2010.11.05 |
---|---|
byte ; 바이트 (0) | 2010.11.05 |
buffer ; 버퍼 (0) | 2010.11.04 |
BSRAM (Burst Static Random Access Memory) (0) | 2010.11.04 |
broadband ; 광대역 (0) | 2010.11.04 |
buffer ; 버퍼
버퍼는 속도 차이가 있는 하드웨어 장치들, 또는 우선 순위가 다른 프로그램의 프로세스들에 의해 공유되는 데이터 저장소를 말한다. 버퍼는 각 장치나 프로세스가 상대방에 의해 정체되지 않고 잘 동작할 수 있도록 해준다. 효율적인 버퍼를 만들기 위해서는, 버퍼의 크기를 상황에 맞게 잘 설계하고, 데이터를 버퍼로 집어넣거나 빼내기 쉽도록 우수한 알고리즘을 개발하는 것이 중요하다. "데이터의 중간 저장소"라는 측면에서 버퍼는 캐시와 마찬가지이지만, 캐시가 어떤 작업의 속도를 증진시키기 위해 존재하는데 비해, 버퍼는 개별 작업들 간의 협동을 지원하기 위해 존재한다는 차이가 있다. 이 용어는 프로그래밍과 하드웨어 분야 모두에 사용될 수 있다. |
byte ; 바이트 (0) | 2010.11.05 |
---|---|
burst ; 버스트 (0) | 2010.11.05 |
BSRAM (Burst Static Random Access Memory) (0) | 2010.11.04 |
broadband ; 광대역 (0) | 2010.11.04 |
BPR (Business Process Re-engineering) ; 업무 재설계 (0) | 2010.11.04 |
BSRAM (Burst Static Random Access Memory)
BSRAM[비에스램]은 SynchBurst SRAM이라고도 불리는데, 시스템 클록 또는 어떤 경우 캐시 버스의 클록에 동기화된다. 이것은 메모리를 참조하는 어떠한 장치와도 쉽게 동기화할 수 있게 해주며, 액세스 대기 시간을 줄여준다. BSRAM은 펜티엄 II 마이크로프로세서 칩셋의 L2 캐시 메모리로 사용된다. |
burst ; 버스트 (0) | 2010.11.05 |
---|---|
buffer ; 버퍼 (0) | 2010.11.04 |
broadband ; 광대역 (0) | 2010.11.04 |
BPR (Business Process Re-engineering) ; 업무 재설계 (0) | 2010.11.04 |
bottleneck ; 병목현상 (0) | 2010.11.04 |
broadband ; 광대역
브로드밴드는 주파수 분할 다중화 기법(FDM)을 이용하여, 하나의 전송매체에 여러 개의 데이터 채널을 제공하는 통신관련 용어이다. TV나 라디오 등을 포함하여 많은 전송 매체에서 광대역을 사용하고 있는데 일반적으로 100 kHz 이상의 반송 주파수를 사용한다.buffer ; 버퍼 (0) | 2010.11.04 |
---|---|
BSRAM (Burst Static Random Access Memory) (0) | 2010.11.04 |
BPR (Business Process Re-engineering) ; 업무 재설계 (0) | 2010.11.04 |
bottleneck ; 병목현상 (0) | 2010.11.04 |
sms (0) | 2010.07.13 |
BPR (Business Process Re-engineering) ; 업무 재설계
BPR[비피알]은 1990년대 초 미국에서 제창한 개념으로서, 사업활동을 영위하는 조직의 측면에 있어, 작업을 개선하고 자원의 사용을 보다 효율적으로 만들기 위하여, 하나의 목적으로 처음부터 다시 근본적인 변화를 만드는 것을 의미한다. BPR은 업무 프로세스의 근본적인 재고(再考)가 수반되며, 원가, 서비스품질, 직원들의 활력 등과 같은 중대한 지표들이나 또는 그 모두를 강화하기 위한 업무활동의 재설계로 이어진다. 일반적으로 BPR의 개념에는 데이터를 조직화하고, 방향을 설정하기 위하여 컴퓨터나 정보기술을 사용하는 것이 포함된다. |
BSRAM (Burst Static Random Access Memory) (0) | 2010.11.04 |
---|---|
broadband ; 광대역 (0) | 2010.11.04 |
bottleneck ; 병목현상 (0) | 2010.11.04 |
sms (0) | 2010.07.13 |
1 (0) | 2010.07.07 |
bottleneck ; 병목 현상
병목은 처리 중인 전체 프로세스가 갑자기 느려지거나 정지하는 원인이 되는 장소를 말한다. 예를 들어, 비록 ISP가 보장한 인터넷 접속속도가 56 Kbps이라도, 사용자의 모뎀이 14.4 Kbps의 속도 밖에는 낼 수 없다면, 바로 그 모뎀이 전체 성능을 떨어뜨리는 주 요인으로서, "병목" 부분이라고 생각할 수 있다. 병목이라는 단어는 병 속에 담긴 액체가 너무 빨리 나오지 않도록 하기 위해 좁게 만들어 놓은 주둥이 부분을 가리킨다. 그러나 정보기술에서의 병목 현상이란 전체 처리 과정을 느리게 만드는 경향이 있는 프로세스 내의 한 부분을 가리키는 말로 사용된다.
broadband ; 광대역 (0) | 2010.11.04 |
---|---|
BPR (Business Process Re-engineering) ; 업무 재설계 (0) | 2010.11.04 |
sms (0) | 2010.07.13 |
1 (0) | 2010.07.07 |
Refactoring - Martin P. (0) | 2010.04.26 |
자주 받는 질문중의 하나는 “AIDL의 정확한 문법이 어떻게 되는가?” 입니다. 안드로이드의 문서에는 예제 형태로만 설명되어 있을 뿐 형식화된 문법이 제시되지 않고 있습니다. 대충 알고 대충 써라? 천만의 말씀.
안드로이드(Android) 1.6 AIDL의 BNF Grammar 입니다. Yacc 문법을 따릅니다.
document: document_items | headers document_items ; headers: package | imports | package imports ; package: PACKAGE ; imports: IMPORT | IMPORT imports ; document_items: | document_items declaration ; declaration: parcelable_decl | interface_decl ; parcelable_decl: PARCELABLE IDENTIFIER ';' ; interface_header: INTERFACE | ONEWAY INTERFACE ; interface_decl: interface_header IDENTIFIER '{' interface_items '}' ; interface_items: | interface_items method_decl ; method_decl: type IDENTIFIER '(' arg_list ')' ';' | ONEWAY type IDENTIFIER '(' arg_list ')' ';' ; arg_list: | arg | arg_list ',' arg ; arg: direction type IDENTIFIER ; type: IDENTIFIER | IDENTIFIER ARRAY | GENERIC ; direction: | IN | OUT | INOUT ;
PARCELABLE, INTERFACE, IN, OUT, INOUT, ONEWAY 는 각각 키워드(Keyword) parcelable, interface, in, out, inout, oneway를 뜻하고, IMPORT, PACKAGE 는 각각 import, package 문장 전체를 뜻합니다. ARRAY 는 하나 이상의 []를 뜻하고, GENERIC 은 Collection<Object,String>과 같은 Java Generic 표현을 뜻합니다. IDENTIFIER 는 대략 Java 의 클래스 명으로 쓸 수 있는 문자열이라고 보시면 됩니다. 주석 관련 구문 요소들은 생략했습니다.
SDK 의 AIDL 설명에는 나오지 않지만, oneway 키워드를 인터페이스 또는 메쏘드 앞에 붙일 수 있음을 알 수 있습니다. One-way call 에 대한 설명은 android.os.IBinder.FLAG_ONEWAY 에 대한 SDK 문서에 등장합니다. 비록 AIDL 에서의 사용법을 설명하고 있지는 않지만, 메쏘드 실행이 끝나기를 기다리지 않고 호출 즉시 복귀하는 방법을 제공하고 있음을 알 수 있습니다. AIDL 에서 oneway 로 지정한 메쏘드들의 Proxy 는 모두 transact() 를 호출할 때 FLAG_ONEWAY 를 포함하게 됩니다. 인터페이스에 oneway 를 지정하면 모든 메쏘드에 oneway 를 지정한 효과가 발생합니다. 다중 배열은 지원되는 반면 인터페이스 계승은 지원되지 않음을 확인할 수 있습니다.
Android Flow Diagram (0) | 2010.07.06 |
---|---|
JNI (0) | 2010.07.06 |
Android Bitmap Object Resizing Tip (0) | 2010.07.06 |
Handler (0) | 2010.07.06 |
aidl (0) | 2010.07.06 |
[출처] PHP 정규표현식 정리 |작성자 뮤즈
-----------------------------------------------------------------------------------
Regular Expressions
메타 문자 : 정규표현식에서 특별한 의미를 가지는 문자
정규표현식에서 메타문자 및 기호문자를 찾고자하는 문자에 대응하려면 "\"(escape)를 붙혀 사용한다.
모든 문자 : .(마침표) - 모든 문자에 대응되는 한 문자
공백 문자 : \n, \r, \t, \f-form feed, \v-vertical tab
특별한 문자 형태
숫자와 숫자 아닌문자 : \d - [0-9], \D - [^0-9]
영숫자 문자와 영숫자 문자가 아닌 문자 : \w - [a-zA-Z0-9_], \W - [^a-zA-Z0-9_]
공백문자와 공백이 아닌문자 : \s - [\f\n\r\t\v], \S - [^\f\n\r\t\v]
16진수 8진수 : \x, \0
* 유용한 정규 표현식 예
- IP : (((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))\.){3}((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))
- URL : https?://(\w*:\w*@)?[-\w.]+(:\d+)?(/([\w/_.]*(\?\S+)?)?)?
- Email : (\w+\.)*\w+@(\w+\.)+[A-Za-z]+
- HTML 주석 : <!-{2,}.*?-{2,}>
- 주민등록번호 : \d{2}(0[1-9]|1[0-2])(0[1-9]|[12][0-9]|3[01])-[1-4]\d{6}
- 한글 : [가-힣]
- 유니코드 : \ucodenumber
용어정리 (SDK, JDK, J2SE, J2SDK , J2ME , J2EE , JRE) (0) | 2010.11.10 |
---|---|
객체지향 프로그래밍의 4대 특징 (0) | 2010.11.10 |
abstract와 interface (0) | 2010.07.01 |
Scanner, StringTokenizer, DecimalFormat, ChoiceFormat, MessageFormat (0) | 2010.05.25 |
HashMap, TreeMap, Properties (0) | 2010.05.25 |
make 강좌
소스 한두 개로 이루어진 C/C++ 언어 교양과목 과제물을 제출하는 것이 아니라면 약간만 프로젝트가 커져도 소스는 감당할 수 없을 정도로 불어나게 되고 그것을 일일이 gcc 명령행 방식으로 처리한다는 것은 상당히 곤역스러운 일입니다.
그래서 하나의 프로젝트를 효율적으로 관리하고 일관성있게 관리하기 위하여 Makefile 이라는 형식을 사용하고 make 라는 유틸리티를 사용합니다.
여러분이 리눅스에서 소스 형태로 되어 있는 것을 가져와서 컴파일하게 되면 보통 마지막에는 make 라는 명령, 또는 make <어쩌구> 이런 식으로 치게 됩니다.
make 라는 유틸리티는 보통 현재 디렉토리에 Makefile 또는 makefile 이라는 일정한 규칙을 준수하여 만든 화일의 내용을 읽어서 목표 화일(target)을 만들어냅니다. Makefile의 이름을 다르게 명시하고 싶을 때는 다음과 같이 합니다.
$ make -f Makefile.linux
보통 멀티플랫폼용 소스들은 Makefile.solaris, Makefile.freebsd, Makefile.hp 이런 식으로 Makefile 을 여러 개 만들어두는 경향이 있지요. 또는 적절하게 만들어두어 다음과 같이 make <플랫폼> 라는 식으로 하면 컴파일되도록 하기도 합니다.
$ make linux
이런 일은 보통의 관례일 뿐이죠. 더 예를 들어보자면 이런 식입니다. 우리가 커널 컴파일 작업할 때를 보십시요.
$ make config /* 설정 작업을 한다 */ $ make dep /* 화일 의존성을 검사한다 */ $ make clean /* 만든 화일들을 지우고 깨긋한 상태로 만든다 */ $ make zImage /* zImage(압축커널)를 만든다 */ $ make zlilo /* 커널을 만들고 LILO를 설정한다 */ $ make bzImage /* bzImage(비대압축커널)를 만든다 */ $ make modules /* 커널 모듈을 만든다 */ $ make modules_install /* 커널 모듈을 인스톨한다 */
복잡한 것같아도 우리는 항상 make, make, make ... 일관성있게 make 라고만 쳐주면 됩니다. ^^ 분량이 작은 소스들의 경우에는 일반적으로 다음만 해도 되는 경우가 많죠.
$ make 또는 make all $ make install
영어권에 사는 사람들에게는 더욱 친밀하게 느껴질 겁니다. 그렇겠죠? ``만들라!''라는 동사를 사용하고 있는 것이고 그 다음에는 그들의 정상적인 어순에 따라 목적어가 나오죠.
$ make install.man
또한 관례상 ``맨페이지'' 같은 것은 별도로 인스톨하도록 배려하는 경우가 많습니다. 프로그램에 대해 잘 아는 사람이라면 맨페이지를 자질구레하게 설치하고 싶지 않을 때도 많으니까요.
다른 사람에게 공개하는 소스라면 더욱 make 를 사용해야 합니다. 그들뿐 아니라 여러분 자신도 make 라고만 치면 원하는 결과가 나올 수 있도록 하는 것이 좋습니다. 많은 소스를 작성하다 보면 여러분 스스로도 까먹기 쉽상입니다.
일단 make를 사용하는 일반적인 관례를 익히는 것이 중요하다고 봅니다. 리눅스 배포판 패키지만 설치하지 마시고 적극적으로 소스를 가져다 컴파일해보십시요. 실력이든 꽁수든 늘기 시작하면 여러분은 더욱 행복해지실 수 있습니다. =)
일관성있게 make라고만 치면 모든 일이 술술 풀려나가도록 하는 마술은 Makefile이라는 것을 어떻게 여러분이 잘 만들어두는가에 따라 결정됩니다. 바로 이 Makefile 을 어떻게 만드는지에 대하여 오늘 알아봅니다.
$ gcc -o foo foo.c bar.c
여기서 foo 라는 실행화일은 foo.c, bar.c 라는 2 개의 소스로부터 만들어지고 있습니다.
여러분이 지금 계속 코딩을 하고 있는 중이라면 이 정도쯤이야 가상콘솔 또는 X 터미널을 여러 개 열어두고 편집하면서 쉘의 히스토리 기능을 사용하면 그만이지만 하루 이틀 계속 해간다고 하면 곤역스러운 일이 아닐 수 없습니다.
자, 실전으로 들어가버리겠습니다. vi Makefile 해서 만들어봅시다. ( 편집기는 여러분 마음 )
foo: foo.o bar.o gcc -o foo foo.o bar.o foo.o: foo.c gcc -c foo.c bar.o: bar.c gcc -c bar.c
입력하는데 주의하실 것이 있습니다. 자, 위 화일을 보십시요. 형식은 다음과 같습니다.
목표: 목표를 만드는데 필요한 구성요소들... 목표를 달성하기 위한 명령 1 목표를 달성하기 위한 명령 2 ...
Makefile은 조금만 실수해도 일을 망치게 됩니다.
맨 첫번째 목표인 foo 를 살펴보죠. 맨 첫 칸에 foo: 라고 입력하고 나서 foo가 만들어지기 위해서 필요한 구성요소를 적어줍니다. foo가 만들어지기 위해서는 컴파일된 foo.o, bar.o 가 필요합니다. 각 요소를 구분하는데 있어 콤마(,) 같은 건 사용하지 않고 공백으로 합니다.
중요! 중요! 그 다음 줄로 넘어가서는 <탭>키를 누릅니다. 꼭 한 번 이상은 눌러야 합니다. 절대 스페이스키나 다른 키는 사용해선 안됩니다. 목표 화일을 만들어내기 위한 명령에 해당하는 줄들은 모두 <탭>키로 시작해야 합니다. Makefile 만들기에서 제일 중요한 내용입니다. <탭>키를 사용해야 한다는 사실, 바로 이것이 중요한 사실입니다.
foo를 만들기 위한 명령은 바로 gcc -o foo foo.o bar.o 입니다.
다시 한 번 해석하면 이렇습니다. foo 를 만들기 위해서는 foo.o와 bar.o가 우선 필요하다.( foo: foo.o bar.o )
일단 foo.o, bar.o 가 만들어져 있다면 우리는 gcc -o foo foo.o bar.o 를 실행하여 foo 를 만든다.
자, 이제부터 사슬처럼 엮어나가는 일만 남았습니다.
foo를 만들려고 하니 foo.o와 bar.o 가 필요합니다!
그렇다면 foo.o는 어떻게 만들죠?
foo.o: foo.c gcc -c foo.c
바로 이 부분입니다. foo.o는 foo.c를 필요로 하며 만드는 방법은 gcc -c foo.c입니다.
그 다음 bar.o 는 어떻게 만들죠?
bar.o: bar.c gcc -c bar.c
이것을 만들려면 이것이 필요하고 그것을 만들기 위해서는 또 이것이 필요하고...
소스를 만들어서 해봅시다.
extern void bar ( void ); int main ( void ) { bar (); return 0; }
#include <stdio.h> void bar ( void ) { printf ( "Good bye, my love.\n" ); }
Makefile을 위처럼 만들어두고 그냥 해보죠.
$ make 또는 make foo gcc -c foo.c gcc -c bar.c gcc -o foo foo.o bar.o
명령이 실행되는 순서를 잘 보십시요. 여기서 감이 와야 합니다. ^^
$ ./foo Good bye, my love.
다시 한 번 실행해볼까요?
$ make make: `foo' is up to date.
똑똑한 make는 foo를 다시 만들 필요가 없다고 생각하고 더 이상 처리하지 않습니다.
이번에는 foo.c 를 약간만 고쳐봅시다. return 0; 라는 문장을 exit (0); 라는문장으로 바꾸어보죠. 그리고 다시 한 번 다음과 같이 합니다.
$ make gcc -c foo.c gcc -o foo foo.o bar.o
자, 우리가 원하던 결과입니다. 당연히 foo.c 만 변화되었으므로 foo.o 를 만들고 foo.o가 갱신되었으므로 foo도 다시 만듭니다. 하지만 bar.c는 아무변화를 겪지 않았으므로 이미 만들어둔 bar.o 는 그대로 둡니다.
소스크기가 늘면 늘수록 이처럼 똑똑한 처리가 필요하지요.
$ rm -f foo $ make gcc -o foo foo.o bar.o
이것도 우리가 원하던 결과입니다. foo 실행화일만 살짝 지웠더니 make는 알아서 이미 있는 foo.o, bar.o 를 가지고 foo 를 만들어냅니다. :)
clean: rm -f foo foo.o bar.o
이 두 줄을 위에서 만든 Makefile 뒷부분에 추가해보도록 합시다.
$ make clean rm -f foo foo.o bar.o $ make gcc -c foo.c gcc -c bar.c gcc -o foo foo.o bar.o
make clean이라는 작업 또한 중요한 작업입니다. 확실히 청소를 보장해주어야 하거든요.
make, make clean 이런 것이 되면 상당히 멋진 Makefile 이라고 볼 수 있죠? 이번 clean 에서 보여드리고자 하는 부분은 이런 것입니다.
우리의 머리 속에 clean 이라는 목표는 단지 화일들을 지우는 일입니다.
clean: 옆에 아무런 연관 화일들이 없지요?
그리고 오로지 rm -f foo foo.o bar.o 라는 명령만 있을 뿐입니다. clean이라는 목표를 수행하기 위해 필요한 것은 없습니다. 그러므로 적지 않았으며 타당한 make 문법입니다.
all: foo
이 한 줄을 Makefile 맨 앞에 넣어두도록 합시다.
$ make clean $ make all gcc -c foo.c gcc -c bar.c gcc -o foo foo.o bar.o
이번예는 all 이라는 목표에 그 밑에 나오는 다른 목표만이 들어있을 뿐, 아무런 명령도 없는 경우입니다. 보통 우리는 make all 하면 관련된 모든 것들이 만들어지길 원합니다.
all: foo1 foo2 foo3 foo1: <생략> foo2: <생략> foo3: <생략>
이런 식으로 해두면 어떤 장점이 있는지 알아봅시다.
보통 make all 하면 foo1, foo2, foo3가 모두 만들어집니다. 그런데 어떤 경우에는 foo1만 또는 foo2만을 만들고 싶을 때도 있을 겁니다. 괜히 필요없는 foo3 같은 것을 컴파일하느라 시간을 보내기 싫으므로 우리는 단지 다음과 같이만 할 겁니다.
$ make foo1 $ make foo2
물론 일반적으로 다 만들고 싶을 때는 make all 이라고만 하면 됩니다.
make all 이건 아주 일반적인 관례이지요. 그리고 외우기도 쉽잖아요?
잘 관찰해보시면 어쩌구.c -----------> 어쩌구.o 라는 관계가 매번 등장함을 알 수 있습니다. 이것을 매번 반복한다는 것은 소스 화일이 한 두 개 정도일 때야 모르지만 수십 개가 넘게 되면 정말 곤역스러운 일이라고 하지 않을 수 없지요.
다음과 같은 표현을 Makefile 에서 보는 경우가 많을 겁니다.
.c.o: gcc -c ${CFLAGS} $<
여기서 .c.o 의 의미를 생각해보겠습니다. ".c 를 입력화일로 받고 .o 화일을 만든다"
gcc -c ${CFLAGS} $<
이 문자을 보면 일단 눈에 띄는 것은 ${CFLAGS}라는 표현과 $< 라는 암호와도 같은 표현입니다. 여기서는 일단 $< 라는 기호의 의미를 알아보겠습니다.
유닉스에서 쉘을 잘 구사하시는 분들은 눈치채셨을 겁니다. 작다 표시(<)는 리다이렉션에서 입력을 의미하는 것을 아십니까? 그렇다면 $< 는 바로 .c.o 라는 표현에서 .c 즉 C 소스 화일을 의미합니다.
예를 들어 foo.c 가 있다면 자동으로
gcc -c ${CFLAGS} foo.c
가 수행되며 gcc 에 -c 옵션이 붙었으므로 foo.o 화일이 만들어질 것입니다.
.c.o 라는 전통적인 표현 말고 GNU 버전( 우리가 리눅스에서 사용하는 것은 바로 이것입니다 )의 make 에서 사용하는 방법을 알아봅시다.
위에서 예로 든 것을 GNU 버전의 make 에서 지원하는 확장문법을 사용하면 다음과 같습니다.
%.o: %.c gcc -c -o $@ ${CFLAGS} $<
그냥 설명 전에 잘 살펴보시기 바랍니다.
우리가 위에서 알아보았던 표준적인 .c.o 라는 꼬리말 규칙(Suffix rule)보다 훨씬 논리적이라는 것을 발견하셨습니까?
우리가 바로 전 강의에서 main.o : main.c 이런 식으로 표현한 것과 같은 맥락이지요? 이것을 우리는 패턴 규칙(Pattern rule)이라고 부릅니다. 콜론(:) 오른쪽이 입력 화일이고 왼쪽이 목표 화일입니다. 화일명 대신 퍼센트(%) 문자를 사용한 것만 유의하면 됩니다. 여기서 foo.c 라는 입력화일이 있다면 % 기호는 foo 만을 나타냅니다.
gcc -c -o $@ ${CFLAGS} $<
라는 표현을 해석해봅시다. ( 후 마치 고대 문자판을 해석하는 기분이 안드십니까? ^^ )
$< 는 입력화일을 의미하고 $@ 은 출력화일을 의미합니다. .c.o와 같은 꼬리말 규칙과 별 다를 바 없다고 생각하실 지 모르나 -o $@ 를 통하여 .o 라는 이름 말고 전혀 다른 일도 해낼 수 있습니다.
다음 예는 그냥 이런 예가 있다는 것만 한 번 보아두시기 바랍니다.
%_dbg.o: %.c gcc -c -g -o $@ ${CFLAG} $< DEBUG_OBJECTS = main_dbg.o edit_dbg.o edimh_dbg: $(DEBUG_OBJECTS) gcc -o $@ $(DEBUG_OBJECTS)
%_dbg.o 라는 표현을 잘 보십시요. foobar.c 라는 입력화일(%.c)이 있다면 % 기호는 foobar 를 가리키므로 %_dbg.o 는 결국 foobar_dbg.o 가 됩니다.
$< 입력 화일을 의미합니다. 콜론의 오른쪽에 오는 패턴을 치환합니다. $@ 출력 화일을 의미합니다. 콜론의 왼쪽에 오는 패턴을 치환합니다. $* 입력 화일에서 꼬리말(.c, .s 등)을 떼넨 화일명을 나타냅니다.
역시 GNU 버전이라는 생각이 들지 않으시는지요?
앞에서도 잠깐씩 나온 ${CFLAGS} 라는 표현을 보도록 합시다.
gcc 옵션도 많이 알고 make을 능수능란하게 다룰 수 있는 사람들은 다음과 같이 해서 자신의 프로그램에 딱 맞는 gcc 옵션이 무엇인지 알아내려고 할 것입니다.
$ make CFLAGS="-O4" $ make CFLAGS="-g"
이제 매크로에 대한 이야기를 나눠볼까 합니다. 이 이야기를 조금 해야만 위의 예를 이해할 수 있다고 보기 때문입니다. 그냥 시험삼아 해보십시다. 새로운 것을 배우기 위해서는 꼭 어떤 댓가가 와야만 한다는 생각을 버려야겠지요?
myprog: main.o foo.o gcc -o $@ main.o foo.o
이것을 괜히 어렵게 매크로를 이용하여 표현해보기로 하겠습니다.
OBJECTS = main.o foo.o myprog: $(OBJECTS) gcc -o $@ $(OBJECTS)
여러분은 보통 긴 Makefile을 훔쳐 볼 때 이런 매크로가 엄청나게 많다는 것을 보신 적이 있을 겁니다. ^^
ROOT = /usr/local HEADERS = $(ROOT)/include SOURCES = $(ROOT)/src
예상하시듯 위에서 HEADERS는 당연히 /usr/local/include가 되겠지요?
다음과 같은 문장도 있습니다.
ifdef XPM LINK_DEF = -DXPM endif
$ make XPM=yes
이렇게 하면 ifdef endif 부분이 처리됩니다.
자, make CFLAGS="-O" 이런 명령을 한 번 봅시다. ${CFLAGS}에서 {} 표현은 유닉스 쉘에서 변수값을 알아낼 때 쓰는 표현입니다. CFLAGS 값을 여러분이 Makefile에 고정적으로 집어넣지 않고 그냥 make 만 실행하는 사람에게 선택권을 주기 위해서 사용하거나 자기 스스로 어떤 옵션이 제일 잘 맞는지 알아보기 위해서 사용합니다. 다른 옵션으로 컴파일하는 것마다 일일이 다른 Makefile을 만들지 말고 가변적인 부분을 변수화하는 것이 좋습니다.
target: cd obj HOST_DIR=/home/e mv *.o $HOST_DIR
하나의 목표에 대하여 여러 명령을 쓰면 예기치 않은 일이 벌어집니다. 기술적으로 말하자면 각 명령은 각자의 서브쉘에서 실행되므로 전혀 연관이 없습니다. -.- cd obj 도 하나의 쉘에서 HOST_DIR=/home/e도 하나의 쉘에서 나머지도 마찬가지입니다. 각기 다른 쉘에서 작업한 것처럼 되므로 cd obj 했다 하더라도 다음번 명령의 위치는 obj 디렉토리가 아니라 그대로 변함이 없이 현재 디렉토리입니다. 세번째 명령에서 HOST_DIR 변수를 찾으려 하지만 두번째 명령이 종료한 후 HOST_DIR 변수는 사라집니다.
target: cd obj ; \ HOST_DIR=/hom/e ; \ mv *.o $$HOST_DIR
이렇게 적어주셔야 합니다. 세미콜론으로 각 명령을 구분하지요. 처음 두 줄의 마지막에 쓰인 역슬래쉬(\) 문자는 한 줄에 쓸 것을 여러 줄로 나누어 쓴다는 것을 나타내고 있습니다.
주의! 세번째 줄에 $HOST_DIR이 아니라 $$HOST_DIR인 것을 명심하십시요. 예를 하나 들어보죠. ^^
all: HELLO="안녕하세요?";\ echo $HELLO
Makefile의 내용을 이렇게 간단하게 만듭니다.
$ make HELLO="안녕하세요?";\ echo ELLO ELLO <verb> 우리가 원하는 결과가 아니죠? $HELLO를 $$HELLO로 바꾸어보십시요. <verb> $ make HELLO="안녕하세요?";\ echo $HELLO 안녕하세요?
all: @HELLO="안녕하세요?"; echo $$HELLO
명령의 맨 처음에 @ 문자를 붙여봅시다.
$ make 안녕하세요?
Makefile에 대한 내용은 이것보다 훨씬 내용이 많습니다. 하지만 모든 것을 다 알고 시작할 수는 없겠지요? 이 정도면 어느 정도 충분하게 창피하지 않을 정도의 Makefile을 만들 수 있습니다.
참고로 autoconf/automake라고 하는 아주 훌륭한 GNU make 유틸리티를 시간나면 배워보시는 것도 좋습니다.
시간을 내서 리눅스에서의 C 프로그래밍에 필요한 다른 여러 가지 유틸리티들( 간접적이든 직접적이든 grep, awk, rcs, cvs 등 )의 간단/실전 사용법도 올려드릴까 생각 중입니다. ^^
gcc 강좌
명령행 상태에서 다음과 같이 입력해봅시다. 여러분이 사용하같고 있는 gcc 버전은 알아두고 시작하셔야겠죠?
[yong@redyong yong]$ gcc -v Reading specs from /usr/lib/gcc-lib/i386-linux/2.7.2.1/specs gcc version 2.7.2.1 [yong@redyong yong]$
gcc -v 이라고 입력하니까 ``Reading specs from..'' 이라같고 말하면서 그 결과값을 ``gcc version 2.7.2.1''이라고 말해주고 있습니다. 자, 어디서 gcc 에 대한 정보를 읽어오는지 봅시다.
/usr/lib/gcc-lib/i386-linux/2.7.2.1/specs
gcc 를 여러분이 소스를 가져다 손수 설치해보신 적은 없을 것입니다. 보통은 바이너리 패키지로 된 것을 가져다 설치하지요. 나중에 정말 휴일에 너무 심심하다 싶으면 gcc 의 소스를 가져와서 컴파일해보십시요. 참, 재미있는 경험이 될 것입니다. 이미 여러분이 갖고 있는 gcc 를 가지고 새로운 gcc 를 컴파일하여 사용합니다. C 컴파일러를 가지고 새 버전의 C 컴파일러를 컴파일하여 사용한다! 이런 재미있는 경험을 또 어디서 해보겠습니까?
gcc 패키지가 어떤 것으로 구성되어 있는지.. gcc 가 제대로 설치되어 있는지 알아보면 좋겠죠?
다음과 같습니다.
/lib/cpp -----------> /usr/lib/gcc-lib/i386-linux/2.7.2.1/cpp ( 링크임 ) /usr/bin/cc -----------> gcc ( 링크임 ) /usr/bin/gcc C 컴파일러 ``front-end'' /usr/bin/protoize /usr/bin/unprotoize /usr/info/cpp.info-*.gz GNU info 시스템을 이용하는 화일들 /usr/info/gcc.info-*.gz /usr/lib/gcc-lib
마지막 /usr/lib/gcc-lib 디렉토리에 아래에 gcc 에 관한 모든 내용이 설치됩니다.
보통 다음과 같은 디렉토리 구조를 가집니다.
/usr/lib/gcc-lib/<플랫폼>/< gcc 버전 >
보통 우리는 리눅스를 i386 ( 인텔 환경 )에서 사용하고 있으므로 다음과 같이 나타날 것입니다.
/usr/lib/gcc-lib/i386-linux/2.7.2.1
( i386-linux, i486-linux, i586-linux 는 각기 다를 수 있습니다. 하지만 상관없는 내용입니다. 미친 척 하고 다른 이름을 부여할 수도 있습니다. )
그럼 계속 해서 /usr/lib/gcc-lib 밑의 내용을 살펴보죠.
/usr/lib/gcc-lib/i386-linux/2.7.2.1/cc1 /usr/lib/gcc-lib/i386-linux/2.7.2.1/cpp /usr/lib/gcc-lib/i386-linux/2.7.2.1/include/*.h /usr/lib/gcc-lib/i386-linux/2.7.2.1/libgcc.a /usr/lib/gcc-lib/i386-linux/2.7.2.1/specs
cc1이 진짜 C 컴파일러 본체입니다. gcc 는 단지 적절하게 C 인가, C++ 인가 아니면 오브젝티브 C 인가를 검사하고 컴파일 작업만이 아니라 ``링크''라는 작업까지 하여 C 언어로 프로그램 소스를 만든 다음, 프로그램 바이너리가 만들어지기까지의 모든 과정을 관장해주는 ``조정자'' 역할을 할 뿐입니다.
C 컴파일러는 cc1, C++ 컴파일러는 cc1plus, 오브젝티브 C 컴파일러는 cc1obj 입니다. 여러분이 C++/오브젝티브 C 컴파일러를 설치하셨다면 cc1plus, cc1obj 라는 실행화일도 찾아보실 수 있을 겁니다. cpp 는 "프리프로세서"입니다. #include 등의 문장을 본격적인 cc1 컴파일에 들어 가기에 앞서 먼저(pre) 처리(process)해주는 녀석입니다.
참고로 g++ 즉 C++ 컴파일러( 정확히는 C++ 컴파일러 프론트 엔드 )에 대한 패키지는 다음과 같습니다.
/usr/bin/c++ ---------------------------> g++ 에 대한 링크에 불과함 /usr/bin/g++ /usr/lib/gcc-lib/i386-linux/2.7.2.1/cc1plus ( 진짜 C++ 컴파일러 )
오브젝티브 C 컴파일러 패키지는 다음과 같습니다.
/usr/lib/gcc-lib/i386-linux/2.7.2.1/cc1obj /usr/lib/gcc-lib/i386-linux/2.7.2.1/include/objc/*.h /usr/lib/gcc-lib/i386-linux/2.7.2.1/libobjc.a
구성요소가 어떤 것인지 아셨으니 좀 도움이 되셨을 겁니다.
hello.c 라는 지긋지긋한 소스 하나를 기준으로 설명합니다 ^^
#include <stdio.h> int main ( void ) { (void) printf ( "Hello, Linux Girls! =)\n" ); return 0; }
참고로 제일 간단한 소스는 다음과 같은 것입니다. ^^
main () {}
컴파일을 해보겠습니다! $ 는 프롬프트이지 입력하는 것이 아닌 것 아시죠?
$ gcc hello.c $
무소식이 희소식이라... gcc <C소스 화일명> 이렇게 실행하고 나서 아무런 메시지도 나오지 않고 다음 줄에 프롬프트만 달랑 떨어지면 그것이 바로 컴파일 성공입니다.
여러분은 무심코 다음과 같이 결과 프로그램을 실행시키려 할 것입니다.
$ hello bash: hello: command not found $
예. 땡입니다. ^^
여러분은 다음과 같이 실행시켜야 합니다.
$ ./a.out
맨 앞의 도트 문자(.)는 현재 디렉토리를 의미합니다. 그 다음 디렉토리 구분 문자 슬래쉬(/)를 쓰고 유닉스 C 에서 ``약속한'' C 컴파일러의 출력 결과 바이너리 화일인 a.out 을 써줍니다.
이러한 습관은 아주 중요합니다. 여러분이 현재 디렉토리에 어떤 실행 화일을 만들고 나서 테스트를 해 보려고 한다면 꼭 ./<실행 화일명> 이라고 적어줍니다.
유닉스는 기본적으로 PATH 라는 환경변수에 있는 디렉토리에서만 실행화일을 찾을 뿐입니다. 만약 PATH 라는 환경변수에 현재 디렉토리를 의미하는 도트 문자(.)가 들어있지 않으면 현재 디렉토리의 실행화일은 절대 실행되지 않습니다. 게다가 현재 디렉토리를 PATH 환경 변수에 넣어준다 할 지라도 도스처렁럼 현재 디렉토리를 먼저 찾는다든지 하는 일은 없습니다. 오로지 PATH 에 지정한 순서대로 수행합니다.
실행 바이너리명이 계속 a.out 으로 나오면 좀 곤란하죠. 뭐 물론 mv 명령으로 a.out 의 이름을 바꾸면 되지만서도...
-o 옵션( 소문자 o 임! )은 출력(output) 화일명을 정하는 옵션입니다. 위에서 우리는 hello.c 라는 소스를 가지고 일반적으로 hello 라는 이름의 실행화일을 만들고 싶어할 것입니다.
$ gcc -o hello hello.c ^^^^^^^^
또는 다음과 같이 순서를 바꿔도 무방합니다.
$ gcc hello.c -o hello ^^^^^^^^
워낙 유닉스 쪽은 명령행 방식이 전통적으로 주된 방식이라 명령행에서 하는 일은 뛰어납니다.
당연히 실행을 하려면 ./hello 라고 하셔야 합니다. 결과는 다음처럼 나오겠지요?
$ ./hello Hello, Linux Girls! =) $
제일 안좋은 습관 중 하나가 바로 테스트용으로 만든 소스라고 다음처럼 하는 것입니다.
$ gcc -o test test.c $ test $
문제를 알아내기 위하여 위에서 작성한 hello.c 를 컴파일/링크해봅시다.
$ gcc -o test hello.c $ test $
원하는 문자열이 출력되지 않았습니다. -.-
$ ./test Hello, Linux Girls! =) $
어떤 이유로 오로지 컴파일(compile) 작업만 하고 싶은 경우가 있습니다. 그럴 때는 다음과 같이 합니다.
$ gcc -c hello.c $
그 결과 만들어지는 화일은 전통적으로 hello.c 에서 .c 부분을 떼어내고 .o 를 붙인 화일입니다. 오브젝트 화일, 목적 화일이라고 하지요.
hello.o 라는 화일이 만들어집니다.
여러분은 C 언어로 조금이라도 복잡한 프로그램을 만들기 시작하면 여러 개의 소스로 나누어서 전체 프로그램을 짜게 됩니다. 그럴 때는 각 소스가 전체 기능에 기여하는 특정 기능의 함수들을 가지게 되고 오로지 한 녀석만 main 함수를 가집니다.
만약 어떤 프로그램이 foo.c, bar.c 이렇게 두 개의 소스로 이루어져 있다고 합시다. 이럴 때는 다음과 같이 하는 것이 가능합니다.
$ gcc -o baz foo.c bar.c $ ./baz
$ gcc -c foo.c $ gcc -c bar.c 또는 $ gcc -c foo.c bar.c $ gcc -o baz foo.o bar.o ^^^^^^^^^^^ $ ./baz
위에서 보면 "아니! C 컴파일러에 .c 즉 소스 화일이 아닌 오브젝트 화일도 막 써주나?"라는 생각을 하시게 될 겁니다.
그렇습니다! 왜냐? gcc 는 정확히 말해서 C 컴파일러가 아닙니다. gcc 라는 실행 화일 자체는 "C 컴파일러를 돌리는 녀석"입니다.
더욱 더 정확히 말해보겠습니다.
C 언어는 기본적으로 두 가지 과정을 거쳐야만 실행화일을 만들어냅니다.
1. 과정을 실제로 맡는 것은 cc1 이라는 녀석이고 2. 과정을 맡는 것은 ld 라는 링커(linker)입니다.
gcc 는 상당히 편리한 도구로서 .c, .o 등의 화일명 꼬리말을 보고 적절하게 C 컴파일러와 링커를 불러다가 원하는 실행화일을 만들어줍니다. gcc 는 "컴파일러와 링커를 불러주는 대리인"입니다.
hello.c 를 괜히 어렵게 컴파일/링크해봅시다 ^^
$ gcc -c hello.c ^^^^^^^ $ gcc -o hello hello.o ^^^^^^^
gcc 가 얼마나 똑똑피한 놈인지 알아보죠.
$ gcc -c hello.o
이게 무슨 의미가 있겠습니까? ^^
gcc: hello.o: linker input file unused since linking not done
위와 같이 불평합니다. 링크 과정을 수행하지 않으므로 링커에 대한 입력 화일인 hello.o 를 사용하지 않았다!
#include 문장에서 지정한 헤더 화일이 들어있는 곳을 정하는 옵션입니다. 아주 많이 사용되는 옵션 중 하나입니다.
#include <stdio.h> #include "my_header.h"
전자( <> 문자를 쓴 경우 )는 시스템 표준 헤더 디렉토리인 /usr/include를 기준으로 화일을 찾아서 포함시킵니다. 표준 디렉토리이지요.
후자( "" 문자를 쓴 경우 )는 지금 컴파일러가 실행되고 있는 현재 디렉토리를 기준으로 헤더 화일을 찾습니다.
이 두 디렉토리가 아닌 곳에 대해서는 명시적으로 -I<디렉토리> 로 정해줍니다.
$ gcc -c myprog1.c -I.. $ gcc -c myprog1.c -Iinclude
첫번째는 헤더 화일이 현재 소스 하위 디렉토리(..)에 있다는 뜻이며 두번째는 현재 디렉토리의 include라는 디렉토리에 들어있다는 뜻입니다.
-I 옵션은 얼마든지 여러번 쓸 수 있으며 주어진 순서대로 헤더 화일을 검색합니다.
디렉토리명은 -I 라는 문자 바로 다음에 붙여서 씁니다. 즉 -I <디렉토리>라는 식이 아니라 -I<디렉토리> 입니다. 또한 유닉스에 있어 표준 헤더 화일 디렉토리는 /usr/include 라는 사실을 기억하시기 바랍니다. 또한 리눅스에 있어서는 커널 소스가 아주 중요한데 리눅스 고유의 기능을 쓰는 리눅스용 프로그램의 경우에는 /usr/include/linux, /usr/include/asm, /usr/include/scsi (최신 커널의 경우) 라는 디렉토리가 꼭 있어야 하며 각각은 커널 소스의 헤더 디렉토리에 대한 링크입니다. 따라서 커널 소스를 꼭 설치해두셔야 합니다.
/usr/include/linux --------------> /usr/src/linux/include/linux /usr/include/asm --------------> /usr/src/linux/include/asm /usr/include/scsi --------------> /usr/src/linux/include/scsi
( 위에서 /usr/src/linux/include/asm은 사실 대부분의 경우 /usr/src/linux/include/asm-i386 이라는 디렉토리에 대한 링크입니다 )
각각 linux는 일반적인 C 헤더 화일, asm은 각 아키텍쳐별 의존적인 어셈블리 헤더 화일, 맨 마지막은 SCSI 장치 프로그래밍에 쓰이는 헤더 화일이 들어있는 곳입니다.
일반적으로 커널 소스( 약 6 메가 이상되는 소스 )는 /usr/src 에서 tar, gzip으로 풀어두는 것이 관례입니다.
맨 처음 프로그래밍을 할 때는 그렇게 많이 쓰지는 않는 옵션이지만 여러분이 다른 소스를 가져다 컴파일할 때 아주 많이 보게 되는 옵션이므로 일단 이해는 할 수 있어야겠죠?
옵션을 제대로 이해하기에 앞서 ``라이브러리''라는 것에 대한 이야기를 먼 저 하지 않으면 안될 듯 하군요.
``라이브러리(Library)''라는 것은 개념상 영어 단어 그대로입니다.
무엇인가 유용한 지식을 한 곳에 모아둔 곳이라는 개념이지요.
C 프로그래밍을 하다 보면 반복적으로 사용하게 되는 함수들이 있기
마련이고 그것은 하나의 함수로 떼내어 어디에서든 유용하게 사용할
수 있도록 합니다.
이 함수가 극도로 많이 사용되는 경우에는 ``라이브러리''라는 것으
로 만들어두고 매번 컴파일해둘 필요없이 가져다 사용할 수 있도록
하지요.
라이브러리에 대한 얘기는 다음 번에 또 하게 되겠지만 일단 지금
필요한 지식만 쌓기로 하겠습니다.
일반적으로 관례상 라이브러리는 화일명 끝이 .a 로 끝납니다.
여기서 a 는 Archive 라는 의미일 것입니다.
라이브러리의 예를 들어보도록 하죠. 지금 /usr/lib 디렉토리를 한
번 구경해보십시요. 정말로 많은 라이브러리들이 있지요.
libc.a
libm.a
libdb.a
libelf.a
libfl.a
libg++.a
libg.a
libncurses.a
libreadline.a
libvga.a
등등...
이러한 라이브러리는 우리가 컴파일 과정을 거쳐서 만든 .o 화일을
한 곳에 통들어 관리하는 것에 불과합니다. 따라서 archive 를 의미
하는 .a 라고 이름을 짓게 된 것이죠. 라이브러리는 ``도서관''으로
서 그냥 .o 를 무작위로 집어넣은 것은 아니고 당연히 도서관에는
소장하고 있는 책에 대한 목록(index)을 가지듯 포함되어 있는 .o
에 대한 인덱스(index)를 가지고 있습니다.
라이브러리는 다음과 같이 구성되어 있다고 할 수 있는 것입니다.
라이브러리 = 목차(index) + ( a.o + b.o + c.o + ... )
libc.a 를 가지고 한 번 놀아볼까요? 라이브러리 아카이브를 관리하
는 ar 이라는 GNU 유틸리티를 써보겠습니다.
$ cd /usr/lib
$ ar t libc.a
assert-perr.o
assert.o
setenv.o
ftime.o
psignal.o
mkstemp.o
sigint.o
realpath.o
cvt.o
gcvt.o
ctype-extn.o
ctype.o
<등등... 계속>
$ ar t libc.a | grep printf
iofprintf.o
ioprintf.o
iosprintf.o
iovsprintf.o
iovfprintf.o
printf_fp.o
vprintf.o
snprintf.o
vsnprintf.o
asprintf.o
vasprintf.o
printf-prs.o
reg-printf.o
$
위에서 볼 수 있다시피 .o 화일들이 그 안에 들어있습니다.
<주목>
유닉스에서 라이브러리 이름은 lib 로 시작합니다.
간단하게 라이브러리를 하나 만들어서 사용해보도록 합시다.
이번 예제는 3 개의 화일로 이루어졌습니다.
myfunc.h myfunc.c hello.c
첫번째 myfunc.h 헤더 화일의 내용입니다.
extern void say_hello ( void );
두번째 myfunc.c, 실제 함수 정의부입니다.
#include <stdio.h> #include "myfunc.h" void say_hello ( void ) { printf ( "Hello, Linux guys!\n" ); }
마지막으로 메인 함수(main)가 들어있는 hello.c 입니다.
#include "myfunc.h" int main ( void ) { say_hello (); return 0; }
main 함수에서 say_hello 라는 함수를 사용하게 됩니다. 이 정도야 그냥 이렇게 해버리고 말죠 ^^
$ gcc -o say_linux hello.c myfunc.c
하지만 라이브러리를 만들어보고 시험해보려고 하는 것이므로 일부러 어렵게 한 번 해보기로 하겠습니다.
$ gcc -c myfunc.c $ ar r libmylib.a myfunc.o $ ar s libmylib.a $ ar t libmylib.a myfunc.o $ gcc -o say_linux hello.c -lmylib ^^^^^^^^ ld: cannot open -lmylib: No such file or directory
흠... 처음부터 만만치 않죠? ^^ 실패하긴 했지만 몇 가지를 일단 알아봅시다.
링크(link)할 라이브러리를 명시해주는 옵션이 바로 -l ( 소문자 L ) 옵션입니다.
-I 옵션과 마찬가지로 바짝 붙여서 씁니다. 절대 떼면 안됩니다.
우리는 libmylib.a 라는 라이브러리를 만들어두었습니다. 그것을 사용하기 위해서는 -lmylib 라고 적어줍니다. 라이브러리 화일명에서 어떤 글자들을 떼내고 쓰는지 주목하십시요.
libmylib.a ^^^^^
앞의 lib 를 떼내고 맨 뒤에 붙는 .a 를 떼냅니다.
링크(link)라는 것이 어떤 것이 모르신다면 당장 C 프로그래밍 책을 다시 읽어보시기 바랍니다. 이 글에서 설명할 범위는 아닌 듯 합니다.
ld 는 유닉스에서 사용되는 링커(Linker)입니다. C 프로그램 컴파일의 맨 마지막 단계를 맡게 되지요.
위에서 우리는 다음과 같은 에러 메세지를 만났습니다.
ld: cannot open -lmylib: No such file or directory
자, 이제 배워야 할 옵션은 ``라이브러리의 위치를 정해주는'' -L ( 대문자 L ) 옵션입니다. 사용형식은 -L<디렉토리명> 입니다.
리눅스에서 어떤 라이브러리를 찾을 때는 /lib, /usr/lib, /usr/local/lib와 같은 정해진 장소에서만 찾게 되어 있습니다. 그것은 규칙이지요.
중요한 사실은 아무리 여러분 라이브러리를 현재 작업 디렉토리에 놓아두어도 ld 는 그것을 찾지 않는다는 사실입니다. ld 더러 라이브러리가 있는 장소를 알려주려면 다음과 같이 -L 옵션을 붙이십시요.
$ gcc -o say_linux hello.c -lmylib -L. ^^^
-L. 은 현재 디렉토리에서 라이브러리를 찾으라는 말입니다. -L 옵션은 여러번 줄 수 있습니다.
성공적으로 컴파일되었을 겁니다.
$ ./say_linux Hello, Linux guys!
지금까지 여러분은 gcc 옵션 중 두번째로 중요한 -I, -l, -L 옵션에 대하여 배우셨습니다. 그리고 또한 라이브러리 만들기에 대하여 맛보기를 하였습니다.
시작하면서
세상에서 제일 뛰어난 C 컴파일러 중 하나인 gcc 는 리눅스나 기타 자유 운영체제에 있어 커다란 보배가 아닐 수 없습니다. 우리가 알고 있는 유닉스가 C 언어로 거의 다 만들어졌듯이 리눅스의 모국어는 바로 gcc 입니다.
사실 많은 분들이 리눅스 해커(hacker), 구루(guru)의 경지가 되고 싶어합니다. 그렇게 되길 원하신다면 리눅스용의 모국어인 gcc 를 익히십시요. gcc 를 알면 리눅스를 아는 것이나 다름 없습니다. 사실 C 와 유닉스가 따로 떨어진 것이 아니라 어떻게 보면 일심동체라고 할 수도 있듯이 gcc 와 리눅스는 일심동체라고 봐도 무방합니다.
C 언어! 이는 유닉스와 심지어 마이크로소프트 제품에 이르기까지(어떤 식으로 변질되었든 간에 ) 컴퓨터 세상의 ``만국 공통어''입니다. 여태까지 이러한 언어의 통일을 이뤄낸 것은 C 언어밖에 없습니다. 컴퓨터 언어의 에스페란토어를 지향하는 많은 언어들( 자바, 티클/티케이 )이 나오고 있으나 이는 두고 볼 일입니다. 그리고 그 언어를 구사한다 할 지라도 C 언어는 역시나 ``기초 교양 언어''입니다.
여러분은 리눅스에서 gcc 를 통하여 그 동안 도스/윈도 환경에서 배운 엉터리 C 언어를 잊으셔야 합니다. 감히 말하건데 그것은 C 언어가 아닙니다. C 언어는 만국 공통어야 함에도 불구하고 몇몇 회사들, 도스/윈도와 같은 환경에서 변질되어 각 환경마다 ``새로운 문법''을 배워야 하는 어처구니없는 사태가 벌어졌습니다. 터보 C 와 MS-C를 배우면서 혼란도 많았고 그 뒤에 나온 녀석들은 완전히 다른 놈들이나 다름 없습니다.
지금 리눅스에서 여러분은 C 언어의 ``정통 소림권법''을 익히실 수 있습니다. 기초가 없이 비법만 전수받아 보았자 다른 곳에 가면 수많은 비법을 지닌 무림고수들에게 여지없이 깨지기 마련입니다. 하지만 아무리 괴로와도 처음에 물 길어오는 것, 마당 쓰는 일부터 시작하면 철통같은 신체를 단련하기 때문에 온갖 꽁수 비법으로는 여러분을 헤칠 수 없습니다. 또한 정통 권법을 연마한 사람은 기본기가 갖춰져 있으므로 대련 중에도 상대의 비법을 금방 간파하고 심지어 상대의 비법만마저 자신의 것으로 하기도 합니다. ^^
gcc 는 GNU 프로젝트에 의해 만들어진 작품의 하나로서 그 명성은 하늘을 찌를 듯합니다. GNU 프로젝트응의 산물 중 가장 멋진 것을 꼽으라면 저는 주저하지 않고 C 컴파일러의 최고봉인 gcc 를 지목할 것입니다.
실제로 gcc 의 명성은 뛰어나며 수많은 상용 회사도 스폰서를 해주고 있다는 것을 아시는지요? 예를 들어 넥스트사( 지금은 사라짐 )의 새로운 C 언어인 ``오브젝티브 C''는 gcc 를 가져다 만든 것이며 FSF 측에 다시 기증 되었습니다.
gcc 는 아주 강력합니다! 이미 상용 유닉스에 달려오는 AT&T 스타일, BSD 스타일의 C 언어 문법은 물론 ANSI C 를 기본으로 하여 모든 문법을 소화해낼 수 있으며 특유의 문법도 가지고 있습니다. 아주 구식 컴파일러, 아주 구식 문법도 소화해낼 수 있습니다. 이미 많은 사람들이 상용 유닉스에도 gcc 를 설컴치하여 사용하는 경우가 많지요. ( 물론 금전적인 문제가 많이 작용 ^^ )
gcc 는 매우 단순합니다. 어떤 의미로 이런 말을 하는가 하면, 터보 C/볼랜드 C 통합환경이나 윈도 환경의 비주얼한 환경을 제공하지 않는다는 것입니다. -.- 그들이 상당히 오토매틱한 성격을 갖는 반면, gcc 는 오로지 수동 스틱방식입니다. 각각의 장단점이 있지만 여러분이 일단 gcc 를 만나시려면 각오는 하고 계셔야 합니다. 도스/윈도에서 보던 것을 원하지 마십시요. gcc 는 껍데기에 신경쓸 겨를조차 없습니다. gcc 는 오로지 명령행 방식만을 제공합니다. 그리고 그 자체로 파워풀합니다. 개발 방향은 계속 ``뛰어난 능력''이지 겉모양 화장은 아닐 것입니다. ( 만약 겉모양을 원하신다면 그것은 여러분의 몫입니다. xwpe 같은 것이 그 좋은 예라고 할 수 있습니다 )
gcc 는 어떻게 보면 C 언어에 대한 개념이 서지 않는 사람에게는 무리인 C 컴파일러인 듯 합니다. 기초 지식없이 사용한다는 것은 불가능에 가깝습니다. 하지만 C 언어를 확실하게 기초부터 배워서 어디서든 쓰러지지 않는 무림고수가 되기 위해서는 gcc 를 권합니다. 자잘한 무공을 하는 깡패가 되느냐? 아니면 정신을 지닌 무림고수가 되느냐?는 여러분의 선택에 달렸습니다.
gcc 가 어렵기만 한가? 하면 그렇지는 않습니다. gcc 는 상당한 매력을 지니고 있습니다. 그 매력으로 인해 한 번 빠지면 다른 컴파일러가 상당히 우습게 보이기까지 합니다. ( 그렇다고 다른 컴파일러를 비웃지는 마세요 ^^ 그거 쓰는 사람들이 자존심 상해서 엄청 화를 낼 테니까요. 개인적으로 생각하기에 gcc 에 대적할 수 있을 정도되는 컴파일러는 와콤 C 컴파일러 정도? )
gcc 를 배우시려면 정신 무장(?)이 중요하다고 생각해서 이렇게 장황하게 읊었습니다. 심플하게 배우면서 여러분의 리눅스, C 컴파일러에 대한 두려움을 하나씩 없애고 C 언어 위에 군림하시기 바랍니다.
자, 이제는 잡담없이 시작합니다.
cout<<출력1<<"출력2string"<<출력3;
std::cout<<"출력"; // :: 공간지정 연산자
std 영역안에 있는 cout 을 사용
동일한 함수명 중복하여 사용, 매개변수가 다르므로 구분
동일한 함수명 (매개변수1)
동일한 함수명 (매개변수1, 매개변수2)
C에서는 Macro함수
C++에서는 inline 선언에 의한 함수의 인-라인화
namespace std { // 선언
cout;
cin;
endl; // endline
}
using namespace std; // 사용
C언어에는 1과 0으로 true, false를 구분
C++에는 논리적인 참과 거짓을 의미하는 키워드 true나 fasle를 사용 , 데이터타입 bool로 선언하여 사용
데이터 타입 bool result;
result = true;
int val=10;
int *val=&val; // &는 val의 주소값을 의미
int &ref = val; // &는 val의 Reference를 선언하는 의미
레퍼런스의 제약
레퍼런스를 이용한 Call by Reference
포인터 연산을 할 필요가 없으므로 안정적
원본 데이터의 손실 예상 - const 선언!
Cpp에서 C에서
int *val = new int; int *val = (int*)malloc(sizeof(int));
int *val = new int[size]; int *val = (int*)malloc(sizeof(int*size));
delete val;
delete []arr;
클래스
클래스 객체의 생성과 소멸
Person p = Person("KIM", "010-000-0000", 22);
Person p("KIM", "010-000-0000", 22); // 객체를 만들면서 매개 변수를 써서 함수를 호출
Person p(); // 파라미터 형식을 맞춰줘야 함
객체 배열과 생성자
객체 포인터 배열
this 포인터의 의미
class Point {
int aaa;
public :
Point(int aaa)
{
this->aaa=aaa; // this->aaa는 class의 aaa, 그냥 aaa는 public안의 aaa
}
};
friend 선언의 유용성
C++의 main()에서 함수를 호출할 경우 class명을 붙이고 :: 공간지정연산자를 붙여서 호출한다.
이 글은 스프링노트에서 작성되었습니다.
※ 리눅스에서 심볼릭링크 생성
심볼릭링크 : 다른파일(또는 디렉토리)에 대한 추상적인 위치를 가리키는 경로(Path)
하드링크 : 특정한 물리적인 데이터 경로
심볼릭링크 생성방법
$ln -s /path/to/file1.txt /path/to/file2.txt
$ls -ali
하드링크 생성방법
#ln /root/file1 /root/file2
#ls -l
하위 디렉토리 파일 검색 및 삭제 (0) | 2011.08.16 |
---|---|
smb.conf 설정 예 (0) | 2010.08.10 |
일정 등록(자동 종료 등) - cron (0) | 2010.05.11 |
지정 시간에 동작을 예약하는 명령어 [at 사용법] (0) | 2010.05.08 |
리눅스용 소스 비교 툴 (0) | 2010.04.19 |
1.Linear Gradient
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<gradient android:startColor="#FFFF00" android:endColor="#FFFFFF" android:angle="270"/>
<corners android:radius="0dp" />
</shape>
2.Radial Gradient
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
<gradient android:type="radial"
android:startColor="#ff0000"
android:endColor="#ffff00"
android:gradientRadius="300"
android:centerX="0.5"
android:centerY="0.7"/>
</shape>
3.Line
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="line">
<stroke android:width="1dp" android:color="#FF000000"
android:dashWidth="1dp" android:dashGap="2dp" />
<size android:height="5dp" />
</shape>
4.Oval
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval">
<solid android:color="#00000000"/>
<stroke android:width="4dp" android:color="#990000FF"
android:dashWidth="4dp" android:dashGap="2dp" />
<padding android:left="7dp" android:top="7dp"
android:right="7dp" android:bottom="7dp" />
<corners android:radius="4dp" />
</shape>
5.Ring & Sweet Gradient
<shape android:shape="ring" xmlns:android="http://schemas.android.com/apk/res/android"
android:innerRadiusRatio="3"
android:thicknessRatio="8"
android:useLevel="false">
<size android:width="48dip"
android:height="48dip" />
<gradient android:type="sweep"
android:useLevel="false"
android:startColor="#4c737373"
android:centerColor="#4c737373"
android:centerY="0.50"
android:endColor="#ffffd300" />
</shape>
shape layout (0) | 2010.08.04 |
---|---|
cutom title bar (0) | 2010.08.04 |
adb shell에서 특정 activity실행하기 (0) | 2010.07.06 |
PowerManager에서 Screen ON/OFF 통지 (0) | 2010.07.06 |
Resources - Menus, Searchable (0) | 2010.07.01 |
The /etc/smb.conf file is the main configuration file for the Samba server, in which you can specify which directory you want to access from Windows machines, which IP addresses are authorized, and so on. The first few lines of the file under the [global] line contain global configuration directives, which are common to all shares, unless they are over-ridden on a per-share basis, followed by share sections. A lot of options exist, and it's important to read the documentation that comes with Samba for more information on each of the different settings and parameters.
The following configuration example is a minimal working configuration file for Samba with encrypted password support. Also, it's important to note that we comment in this Samba configuration only parameters that relate to security and optimization, and left other posiblities for you to explore.
In our example we have created just one directory, [tmp] and have allowed only class C machine IP address ranges to connect on the Samba server. Also, we don't use print-sharing capability between Samba and Windows on this server. Edit the smb.conf file, vi /etc/smb.conf and add/change the following parameters:
[global] workgroup = OPENNA server string = R&D of Open Network Architecture Samba Server encrypt passwords = True security = user smb passwd file = /etc/smbpasswd log file = /var/log/samba/log.%m socket options = IPTOS_LOWDELAY TCP_NODELAY domain master = Yes local master = Yes preferred master = Yes os level = 65 dns proxy = No name resolve order = lmhosts host bcast bind interfaces only = True interfaces = eth0 192.168.1.1 hosts deny = ALL hosts allow = 192.168.1.4 127.0.0.1 debug level = 1 create mask = 0644 directory mask = 0755 level2 oplocks = True read raw = no write cache size = 262144 [homes] comment = Home Directories browseable = no read only = no invalid users = root bin daemon nobody named sys tty disk mem kmem users [tmp] comment = Temporary File Space path = /tmp read only = No valid users = admin invalid users = root bin daemon nobody named sys tty disk mem kmem users |
This tells the smb.conf file to set itself up for this particular configuration setup with:
[global].
The option workgroup specifies the workgroup your server will appear to be in when queried by clients. It's important to have the same workgroup name on both clients and servers.
The option server string specifies the string that you wish to show to your users in the printer comment box in print manager, or to the IPC connection in the net view command under Windows machines.
The option encrypt passwords if set to True instructs Samba to use encrypted passwords instead of plain text password when negotiating with the client. Sniffer program will not be able to detect your password when it is encrypted. This option always must be set to True for security reasons.
The option security, if set to user, specifies that a client must first log-on with a valid username and password, or the connection will be refused. This means that a valid username and password for the client must exit in your /etc/passwd file on the Linux server and in the /etc/smbpasswd file of the Samba server, or the connection from the client will fail. See Securing samba in this chapter for more information about the smbpasswd file.
The option smb passwd file specifies the path to the encrypted smbpasswd file. The smbpasswd file is a copy of the /etc/passwd file of the Linux system containing valid usernames and passwords of clients allowed to connect to the Samba server. The Samba software reads this file, smbpasswd when a connection is requested.
The option log file specifies the locations and names of Samba log files. With the name extension %m, it allows you to have separate log files for each user or machine that logs on your Samba server i.e. log.machine1.
The option socket options specifies parameters that you can include in your Samba configuration to tune and improve your samba server for optimal performance. By default we chose to tune the connection for a local network, and improve the performance of the Samba server for transferring files.
The option domain master specifies to set nmbd, the Samba server daemon, as a domain master browser for its given workgroup. This option usually must be set to Yes only on one Samba server for all other Samba servers on the same network and workgroup.
The option local master allows nmbd, the Samba server daemon, to try to become a local master browser on a subnet. Like the above, usually this option must be set to Yes only on one Samba server that acts as a local master on a subnet for all the other Samba servers on your network.
The option preferred master specifies and controls if nmbd the Samba server daemon, is a preferred master browser for its workgroup. Once again, this must usually be set to Yes on one server for all the others on your network.
The option os level specifies by its value whether nmbd, the Samba server daemon, has a chance of becoming a local master browser for the Workgroup in the local broadcast area. The number 65 will win against any NT Server. If you have an NT Server on your network, and want to set your Linux Samba server to be a local master browser for the Workgroup in the local broadcast area then you must set the os level option to 65. Also, this option must be set only on one Linux Samba server, and must be disabled on all other Linux Samba servers you may have on your network.
The option dns proxy if set to Yes specifies that nmbd, the Samba server daemon, when acting as a WINS server and finding that a Net BIOS name has not been registered, should treat the Net BIOS name word-for-word as a DNS name and do a lookup with the DNS server for that name on behalf of the name-querying client. Since we have not configured the Samba server to act as a WINS server, we don't need to set this option to Yes. Also, setting this option to Yes will degrade your Samba performance.
The option name resolve order specifies what naming services to use in order to resolve host names to IP addresses, and in what order. The parameters we chose cause the local lmhosts file of samba to be examined first, followed by the rest.
The option bind interfaces only if set to True, allows you to limit what interfaces will serve smb requests. This is a security feature. The configuration option interfaces = eth0 192.168.1.1 below completes this option.
The option interfaces allows you to override the default network interface list that Samba will use for browsing, name registration and other NBT traffic. By default, Samba will query the kernel for the list of all active interfaces and use any interface, except 127.0.0.1, that is broadcast capable. With this option, Samba will only listen on interface eth0 on the IP address 192.168.1.1. This is a security feature, and completes the above configuration option bind interfaces only = True.
The option hosts deny specifies the list of hosts that are not permitted access to Samba services unless the specific services have their own lists to override this one. For simplicity, we deny access to all hosts by default, and allow specific hosts in the hosts allow = option below.
The option hosts allow specifies which hosts are permitted to access a Samba service. By default, we allow hosts from IP class C 192.168.1.4 and our localhost 127.0.0.1 to access the Samba server. Note that the localhost must always be set or you will receive some error messages.
The option debug level allows the logging level to be specified in the smb.conf file. If you set the debug level higher than 2 then you may suffer a large drop in performance. This is because the server flushes the log file after each operation, which can be very expensive.
The option create mask specifies and sets the necessary permissions according to the mapping from DOS modes to UNIX permissions. With this option set to 0644, all file copying or creating from a Windows system to the Unix system will have a permission of 0644 by default.
The option directory mask specifies and set the octal modes, which are used when converting DOS modes to UNIX modes when creating UNIX directories. With this option set to 0755, all directory copying or creating from a Windows system to the Unix system will have a permission of 0755 by default.
The option level2 oplocks, if set to True, will increase the performance for many accesses of files that are not commonly written, such as .EXE application files.
The option read raw controls whether or not the server will support the raw read SMB requests when transferring data to clients. Note that memory mapping is not used by the read raw operation. Thus, you may find memory mapping is more effective if you disable read raw using read raw = no, like we do.
The option write cache size allows Samba to improve performance on systems where the disk subsystem is a bottleneck. The value of this option is specified in bytes, and a size of 262,144 represent a 256k cache size per file.
[tmp].
The option comment allows you to specify a comment that will appear next to a share when a client does queries to the server.
The option path specifies a directory to which the user of the service is to be given access. In our example this is the tmp directory of the Linux server.
The option read only specifies if users should be allowed to only read files or not. In our example, since this is a configuration for the tmp directory of the Linux server, users can do more than just read files.
The option valid users specifies a list of users that should be allowed to login to this service. In our example only the user admin is allowed to access the service.
The option invalid users specifies a list of users that should not be allowed to login to this service. This is really a paranoid check to absolutely ensure an
하위 디렉토리 파일 검색 및 삭제 (0) | 2011.08.16 |
---|---|
심볼릭링크 생성 (0) | 2010.08.13 |
일정 등록(자동 종료 등) - cron (0) | 2010.05.11 |
지정 시간에 동작을 예약하는 명령어 [at 사용법] (0) | 2010.05.08 |
리눅스용 소스 비교 툴 (0) | 2010.04.19 |
Repo 설치 및 설정 (0) | 2011.01.14 |
---|---|
git 요약 (0) | 2010.07.27 |
Subversion Git 사용법 (0) | 2010.05.14 |
Eclipse Plugins (0) | 2010.02.01 |
Git과 SVN 통합 (0) | 2010.02.01 |
[shape_counter.xml]
<?xml version="1.0" encoding="utf-8"?>
<!-- produced by lee.hyuntae@btbsolution.co.kr
for text counter background -->
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid
android:color="#88000000" />
<padding
android:left="7dp"
android:right="7dp" />
<corners
android:radius="4dp" />
</shape>
Shape (0) | 2010.08.10 |
---|---|
cutom title bar (0) | 2010.08.04 |
adb shell에서 특정 activity실행하기 (0) | 2010.07.06 |
PowerManager에서 Screen ON/OFF 통지 (0) | 2010.07.06 |
Resources - Menus, Searchable (0) | 2010.07.01 |
enter code heremy_title.xml
<ImageView android:src="@drawable/jetpack"
android:layout_width="wrap_content" android:layout_alignParentLeft="true"
android:layout_centerVertical="true" android:id="@+id/back"
android:layout_height="wrap_content" android:layout_alignParentTop="true" />
<TextView android:id="@+id/title" android:layout_width="wrap_content"
android:gravity="center_vertical" android:textSize="20px"
android:textColor="#ffffff" android:layout_alignParentRight="true"
android:text="New Title" android:background="#a5c639"
android:layout_height="wrap_content" android:layout_alignParentTop="true"
android:padding="9dip" android:layout_margin="5dip" />
requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
setContentView(R.layout.main); getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.my_title);
((TextView)findViewById(R.id.title)).setText("gradient shadow");
findViewById(R.id.back).setOnClickListener(new OnClickListener() {
public void onClick(View v) {
((TextView)findViewById(R.id.title)).setText("loce");
}
});
because custom title default is fixed you should write yourself theme:
Shape (0) | 2010.08.10 |
---|---|
shape layout (0) | 2010.08.04 |
adb shell에서 특정 activity실행하기 (0) | 2010.07.06 |
PowerManager에서 Screen ON/OFF 통지 (0) | 2010.07.06 |
Resources - Menus, Searchable (0) | 2010.07.01 |