g++ 과 gdb 사용법

old/Linux 2010. 3. 25. 14:32
 g++ 사용법
  • 일반적인 컴파일
    > g++ filename

    ⇒ filename이라는 파일을 컴파일하고 오류가 없을 경우 실행 파일 a.out을 생성
     
  • 실행 파일을 지정하는 컴파일
    > g++ -o exefile filename

    ⇒ filename이라는 파일을 컴파일하여 실행파일 exefile 생성
     
  • gdb를 사용하여 디버그할 때의 컴파일
    > g++ -g filename

    ⇒ filename이라는 파일을 컴파일하여 실행 파일 a.out을 생성하고 gdb로 디버그함
     
  • 실행 파일을 지정하여 gdb로 디버그할 때의 컴파일
    > g++ -o exefile -g filename

    ⇒ filename이라는 파일을 컴파일하여 실행 파일 exefile을 생성하고 gdb로 디버그함

□ gdb 사용법

  • gdb 실행
    > gdb exefile

    ⇒ 실행 파일 exefile을 디버그함 (실행 파일은 반드시 -g 옵션을 사용하여 컴파일되어야 함)
     
  • gdb 명령어 

명령어

의  미

b (breakpoint)

실행 중 디버그를 위해 멈추는 위치 지정

b 함수명

함수명에서 멈춤

b 라인번호

라인번호에서 멈춤

r (run)

실행 시작

n (next)

현재 라인 실행 (함수의 경우 실행하고 다음 라인으로 넘어 감)

s (step)

현재 라인 실행 (함수의 경우 호출된 함수 내로 들어가 실행 계속)

c (continue)

다음 breakpoint까지 실행

l (list)

현재 수행되고 있는 라인부터 10개 라인씩 연속적으로 소스 코드를 프린트

p (print) 변수명

변수명으로 저장되어 있는 내용을 프린트

h (help)

도움말

q (quit)

gdb 종료

'old > Linux' 카테고리의 다른 글

백그라운드 실행  (0) 2010.04.01
우분투 명령어 정리  (0) 2010.03.25
프로그램 내에서 쉘 명령어 수행  (0) 2010.03.25
gcc 옵션  (0) 2010.03.25
윈도우 파일시스템 마운트  (0) 2010.03.25
Posted by jazzlife
,
a.sh 이 /home/user/a.sh 이라면...

system("/home/user/a.sh"); 

'old > Linux' 카테고리의 다른 글

우분투 명령어 정리  (0) 2010.03.25
g++ 과 gdb 사용법  (0) 2010.03.25
gcc 옵션  (0) 2010.03.25
윈도우 파일시스템 마운트  (0) 2010.03.25
fdisk 사용법  (0) 2010.03.25
Posted by jazzlife
,

gcc 옵션

old/Linux 2010. 3. 25. 14:30
 

디렉토리구조에 이어 오늘은 gcc 컴파일 옵션에 대해 알아보겠습니다.


제 경험상 학교에서는 기본적인 -o 옵션정도, 회사에서는 Makefile 에 의한 자동 컴파일을 하기때문에 많은 분들이 컴파일 옵션을 잘 모르시는것 같습니다.
(컴파일옵션을 잘 모르시면 프로그램이 어떻게 동작하는지, 그리고 실행화일을 만들기 위해 어떤것들이 필요하며 디버깅은 어떻게 하는지 등을 모를수 있습니다. )
 

쉘에서 man gcc 해보시면 gcc 및 옵션에 대해 친절하지도, 그렇다고 쉽지도 않은 영어 설명이 나옵니다. 휴~


이렇게 많은 옵션중에서 반드시 필요한 몇개만 알아보도록 하겠습니다. 오늘 알아볼 옵션은 -v, -I,

-o, -D 정도입니다. (그외의 옵션은 Makefile 시간과 필요시에 그때그때 알아보도록 하겠습니다..^^)


컴파일 옵션 설명을 위해 간단한 C 소스를 하나 작성하겠습니다. 모두 잘 아시는 Hello, World 소스입니다


--------------------------------------------------------------
  #include <stdio.h>

  int main(int argc,char** argv)
  {
    printf("Hello, World\n");

    return 0;
  }
--------------------------------------------------------------


위 소스를 helloworld.c 로 저장한후에 gcc helloworld.c 실행하면 해당디렉토리에 a.out 실행화일이 생성됩니다.


 

[그림 1]


[1] -v 옵션 (컴파일 과정을 보여주는 옵션입니다)
그럼 여기서 질문하나 할까요? 컴파일과정, 즉 현재 사용하는 gcc 버젼 및 소스에서 삽입한 stdio.h 가 어느 디렉토리에 있는지등의 정보를 보려면 어떤 옵션을 사용할까요?

바로 -v  옵션입니다. -v 옵션을 사용해 컴파일 하면 컴파일러 버젼 정보, include 디렉토리, 에셈블러정보, 실행화일 형식등의 많은 정보를 보실수 있습니다. 다음 그림과 같이 gcc -v helloworld.c 를 해보고 위 [그림 1]과 비교해 보겠습니다.



[그림2]


[그림 2] 에서 보듯이 -v 옵션을 적용하면 다양한 컴파일과정이 출력됩니다. gcc 컴파일러 버젼은 3.2.2 이고 gcc 가 stdio.h 등의 헤더파일을 찾아가는 경로는 /usr/local/include, /usr/include,

/usr/lib/gcc-lib/i386-redhat-linux/3.2.2/include 입니다.


[2] -o 옵션 (출력파일의 이름 지정하는 옵션입니다)

위에서 보듯이 출력파일의 이름을 특별히 지정하지 않으면 모든 이름은 a.out 으로 나타납니다. 실행파일의 이름을 주고 싶을땐 -o 옵션을 주시면 됩니다 (숫자 0 이 아닌 알파벳 o 입니다...). 즉, gcc -o <실행파일이름> <소스파일이름> 또는 gcc <소스파일이름> -o <실행파일이름> 으로 지정하시면 됩니다..중요한것은 -o 다음에는 반드시 출력파일이름이 와야합니다. 실수로 gcc -o <소스파일이름> <출력파일이름> 하시면 대재앙입니다....


다음은 출력파일의 이름을 helloworld 로 주는경우를 나타내 보았습니다



[그림3]


[3] -D 옵션 (외부에서 #define 을 정의하는 옵션입니다)

-D 옵션을 알아보기 위해 처음 제시한 helloworld.c 소스를 약간 수정해보겠습니다. 즉, 소스에 #ifdef ~ #endif 를 추가했습니다.


--------------------------------------------------------------
  #include <stdio.h>

  int main(int argc,char** argv)
  {

    #ifdef   TEST
    printf("Hello, World\n");

    #else

    printf("Hello, New World\n");

    #endif


    return 0;
  }
--------------------------------------------------------------

소스에서 보듯이 TEST 가 정의되어 있으면 Hello, World 를 출력하고, 정의되어 있지 않으면 Hello, New World 를 출력하는 소스입니다. 이렇게 조건부컴파일을 할때 유용하게 사용되어 지는 것이 -D 옵션입니다. (실무에서 개발중일때는 DEBUG  라는 매크로를 사용하다가 실제 출시할때는 정의하지 않응 방식을 사용합니다.)


사용방법은 다음과 같습니다.

gcc -D<매크로이름>


다음 그림 4는 -D 옵션을 사용하지 않고 컴파일/실행한 화면입니다. 결과에서 보듯이 'Hello, New World' 가 출력되었습니다



[그림 4]


다음 그림5는 -D 옵션을 사용하여 컴파일/실행한 화면입니다. 밑줄에 표시된 부분처럼 컴파일시에

-DTEST 가 정의되어 있고 실행시 'Hello, World' 가 출력됩니다



[그림 5]


[4] -I 옵션 (컴파일러가 헤더파일을 탐색할 디렉토리지정 옵션입니다)

일반적으로 C 소스에서 "AAA.h" 라고 하면 현재 작업디렉토리에서 AAA.h 를 찾고 <BBB.h> 라고 하면 컴파일러가 참조하는 디렉토리를 탐색해서 해당파일을 찾습니다. -v 옵션에서 보았듯이 gcc 컴파일러는 헤더파일의 디렉토리를 /usr/include, /usr/local/include, /usr/lib/gcc-lib/i386-redhat-linux/3.2.2/include 로 부터 탐색합니다. 그러나 실무에서는 특정디렉토리에 회사 고유의 헤더파일을 만들어 보관합니다. 이럴때 컴파일러로 하여금 특정 디렉토리를 기존의 디렉토리와 함께 탐색할수 있게 해 주는 옵션이 -I 입니다. 사용법은 다음과 같습니다

(영어 대문자 I 입니다..숫자 1이 아닙니다..)


gcc -I<디렉토리경로>


이해를 쉽게 하기 위해 helloworld.c 소스를 약간 수정해보겠습니다.

--------------------------------------------------------------
  #include <stdio.h>

  #include <myheader.h>


  int main(int argc,char** argv)
  {
    P("Hello, World\n");

    return 0;
  }
--------------------------------------------------------------

myheader.h 는 현재 디렉토리아래의 common 이라는 디렉토리에 넣어두겠습니다. 그리고 myheader.h 에는 다음과 같은 구문이 정의 되어 있습니다.


#define  P  printf



[그림 6]


위 결과에서 보듯이 참조하는 디렉토리에 /home/thelegend/test/common 이 추가되었습니다. 즉, gcc -I/home/thelegend/test/common  에서 지정한 옵션입니다..


이제 컴파일 옵션 개념을 잡으셨죠? 보셨듯이 전혀 어렵지 않습니다. 추가 옵션은 다음 Makefile 이야기 할때 추가하도록 하겠습니다..


그럼 언제나 즐거운 시간 되세요...

'old > Linux' 카테고리의 다른 글

g++ 과 gdb 사용법  (0) 2010.03.25
프로그램 내에서 쉘 명령어 수행  (0) 2010.03.25
윈도우 파일시스템 마운트  (0) 2010.03.25
fdisk 사용법  (0) 2010.03.25
vi 설정  (0) 2010.03.25
Posted by jazzlife
,
 

[마운트 방법]
mount -t type device mount-point
ex) mount -t ext3 /dev/sda2 /mnt

type : 파일시스템명
device : 파일시스템이 위치한 물리적인 장치(ex. /dev/sda2)
mount-point : 파일시스템을 마운트할 디렉토리(ex. /mnt/dvd, /media)


[언마운트 방법]
umount /dev/sda2(장치명) 또는 umount /mnt(마운트한 디렉토리)



[파일 시스템 종류]
*참고 : cat /proc/filesystems


 파일시스템            타입                  설명
Second Extended filesystem    ext2         가장 일반적인 리눅스 파일시스템
Reiser filesystem                   reiserfs    리눅스용 저널링(journaling) 파일시스템
Third Extended filesystem        ext3        ext2와 호환되는 리눅스용 저널링FS
Minix filesystem                     minix       오리지널 미닉스 파일시스템(거의사용x)
ROM filesystem                      romfs        램디스크에서 사용하기 위한 읽기전용 FS
CRAM filesystem                    cramfs      주로 PDA에서 사용하는 읽기전용 압축 FS
Network File System(NFS)         nfs        네트워크의 원격 파일을 접근
UMSDOS filesystem               umsdos     MS-DOS 파티션에 리눅스 설치
DOS-FAT filesystem               msdos      MS-DOS 파일 지원
VFAT filesystem                       vfat         윈도우 95/98 파일 접근
NT filesystem                           ntfs        윈도우 NT 파일 접근
HPFS filesystem                    hpfsOS/     OS/2 파일시스템
/proc filesystem                       proc        ps를 위한 프로세스 정보 제공
Device filesystem                     devfs       /dev 디렉토리의 파일을 표현한 다른방식
ISO 9660 filesystem                 iso9660    대부분의 CD-ROM에서 사용
Joliet filesystem                      iso9660      유니코드 파일명을 처리할 수 있도록 확장
UDF filesystem                           udf        가장 최근의 CD-ROM 파일시스템
System V filesystem                  sysv       시스템 V 계열 파일 접근
Coherent filesystem                 coherent    Coherent 파일 접근
UFS filesystem                           ufs        SunOS,BSD,Tru64 유닉스 UFS 파일 접근
BFS filesystem                           bfs         SCO 유닉스웨어 파일 접근
EFS filesystem                           efs         구형 IRIX 버전의 파일 접근
ADFS filesystem                         adfs        Acorn 파티션의 파일 접근
Apple Mac filesystem                  hfs         애플 맥킨토시의 파일 접근
QNX4 filesystem                         qnx4       QNX4 파티션 파일 접근
JFFS filesystem                           jffs         플래시(FLASH)기반의 장치 파일시스템
Novell filesystem                        ncpfs      네트워크를 통해 노벨 서버의 파일 접근
SMB filesystem                         smbfs   네트워크를 통해 윈도우 서버의 파일 접근
Coda filesystem                          coda       NFS보다 진보한 네트워크 파일시스템
RAM filesystem                          ramfs       RAM 디스크용 파일시스템
Temporary filesystem                  tmpfs      RAM만 사용하는 또 다른 파일시스템

*참고자료 : 러닝리눅스 4판

 

 

[자동실행]

# cd /mnt  

# mkdir winDisk

# cd winDisk

 

# df -a  명령으로 하드디스크 정보를 대충 봐두시고

# vi /etc/fstab 실행(여기다 추가해놓으면 부팅시 자동으로 마운트 해줌)

 

이미 설정되어 있는 것들이 보일겁니다.

맨 아래에 추가하세요

밝게 표시된 부분이 하드디스크 갯수에 따라 달라질수 있는 부분입니다.

 

보통 첫번째 하드가 hda

       두번째 하드가 hdb

이런식으로 나가니까 외우시기 편할겁니다.

 

# df -a  명령에서 보일겁니다.

  1. 하드디스크 하나일경우 윈도우 파티션의 번호가 보임(예: hda5)

  2. 두개일 경우 파티션정보가 안보입니다(저도 잘 모름 ;;). hdb1 또는 2 해보시면 될겁니다.

 

인제 아래내용 추가하세요

 

/dev/hda5   /mnt/winDisk  vfat  default  0 0

 

default,umask=000,iocharset=utf8 을 넣으면

  마운트 한 후 누구나 쓰기가 가능하다(umask=000)

  utf8환경에서 한글이 나온다(iocharset=utf8)

 

참! 중간에 있는 vfat 는 파일시스템이 fat32 일경우 쓰시구요

요즘 xp 에서 사용하는 ntfs 의 경우 vfat 대신 ntfs 라고 쓰시면 됩니다. ^^

 

그리고 /mnt/winDisk 가셔서  ls  해보시면 쭉~ 뜰꺼에요ㅎ 수고하셨습니다.

'old > Linux' 카테고리의 다른 글

프로그램 내에서 쉘 명령어 수행  (0) 2010.03.25
gcc 옵션  (0) 2010.03.25
fdisk 사용법  (0) 2010.03.25
vi 설정  (0) 2010.03.25
profile 수정  (0) 2010.03.25
Posted by jazzlife
,

fdisk 사용법

old/Linux 2010. 3. 25. 14:29
 

리눅스의 fdisk 사용 요령

 

먼저, 현재 파티션 테이블을 표시하기 위해 명령어 "p"를 사용한다. 보다시피, /dev/hda1은 (/dev/hda의 첫 번째 파티션) 61693블럭의 도스 파티션이다.

 

Command (m for help): p

Disk /dev/hda: 16heads, 38 secrors, 683 cylinders

Units = cylinders of 608 * 512 bytes

 

   Device    Boot  Begin  Start   End   Blocks   Id      System

  /dev/hda1   *        1      1   203    61693    6      DOS 16-bit >=32M

 

Command (m for help):

 

그 다음에 명령어 "n"을 사용하면 새로운 파티션을 생성시킬 수 있다. 리눅스 루트 파티션의 크기를 80 메가로 할 것이다.

 

Command (m for help): n

Command action

    e   extended

    p   primary partition (1-4)

p

 

extended 혹은 primary 파티션을 생성할 것인지 물어볼 것이다. 대부분의 경우. 한 개의 드라이브에 네 개이상의 파티션을 팔요로 하지 않는다면 primary 파티션을 사용하려 할 것이다. 더 자세한 것은 저 위의 "Repartitioning" 절을 참고하기 바란다.

 

Partition number (1-4): 2

First cylinder (204-683): 204

Last cylinder or +size or +sizeM or +sizeK (204-683): +80M

 

첫 번째 실린더는 마지막 파티션이 끝난 뒤의 실린더가 되어야 한다. 이 경우에 /dev/hda1은 실린더 203에서 끝났다. 그래서 실린더 204에서 새로운 파티션이 시작된다.

 

보다시피, "+80M" 이라고 표기를 한다면 그것은 크기가 80메가인 파티션을 규정하는 것이다. 유사하게, "+80K" 라는 표기는 80킬로바이트 파티션을 규정한다. 그리고 "+80"은 단지 80바이트 파티션을 규정한다.

 

Warning: Linux cannot currently use 33090 sectors of this partition

 

여러분이 위와 같은 경고문을 보게 된다면 무시해도 좋다. 리눅스 파일시스템의 크기가 64 메가 이상일 수 없었던 오래전의 한계에서부터 연유된것일 뿐이다. 오늘날의 파일시스템 타입에 적용되는 것이 아니다. 오늘날 파티션들의 크기는 4테라바이트까지 가능하다.

 

다음엔 10메가 스왑 파티션, /dev/hda3 을 생성한다.

 

Command (m for help): n

Command action

    e   extended

    p   primary partition (1-4)

p

partition number (1-4): 3

First cylinder (474-683): 474

Last cylinder or +size or +sizeM or +sizeK (474-683): +10M

 

다시 한번, 파티션 테이블의 내용을 표시한다. 여기에 있는 정보를 기록하여 확인하기 바란다.  특히 각 파티션의 크기가 몇 block 인지를 확인한다. 나중에 이 정보가 필요하다.

 

Command (m for help): p

Disk /dev/hda: 16 heads, 38 sectors, 683 cylinders

Units = cylinders of 608 * 512 bytes

 

   Device   Boot  Begin   Start     End   Blocks  Id  System

  /dev/hda1   *       1       1     203   61693    6  DOS 16-bit >=32M

  /dev/hda2         204     204     473   82080   83  Linux native

  /dev/hda3         474     474     507   10336   83  Linux native

 

리눅스 스왑 파티션은 (여기에서는 /dev/hda3) "Linux native" 라는 타입을 갖고 있다는 것에 주의해라. 이를 "Linux swap" 이라는 타입명으로 바꾸어야 하며 그렇게 하므로서 설치 프로그램이 스왑 파티션의 타입을 "Linux swap"으로 인식하도록 해야한다. 그렇게 하기위해 fdisk 에 "t" 라는 명령어를 사용하도록 한다.

 

Command (m for help): t

Partition number (1-4): 3

Hex code (type L to list codes): 82

 

"L"을 사용한다면 타입 코드 목록을 보여줄 것이고, 82가 리눅스 스왑과 일치하는 타입이라는 것을 알 수 있을 것이다.

 

파티션 테이블의 변경 사항을 저장하고 fdisk를 빠져나오려면 명령어 "w", 저장하지않고 그만두려면 "q"를 사용한다.

 

fdisk를 끝낸후에 바뀐 것이 효력을 발휘하도록 시스템이 여러분에게 재부팅 할건지 확인할지도 모른다. 일반적으로 fdisk를 사용한 후엔 재부팅할 이유가 없다. 요즘의 fdisk 와 cfdisk 버전은 재부팅하지 않고서도 바뀐 파티션 내용을 충분히 갱신할 수 있다 

'old > Linux' 카테고리의 다른 글

gcc 옵션  (0) 2010.03.25
윈도우 파일시스템 마운트  (0) 2010.03.25
vi 설정  (0) 2010.03.25
profile 수정  (0) 2010.03.25
WOL켜기  (0) 2010.03.25
Posted by jazzlife
,

vi 설정

old/Linux 2010. 3. 25. 14:28

개인설정으로 할 경우 ~/.exrc 또는 /.vimrc를 수정
전체설정으로 할 경우 /etc/vim/vimrc 수정


set nu
set ai
set ts=4


set syntax=on

최신버전에서 변경됨

syntax on


이렇게 이쁘게 바뀐다.


'old > Linux' 카테고리의 다른 글

윈도우 파일시스템 마운트  (0) 2010.03.25
fdisk 사용법  (0) 2010.03.25
profile 수정  (0) 2010.03.25
WOL켜기  (0) 2010.03.25
gcc와 make 강좌  (0) 2010.03.25
Posted by jazzlife
,

profile 수정

old/Linux 2010. 3. 25. 14:27

~/.profile 을 아래와 같이 수정하면

alias vi='vim'
export PS1='\[\033[1;32m\]\u\[\033[0;37m\]@\[\033[1;31m\]\h \[\033[01;34m\]\W #\[\033[00m\]'

또는

export PS1='\[\033[1;32m\]\u\[\033[0;37m\]@\[\033[1;31m\]\h \[\033[01;34m\]\W $\[\033[00m\] '

또는

export PS1='\[\033[1;32m\]\u\[\033[0;37m\]@\[\033[1;31m\]\h\[\033[1;34m\]\[\033[1;34m\] \w\n\[\033[1;35m\]#\[\033[0m\] '



'old > Linux' 카테고리의 다른 글

fdisk 사용법  (0) 2010.03.25
vi 설정  (0) 2010.03.25
WOL켜기  (0) 2010.03.25
gcc와 make 강좌  (0) 2010.03.25
고급 Bash 스크립팅 가이드  (0) 2010.03.25
Posted by jazzlife
,

WOL켜기

old/Linux 2010. 3. 25. 14:25
ethtool -s eth0 wol g 를 쳐주면 된다 물론 eth0 은 장치 이름이며 다를경우 바꿔줘야 한다.
당연하겠지만, 랜카드와 보드가 WOL 기능을 지원해야 하며 CMOS 에서도 설정 해줬을 경우 사용 가능하다.

또한 재부팅 될때 다시 비활성화 되기때문에, /etc/rc.local 에 추가하여 사용하는 것을 추천한다. 

'old > Linux' 카테고리의 다른 글

vi 설정  (0) 2010.03.25
profile 수정  (0) 2010.03.25
gcc와 make 강좌  (0) 2010.03.25
고급 Bash 스크립팅 가이드  (0) 2010.03.25
vi 명령어  (0) 2010.03.25
Posted by jazzlife
,

gcc와 make 강좌

old/Linux 2010. 3. 25. 13:55

gcc와 make 강좌

지은이 : 이만용(geoman), 옮긴이 : 조한석(junye)

v1.0, 1997년 6월 11일 수요일
이 문서는 나우누리 "Linux 사용자 모임" 12-2번 강좌란 게시판에 올라온 이만용님의 강좌 "gcc와 make에 대한 강좌"를 sgml문서로 만든 것입니다.
참고문헌

Running LINUX(Matt Welsh, Lar Kaufman), "오렐리 출판사"

1. 시작하면서

2. gcc 강좌

3. make 강좌

'old > Linux' 카테고리의 다른 글

profile 수정  (0) 2010.03.25
WOL켜기  (0) 2010.03.25
고급 Bash 스크립팅 가이드  (0) 2010.03.25
vi 명령어  (0) 2010.03.25
하드웨어 정보 확인  (0) 2010.03.25
Posted by jazzlife
,

고급 Bash 스크립팅 가이드

Bash를 이용한 쉘 스크립팅 완전 가이드

Mendel Cooper

Brindlesoft

thegrendel (at) theriver.com

차현진

terminus (at) kldp.org

2001년 12월 16일

본 튜토리얼은 여러분이 Bash에 대해서 어떠한 사전 지식도 없다고 가정을 합니다만, 금방 중/고급 수준의 명령어들을 소개합니다(...유닉스의 슬기롭고 교훈적인 부분들을 배워 나가면서). 이 문서는 교과서나, 혼자 공부할 때 볼 수 있는 메뉴얼, 쉘 스크립팅 기술에 대한 레퍼런스및 소스로 쓰일 수 있습니다. 스크립트를 배우는 유일한 방법은 스크립트를 직접 짜 보는 것이다라는 전제하에, 연습문제와 아주 자세하게 주석 처리된 예제들로 능동적인 독자들의 참여를 유도할 것입니다.

이 문서의 최신 버전은 저자의 홈페이지에서 SGML 소스와 HTML을 "타르볼"형태로 얻을 수 있습니다. 고침 변경 사항은 change log를 참고하세요.

고친 과정
고침 0.1 2000년 6월 14일 고친이 mc
초기 릴리스.
고침 0.2 2000년 10월 30일 고친이 mc
버그 수정, 내용및 예제 스크립트 추가.
고침 0.3 2001년 2월 12일 고친이 mc
메이저 업데이트.
고침 0.4 2001년 7월 8일 고친이 mc
버그 수정, 더 많은 내용및 예제 추가 - 완전한 책 형태의 개정판.
고침 0.5 2001년 9월 3일 고친이 mc
메이저 업데이트. 버그 수정, 내용 추가, 장과 절을 재편성.
고침 1.0.11 2001년 12월 16일 고친이 mc
버그 수정, 재편성, 내용 추가. Stable release.

바치는 글

모든 마법의 근원인 Anita에게 이 책을 바칩니다.

차례
Part 1. 소개
1. 왜 쉘 프로그래밍을 해야 하죠?
2. #! 으로 시작하기
2.1. 스크립트 실행하기
2.2. 몸풀기 연습문제(Preliminary Exercises)
Part 2. 기초 단계
3. 종료와 종료 상태(Exit and Exit Status)
4. 특수 문자
5. 변수와 매개변수 소개
5.1. 변수 치환(Variable Substitution)
5.2. 변수 할당(Variable Assignment)
5.3. Bash 변수는 타입이 없다(untyped)
5.4. 특수한 변수 타입
6. 쿼우팅(quoting)
7. 테스트
7.1. 테스트(Test Constructs)
7.2. 파일 테스트 연산자
7.3. 비교 연산자(이진)
7.4. 중첩된 if/then 조건 테스트
7.5. 여러분이 테스트문을 얼마나 이해했는지 테스트 해보기
8. 연산자 이야기(Operations and Related Topics)
8.1. 연산자(Operators)
8.2. 숫자 상수(Numerical Constants)
Part 3. 중급 단계(Beyond the Basics)
9. 변수 재검토(Variables Revisited)
9.1. 내부 변수(Internal Variables)
9.2. 문자열 조작
9.3. 매개변수 치환(Parameter Substitution)
9.4. 변수 타입 지정: declaretypeset
9.5. 변수 간접 참조
9.6. $RANDOM: 랜덤한 정수 만들기
9.7. 이중소괄호(The Double Parentheses Construct)
10. 루프와 분기(Loops and Branches)
10.1. 루프
10.2. 중첩된 루프
10.3. 루프 제어
10.4. 테스트와 분기(Testing and Branching)
11. 내부 명령어(Internal Commands and Builtins)
11.1. 작업 제어 명령어
12. 외부 필터, 프로그램, 명령어
12.1. 기본 명령어
12.2. 복잡한 명령어
12.3. 시간/날짜 명령어
12.4. 텍스트 처리 명령어
12.5. 파일, 아카이브(archive) 명령어
12.6. 통신 명령어
12.7. 터미널 제어 명령어
12.8. 수학용 명령어
12.9. 기타 명령어
13. 시스템과 관리자용 명령어
14. 명령어 치환(Command Substitution)
15. 산술 확장(Arithmetic Expansion)
16. I/O 재지향
16.1. exec 쓰기
16.2. 코드 블럭 재지향
16.3. 응용
17. Here Documents
18. 쉬어가기
Part 4. 고급 주제들(Advanced Topics)
19. 정규 표현식(Regular Expressions)
19.1. 정규 표현식의 간략한 소개
19.2. Globbing
20. 서브쉘(Subshells)
21. 제한된 쉘(Restricted Shells)
22. 프로세스 치환(Process Substitution)
23. 함수
23.1. 복잡 함수와 함수의 복잡성(Complex Functions and Function Complexities)
23.2. 지역 변수와 재귀 함수(Local Variables and Recursion)
24. 별칭(Aliases)
25. 리스트(List Constructs)
26. 배열
27. 파일들
28. /dev 와 /proc
28.1. /dev
28.2. /proc
29. 제로와 널(Of Zeros and Nulls)
30. 디버깅
31. 옵션
32. 몇 가지 지저분한 것들(Gotchas)
33. 스타일 있게 스크립트 짜기
33.1. 비공식 쉘 스크립팅 스타일시트
34. 자질구레한 것들
34.1. 대화(interactive)형 모드와 비대화(non-interactive)형 모드 쉘과 스크립트
34.2. 쉘 래퍼(Shell Wrappers)
34.3. 테스트와 비교: 다른 방법
34.4. 최적화
34.5. 팁 모음(Assorted Tips)
34.6. 괴상한 것(Oddities)
34.7. 이식성 문제(Portability Issues)
34.8. 윈도우즈에서의 쉘 스크립팅
35. Bash, 버전 2
36. 후기(Endnotes)
36.1. 저자 후기(Author's Note)
36.2. 저자에 대해서
36.3. 이 책을 만드는데 쓴 도구들
36.3.1. 하드웨어
36.3.2. 소프트웨어와 프린트웨어
36.4. 크레딧
서지사항
A. 여러분들이 보내준 스크립트들(Contributed Scripts)
B. Sed 와 Awk 에 대한 간단한 입문서
B.1. Sed
B.2. Awk
C. 특별한 의미를 갖는 종료 코드
D. I/O와 I/O 재지향에 대한 자세한 소개
E. 지역화(Localization)
F. 샘플 .bashrc 파일
G. 도스(DOS) 배치 파일을 쉘 스크립트로 변환
H. 연습문제
I. Copyright
예 목록
2-1. cleanup: /var/log 에 있는 로그 파일들을 청소하는 스크립트
2-2. cleanup: 위 스크립트의 향상되고 일반화된 버전.
3-1. 종료/종료 상태
3-2. !으로 조건을 부정하기
4-1. 코드 블럭과 I/O 재지향
4-2. 코드 블럭의 결과를 파일로 저장하기
4-3. 최근 하루동안 변경된 파일들을 백업하기
5-1. 변수 할당과 치환
5-2. 평범한 변수 할당
5-3. 평범하고 재미있는 변수 할당
5-4. 정수? 문자열?
5-5. 위치 매개변수
5-6. wh, whois 도메인 네임 룩업
5-7. shift 쓰기
6-1. 이상한 변수를 에코하기
6-2. 이스케이프된 문자들
7-1. 무엇이 참인가?
7-2. [ ]test 의 동일함
7-3. (( ))로 산술식 테스트 하기
7-4. 산술 비교와 문자열 비교
7-5. 문자열이 인지 테스트 하기
7-6. zmost
8-1. 산술 연산자 쓰기
8-2. && 와 || 를 쓴 복합 조건 테스트
8-3. 숫자 상수 표기법:
9-1. $IFS 와 빈 칸
9-2. 타임 아웃 처리 입력
9-3. 타임 아웃 처리 입력, 한 번 더
9-4. 내가 루트인가?
9-5. arglist: $* 과 $@ 로 인자를 나열하기
9-6. 일관성 없는 $*$@의 동작
9-7. $IFS 가 비어 있을 때 $*$@
9-8. 밑줄 변수(underscore variable)
9-9. 그래픽 파일을 다른 포맷 확장자로 이름을 바꾸면서 변환
9-10. 매개변수 치환과 : 쓰기
9-11. 변수의 길이
9-12. 매개변수 치환에서의 패턴 매칭
9-13. 파일 확장자 바꾸기:
9-14. 임의의 문자열을 파싱하기 위해 패턴 매칭 사용하기
9-15. 문자열의 접두, 접미어에서 일치하는 패턴 찾기
9-16. declare를 써서 변수 타입 지정하기
9-17. 간접 참조
9-18. awk에게 간접 참조를 넘기기
9-19. 랜덤한 숫자 만들기
9-20. RANDOM 으로 주사위를 던지기
9-21. RANDOM 에 seed를 다시 지정해 주기
9-22. C 형태의 변수 조작
10-1. 간단한 for 루프
10-2. 각 [list] 항목이 인자를 두 개씩 갖는 for
10-3. Fileinfo: 변수에 들어 있는 파일 목록에 대해 동작
10-4. for 문에서 파일 조작하기
10-5. in [list]가 빠진 for
10-6. for 문의 [list]에 명령어 치환 쓰기
10-7. 이진 파일에 grep 걸기
10-8. 특정 디렉토리의 모든 바이너리 파일에 대해 원저작자(authorship)를 확인 하기
10-9. 디렉토리에 들어 있는 심볼릭 링크들을 나열하기
10-10. 디렉토리에 들어 있는 심볼릭 링크들을 파일로 저장하기
10-11. C 형태의 for 루프
10-12. 배치 모드로 efax 사용하기
10-13. 간단한 while 루프
10-14. 다른 while 루프
10-15. 다중 조건 while 루프
10-16. C 형태의 문법을 쓰는 while 루프
10-17. until 루프
10-18. 중첩된 루프
10-19. 루프에서 breakcontinue의 영향
10-20. 여러 단계의 루프에서 탈출하기
10-21. 더 상위 루프 레벨에서 계속하기(continue)
10-22. case 쓰기
10-23. case로 메뉴 만들기
10-24. case용 변수를 만들기 위해서 명령어 치환 쓰기
10-25. 간단한 문자열 매칭
10-26. 입력이 알파벳인지 확인하기
10-27. select로 메뉴 만들기
10-28. 함수에서 select를 써서 메뉴 만들기
11-1. printf가 실제로 쓰이는 예제
11-2. read로 변수 할당하기
11-3. read로 여러줄의 입력 넣기
11-4. read파일 재지향과 같이 쓰기
11-5. 현재 작업 디렉토리 변경하기
11-6. let으로 몇 가지 산술 연산을 하기.
11-7. eval의 효과 보여주기
11-8. 강제로 로그 아웃 시키기
11-9. "rot13" 버전
11-10. 위치 매개변수와 set 쓰기
11-11. 변수를 "언셋"(unset) 하기
11-12. export를 써서, 내장된 awk 스크립트에 변수를 전달하기
11-13. getopts로 스크립트로 넘어온 옵션과 인자 읽기
11-14. 데이타 파일 "포함하기"
11-15. exec 효과
11-16. 작업을 계속 해 나가기 전에 프로세스가 끝나길 기다리기
12-1. CDR 디스크를 구울 때 ls로 목차 만들기
12-2. Badname, 파일 이름에 일반적이지 않은 문자나 공백 문자를 포함하는 파일을 지우기.
12-3. inode 로 파일을 지우기
12-4. 시스템 로그 모니터링용 xargs 로그 파일
12-5. copydir. xargs로 현재 디렉토리를 다른 곳으로 복사하기
12-6. expr 쓰기
12-7. date 쓰기
12-8. 스크립트에서 두 파일을 비교하기 위해 cmp 쓰기.
12-9. 낱말 빈도수 분석
12-10. 10자리 랜덤한 숫자 만들기
12-11. tail로 시스템 로그를 모니터하기
12-12. 스크립트에서 "grep"을 에뮬레이트 하기
12-13. 목록에 들어 있는 낱말들의 유효성 확인하기
12-14. toupper: 파일 내용을 모두 대문자로 바꿈.
12-15. lowercase: 현재 디렉토리의 모든 파일명을 소문자로 바꿈.
12-16. du: 도스용 텍스트 파일을 UNIX용으로 변환.
12-17. rot13: 초허접(ultra-weak) 암호화, rot13.
12-18. "Crypto-Quote" 퍼즐 만들기
12-19. 파일 목록 형식화.
12-20. column 으로 디렉토리 목록을 형식화 하기
12-21. nl: 자기 자신에게 번호를 붙이는 스크립트.
12-22. cpio로 디렉토리 트리 옮기기
12-23. rpm 아카이브 풀기
12-24. C 소스에서 주석을 제거하기
12-25. /usr/X11R6/bin 둘러보기
12-26. basenamedirname
12-27. 인코드된 파일을 uudecode하기
12-28. 저당에 대한 월 상환액(Monthly Payment on a Mortgage)
12-29. 진법 변환(Base Conversion)
12-30. 다른 방법으로 bc 실행
12-31. seq로 루프에 인자를 만들어 넣기
12-32. 키보드 입력을 갈무리하기
12-33. 파일을 안전하게 지우기
12-34. m4 쓰기
13-1. 지움 글자(erase character) 세팅하기
13-2. 비밀스런 비밀번호: 터미널 에코 끄기
13-3. 키누름 알아내기
13-4. pidof 로 프로세스를 죽이기
13-5. CD 이미지 확인하기
13-6. 한 파일에서 한번에 파일 시스템 만들기
13-7. 새 하드 드라이브 추가하기
13-8. killall, /etc/rc .d/init.d 에서 인용
16-1. exec으로 표준입력을 재지향 하기
16-2. 재지향된 while 루프
16-3. 다른 형태의 재지향된 while 루프
16-4. 재지향된 until 루프
16-5. 재지향된 for 루프
16-6. 재지향된 for 루프(표준입력, 표준출력 모두 재지향됨)
16-7. 재지향된 if/then 테스트
16-8. 이벤트 로깅하기
17-1. dummyfile: 두 줄짜리 더미 파일 만들기
17-2. broadcast: 로그인 해 있는 모든 사람들에게 메세지 보내기
17-3. cat으로 여러 줄의 메세지 만들기
17-4. 탭이 지워진 여러 줄의 메세지
17-5. Here document에서 매개변수 치환하기
17-6. 매개변수 치환 끄기
17-7. upload: "Sunsite" incoming 디렉토리에 파일 한 쌍을 업로드
17-8. "아무개"(anonymous) Here Document
20-1. 서브쉘에서 변수의 통용 범위(variable scope)
20-2. 사용자 프로파일 보기
20-3. 프로세스를 서브쉘에서 병렬로 돌리기
21-1. 제한된 모드로 스크립트 돌리기
23-1. 간단한 함수
23-2. 매개변수를 받는 함수
23-3. 두 숫자중 큰 수 찾기
23-4. 숫자를 로마 숫자로 바꾸기
23-5. 함수에서 큰 값을 리턴하는지 테스트하기
23-6. 큰 두 정수 비교하기
23-7. 사용자 계정 이름에서 실제 이름을 알아내기
23-8. 지역 변수의 영역(Local variable visibility)
23-9. 지역 변수를 쓴 재귀 함수
24-1. 스크립트에서 쓰이는 별칭(alias)
24-2. unalias: 별칭을 설정, 해제하기
25-1. "and list"를 써서 명령어줄 인자 확인하기
25-2. "and list"를 써서 명령어줄 인자를 확인하는 다른 방법
25-3. "or lists""and list"를 같이 쓰기
26-1. 간단한 배열 사용법
26-2. 배열의 특별한 특성 몇 가지
26-3. 빈 배열과 빈 원소
26-4. 아주 오래된 친구: 버블 정렬(Bubble Sort)
26-5. 복잡한 배열 어플리케이션: 에라토스테네스의 체(Sieve of Erastosthenes)
26-6. 복잡한 배열 어플리케이션: 기묘한 수학 급수 탐색(Exploring a weird mathematical series)
26-7. 2차원 배열을 흉내낸 다음, 기울이기(tilting it)
28-1. 특정 PID와 관련있는 프로세스 찾기
28-2. 온라인 연결 상태
29-1. 쿠키 항아리를 숨기기
29-2. /dev/zero로 스왑 파일 세팅하기
29-3. 램디스크 만들기
30-1. 버그 있는 스크립트
30-2. test24, 버그가 있는 다른 스크립트
30-3. "assert"로 조건을 테스트하기
30-4. exit 잡아채기(Trapping at exit)
30-5. Control-C 가 눌렸을 때 깨끗이 청소하기
30-6. 변수 추적하기
32-1. 서브쉘 함정(Subshell Pitfalls)
34-1. 쉘 래퍼(shell wrapper)
34-2. 조금 복잡한 쉘 래퍼(shell wapper)
34-3. awk 스크립트 쉘 래퍼(shell wrapper)
34-4. Bash 스크립트에 내장된 펄
34-5. 하나로 묶인 Bash 스크립트와 펄 스크립트
34-6. 자신을 재귀적으로 부르는 스크립트
35-1. 문자열 확장
35-2. 간접 변수 참조 - 새로운 방법
35-3. 배열과 약간의 트릭을 써서 한 벌의 카드를 4명에게 랜덤하게 돌리기
A-1. manview: 포맷된 맨 페이지를 보는 스크립트
A-2. mailformat: 이메일 메세지를 포맷해서 보기
A-3. rn: 간단한 파일이름 변경 유틸리티
A-4. encryptedpw: 로컬에 암호화 되어 있는 비밀번호로 ftp 사이트에 파일을 업로드하는 스크립트
A-5. copy-cd: 데이타 CD를 복사하는 스크립트
A-6. days-between: 두 날짜 사이의 차이를 계산해 주는 스크립트
A-7. behead: 메일과 뉴스 메세지 헤더를 제거해 주는 스크립트
A-8. ftpget: ftp에서 파일을 다운로드 해 주는 스크립트
A-9. password: 8 글자짜리 랜덤한 비밀번호 생성 스크립트
A-10. fifo: 네임드 파이프를 써서 매일 백업해 주는 스크립트
A-11. 나머지 연산자로 소수 생성하기
A-12. tree: 디렉토리 구조를 트리 형태로 보여주는 스크립트
A-13. 문자열 함수들: C 형태의 문자열 함수
A-14. 객체 지향 데이타 베이스
F-1. 샘플 .bashrc 파일
G-1. VIEWDATA.BAT: 도스용 배치 파일
G-2. viewdata.sh: VIEWDATA.BAT 의 스크립트 버전

'old > Linux' 카테고리의 다른 글

WOL켜기  (0) 2010.03.25
gcc와 make 강좌  (0) 2010.03.25
vi 명령어  (0) 2010.03.25
하드웨어 정보 확인  (0) 2010.03.25
기본 명령어  (0) 2010.03.25
Posted by jazzlife
,

vi 명령어

old/Linux 2010. 3. 25. 13:10

vi Editor's Command Collection

 command line 명령어

내 용

vi file

vi를 시작하여 지정한 파일 편집

vi -r file

읽기 전용(read- only) 편집기로서 vi를 시작하여 지정한 파일 편집

view file

읽기 전용(read- only) 편집기로서 vi를 시작하여 지정한 파일 편집

vi -r

되살릴 수 있는 모든 파일 이름 보여주기

vi -r file

vi를 시작하여 지정한 파일 되살리기

편 집 명 령

내 용

i

입력 모드로 전환, 커서 위치 앞에서 삽입

a

입력 모드로 전환, 커서 위치 뒤에서 삽입

I

입력 모드로 전환, 현재 줄의 앞에 삽입

A

입력 모드로 전환, 현재 줄의 끝에 삽입

o

입력 모드로 전환, 현재 줄의 아래에 전개

O

입력 모드로 전환, 현재 줄의 위에 전개

:e file

지정한 파일의 편집

:e! file

지정한 파일의 편집, 자동 점검의 생략

r

단지 한 글자만 변경(입력 모드로 바뀌지 않음)

R

입력하는 대로 겹쳐 써서 변경

s

삽입에 의해 한 단어의 변경

C

커서의 위치로부터 줄 끝까지 삽입에 의한 변경

cc

전체 줄을 삽입에 의한 변경

S

전체 줄을 삽입에 의한 변경

cmove

커서부터 move까지 삽입에 의해 변경

~

대,소문자 바꾸기

u

편집 버퍼를 수정했던 마지막 명령을 취소

U

현재 줄을 저장

.

편집 버퍼를 수정했던 마지막 명령 반복

x

커서가 있는 문자 삭제

X

커서의 왼쪽 문자 삭제

D

커서부터 줄의 끝까지 삭제

dd

현재 줄의 전체 삭제

dmove

커서부터 move까지 삭제

dG

커서부터 편집 버퍼의 끝까지 삭제

d1G

커서부터 편집 버퍼의 맨 앞까지 삭제

:<line>d

지정한 줄의 삭제

:<line>,<line>d

지정한 범위의 삭제

:<line>co<target>

지정한 줄을 복사하여 target 줄 밑에 삽입

:<line>, <line>co<target>

지정한 범위를 복사하여 target 줄 밑에 삽입

:<line>m<target?

지정한 줄로 이동하여 target 줄 밑에 삽입

:<line>, <line>m<target>

지정한 범위로 이동하여target 줄 밑에 삽입

<n>!!command

n번 줄에서 command의 실행

!move command

커서부터 move까지 command 실행

!move fmt

커서부터 move까지 줄들을 형식 맞추기

:w

원래의 파일로 데이터를 저장

:w file

지정한 파일로 데이터를 저장

:w>> file

지정한 파일에 데이터를 추가

:wq

데이터를 저장하고 종료

:q!

데이터를 저장하지 않고 종료

:set number

내부 줄 번호 디스플레이

:set nonumber

내부 줄 번호 디스플레이 않기

p

마지막으로 지워진 것을 커서의 뒤/아래에 삽입

P

마지막으로 지워진 것을 커서의 앞/위에 삽입

xp

두 문자를 바꿈

deep

두 단어를 바꿈

ddp

두 줄을 바꿈

/rexp

지정된 정규 표현식에 대해 앞으로 이동

/

이전의 패턴에 대해 앞으로 검색을 반복

?rexp

지정된 정규 표현식에 대해 뒤로 이동

?

이전의 패턴에 대해 뒤로 검색을 반복

n

/나 ?명령에 대해 같은 방향으로 반복

N

/나 ?명령에 대해 반대 방향으로 반복

:ab short long

short를 long에 대한 약어로 변경

:ab

현재 약어 목록을 표시

:una short

약어 short를 표시

r<Return>

문자를 뉴라인으로 변경

J

아래 line을 현재 line과 합치기

:set wm=n

오른쪽으로 n문자 위치에서 자동적으로 줄 나눔

h or <Left key>

커서를 한 칸 왼쪽으로 이동

j or <Down key>

커서를 한 줄 아래로 이동

k or <Up key>

커서를 한 줄 위로 이동

l or <Right key>

커서를 한 칸 오른쪽으로 이동

<Backspace>

커서를 한 칸 왼쪽으로 이동

<Space>

커서를 한 칸 오른쪽으로 이동

-

커서를 이전 줄의 처음으로 이동

+

커서를 다음 줄의 처음으로 이동

<Return>

커서를 다음 줄의 처음으로 이동

0

커서를 현재 줄의 맨 앞으로 이동

$

커서를 현재 줄의 맨 끝으로 이동

^

커서를 현재 줄의 첫글자(공백이나 탭이 아닌)로 이동

w

커서를 다음 단어의 첫 글자로 이동

e

커서를 다음 단어의 끝 글자로 이동

b

커서를 이전 단어의 첫 글자로 이동

W

w와 같음(문장 부호 무시)

E

e와 같음(문장 부호 무시)

B

b와 같음(문장 부호 무시)

(

다음 문장의 처음으로 이동

)

이전 문장의 처음으로 이동

{

다음 문단의 처음으로 이동

}

이전 문단의 처음으로 이동

H

커서를 화면 맨 위로 이동

M

커서를 중간으로 이동

L

커서를 맨 아래로 이동

^f

한 화면 아래로 이동

^b

화면 위로 이동

^d

반 화면 아래로 이동

^u

반 화면 위로 이동

n^d

n줄만큼 아래로 이동

n^u

n줄만큼 위로 이동

:!command

vi를 중단하고 지정한 셸 명령을 실행

:!!

vi를 중단하고 이전의 셸 명령을 실행

:sh

vi를 중단하고 셸을 실행

:!csh

vi를 중단하고 새로운 C-셸을 실행

:s/<pattern>/<replace>/

현재 줄의 치환

:<line>s/<pattern>/<replace>/

지정한 줄의 치환

:<line>,<line>s/<pattern>/<replace>/

정한 범위의 치환

:%s/<pattern>/<replace>/

모든 줄의 치환

:<line>r file

file의 내용을 지정한 줄 다음에 삽입

:r file

file의 내용을 현재의 줄 다음에 삽입

:<line>r !command

command의 결과를 지정한 줄 다음에 삽입

:r !command

command의 결과를 현재의 줄 다음에 삽입

:r !look pattern

지정한 pattern으로 시작된 단어 삽입

.

뉴라인을 제외한 모든 단일 문자와 대응

*

영 또는 그 이상의 선행 문자와 대응

^

줄의 시작과 대응

$

줄의 끝과 대응

\<

단어의 시작과 대응

\>

단어의 끝과 대응

[ ]

묶여진 문자중의 하나와 대응

[^ ]

묶여진 문자를 제외한 아무것하고나 대응

\

이어지는 기호를 문자 그대로 해석

<n>G

줄번호 n으로 건너뛰기

1G

편집 버퍼의 첫 줄로 건너뛰기

G

편집 버퍼의 마지막 줄로 건너뛰기

:map g lG

g가 lG와 같도록 매크로 정의


'old > Linux' 카테고리의 다른 글

gcc와 make 강좌  (0) 2010.03.25
고급 Bash 스크립팅 가이드  (0) 2010.03.25
하드웨어 정보 확인  (0) 2010.03.25
기본 명령어  (0) 2010.03.25
Linux Partition  (0) 2010.03.25
Posted by jazzlife
,

하드웨어 정보와 커널 정보 확인#



리눅스 시스템에 있는 하드웨어 정보와 커널 정보 확인 아래와 같이 설명드리겠습니다.


- /proc/cpuinfo : cpu 제조 회사, 클럭 속도, porcessor id, physical id등 cpu에대한 전반적인 사항을 출력한다

- /proc/devices : 사용 가능한 디바이스 정보(블록/문자 장치)

- /proc/filesystems : 지원되는 파일시스템 정보를 보여준다

- /proc/interrupts : 인터럽트 사용률을 보여준다

- /proc/meminfo : 메모리와 swap 메모리 사용량과 free byte 용량을 확인 할 수 있다.

- /proc/modules : kernel에 로드 된 모듈의 정보, lsmod 하면 나오는 정보를 볼수 있다.

- /proc/partitions : 시스템 파티션 정보를 자세하게 볼 수 있다.

- /proc/pci : pci 버스 정보

- /proc/swaps : swap 파일시스템의 사용 정보를 확인 할 수 있다.

- /proc/version : 커널 또는 배포판의 버전 정보를 확인할 수 있다.


위의 정보들을 리눅스에서 확인하기 위해서는 아래와 같은 명령어를 통해서 볼수 있습니다.

# cat /proc/cpuinfo

'old > Linux' 카테고리의 다른 글

고급 Bash 스크립팅 가이드  (0) 2010.03.25
vi 명령어  (0) 2010.03.25
기본 명령어  (0) 2010.03.25
Linux Partition  (0) 2010.03.25
tar 사용법  (0) 2010.03.25
Posted by jazzlife
,

기본 명령어

old/Linux 2010. 3. 25. 12:31

1-1-1. pwd

- 현재 작업 디렉터리 또는 현재 디렉터리를 화면에 출력

- 절대경로 형태로 화면에 출력

1-1-2. is

- 디렉터리 및 파일에 대한 정보 출력

1-1-3. mkdir

- 새로운 디렉터리 생성

1-1-4. cd

- 현재 작업중인 디렉터리를 이동

- 절대 경로와 상대 경로를 이용하여 이동함

1-2-1. 절대 주소

- 특정 디렉터리 혹은 파일이 존재하는 위치를 루트(root) 디렉터리로부터의 위치로 표시

1-2-2. 상대 주소

- 특정 디렉터리 혹은 파일이 존재하는 위치를 현재 작업 디렉터리로부터의 위치로 표시

1-2-3. cp

- 파일 복사 기능으로 한 파일을 다른 파일로 복사하거나 다른 디렉터리로 복사함

1-2-4. rmdir

- 기존의 존재하는 디렉터리 삭제

- 삭제하려는 디렉터리 내에 파일이 전혀없는 경우에만 삭제됨

1-3-1. mv

- 파일의 이름을 바꾸거나, 파일을 새로운 디렉터리로 이동 시킴

1-3-2. rm

- 파일을 삭제하거나, 디렉터리 내용 전체를 삭제

- 파일이 지워지면 복구 불가능함

1-4-1. file

- 파일의 유형을 알려줌

1-4-2. tty

- 현재 사용 중인 단말장치명을 경로(path)와 함께 출력

1-5-1. cat

- 파일의 전체 내용을 화면에 출력

- 텍스트 형식의 파일 내용을 볼 때 주로 사용함

1-5-2. head

- 파일의 처음부터 10줄 또는 지정한 줄 수의 내용을 화면에 출력

1-5-3. tail

- 파일의 내용 중 파일의 마지막 10줄 또는 지정한 줄 수의 내용을 화면에 출력

1-5-4. more

- 파일의 전체 내용을 화면에 페이지 단위로 출력

- 다음 페이지의 내용을 계속 볼 때에는 space key를 누름

- 다음 줄의 내용을 계속 볼 때에는 enter key를 누름

- 파일 내용 보기를 중단하고자 할 때에는 q key를 누름

1-5-5. 표준 입출력 전환(변경) 명령어

- < : 표준 입력(키보드)의 방향을 변경함

- > : 표준 출력(모니터)의 방향을 변경함

1-6-1. man

- 리눅스 시스템에서 실행 가능한 각 명령어에 대한 사용 매뉴얼을 출력

1-6-2. uname

- 현재 사용중인 리눅스 시스템에 대한 정보 출력

1-6-3. date

- 현재의 날짜와 시간을 화면에 출력

1-6-4. echo

- 명령어에 주어진 인자를 단순히 화면에 출력함

1-6-5. clear

- 현재 사용중인 터미널 화면의 내용을 clear함

1-6-6. sort

- 사용자가 지정한 특정 파일의 내용을 알파벳이나 숫자 순으로 정렬하여 화면에 출력

2-1-1. chmod

- 파일이나 디렉터리의 접근 권한 모드를 변경함

2-1-2. umask

- 새로운 파일 및 디렉터리를 만들 때, 접근 사용 권한 모드를 자동으로 설정해줌

2-2-1. whoami

- 현재 모니터 상에서 작업하고 있는 리눅스 시스템의 사용자 계정정보를 출력함

2-2-2. su

- 사용 중인 사용자 로그인 계정을 변경함

2-2-3. useradd

- 사용자 계정을 새로 추가함

- 슈퍼유저(root계정)만 사용 가능한 명령임

2-2-4. userdel

- 사용자 계정을 삭제함

- 슈퍼유저(root계정)만 사용 가능한 명령임

2-2-5. chown

- 파일과 디렉터리의 사용자 소유권을 변경함

- 슈퍼유저(root계정)만 사용 가능한 명령임

2-2-6. chgrp

- 파일과 디렉터리의 그룹 소유권을 변경함

- 슈퍼유저(root계정)만 사용 가능한 명령임

2-3-1. grep

- 주어진 패턴을 포함하는 파일의 라인을 출력함

2-3-2. find

- 파일과 디렉터리를 검색할 때 사용함

2-4-1. gzip/gunzip

- 파일의 내용을 압축함

2-4-2. bzip/bunzip2

- 파일의 내용을 압축함

2-4-3. tar

- 여러 개의 파일을 하나로 묶는데 사용함

2-5-1. ifconfig

- 네트웍 인터페이스 카드의 설정 내용을 확인하거나 수정하며, 네트웍 기능을 활성화 또는 비활성화 시킴

- 슈퍼유저(root계정)만 사용 가능한 명령임

2-5-2. ping

- 물리적인 네트웍의 연결이 정상적으로 이루어졌는지 확인함

- 슈퍼유저(root계정)만 사용 가능한 명령임

2-5-3. ssh

- 네트웍으로 연결된 리모트 시스템에 로그인을 함

2-6-1. ftp

- 네트웍에 연결된 리모트 시스템으로 파일을 전송함(송,수신함)

2-6-2. scp

- 네트웍으로 연결된 리모트 시스템에 있는 파일을 복사함

2-7-1. ('|') 파이프라인

- 파이프라인은 한 프로세스의 표준출력을 다른 프로세스의 표준 입력으로 연결하는 것

2-7-2. sleep

- 주어진 시간만큼 아무 동작도 하지 않고 대기함

2-7-3. ps

- 시스템에 존재하는 프로세스의 현재 상태를 보여줌

2-8-1. kill

- 지정한 프로세스에게 특정 시그널을 보냄

- 지정한 프로세스의 수행을 종료 시킴

2-9-1. du

- 디스크의 사용 현황을 출력함

2-9-2. df

- 현재 마운트되어 있는 파일시스템의 사용정보 출력

2-9-3. at

- 명령어나 스크립트의 실행을 예약함



alias (명령어 간소화하기)
apropos (관련된 명령어 찾기)
arch (컴퓨터 종류 알기)
arp (같은 서브넷의 IP 보여주기)
at (작업 시간 정하기)
atd (계획성 있는 작업 실행하기)
awk (특정 패턴 문자 처리하기)
a2p (펄 파일로 바꾸기)
badblocks (배드 블럭 검사하기)
bc (계산기)
biff (메일 수신 소리로 확인하기)
bg (후면작업; 배경화면 설정)
bind (키나 함수 순서 결합하기)
break (루프 빠져나가기)
cal (달력보기)
builtin (내부 명령어 알아보기)
case (조건 처리하기)
cat (화면상에서 파일 보기)
cd (디렉토리 변경하기)
cfdisk (디스크 설정하기)
chattr (파일 속성 변경하기)
chfn (사용자 정보 변경하기)
chgrp (파일, 디렉토리가 속했던 그룹 바꾸기)
chmod (파일 권한 바꾸기)
chown (파일 주인 바꾸기)
chsh (지정된 셸 바꾸기)
cksum (CRC값을 점검한다)
clear (화면 청소하기)
clock (CMOS 시각을 조정하기)
cmp (파일 비교하기)
colcrt (문자 변환 필터)
colrm (열 삭제하기)
column (가로 정렬하기)
comm (파일 비교 출력하기)
command (명령어 알아보기)
continue (루프 계속돌기)
cp (파일 복사하기)
cpio (복사본 만들기)
crontab (cron을 관리한다)
csplit (파일에 서식, 규칙 정하기)
cut (필요한 필드만 출력하기)
date (날짜 보기)
dd (블럭장치 읽고 쓰기)
debugfs (ext2 파일 시스템 디버깅하기)
declare (변수 선언하기)
df (파일 시스템의 사용량 보기)
dirs (디렉토리 목록 표시하기)
dmesg (부팅 메시지 보기)
dnsdomainname (DNS 이름 출력)
domainname (NIS 이름 출력&설정)
du (디렉토리와 파일의 용량 파악하기)
dumpe2fs (파일 시스템 정보 보기)
echo (표준 출력하기)
eject (장치 해제하기)
elm (메일 관련)
enable (내부 명령어 지정)
env (환경변수 출력하기)
eval (인수 읽기)
exec (셸 명령어 실행하기)
exit (종료하기)
expand (탭을 공백으로 변환하기)
export (변수 지정하기)
e2fsck (파일 시스템 복구하기)
fc (지정된 편집기 받기)
fdformat (플로피 디스크 포맷하기)
fdisk (파티션 나누기)
fg (지정된 작업을 전면 프로세스로 시작하기)
file (파일 종류 보기)
find (파일 찾기)
finger (사용자 정보 알기)
fold (정형화하기)
fmt (정형화하기)
for (반복 실행하기)
free (메모리 사용량 알아보기)
fsck (파일 시스템 검사하기)
fstab (파일 시스템에 대한 고정적인 정보 저장하기)
ftp (파일 전송 프로그램)
fuser (프로세스 ID 출력)
getkeycodes (매핑 테이블 출력하기)
grep (특정 문자 (열) 검색하기)
gzexe (실행 파일 압축하기)
gzip (압축하기)
halt (시스템 종료하기)
hash (기억해 두기; index 역할)
head (파일의 앞부분 출력하기)
help (도움말 보여주기)
host (호스트 정보 보기)
history (사용 명령어 목록보기)
hostname (서버 이름 알기)
id (계정 정보 알기)
if (조건문 실행하기)
ifconfig (랜카드에 주소 할당하기)
imolamod (모듈 설치하기)
inetd (인터넷 서비스의 최상위 데몬)
init (실행 단계 정하기)
ispell (철자법 검사하기)
jobs (수행중인 프로세스 알기)
kbd_mode (키보드 모드 출력하기)
kill (프로세스 죽이기)
klogd (커널 로그 데몬)
ldd (공유 라이브러리의 의존성 알기)
less (페이지 단위로 출력하기)
let (정규식 표현하기)
lilo (부팅하기)
ln (링크하기)
locate (패턴에 맞는 파일 찾기)
login (로그인하기)
logger (시스템 로그 기록하기)
logname (사용자 로그인명 보여주기)
logout (로그인 셸 종료하기)
look (특정 단어 검색하기)
losetup (중복 장치 확인하기)
lpd (프린트 데몬)
lpq (현재 프린트 작업 상태 출력하기)
lpr (출력하기)
lprm (대기열에 있는 문서 삭제하기)
ls (디렉토리 내용보기)
lsattr (파일 시스템의 속성 보여주기)
lsdev (하드웨어 장치 출력하기)
lsmod (모듈 정보 출력하기)
mail (메일 관련)
make (컴파일하기)
man (매뉴얼 보기)
mattrib
mbadblocks
mcd
mcopy
mdel
mdeltree
mdir
mesg (메시지를 받을 수 있는지 확인하기)
mformat
minfo
mkdir (디렉토리 만들기)
mke2fs (파일 시스템 생성하기)
mkfs (파일 시스템 만들기)
mknod (특수 파일 만들기)
mkswap (스왑 영역 지정하기)
mlabel
mmd
mmount
mmove
mpartition
mount (장치 연결하기)
more (화면 단위로 출력하기)
mrd
mren
mtoolstest
mtype
mutt (메일 관련)
mv (파일 옮기기)
mzip
netstat (현재 네트웍 상황 보기)
nice (프로세스 우선 순위 변경하기)
od (8진수로 파일 보기)
passwd (암호 입력하기)
pidof (실행중인 프로그램의 프로세스 ID 찾기)
pine (메일 관련)
ping (네트웍 확인하기)
popd (pushd 취소)
ps (프로세스 纘?알기)
pstree (프로세스 상관관계 알기)
pwd (절대경로 보여주기)
quota (디스크 한계량 알기)
rarp (rarp 테이블 관리하기)
rcp (원격 호스트에 파일 복사하기)
rdev (루트, 스왑장치, 램 크기, 비디오 모드를 조사하고 설정하기)
rdate (네트웍으로 시간 설정하기)
reboot (재부팅하기)
rmmod (모듈 지우기)
readonly (읽기 전용으로 표시하기)
renice (프로세스 우선 순위 바꾸기)
reset (터미널 초기화하기)
restore (다시 저장하기)
rlogin (바로 접속하기)
rm (파일 지우기)
rmdir (디렉토리 지우기)
route (라우팅 테이블 추가/삭제하기)
rpm (프로그램 추가/삭제)
rpm2cpio (rpm을 cpio로 변환하기)
rsh (원격으로 명령어 실행하기)
rup (호스트 상태 출력하기)
rusers (호스트에 로그인한 사용자 출력하기)
rwall (호스트 사용자에게 메시지 뿌리기)
script (기록하기)
set (변수값 설정하기)
setup (시스템 관련 설정하기)
showmount (호스트의 마운트 정보 보여주기)
shutdown (전원 끄기)
sleep (잠시 쉬기)
source (스크립트 번역하기)
split (파일 나누기)
ssh (암호화된 원격 로그인하기)
stty (터미널라인 설정 보여주기)
su (계정 바꾸기)
suspend (셸 중단하기)
swapoff (스왑 해제하기)
swapon (스왑 활성화하기)
sync (버퍼 재설정하기)
syslogd (로그인 과정 설정하기)
tac (거꾸로 보기)
tail (문서 끝부분 출력하기)
talk (이야기하기)
tar (파일 묶기)
tcpdchk (tcp wrapper 설정하기)
tcpmatch (네트웍 요청에 대해 예측하기)
tee (표준 입력으로부터 표준 출력 만들기)
telnet (원격접속하기)
test (테스트하기)
times (셸에서의 사용자와 시스템 시간 출력하기)
top (cpu 프로세스 상황 보여주기)
tr (문자열 바꿔주기)
true (종료 코드 리턴하기)
type (유형 보기)
ul (밑줄 처리해서 보여주기)
ulimit (제한하기)
umask (매스크 모드 설정하기)
umount (장치 해제하기)
unalias (별명 제거하기)
uname (시스템 정보 보기)
unexpand (공백 문자를 탭으로 변환하기)
uniq (중복된 문장 찾기)
useradd (사용자 계정 만들기)
userdel (계정 삭제하기)
usermod (사용자 계정정보 수정하기)
unset (설정 변수 해제)
uptime (시스템 부하 평균 보여주기)
users (로그인된 사용자 보여주기)
w (시스템에 접속한 사용자 상황 알아보기)
wait (프로세스 기다리기)
wall (모든 사용자에게 메시지 보내기)
wc (문자, 단어, 라인수 세기)
whatis (명령어의 간단한 설명보기)
while (루프 명령어)
who (사용자 알기)
write (콘솔 상에서 간단한 메시지 보내기)
xcopy (반복적으로 복사하기)
XFree86
ypchfn (NIS에서 사용하는 chfn 명령어)
ypchsh (NIS에서 사용하는 chsh 명령어)
yppasswd (NIS에서 사용하는 passwd 명령어)
zcat (압축 파일 보기)
zcmp (압축 파일 비교하기)
zforce (강제로 gz 만들기)

zgrep (압축 상태에서 grep 실행하기)

zmore (압축 상태에서 more 실행하기)

'old > Linux' 카테고리의 다른 글

vi 명령어  (0) 2010.03.25
하드웨어 정보 확인  (0) 2010.03.25
Linux Partition  (0) 2010.03.25
tar 사용법  (0) 2010.03.25
RPM 사용법  (0) 2010.03.25
Posted by jazzlife
,

Linux Partition

old/Linux 2010. 3. 25. 12:30

리눅스 파티션의 의미#


1) /

최상위 디렉토리이다. 루트 디렉토리의 공간은 많이 설정할 필요는 없으나 루트 디렉토리에 데이터 디렉토리를 설정하여 많은 데이터 파일들을 저장하고자 할 때에는 파티션의 크기를 크게 잡아준다.


2) /boot

부트 이미지 파티션으로 시스템이 부팅될 때 부팅 가능한 커널 이미지 파일을 담고 있는 디렉토리이다. 보통 100메가 정도 잡아주는 것이 좋다.


3) /home

일반 사용자들의 사용자 계정이 위치하는 파티션이며 익명 FTP 서비스를 할 때의 파티션이다.


4) /usr

리눅스에 필요한 대부분의 바이너리 파일들과 라이브러리 파일 그리고 X윈도우 파일들이 설치되는 파티션으로 많은 용량을 요구한다. 하위 디렉토리에는 bin, local, man등이 있으며 각각의 기능은 다음과 같다.

/usr/bin - 리눅스에 깔려있는 어플리케이션의 실행파일들이 저장되어있는 디렉토리이다., 자신이 리눅스에서 어떤 프로그램을 실행시키려면 이 밑에 있는 파일을 실행시켜야 한다.

/usr/local - 관리자에 의해 소스설치되는 프로그램들이 주로 설치되는 경로이다.

/usr/man - 도움말 페이지인 man 페이지의 내용이 들어있는 디렉토리이다.


5) /var

로그 파일 파티션이며 가변자료가 저장되는 공간이다. 발신/수신 되는 메일, 프린터 스풀, 각종 로그들이 저장된다. 메일서버, 프린터 서버, 웹호스팅을 이용한다면 이 공간을 충분히 확보해야 한다.


6) swap

가상 메모리로 사용되는 곳으로 실제 물리 메모리가 부족할 때 하드디스크에 설정된 스왑파티션을 물리 메모리처럼 사용하게 된다. 최소 크기는 리눅스가 설치된 시스템의 램의 2배 정도로 잡아주면 된다. 시스템에 너무 많은 스왑 파티션을 설정하면 그만큼 시스템 속도가 저하된다.

'old > Linux' 카테고리의 다른 글

하드웨어 정보 확인  (0) 2010.03.25
기본 명령어  (0) 2010.03.25
tar 사용법  (0) 2010.03.25
RPM 사용법  (0) 2010.03.25
QuickSynergy  (0) 2010.02.26
Posted by jazzlife
,

tar 사용법

old/Linux 2010. 3. 25. 12:30

tar 압축#


지정된 폴더만 압축할 경우#

tar -cvf file.tar dir1 dir2 dir3

--> dir1, dir2, dir3폴더를 file.tar로 압축


해제시 tar안의 특정폴더만 압축 풀 경우#

tar -xvf file2.tar dir1/dir2/dir3

--> file2.tar안에 dir1/dir2/dir3에 있는 폴더만 압축을 해제


분할 압축 #



  1. 먼저 압축하고자하는 디렉토리로 이동한다..
    # cd /var/www

    2. 다음과 같은 명령으로 압축을 실행한다.
    # tar cvf - 압축할디렉토리 | split -b 1024m - 압축파일.tar

    폴더의 권한까지 1기가로 압축을 하는 명령어입니다..
    단순히 tar로 묶어줍니다..
    (그냥 묶는것이 속도가 더 빠릅니다.그래서 저는 압축을 안하고 묶었습니다.)

    만약 압축까지하려면 다음과 같은 명령어를 넣어줍니다.
    # tar cvzf - 압축할디렉토리 | split -b 1024m - 압축파일.tar.gz


    3. 압축파일은 다음과 같은 형태로 저장되게 됩니다.
            압축파일.taraa
            압축파일.tarab
            압축파일.tarac
       뒤에 aa,ab,ac...가 붙게 됩니다..
       혹은
            압축파일.tar.gzaa

            압축파일.tar.gzab
            압축파일.tar.gzac


    4. 압축풀기
     #cat 압축파일.tar* | tar xvf -
    혹은
     #cat 압축파일.tar.gz* | tar xvz

'old > Linux' 카테고리의 다른 글

하드웨어 정보 확인  (0) 2010.03.25
기본 명령어  (0) 2010.03.25
Linux Partition  (0) 2010.03.25
RPM 사용법  (0) 2010.03.25
QuickSynergy  (0) 2010.02.26
Posted by jazzlife
,

RPM 사용법

old/Linux 2010. 3. 25. 12:29

RPM 설치#


※참고 : rpm 명령의 버젼에 따라 옵션값의 변경이나 사용법이 달라질수 도 있다.

            이 문서는 페도라 계열의 rpm-4.4.2-15.2.1 을 기준으로 작성되었다.

 

어디서나 흔히 볼 수 잇는 rpm 설치 하고 삭제 등...

1.rpm 설치

  1. #rpm -Uvh test-1.2.3.src.rpm

      : test.src.rpm을 /usr/src/<vender_name_dir>/SPEC 에 SPEC 파일과

         /usr/src/<vender_name_dir>/SOURCES/ 에 소스를 설치 한다.

         기존에 설치된 패키지가 있을 경우 업그레이드를 한다. -ivh 보다 많이 사용한다.

    #rpm -Uvh test-1.2.3.rpm

       : test-1.2.3.rpm 을 설치 한다. 기존에 test 라는 낮은 버젼의 패키지가 있으면 업그레이드. 없으면 그냥 -ivh 처럼 설치가 된다.

    #rpm -ivh test-1.2.3.rpm

       : test-1.2.3 을 처음으로 설치 한다. 처음 설치가 아니더라도 -Uvh 를 사용해도 무관 하다.


  2. 설치된 rpm 제거

    #rpm -e test

      : test 라는 이름의 패키지를 제거 한다.

    #rpm -evv test

      : test 라는 패키지를 제거 하는 과정을 보여 준다.


  3. 설치된 패키지 정보 보기

    #rpm -qi test

       : test 가 설치 되어 있다면, test 패키지에 대한 설명이 주루룩 뜰것 이다. 아래는 예...


    #rpm -qi bash
    Name        : bash                                      Relocations: /usr
    Version     : 3.1                                         Vendor: (none)
    Release     : 6.2.1.by                                 Build Date:
    Install Date:                                               Build Host: build.i386
    Group       : System Environment/Shells     Source RPM: bash-3.1-6.2.1.by.src.rpm
    Size          : 5298761                                License: GPL
    Signature   : DSA/SHA1, 2006년 08월 31일 (목) 오후 02시 04분 38초, Key ID ed71c4b0ef24e3a8
    URL            : http://www.gnu.org/software/bash
    Summary    : The GNU Bourne Again shell (bash) version 3.1.
    Description :
    The GNU Bourne Again shell (Bash) is a shell or command language
    interpreter that is compatible with the Bourne shell (sh). Bash
    incorporates useful features from the Korn shell (ksh) and the C shell
    (csh). Most sh scripts can be run by bash without modification. This
    package (bash) contains bash version 3.1, which improves POSIX
    compliance over previous versions.

    ※각 필드 별로 값이 들어 있는데 이 값들만 추축 하는 방법을 알고 싶다면, 이 노트의 rpm querytag 을 참고 하도록 한다.


  4. 강제 설치

      #rpm -Uvh --force test-1.2.3.rpm

        : 기존에 설치된 동일 버젼의 동일한 릴리즈 번호의 패키지를 덮어 씌워 설치 한다.


5. 의존성 무시 설치

     #rpm -Uvh --nodeps test-1.2.3.rpm

     #rpm -ivh --nodeps test-1.2.3.rpm

        :  test-1.2.3.rpm 패키지의 의존성을 무시하고 설치 한다. 의존성으로 인한 문제가 발생할 수도 있다.


6. 패키지가 설치한 파일들 보기

    : -ql 옵션을 사용 하여 rpm 패키지가 설치한 파일리스트를 본다.

     #rpm -ql test-1.2.3

     아래는 예제...


     #rpm -ql coreutils

     /bin/basename
     /bin/cat
     /bin/chgrp
     /bin/chmod
     /bin/chown
           .

           .

           .

        중략

7. 파일이 어느 패키지에 들어 있는지 알아보기

     : -qf 옵션을 이용하여 파일이 어느 패키지에서 설치 된것인지 알아본다.


     #whereis diff
     diff: /usr/bin/diff /usr/share/man/man1p/diff.1p.gz /usr/share/man/man1/diff.1.gz
     # rpm -qf /usr/bin/diff
     diffutils-2.8.1-15.2.1.1.by


     diff 명령이 어디 있는지 알아보기 위해 whereis 를 사용 하고, 파란글씨 부분의 실헹 파일이 어느 패키지에서 설치 된것인지 알아보기 위헤

     해당 경로를 입력 하였다. 결과 diff 라는 명령은 diffutils-2.8.1-15.2.1.1.by 에서 설치된 것임을 알 수 있다.

'old > Linux' 카테고리의 다른 글

하드웨어 정보 확인  (0) 2010.03.25
기본 명령어  (0) 2010.03.25
Linux Partition  (0) 2010.03.25
tar 사용법  (0) 2010.03.25
QuickSynergy  (0) 2010.02.26
Posted by jazzlife
,

Network switching subsystem

From Wikipedia, the free encyclopedia

  (Redirected from Home Location Register)
Jump to: navigation, search

Network switching subsystem (NSS) is the component of a GSM system that carries out switching functions and manages the communications between mobile phones and the Public Switched Telephone Network (PSTN). It is owned and deployed by mobile phone operators and allows mobile phones to communicate with each other and telephones in the wider telecommunications network. The architecture closely resembles a telephone exchange, but there are additional functions which are needed because the phones are not fixed in one location. Each of these functions handle different aspects of mobility management and are described in more detail below.

The Network Switching Subsystem, also referred to as the GSM core network, usually refers to the circuit-switched core network, used for traditional GSM services such as voice calls, SMS, and circuit switched data calls.

There is also an overlay architecture on the GSM core network to provide packet-switched data services and is known as the GPRS core network. This allows mobile phones to have access to services such as WAP, MMS, and Internet access.

All mobile phones manufactured today have both circuit and packet based services, so most operators have a GPRS network in addition to the standard GSM core network.

Contents

[hide]

[edit] Mobile switching center (MSC)

[edit] Description

The mobile switching center (MSC) is the primary service delivery node for GSM, responsible for routing voice calls and SMS as well as other services (such as conference calls, FAX and circuit switched data). The MSC sets up and releases the end-to-end connection, handles mobility and hand-over requirements during the call and takes care of charging and real time pre-paid account monitoring.

In the GSM mobile phone system, in contrast with earlier analogue services, fax and data information is sent directly digitally encoded to the MSC. Only at the MSC is this re-coded into an "analogue" signal (although actually this will almost certainly mean sound encoded digitally as PCM signal in a 64-kbit/s timeslot, known as a DS0 in America).

There are various different names for MSCs in different contexts which reflects their complex role in the network, all of these terms though could refer to the same MSC, but doing different things at different times.

The gateway MSC (G-MSC) is the MSC that determines which visited MSC the subscriber who is being called is currently located. It also interfaces with the PSTN. All mobile to mobile calls and PSTN to mobile calls are routed through a G-MSC. The term is only valid in the context of one call since any MSC may provide both the gateway function and the Visited MSC function, however, some manufacturers design dedicated high capacity MSCs which do not have any BSSs connected to them. These MSCs will then be the Gateway MSC for many of the calls they handle.

The visited MSC (V-MSC) is the MSC where a customer is currently located. The VLR associated with this MSC will have the subscriber's data in it.

The anchor MSC is the MSC from which a handover has been initiated. The target MSC is the MSC toward which a Handover should take place. A mobile switching centre server is a part of the redesigned MSC concept starting from 3GPP Release 5.

[edit] Mobile switching centre server (MSCS)

The mobile switching centre server is a soft-switch variant of the mobile switching centre, which provides circuit-switched calling, mobility management, and GSM services to the mobile phones roaming within the area that it serves. MSS functionality enables split between control (signalling) and user plane (bearer in network element called as media gateway/MG), which guarantees more optimal placement of network elements within the network.

MSS and MGW media gateway makes it possible to cross-connect circuit switched calls switched by using IP, ATM AAL2 as well as TDM. More information is available in 3GPP TS 23.205.

[edit] Other GSM core network elements connected to the MSC

The MSC connects to the following elements:

[edit] Procedures implemented

Tasks of the MSC include:

  • Delivering calls to subscribers as they arrive based on information from the VLR.
  • Connecting outgoing calls to other mobile subscribers or the PSTN.
  • Delivering SMSs from subscribers to the short message service centre (SMSC) and vice versa.
  • Arranging handovers from BSC to BSC.
  • Carrying out handovers from this MSC to another.
  • Supporting supplementary services such as conference calls or call hold.
  • Generating billing information.

[edit] Home location register (HLR)

The home location register (HLR) is a central database that contains details of each mobile phone subscriber that is authorized to use the GSM core network. There can be several logical, and physical, HLRs per public land mobile network (PLMN), though one international mobile subscriber identity (IMSI)/MSISDN pair can be associated with only one logical HLR (which can span several physical nodes) at a time.

The HLR stores details of every SIM card issued by the mobile phone operator. Each SIM has a unique identifier called an IMSI which is the primary key to each HLR record.

The next important items of data associated with the SIM are the MSISDNs, which are the telephone numbers used by mobile phones to make and receive calls. The primary MSISDN is the number used for making and receiving voice calls and SMS, but it is possible for a SIM to have other secondary MSISDNs associated with it for fax and data calls. Each MSISDN is also a primary key to the HLR record. The HLR data is stored for as long as a subscriber remains with the mobile phone operator.

Examples of other data stored in the HLR against an IMSI record is:

  • GSM services that the subscriber has requested or been given.
  • GPRS settings to allow the subscriber to access packet services.
  • Current location of subscriber (VLR and serving GPRS support node/SGSN).
  • Call divert settings applicable for each associated MSISDN.

The HLR is a system which directly receives and processes MAP transactions and messages from elements in the GSM network, for example, the location update messages received as mobile phones roam around.

[edit] Other GSM core network elements connected to the HLR

The HLR connects to the following elements:

  • The G-MSC for handling incoming calls
  • The VLR for handling requests from mobile phones to attach to the network
  • The SMSC for handling incoming SMS
  • The voice mail system for delivering notifications to the mobile phone that a message is waiting
  • The AUC for authentication and ciphering and exchange of data (triplets)

[edit] Procedures implemented

The main function of the HLR is to manage the fact that SIMs and phones move around a lot. The following procedures are implemented to deal with this:

  • Manage the mobility of subscribers by means of updating their position in administrative areas called 'location areas', which are identified with a LAC. The action of a user of moving from one LA to another is followed by the HLR with a Location area update procedure.
  • Send the subscriber data to a VLR or SGSN when a subscriber first roams there.
  • Broker between the G-MSC or SMSC and the subscriber's current VLR in order to allow incoming calls or text messages to be delivered.
  • Remove subscriber data from the previous VLR when a subscriber has roamed away from it.

[edit] Authentication centre (AUC)

[edit] Description

The authentication centre (AUC) is a function to authenticate each SIM card that attempts to connect to the GSM core network (typically when the phone is powered on). Once the authentication is successful, the HLR is allowed to manage the SIM and services described above. An encryption key is also generated that is subsequently used to encrypt all wireless communications (voice, SMS, etc.) between the mobile phone and the GSM core network.

If the authentication fails, then no services are possible from that particular combination of SIM card and mobile phone operator attempted. There is an additional form of identification check performed on the serial number of the mobile phone described in the EIR section below, but this is not relevant to the AUC processing.

Proper implementation of security in and around the AUC is a key part of an operator's strategy to avoid SIM cloning.

The AUC does not engage directly in the authentication process, but instead generates data known as triplets for the MSC to use during the procedure. The security of the process depends upon a shared secret between the AUC and the SIM called the Ki. The Ki is securely burned into the SIM during manufacture and is also securely replicated onto the AUC. This Ki is never transmitted between the AUC and SIM, but is combined with the IMSI to produce a challenge/response for identification purposes and an encryption key called Kc for use in over the air communications.

[edit] Other GSM core network elements connected to the AUC

The AUC connects to the following elements:

  • the MSC which requests a new batch of triplet data for an IMSI after the previous data have been used. This ensures that same keys and challenge responses are not used twice for a particular mobile.

[edit] Procedures implemented

The AUC stores the following data for each IMSI:

  • the Ki
  • Algorithm id. (the standard algorithms are called A3 or A8, but an operator may choose a proprietary one).

When the MSC asks the AUC for a new set of triplets for a particular IMSI, the AUC first generates a random number known as RAND. This RAND is then combined with the Ki to produce two numbers as follows:

  • The Ki and RAND are fed into the A3 algorithm and the signed response (SRES) is calculated.
  • The Ki and RAND are fed into the A8 algorithm and a session key called Kc is calculated.

The numbers (RAND, SRES, Kc) form the triplet sent back to the MSC. When a particular IMSI requests access to the GSM core network, the MSC sends the RAND part of the triplet to the SIM. The SIM then feeds this number and the Ki (which is burned onto the SIM) into the A3 algorithm as appropriate and an SRES is calculated and sent back to the MSC. If this SRES matches with the SRES in the triplet (which it should if it is a valid SIM), then the mobile is allowed to attach and proceed with GSM services.

After successful authentication, the MSC sends the encryption key Kc to the base station controller (BSC) so that all communications can be encrypted and decrypted. Of course, the mobile phone can generate the Kc itself by feeding the same RAND supplied during authentication and the Ki into the A8 algorithm.

The AUC is usually collocated with the HLR, although this is not necessary. Whilst the procedure is secure for most everyday use, it is by no means crack proof. Therefore a new set of security methods was designed for 3G phones.

[edit] Visitor location register (VLR)

[edit] Description

The visitor location register is a temporary database of the subscribers who have roamed into the particular area which it serves. Each base station in the network is served by exactly one VLR, hence a subscriber cannot be present in more than one VLR at a time.

The data stored in the VLR has either been received from the HLR, or collected from the MS. In practice, for performance reasons, most vendors integrate the VLR directly to the V-MSC and, where this is not done, the VLR is very tightly linked with the MSC via a proprietary interface.

Data stored include:

  • IMSI (the subscriber's identity number).
  • Authentication data.
  • MSISDN (the subscriber's phone number).
  • GSM services that the subscriber is allowed to access.
  • access point (GPRS) subscribed.
  • The HLR address of the subscriber.

[edit] Other GSM core network elements connected to the VLR

The VLR connects to the following elements:

  • The V-MSC to pass needed data for its procedures; e.g., authentication or call setup.
  • The HLR to request data for mobile phones attached to its serving area.
  • Other VLRs to transfer temporary data concerning the mobile when they roam into new VLR areas. For example, the temporal mobile subscriber identity (TMSI).

[edit] Procedures implemented

The primary functions of the VLR are:

  • To inform the HLR that a subscriber has arrived in the particular area covered by the VLR.
  • To track where the subscriber is within the VLR area (location area) when no call is ongoing.
  • To allow or disallow which services the subscriber may use.
  • To allocate roaming numbers during the processing of incoming calls.
  • To purge the subscriber record if a subscriber becomes inactive whilst in the area of a VLR. The VLR deletes the subscriber's data after a fixed time period of inactivity and informs the HLR (e.g., when the phone has been switched off and left off or when the subscriber has moved to an area with no coverage for a long time).
  • To delete the subscriber record when a subscriber explicitly moves to another, as instructed by the HLR.

[edit] Equipment identity register (EIR)

The equipment identity register is often integrated to the HLR. The EIR keeps a list of mobile phones (identified by their IMEI) which are to be banned from the network or monitored. This is designed to allow tracking of stolen mobile phones. In theory all data about all stolen mobile phones should be distributed to all EIRs in the world through a Central EIR. It is clear, however, that there are some countries where this is not in operation. The EIR data does not have to change in real time, which means that this function can be less distributed than the function of the HLR. The EIR is a database that contains information about the identity of the mobile equipment that prevents calls from stolen, unauthorized or defective mobile stations. Some EIR also have the capability to log Handset attempts and store it in a log file.

[edit] Other support functions

Connected more or less directly to the GSM core network are many other functions.

[edit] Billing centre (BC)

The billing centre is responsible for processing the toll tickets generated by the VLRs and HLRs and generating a bill for each subscriber. It is also responsible for generating billing data of roaming subscriber.

[edit] Short message service centre (SMSC)

The short message service centre supports the sending and reception of text messages.

[edit] Multimedia messaging service centre (MMSC)

The multimedia messaging service centre supports the sending of multimedia messages (e.g., images, audio, video and their combinations) to (or from) MMS-enabled Handsets.

[edit] Voicemail system (VMS)

The voicemail system records and stores voicemails.

[edit] Lawful interception functions

According to U.S. law, which has also been copied into many other countries, especially in Europe, all telecommunications equipment must provide facilities for monitoring the calls of selected users. There must be some level of support for this built into any of the different elements. The concept of lawful interception is also known, following the relevant U.S. law, as CALEA. Generally Lawful Interception implementation is similar to the implementation of conference call. While A and B is talking with each other, C can join the call and listens silently.

[edit] See also

[edit] External links

'old > sms&mms' 카테고리의 다른 글

SMS framework 소스 참고  (0) 2010.05.10
framework_source 참고  (0) 2010.05.10
telephony framework architecture  (0) 2010.04.26
3GPP Technical Specification Documents Download Site  (0) 2010.04.03
Definitions  (0) 2010.03.18
Posted by jazzlife
,

Network

old/용어정리 2010. 3. 24. 17:12
Gateway (telecommunications) :
  • In a communications network, a network node equipped for interfacing with another network that uses different protocols.
    • A gateway may contain devices such as protocol translators, impedance matching devices, rate converters, fault isolators, or signal translators as necessary to provide system interoperability. It also requires the establishment of mutually acceptable administrative procedures between both networks.
    • A protocol translation/mapping gateway interconnects networks with different network protocol technologies by performing the required protocol conversions.
  • Loosely, a computer configured to perform the tasks of a gateway. For a specific case, see default gateway.

Routers exemplify special cases of gateways.

Gateways, also called protocol converters, can operate at any layer of the OSI model. The job of a gateway is much more complex than that of a router or switch. Typically, a gateway must convert one protocol stack into another.


Router :

A router, pronounced /ˈraʊtər/ in the United States and Canada, and /ˈruːtər/ in the UK and Ireland (to differentiate it from the tool used to rout wood), is a purposely customized computer used to forward data among computer networks beyond directly connected devices. (The directly connected devices are said to be in LAN, where data are forwarded using Network switches.)

More technically, a router is a networking device whose software and hardware [in combination] are customized to the tasks of routing and forwarding information. A router differs from an ordinary computer in that it needs special hardware, called interface cards, to connect to remote devices through either copper cables or Optical fiber cable. These interface cards are in fact small computers that are specialized to convert electric signals from one form to another, with embedded CPU or ASIC, or both. In the case of optical fiber, the interface cards (also called ports) convert between optical signals and electrical signals.

Routers connect two or more logical subnets, which do not share a common network address. The subnets in the router do not necessarily map one-to-one to the physical interfaces of the router.[1] The term "layer 3 switching" is used often interchangeably with the term "routing". The term switching is generally used to refer to data forwarding between two network devices that share a common network address. This is also called layer 2 switching or LAN switching.

Conceptually, a router operates in two operational planes (or sub-systems):[2]

  • Control plane: where a router builds a table (called routing table) as how a packet should be forwarded through which interface, by using either statically configured statements (called statical routes) or by exchanging information with other routers in the network through a dynamical routing protocol;
  • Forwarding plane: where the router actually forwards the traffic (or called packets in IP protocol) from ingress (incoming) interfaces to an egress (outgoing) interface that is appropriate for the the destination address that the packet carries with it, by following rules derived from the routing table that has been built in the control plane.

'old > 용어정리' 카테고리의 다른 글

1  (0) 2010.07.07
Refactoring - Martin P.  (0) 2010.04.26
MMC/MNC 란?  (0) 2010.02.10
IMSI 란?  (0) 2010.02.10
URI 란?  (0) 2010.02.10
Posted by jazzlife
,

[ForegroundServiceController.java]

  @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.foreground_service_controller);

        // Watch for button clicks.
        Button button = (Button)findViewById(R.id.start_foreground);
        button.setOnClickListener(mForegroundListener);
        button = (Button)findViewById(R.id.start_background);
        button.setOnClickListener(mBackgroundListener);
        button = (Button)findViewById(R.id.stop);
        button.setOnClickListener(mStopListener);
    }

    private OnClickListener mForegroundListener = new OnClickListener() {
        public void onClick(View v) {
            Intent intent = new Intent(ForegroundService.ACTION_FOREGROUND);
            intent.setClass(ForegroundServiceController.this, ForegroundService.class);
            startService(intent);

        }
    };

    private OnClickListener mBackgroundListener = new OnClickListener() {
        public void onClick(View v) {
            Intent intent = new Intent(ForegroundService.ACTION_BACKGROUND);
            intent.setClass(ForegroundServiceController.this, ForegroundService.class);
            startService(intent);
        }
    };

    private OnClickListener mStopListener = new OnClickListener() {
        public void onClick(View v) {
            stopService(new Intent(ForegroundServiceController.this,
                    ForegroundService.class));

        }
    };
}



[ForegroundService.java]

    static final String ACTION_FOREGROUND = "com.example.android.apis.FOREGROUND";
    static final String ACTION_BACKGROUND = "com.example.android.apis.BACKGROUND";
   
    private static final Class[] mStartForegroundSignature = new Class[] {
        int.class, Notification.class};
    private static final Class[] mStopForegroundSignature = new Class[] {
        boolean.class};
   
    private NotificationManager mNM;
    private Method mStartForeground;
    private Method mStopForeground;
    private Object[] mStartForegroundArgs = new Object[2];
    private Object[] mStopForegroundArgs = new Object[1];
   
    @Override
    public void onCreate() {
        mNM = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
        try {
            mStartForeground = getClass().getMethod("startForeground",
                    mStartForegroundSignature);
            mStopForeground = getClass().getMethod("stopForeground",
                    mStopForegroundSignature);
        } catch (NoSuchMethodException e) {
            // Running on an older platform.
            mStartForeground = mStopForeground = null;
        }
    }

    // This is the old onStart method that will be called on the pre-2.0
    // platform.  On 2.0 or later we override onStartCommand() so this
    // method will not be called.
    @Override
    public void onStart(Intent intent, int startId) {
        handleCommand(intent);
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        handleCommand(intent);
        // We want this service to continue running until it is explicitly
        // stopped, so return sticky.
        return START_STICKY;
    }

    void handleCommand(Intent intent) {
        if (ACTION_FOREGROUND.equals(intent.getAction())) {
   // In this sample, we'll use the same text for the ticker and the expanded notification
            CharSequence text = getText(R.string.foreground_service_started);

            // Set the icon, scrolling text and timestamp
            Notification notification = new Notification(R.drawable.stat_sample, text,
                    System.currentTimeMillis());

            // The PendingIntent to launch our activity if the user selects this notification
            PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
                    new Intent(this, ForegroundServiceController.class), 0);

            // Set the info for the views that show in the notification panel.
            notification.setLatestEventInfo(this, getText(R.string.local_service_label),
                           text, contentIntent);
           
            startForegroundCompat(R.string.foreground_service_started, notification);
           
        } else if (ACTION_BACKGROUND.equals(intent.getAction())) {
            stopForegroundCompat(R.string.foreground_service_started);
        }
    }
   
    /**
     * This is a wrapper around the new startForeground method, using the older
     * APIs if it is not available.
     */

    void startForegroundCompat(int id, Notification notification) {
        // If we have the new startForeground API, then use it.
        if (mStartForeground != null) {
            mStartForegroundArgs[0] = Integer.valueOf(id);
            mStartForegroundArgs[1] = notification;
            try {
                mStartForeground.invoke(this, mStartForegroundArgs);
            } catch (InvocationTargetException e) {
                // Should not happen.
                Log.w("ApiDemos", "Unable to invoke startForeground", e);
            } catch (IllegalAccessException e) {
                // Should not happen.
                Log.w("ApiDemos", "Unable to invoke startForeground", e);
            }
            return;
        }
       
        // Fall back on the old API.
        setForeground(true);
        mNM.notify(id, notification);
    }
   
    /**
     * This is a wrapper around the new stopForeground method, using the older
     * APIs if it is not available.
     */

    void stopForegroundCompat(int id) {
        // If we have the new stopForeground API, then use it.
        if (mStopForeground != null) {
            mStopForegroundArgs[0] = Boolean.TRUE;
            try {
                mStopForeground.invoke(this, mStopForegroundArgs);
            } catch (InvocationTargetException e) {
                // Should not happen.
                Log.w("ApiDemos", "Unable to invoke stopForeground", e);
            } catch (IllegalAccessException e) {
                // Should not happen.
                Log.w("ApiDemos", "Unable to invoke stopForeground", e);
            }
            return;
        }
       
        // Fall back on the old API.  Note to cancel BEFORE changing the
        // foreground state, since we could be killed at that point.

        mNM.cancel(id);
        setForeground(false);
    }
   
    @Override
    public void onDestroy() {
        // Make sure our notification is gone.
        stopForegroundCompat(R.string.foreground_service_started);
    }

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
}

'old > API_Demo' 카테고리의 다른 글

APP_Service_LocalServiceController  (0) 2010.03.25
APP_Service_LocalServiceBinding  (0) 2010.03.25
APP_Search  (0) 2010.03.24
APP_Preferences_PreferencesFromCode  (0) 2010.03.24
APP_Preferences_DefaultValues  (0) 2010.03.24
Posted by jazzlife
,

APP_Search

old/API_Demo 2010. 3. 24. 15:05

[SearchInvoke.java]


    Button mStartSearch;
    Spinner mMenuMode;
    EditText mQueryPrefill;
    EditText mQueryAppData;

   
    final static int MENUMODE_SEARCH_KEY = 0;
    final static int MENUMODE_MENU_ITEM = 1;
    final static int MENUMODE_TYPE_TO_SEARCH = 2;
    final static int MENUMODE_DISABLED = 3;

   
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
       
        // Inflate our UI from its XML layout description.
        setContentView(R.layout.search_invoke);
       
        // Get display items for later interaction
        mStartSearch = (Button) findViewById(R.id.btn_start_search);
        mMenuMode = (Spinner) findViewById(R.id.spinner_menu_mode);
        mQueryPrefill = (EditText) findViewById(R.id.txt_query_prefill);
        mQueryAppData = (EditText) findViewById(R.id.txt_query_appdata);
       
        // Populate items
        ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(
                            this, R.array.search_menuModes, android.R.layout.simple_spinner_item);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        mMenuMode.setAdapter(adapter);
       
    // Create listener for the menu mode dropdown.  We use this to demonstrate control
    // of the default keys handler in every Activity.  More typically, you will simply set
    // the default key mode in your activity's onCreate() handler.

        mMenuMode.setOnItemSelectedListener(
            new OnItemSelectedListener() {
                public void onItemSelected(
                        AdapterView<?> parent, View view, int position, long id) {
                    if (position == MENUMODE_TYPE_TO_SEARCH) {
                        setDefaultKeyMode(DEFAULT_KEYS_SEARCH_LOCAL);
                    } else {
                        setDefaultKeyMode(DEFAULT_KEYS_DISABLE);
                    }
                }

                public void onNothingSelected(AdapterView<?> parent) {
                    setDefaultKeyMode(DEFAULT_KEYS_DISABLE);
                }
            });
       
        // Attach actions to buttons
        mStartSearch.setOnClickListener(
            new OnClickListener() {
                public void onClick(View v) {
                    onSearchRequested();
                }
            });
    }
   
    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
        super.onPrepareOptionsMenu(menu);
        MenuItem item;
       
            // first, get rid of our menus (if any)
        menu.removeItem(0);
        menu.removeItem(1);
       
            // next, add back item(s) based on current menu mode
        switch (mMenuMode.getSelectedItemPosition())
        {
        case MENUMODE_SEARCH_KEY:
            item = menu.add( 0, 0, 0, "(Search Key)");
            break;
           
        case MENUMODE_MENU_ITEM:
            item = menu.add( 0, 0, 0, "Search");
            item.setAlphabeticShortcut(SearchManager.MENU_KEY);
            break;
           
        case MENUMODE_TYPE_TO_SEARCH:
            item = menu.add( 0, 0, 0, "(Type-To-Search)");
            break;
           
        case MENUMODE_DISABLED:
            item = menu.add( 0, 0, 0, "(Disabled)");
            break;
        }
       
        item = menu.add(0, 1, 0, "Clear History");
        return true;
    }
   
    /** Handle the menu item selections */
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case 0:
            switch (mMenuMode.getSelectedItemPosition()) {
            case MENUMODE_SEARCH_KEY:
                new AlertDialog.Builder(this)
                    .setMessage("To invoke search, dismiss this dialog and press the search key" +
                                " (F5 on the simulator).")
                    .setPositiveButton("OK", null)
                    .show();
                break;
               
            case MENUMODE_MENU_ITEM:
                onSearchRequested();
                break;
               
            case MENUMODE_TYPE_TO_SEARCH:
                new AlertDialog.Builder(this)
                    .setMessage("To invoke search, dismiss this dialog and start typing.")
                    .setPositiveButton("OK", null)
                    .show();
                break;
               
            case MENUMODE_DISABLED:
                new AlertDialog.Builder(this)
                    .setMessage("You have disabled search.")
                    .setPositiveButton("OK", null)
                    .show();
                break;
            }
            break;
        case 1:
            clearSearchHistory();
            break;
        }
   
         return super.onOptionsItemSelected(item);
    }
   
    @Override
    public boolean onSearchRequested() {
        // If your application absolutely must disable search, do it here.
        if (mMenuMode.getSelectedItemPosition() == MENUMODE_DISABLED) {
            return false;
        }
       
        final String queryPrefill = mQueryPrefill.getText().toString();

        Bundle appDataBundle = null;
        final String queryAppDataString = mQueryAppData.getText().toString();
        if (queryAppDataString != null) {
            appDataBundle = new Bundle();
            appDataBundle.putString("demo_key", queryAppDataString);
        }
       
        // Now call the Activity member function that invokes the Search Manager UI.
        startSearch(queryPrefill, false, appDataBundle, false);
       
        // Returning true indicates that we did launch the search, instead of blocking it.
        return true;
    }
   
    private void clearSearchHistory() {
        SearchRecentSuggestions suggestions = new SearchRecentSuggestions(this,
                SearchSuggestionSampleProvider.AUTHORITY, SearchSuggestionSampleProvider.MODE);
        suggestions.clearHistory();
    }
   
}



[SearchQueryResoults.java]

        // UI elements
    TextView mQueryText;
    TextView mAppDataText;
    TextView mDeliveredByText;
   
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
       
        // Inflate our UI from its XML layout description.
        setContentView(R.layout.search_query_results);
       
        // Get active display items for later updates
        mQueryText = (TextView) findViewById(R.id.txt_query);
        mAppDataText = (TextView) findViewById(R.id.txt_appdata);
        mDeliveredByText = (TextView) findViewById(R.id.txt_deliveredby);
       
        // get and process search query here
        final Intent queryIntent = getIntent();
        final String queryAction = queryIntent.getAction();
        if (Intent.ACTION_SEARCH.equals(queryAction)) {
            doSearchQuery(queryIntent, "onCreate()");
        }
        else {
            mDeliveredByText.setText("onCreate(), but no ACTION_SEARCH intent");
        }
    }
   
    @Override
    public void onNewIntent(final Intent newIntent) {
        super.onNewIntent(newIntent);
       
        // get and process search query here
        final Intent queryIntent = getIntent();
        final String queryAction = queryIntent.getAction();
        if (Intent.ACTION_SEARCH.equals(queryAction)) {
            doSearchQuery(queryIntent, "onNewIntent()");
        }
        else {
            mDeliveredByText.setText("onNewIntent(), but no ACTION_SEARCH intent");
        }
    }
   
    private void doSearchQuery(final Intent queryIntent, final String entryPoint) {
       
        // The search query is provided as an "extra" string in the query intent
        final String queryString = queryIntent.getStringExtra(SearchManager.QUERY);
        mQueryText.setText(queryString);
       
        // Record the query string in the recent queries suggestions provider.
        SearchRecentSuggestions suggestions = new SearchRecentSuggestions(this,
                SearchSuggestionSampleProvider.AUTHORITY, SearchSuggestionSampleProvider.MODE);
        suggestions.saveRecentQuery(queryString, null);
       
        // If your application provides context data for its searches,
        // you will receive it as an "extra" bundle in the query intent.
        // The bundle can contain any number of elements, using any number of keys;
        // For this Api Demo we're just using a single string, stored using "demo key".
        final Bundle appData = queryIntent.getBundleExtra(SearchManager.APP_DATA);
        if (appData == null) {
            mAppDataText.setText("<no app data bundle>");
        }
        if (appData != null) {
            String testStr = appData.getString("demo_key");
            mAppDataText.setText((testStr == null) ? "<no app data>" : testStr);
        }
       
        // Report the method by which we were called.
        mDeliveredByText.setText(entryPoint);
    }
}



[arrays.xml]

<resources>
    <string-array name="search_menuModes">
        <item>Search Key</item>
        <item>Menu Item</item>
        <item>Type-To-Search</item>
        <item>Disabled</item>
    </string-array>
</resources>


'old > API_Demo' 카테고리의 다른 글

APP_Service_LocalServiceBinding  (0) 2010.03.25
APP_Service_ForegroundServiceController  (0) 2010.03.24
APP_Preferences_PreferencesFromCode  (0) 2010.03.24
APP_Preferences_DefaultValues  (0) 2010.03.24
APP_PreferenceDependencies  (0) 2010.03.24
Posted by jazzlife
,

[PreferencesFromCode.java]

   @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
       
        setPreferenceScreen(createPreferenceHierarchy());
    }

    private PreferenceScreen createPreferenceHierarchy() {
        PreferenceScreen root = getPreferenceManager().createPreferenceScreen(this);
       
        // Inline preferences
        PreferenceCategory inlinePrefCat = new PreferenceCategory(this);
        inlinePrefCat.setTitle(R.string.inline_preferences);
        root.addPreference(inlinePrefCat);
       
        // Toggle preference
        CheckBoxPreference togglePref = new CheckBoxPreference(this);
        togglePref.setKey("toggle_preference");
        togglePref.setTitle(R.string.title_toggle_preference);
        togglePref.setSummary(R.string.summary_toggle_preference);
        inlinePrefCat.addPreference(togglePref);
               
        // Dialog based preferences
        PreferenceCategory dialogBasedPrefCat = new PreferenceCategory(this);
        dialogBasedPrefCat.setTitle(R.string.dialog_based_preferences);
        root.addPreference(dialogBasedPrefCat);

        // Edit text preference
        EditTextPreference editTextPref = new EditTextPreference(this);
        editTextPref.setDialogTitle(R.string.dialog_title_edittext_preference);
        editTextPref.setKey("edittext_preference");
        editTextPref.setTitle(R.string.title_edittext_preference);
        editTextPref.setSummary(R.string.summary_edittext_preference);
        dialogBasedPrefCat.addPreference(editTextPref);
       
        // List preference
        ListPreference listPref = new ListPreference(this);
        listPref.setEntries(R.array.entries_list_preference);
        listPref.setEntryValues(R.array.entryvalues_list_preference);
        listPref.setDialogTitle(R.string.dialog_title_list_preference);
        listPref.setKey("list_preference");
        listPref.setTitle(R.string.title_list_preference);
        listPref.setSummary(R.string.summary_list_preference);
        dialogBasedPrefCat.addPreference(listPref);
       
        // Launch preferences
        PreferenceCategory launchPrefCat = new PreferenceCategory(this);
        launchPrefCat.setTitle(R.string.launch_preferences);
        root.addPreference(launchPrefCat);

        // Screen preference
        PreferenceScreen screenPref = getPreferenceManager().createPreferenceScreen(this);
        screenPref.setKey("screen_preference");
        screenPref.setTitle(R.string.title_screen_preference);
        screenPref.setSummary(R.string.summary_screen_preference);
        launchPrefCat.addPreference(screenPref);
               
        // Example of next screen toggle preference
        CheckBoxPreference nextScreenCheckBoxPref = new CheckBoxPreference(this);
        nextScreenCheckBoxPref.setKey("next_screen_toggle_preference");
        nextScreenCheckBoxPref.setTitle(R.string.title_next_screen_toggle_preference);
        nextScreenCheckBoxPref.setSummary(R.string.summary_next_screen_toggle_preference);
        screenPref.addPreference(nextScreenCheckBoxPref);
       
        // Intent preference
        PreferenceScreen intentPref = getPreferenceManager().createPreferenceScreen(this);
        intentPref.setIntent(new Intent().setAction(Intent.ACTION_VIEW)
                .setData(Uri.parse("http://www.android.com")));
        intentPref.setTitle(R.string.title_intent_preference);
        intentPref.setSummary(R.string.summary_intent_preference);
        launchPrefCat.addPreference(intentPref);
       
        // Preference attributes
        PreferenceCategory prefAttrsCat = new PreferenceCategory(this);
        prefAttrsCat.setTitle(R.string.preference_attributes);
        root.addPreference(prefAttrsCat);
       
        // Visual parent toggle preference
        CheckBoxPreference parentCheckBoxPref = new CheckBoxPreference(this);
        parentCheckBoxPref.setTitle(R.string.title_parent_preference);
        parentCheckBoxPref.setSummary(R.string.summary_parent_preference);
        prefAttrsCat.addPreference(parentCheckBoxPref);
       
        // Visual child toggle preference
        // See res/values/attrs.xml for the <declare-styleable> that defines
        // TogglePrefAttrs.

        TypedArray a = obtainStyledAttributes(R.styleable.TogglePrefAttrs);
        CheckBoxPreference childCheckBoxPref = new CheckBoxPreference(this);
        childCheckBoxPref.setTitle(R.string.title_child_preference);
        childCheckBoxPref.setSummary(R.string.summary_child_preference);
        childCheckBoxPref.setLayoutResource(
                a.getResourceId(R.styleable.TogglePrefAttrs_android_preferenceLayoutChild,
                        0));
        prefAttrsCat.addPreference(childCheckBoxPref);
        a.recycle();
       
        return root;
    }
}



[attrs.xml]

<resources>
    <declare-styleable name="TogglePrefAttrs">
        <attr name="android:preferenceLayoutChild" />
    </declare-styleable>
</resources>

'old > API_Demo' 카테고리의 다른 글

APP_Service_ForegroundServiceController  (0) 2010.03.24
APP_Search  (0) 2010.03.24
APP_Preferences_DefaultValues  (0) 2010.03.24
APP_PreferenceDependencies  (0) 2010.03.24
APP_Preferences_LaunchingPreferences  (0) 2010.03.23
Posted by jazzlife
,
[DefaultValues.java]

addPreferencesFromResource(R.xml.default_values);




[default_values.xml]

<PreferenceScreen
        xmlns:android="
http://schemas.android.com/apk/res/android">

    <CheckBoxPreference
            android:key="default_toggle"
            android:defaultValue="true"
            android:title="@string/title_checkbox_preference"
            android:summary="@string/summary_checkbox_preference" />

    <EditTextPreference
            android:key="default_edittext"
            android:defaultValue="@string/default_value_edittext_preference"
            android:title="@string/title_edittext_preference"
            android:summary="@string/summary_edittext_preference"
            android:dialogTitle="@string/dialog_title_edittext_preference" />
           
    <ListPreference
            android:key="default_list"
          android:defaultValue="@string/default_value_list_preference"
            android:title="@string/title_list_preference"
            android:summary="@string/summary_list_preference"
            android:entries="@array/entries_list_preference"
            android:entryValues="@array/entryvalues_list_preference"
            android:dialogTitle="@string/dialog_title_list_preference" />

</PreferenceScreen>



[arrays.xml]

<resources>
    <string-array name="entries_list_preference">
        <item>Alpha Option 01</item>
        <item>Beta Option 02</item>
        <item>Charlie Option 03</item> 
    </string-array>

    <string-array name="entryvalues_list_preference">
        <item>alpha</item>
        <item>beta</item>
        <item>charlie</item> 
    </string-array>
</resources>

 

'old > API_Demo' 카테고리의 다른 글

APP_Search  (0) 2010.03.24
APP_Preferences_PreferencesFromCode  (0) 2010.03.24
APP_PreferenceDependencies  (0) 2010.03.24
APP_Preferences_LaunchingPreferences  (0) 2010.03.23
APP_Preferences_PreferencesFromXML  (0) 2010.03.23
Posted by jazzlife
,

[PreferenceDependencies.java]

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
       
        addPreferencesFromResource(R.xml.preference_dependencies);
    }

}



[preference_depencencies.xml]

<PreferenceScreen
        xmlns:android="
http://schemas.android.com/apk/res/android">

    <PreferenceCategory
            android:title="@string/example_preference_dependency">
           
        <CheckBoxPreference
                android:key="wifi"
                android:title="@string/title_wifi" />
           
        <EditTextPreference
                android:layout="?android:attr/preferenceLayoutChild"
                android:title="@string/title_wifi_settings"
                android:dependency="wifi" />
           
    </PreferenceCategory>
</PreferenceScreen>


'old > API_Demo' 카테고리의 다른 글

APP_Preferences_PreferencesFromCode  (0) 2010.03.24
APP_Preferences_DefaultValues  (0) 2010.03.24
APP_Preferences_LaunchingPreferences  (0) 2010.03.23
APP_Preferences_PreferencesFromXML  (0) 2010.03.23
APP_Notification_StatusBar  (0) 2010.03.23
Posted by jazzlife
,

[LaunchingPreferences.java]

    private static final int REQUEST_CODE_PREFERENCES = 1;
    private TextView mCounterText;
   
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

       PreferenceManager.setDefaultValues(this, R.xml.advanced_preferences, false);
       
        LinearLayout layout = new LinearLayout(this);
        layout.setOrientation(LinearLayout.VERTICAL);
        setContentView(layout);
       
        Button launchPreferences = new Button(this);
        launchPreferences.setText(getString(R.string.launch_preference_activity));
        launchPreferences.setOnClickListener(this);
        layout.addView(launchPreferences, new LayoutParams(LayoutParams.FILL_PARENT,
                LayoutParams.WRAP_CONTENT));
       
        mCounterText = new TextView(this);
        layout.addView(mCounterText, new LayoutParams(LayoutParams.FILL_PARENT,
                LayoutParams.WRAP_CONTENT));
       
        updateCounterText();
    }

    public void onClick(View v) {
       
        Intent launchPreferencesIntent = new Intent().setClass(this, AdvancedPreferences.class);
       
        startActivityForResult(launchPreferencesIntent, REQUEST_CODE_PREFERENCES);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
       
        if (requestCode == REQUEST_CODE_PREFERENCES) {
            updateCounterText();
        }
    }

    private void updateCounterText() {
        SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
        final int counter = sharedPref.getInt(AdvancedPreferences.KEY_MY_PREFERENCE, 0);
        mCounterText.setText(getString(R.string.counter_value_is) + " " + counter);
    }
}



[AdvancedPreferences.class]


   public static final String KEY_MY_PREFERENCE = "my_preference";
    public static final String KEY_ADVANCED_CHECKBOX_PREFERENCE = "advanced_checkbox_preference";

    private CheckBoxPreference mCheckBoxPreference;
    private Handler mHandler = new Handler();

   
    private Runnable mForceCheckBoxRunnable = new Runnable() {
        public void run() {
            if (mCheckBoxPreference != null) {
                mCheckBoxPreference.setChecked(!mCheckBoxPreference.isChecked());
            }
           
              mHandler.postDelayed(this, 1000);
        }
    };
   
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        addPreferencesFromResource(R.xml.advanced_preferences);
       
        mCheckBoxPreference = (CheckBoxPreference)getPreferenceScreen().findPreference(KEY_ADVANCED_CHECKBOX_PREFERENCE);
    }

    @Override
    protected void onResume() {
        super.onResume();

        mForceCheckBoxRunnable.run();
       
        getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
    }

    @Override
    protected void onPause() {
        super.onPause();

        getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
       
        mHandler.removeCallbacks(mForceCheckBoxRunnable);
    }

    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
        if (key.equals(KEY_MY_PREFERENCE)) {
            Toast.makeText(this, "Thanks! You increased my count to "
                    + sharedPreferences.getInt(key, 0), Toast.LENGTH_SHORT).show();
        }
    }
   
}


[MyPreference.java]

   private int mClickCounter;

    public MyPreference(Context context, AttributeSet attrs) {
        super(context, attrs);
       
        setWidgetLayoutResource(R.layout.preference_widget_mypreference);       
    }

    @Override
    protected void onBindView (View view) {
        super.onBindView(view);
       
        final TextView myTextView = (TextView) view.findViewById(R.id.mypreference_widget);
        if (myTextView != null) {
            myTextView.setText(String.valueOf(mClickCounter));
        }
    }

    @Override
    protected void onClick() {
        int newValue = mClickCounter + 1;
        if (!callChangeListener(newValue)) {
            return;
        }
       
        mClickCounter = newValue;
       
        persistInt(mClickCounter);
       
        notifyChanged();
    }

    @Override
    protected Object onGetDefaultValue(TypedArray a, int index) {
        return a.getInteger(index, 0);
    }

    @Override
    protected void onSetInitialValue(boolean restoreValue, Object defaultValue) {
        if (restoreValue) {
            mClickCounter = getPersistedInt(mClickCounter);
        } else {
            int value = (Integer) defaultValue;
            mClickCounter = value;
            persistInt(value);
        }
    }

    @Override
    protected Parcelable onSaveInstanceState() {
       
        final Parcelable superState = super.onSaveInstanceState();
        if (isPersistent()) {
            return superState;
        }

        final SavedState myState = new SavedState(superState);
        myState.clickCounter = mClickCounter;
        return myState;
    }

    @Override
    protected void onRestoreInstanceState(Parcelable state) {
        if (!state.getClass().equals(SavedState.class)) {
            super.onRestoreInstanceState(state);
            return;
        }

        SavedState myState = (SavedState) state;
        super.onRestoreInstanceState(myState.getSuperState());
        mClickCounter = myState.clickCounter;
        notifyChanged();
    }
   
    private static class SavedState extends BaseSavedState {
        int clickCounter;
       
        public SavedState(Parcel source) {
            super(source);
           
            clickCounter = source.readInt();
        }

        @Override
        public void writeToParcel(Parcel dest, int flags) {
            super.writeToParcel(dest, flags);
           
            dest.writeInt(clickCounter);
        }

        public SavedState(Parcelable superState) {
            super(superState);
        }

        public static final Parcelable.Creator<SavedState> CREATOR =
                new Parcelable.Creator<SavedState>() {
            public SavedState createFromParcel(Parcel in) {
                return new SavedState(in);
            }

            public SavedState[] newArray(int size) {
                return new SavedState[size];

            }
        };
    }
   
}



[advances_preferences.xml]

<PreferenceScreen
        xmlns:android="
http://schemas.android.com/apk/res/android">

    <com.example.android.apis.app.MyPreference
            android:key="my_preference"
            android:title="@string/title_my_preference"
            android:summary="@string/summary_my_preference"
            android:defaultValue="100" />

    <CheckBoxPreference
            android:key="advanced_checkbox_preference"
            android:title="@string/title_advanced_toggle_preference"
            android:summaryOn="@string/summary_on_advanced_toggle_preference"
            android:summaryOff="@string/summary_off_advanced_toggle_preference" />

</PreferenceScreen>

'old > API_Demo' 카테고리의 다른 글

APP_Preferences_DefaultValues  (0) 2010.03.24
APP_PreferenceDependencies  (0) 2010.03.24
APP_Preferences_PreferencesFromXML  (0) 2010.03.23
APP_Notification_StatusBar  (0) 2010.03.23
APP_Notification_NotifyWithText  (0) 2010.03.23
Posted by jazzlife
,

[PreferencesFromXML.java]

  @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        addPreferencesFromResource(R.xml.preferences);
    }
}



[preferences.xml]

<PreferenceScreen
        xmlns:android="
http://schemas.android.com/apk/res/android">

    <PreferenceCategory
            android:title="@string/inline_preferences" >
           
        <CheckBoxPreference
                android:key="checkbox_preference"
                android:title="@string/title_toggle_preference"
                android:summary="@string/summary_toggle_preference" />
           
    </PreferenceCategory>
               
    <PreferenceCategory
            android:title="@string/dialog_based_preferences" >

        <EditTextPreference
                android:key="edittext_preference"
                android:title="@string/title_edittext_preference"
                android:summary="@string/summary_edittext_preference"
                android:dialogTitle="@string/dialog_title_edittext_preference" />
               
        <ListPreference
                android:key="list_preference"
                android:title="@string/title_list_preference"
                android:summary="@string/summary_list_preference"
                android:entries="@array/entries_list_preference"
                android:entryValues="@array/entryvalues_list_preference"
                android:dialogTitle="@string/dialog_title_list_preference" />

    </PreferenceCategory>

    <PreferenceCategory
            android:title="@string/launch_preferences" >

        <PreferenceScreen
                android:key="screen_preference"
                android:title="@string/title_screen_preference"
                android:summary="@string/summary_screen_preference">
                     
            <CheckBoxPreference
                    android:key="next_screen_checkbox_preference"
                    android:title="@string/title_next_screen_toggle_preference"
                    android:summary="@string/summary_next_screen_toggle_preference" />
               
        </PreferenceScreen>

        <PreferenceScreen
                android:title="@string/title_intent_preference"
                android:summary="@string/summary_intent_preference">

            <intent android:action="android.intent.action.VIEW"
                    android:data="
http://www.android.com" />

        </PreferenceScreen>

    </PreferenceCategory>
   
    <PreferenceCategory
            android:title="@string/preference_attributes">
   
        <CheckBoxPreference
                android:key="parent_checkbox_preference"
                android:title="@string/title_parent_preference"
                android:summary="@string/summary_parent_preference" />

        <CheckBoxPreference
                android:key="child_checkbox_preference"
                android:dependency="parent_checkbox_preference"
                android:layout="?android:attr/preferenceLayoutChild"
                android:title="@string/title_child_preference"
                android:summary="@string/summary_child_preference" />
           
    </PreferenceCategory>
   
</PreferenceScreen>




[arrays.xml]

<Resources>
    <string-array name="entries_list_preference">
        <item>Alpha Option 01</item>
        <item>Beta Option 02</item>
        <item>Charlie Option 03</item> 
    </string-array>
</Resources>




'old > API_Demo' 카테고리의 다른 글

APP_PreferenceDependencies  (0) 2010.03.24
APP_Preferences_LaunchingPreferences  (0) 2010.03.23
APP_Notification_StatusBar  (0) 2010.03.23
APP_Notification_NotifyWithText  (0) 2010.03.23
APP_Notification_NotifyingServiceController  (0) 2010.03.23
Posted by jazzlife
,

[StatusBar.java]

   private NotificationManager mNotificationManager;
   private static int MOOD_NOTIFICATIONS = R.layout.status_bar_notifications;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.status_bar_notifications);

        Button button;

        mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

        button = (Button) findViewById(R.id.happy);
        button.setOnClickListener(new Button.OnClickListener() {
            public void onClick(View v) {
    setMood(R.drawable.stat_happy, R.string.status_bar_notifications_happy_message,
                        false);
            }
        });

        button = (Button) findViewById(R.id.neutral);
        button.setOnClickListener(new Button.OnClickListener() {
            public void onClick(View v) {
     setMood(R.drawable.stat_neutral, R.string.status_bar_notifications_ok_message,
                        false);
            }
        });

        button = (Button) findViewById(R.id.sad);
        button.setOnClickListener(new Button.OnClickListener() {
            public void onClick(View v) {
       setMood(R.drawable.stat_sad, R.string.status_bar_notifications_sad_message, false);
            }
        });

        button = (Button) findViewById(R.id.happyMarquee);
        button.setOnClickListener(new Button.OnClickListener() {
            public void onClick(View v) {
      setMood(R.drawable.stat_happy, R.string.status_bar_notifications_happy_message,
                        true);
            }
        });

        button = (Button) findViewById(R.id.neutralMarquee);
        button.setOnClickListener(new Button.OnClickListener() {
            public void onClick(View v) {
      setMood(R.drawable.stat_neutral, R.string.status_bar_notifications_ok_message, true);
            }
        });

        button = (Button) findViewById(R.id.sadMarquee);
        button.setOnClickListener(new Button.OnClickListener() {
            public void onClick(View v) {
      setMood(R.drawable.stat_sad, R.string.status_bar_notifications_sad_message, true);
            }
        });

        button = (Button) findViewById(R.id.happyViews);
        button.setOnClickListener(new Button.OnClickListener() {
            public void onClick(View v) {
     setMoodView(R.drawable.stat_happy, R.string.status_bar_notifications_happy_message);
            }
        });

        button = (Button) findViewById(R.id.neutralViews);
        button.setOnClickListener(new Button.OnClickListener() {
            public void onClick(View v) {
    setMoodView(R.drawable.stat_neutral, R.string.status_bar_notifications_ok_message);
            }
        });

        button = (Button) findViewById(R.id.sadViews);
        button.setOnClickListener(new Button.OnClickListener() {
            public void onClick(View v) {
    setMoodView(R.drawable.stat_sad, R.string.status_bar_notifications_sad_message);
            }
        });
       
        button = (Button) findViewById(R.id.defaultSound);
        button.setOnClickListener(new Button.OnClickListener() {
            public void onClick(View v) {
                setDefault(Notification.DEFAULT_SOUND);
            }
        });
       
        button = (Button) findViewById(R.id.defaultVibrate);
        button.setOnClickListener(new Button.OnClickListener() {
            public void onClick(View v) {
                setDefault(Notification.DEFAULT_VIBRATE);
            }
        });
       
        button = (Button) findViewById(R.id.defaultAll);
        button.setOnClickListener(new Button.OnClickListener() {
            public void onClick(View v) {
                setDefault(Notification.DEFAULT_ALL);
            }
        });
       
        button = (Button) findViewById(R.id.clear);
        button.setOnClickListener(new Button.OnClickListener() {
            public void onClick(View v) {
                mNotificationManager.cancel(R.layout.status_bar_notifications);
            }
        });
    }

    private PendingIntent makeMoodIntent(int moodId) {
        PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
                new Intent(this, NotificationDisplay.class)
                        .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
                        .putExtra("moodimg", moodId),
                PendingIntent.FLAG_UPDATE_CURRENT);
        return contentIntent;
    }
   
    private void setMood(int moodId, int textId, boolean showTicker) {
         CharSequence text = getText(textId);

         String tickerText = showTicker ? getString(textId) : null;

        Notification notification = new Notification(moodId, tickerText,
                System.currentTimeMillis());

 notification.setLatestEventInfo(this, getText(R.string.status_bar_notifications_mood_title),
                       text, makeMoodIntent(moodId));

        mNotificationManager.notify(R.layout.status_bar_notifications, notification);
    }

    private void setMoodView(int moodId, int textId) {
        Notification notif = new Notification();

        notif.contentIntent = makeMoodIntent(moodId);

        CharSequence text = getText(textId);
        notif.tickerText = text;

        notif.icon = moodId;

        RemoteViews contentView = new RemoteViews(getPackageName(), R.layout.status_bar_balloon);
        contentView.setTextViewText(R.id.text, text);
        contentView.setImageViewResource(R.id.icon, moodId);
        notif.contentView = contentView;

        mNotificationManager.notify(R.layout.status_bar_notifications, notif);
    }
   
    private void setDefault(int defaults) {
       
        PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
                new Intent(this, StatusBarNotifications.class), 0);

        CharSequence text = getText(R.string.status_bar_notifications_happy_message);

        final Notification notification = new Notification(
                R.drawable.stat_happy, text, System.currentTimeMillis());

        notification.setLatestEventInfo(
                this,  getText(R.string.status_bar_notifications_mood_title),
                text, contentIntent);
        notification.defaults = defaults;
       
        mNotificationManager.notify(
                   R.layout.status_bar_notifications, notification);              
    }   
}



[Manifest.xml]

        <activity android:name=".app.StatusBarNotifications"
                android:label="App/Notification/Status Bar"
                android:launchMode="singleTop">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.SAMPLE_CODE" />
            </intent-filter>
        </activity>

'old > API_Demo' 카테고리의 다른 글

APP_Preferences_LaunchingPreferences  (0) 2010.03.23
APP_Preferences_PreferencesFromXML  (0) 2010.03.23
APP_Notification_NotifyWithText  (0) 2010.03.23
APP_Notification_NotifyingServiceController  (0) 2010.03.23
APP_Notification_IncomingMessageView  (0) 2010.03.23
Posted by jazzlife
,

[NotifyWithText.java]

 button = (Button) findViewById(R.id.short_notify);
        button.setOnClickListener(new Button.OnClickListener() {
            public void onClick(View v) {
                Toast.makeText(NotifyWithText.this, R.string.short_notification_text,
                    Toast.LENGTH_SHORT).show();
            }
        });

        button = (Button) findViewById(R.id.long_notify);
        button.setOnClickListener(new Button.OnClickListener() {
            public void onClick(View v) {
                Toast.makeText(NotifyWithText.this, R.string.long_notification_text,
                    Toast.LENGTH_LONG).show();
            }
        });

'old > API_Demo' 카테고리의 다른 글

APP_Preferences_PreferencesFromXML  (0) 2010.03.23
APP_Notification_StatusBar  (0) 2010.03.23
APP_Notification_NotifyingServiceController  (0) 2010.03.23
APP_Notification_IncomingMessageView  (0) 2010.03.23
APP_Menu_InflateFromXML  (0) 2010.03.23
Posted by jazzlife
,

[NotifyingServiceController.java]

    private static int MOOD_NOTIFICATIONS = R.layout.status_bar_notifications;
    private ConditionVariable mCondition;

 
    @Override
    public void onCreate() {
        mNM = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

        Thread notifyingThread = new Thread(null, mTask, "NotifyingService");
        mCondition = new ConditionVariable(false);
        notifyingThread.start();
    }

    @Override
    public void onDestroy() {
        mNM.cancel(MOOD_NOTIFICATIONS);
        mCondition.open();
    }

    private Runnable mTask = new Runnable() {
        public void run() {
            for (int i = 0; i < 4; ++i) {
                showNotification(R.drawable.stat_happy,
                        R.string.status_bar_notifications_happy_message);
                if (mCondition.block(5 * 1000))
                    break;
                showNotification(R.drawable.stat_neutral,
                        R.string.status_bar_notifications_ok_message);
                if (mCondition.block(5 * 1000))
                    break;
                showNotification(R.drawable.stat_sad,
                        R.string.status_bar_notifications_sad_message);
                if (mCondition.block(5 * 1000))
                    break;
            }
            NotifyingService.this.stopSelf();
        }
    };

    @Override
    public IBinder onBind(Intent intent) {
        return mBinder;
    }

   
    private void showNotification(int moodId, int textId) {
        CharSequence text = getText(textId);
        Notification notification = new Notification(moodId, null, System.currentTimeMillis());

        PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
                new Intent(this, NotifyingController.class), 0);

        notification.setLatestEventInfo(this, getText(R.string.status_bar_notifications_mood_title),
                       text, contentIntent);

        mNM.notify(MOOD_NOTIFICATIONS, notification);
    }

    private final IBinder mBinder = new Binder() {
        @Override
        protected boolean onTransact(int code, Parcel data, Parcel reply,
                int flags) throws RemoteException {
            return super.onTransact(code, data, reply, flags);
        }
    };

    private NotificationManager mNM;
}



[Manifest.xml]

        <service android:name=".app.NotifyingService" />

        <activity android:name=".app.NotifyingController" android:label="App/Notification/Notifying Service Controller">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.SAMPLE_CODE" />
            </intent-filter>
        </activity>

'old > API_Demo' 카테고리의 다른 글

APP_Notification_StatusBar  (0) 2010.03.23
APP_Notification_NotifyWithText  (0) 2010.03.23
APP_Notification_IncomingMessageView  (0) 2010.03.23
APP_Menu_InflateFromXML  (0) 2010.03.23
APP_LauncherShortcuts  (0) 2010.03.23
Posted by jazzlife
,

  protected void showToast() {
        View view = inflateView(R.layout.incoming_message_panel);

        TextView tv = (TextView)view.findViewById(R.id.message);
        tv.setText("khtx. meet u for dinner. cul8r");

        Toast toast = new Toast(this);
        toast.setView(view);
        toast.setDuration(Toast.LENGTH_LONG);
        toast.show();

    }

    private View inflateView(int resource) {
        LayoutInflater vi = (LayoutInflater)getSystemService           
                                    (Context.LAYOUT_INFLATER_SERVICE);
        return vi.inflate(resource, null);
    }

    protected void showNotification() {
        NotificationManager nm = (NotificationManager)getSystemService
                                                           (NOTIFICATION_SERVICE);

        CharSequence from = "Joe";
        CharSequence message = "kthx. meet u for dinner. cul8r";

        PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
                new Intent(this, IncomingMessageView.class), 0);

        String tickerText = getString(R.string.imcoming_message_ticker_text, message);

        Notification notif = new Notification(R.drawable.stat_sample, tickerText,
                System.currentTimeMillis());

        notif.setLatestEventInfo(this, from, message, contentIntent);

        notif.vibrate = new long[] { 100, 250, 100, 500};

        nm.notify(R.string.imcoming_message_ticker_text, notif);
    }
}

'old > API_Demo' 카테고리의 다른 글

APP_Notification_NotifyWithText  (0) 2010.03.23
APP_Notification_NotifyingServiceController  (0) 2010.03.23
APP_Menu_InflateFromXML  (0) 2010.03.23
APP_LauncherShortcuts  (0) 2010.03.23
APP_Intents  (0) 2010.03.23
Posted by jazzlife
,

[InflateFromXML.java]

   private static final int sMenuExampleResources[] = {
        R.menu.title_only, R.menu.title_icon, R.menu.submenu, R.menu.groups,
        R.menu.checkable, R.menu.shortcuts, R.menu.order, R.menu.category_order,
        R.menu.visible, R.menu.disabled

    };
   
     private static final String sMenuExampleNames[] = {
        "Title only", "Title and Icon", "Submenu", "Groups",
        "Checkable", "Shortcuts", "Order", "Category and Order",
        "Visible", "Disabled"
    };
   
    private Spinner mSpinner;
    private TextView mInstructionsText;
    private Menu mMenu;
   
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
       
        LinearLayout layout = new LinearLayout(this);
        layout.setOrientation(LinearLayout.VERTICAL);
       
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
                android.R.layout.simple_spinner_item, sMenuExampleNames);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        mSpinner = new Spinner(this);

        mSpinner.setId(R.id.spinner);
        mSpinner.setAdapter(adapter);
       
        layout.addView(mSpinner,
                new LinearLayout.LayoutParams(
                        LinearLayout.LayoutParams.FILL_PARENT,
                        LinearLayout.LayoutParams.WRAP_CONTENT));

        mInstructionsText = new TextView(this);
        mInstructionsText.setText(getResources().getString(
                R.string.menu_from_xml_instructions_press_menu));
       
        LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
                LinearLayout.LayoutParams.FILL_PARENT,
                LinearLayout.LayoutParams.WRAP_CONTENT);
        lp.setMargins(10, 10, 10, 10);
        layout.addView(mInstructionsText, lp);
       
        setContentView(layout);

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        mMenu = menu;
       
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(sMenuExampleResources[mSpinner.getSelectedItemPosition()], menu);
       
        mSpinner.setEnabled(false);
       
        mInstructionsText.setText(getResources().getString(
                R.string.menu_from_xml_instructions_go_back));
       
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.jump:
                Toast.makeText(this, "Jump up in the air!", Toast.LENGTH_SHORT).show();
                return true;

            case R.id.dive:
                Toast.makeText(this, "Dive into the water!", Toast.LENGTH_SHORT).show();
                return true;

            case R.id.browser_visibility:
                final boolean shouldShowBrowser = !mMenu.findItem(R.id.refresh).isVisible();
                mMenu.setGroupVisible(R.id.browser, shouldShowBrowser);
                break;
               
            case R.id.email_visibility:
                final boolean shouldShowEmail = !mMenu.findItem(R.id.reply).isVisible();
                mMenu.setGroupVisible(R.id.email, shouldShowEmail);
                break;
               
            default:
                if (!item.hasSubMenu()) {
                    Toast.makeText(this, item.getTitle(), Toast.LENGTH_SHORT).show();
                    return true;
                }
                break;
        }
       
        return false;
    }

'old > API_Demo' 카테고리의 다른 글

APP_Notification_NotifyingServiceController  (0) 2010.03.23
APP_Notification_IncomingMessageView  (0) 2010.03.23
APP_LauncherShortcuts  (0) 2010.03.23
APP_Intents  (0) 2010.03.23
APP_Dialog_AlertDialogSamples  (0) 2010.03.22
Posted by jazzlife
,