실습5
May 23rd, 2008
실습5 과제
1. jump.c를 컴파일하고 실행한 후 아래의 물음에 답하시오.
- 1 #include <setjmp.h>
2
3 jmp_buf jmpbuffer;
4
5 int foo()
6 {
7 write(1, "Entering function foo().\n", 25);
8 setjmp(jmpbuffer);
9 write(1, "Exit function foo().\n", 21);
10 return 0;
11 }
12
13 int bar()
14 {
15 write(1, "Entering function bar().\n", 25);
16 longjmp(jmpbuffer, 1);
17 write(1, "Exit function bar().\n", 21);
18 return 0;
19 }
20
21 int main()
22 {
23 foo();
24 bar();
25 return 0;
26 }
1) 어떠한 실행 순서를 보이는가? 그 이유는 무엇인가?
결과값
Exit function foo().
Entering function bar().
Exit function foo().
함수에서 return을 하면 그 함수를 호출한 환경으로 돌아간다. 함수가 호출될 때마다, 그 함수의 argument, automatic variables, return variables가 Stack에 쌓이며, 함수에서 return시 해당 함수에 관련된 argument들만이 stack에서 pop된다.
만약 복잡한 일을 수행하는 경우 에러가 발생하거나 어느 특정 signal이 처리된 직후에 어태까지의 함수호출내력과 관계없이 어느 정해진 위치 로 돌아가서 일을 수행할 필요가 있을 수 있다.시스템은 그 정해진 위치 이후에 스택에 쌓인 모든 정보를 한번에 pop시키게 된다. 이를 위해서 setjmp와 longjmp라는 시스템 호출을 제공한다.
setjmp(jmpbuffer)을 호출하면 그때의 레지스터의 값을 jmpbuffer에 저장된다.
이때 setjmp는 0을 return한다. 후에 longjmp(jmpbuffer, val)을 호출하면 setjmp(jmpbuffer) 호출시 저장되었던 Register 값을 복원하고 마치 setjmp()가 종료된 것 처럼 return한다.
이때 setjmp의 반환값은 val이다.
2) wrong_jmp.c의 컴파일 실행결과는 어떠한가? 그 차이가 발생하는 것은 무슨
이유인가?
- 1 #include <setjmp.h>
2
3 jmp_buf jmpbuffer;
4
5 int foo()
6 {
7 write(1, "Entering function foo().\n", 25);
8 setjmp(jmpbuffer);
9 write(1, "Exit function foo().\n", 21);
10 return 0;
11 }
12
13 int bar()
14 {
15 write(1, "Entering function bar().\n", 25);
16 longjmp(jmpbuffer, 1);
17 write(1, "Exit function bar().\n", 21);
18 return 0;
19 }
20
21 int foo1() {
22 foo();
23 }
24
25 int bar1() {
26 int i;
27 float a[1000];
28 for(i=0; i <1000;i++) a[i] = i+10;
29
30 bar();
31 }
32
33 int main()
34 {
35 foo1();
36 bar1();
37 return 0;
38 }
결과값
Exit function foo().
Entering function bar().
Exit function foo().
세그멘테이션 오류
2. signal.c를 컴파일하고 실행한 후 아래의 물음에 답하시오.
- 1 #include <signal.h>
2
3 void sigint_handler(int signo)
4 {
5 write(1, "SIGINT caught\n", 15);
6 // 1.
7 while(1);
8 signal(SIGINT, sigint_handler);
9 }
10
11 int main()
12 {
13 signal(SIGINT, sigint_handler);
14
15 write(1, "Signal handler for SIGINT is ready\n", 35);
16 while(1);
17
18 return 0;
19 }
1) signal 프로그램을 background로 실행한 후, ps 명령으로 해당 프로그램의 pid를 이용해서 'kill pid' 명령을 실행해보자. 어떠한 일이 생기는가?
[1] 11829
ccl@localhost ~/sp/ex5 $ Signal handler for SIGINT is ready
ccl@localhost ~/sp/ex5 $ kill 11829
ccl@localhost ~/sp/ex5 $
[1]+ 종료됨 ./signal
2) 1번 주석을 없애고 실행해보자. 어떠한 일이 생기는가?
Signal handler for SIGINT is ready
^CSIGINT caught
^CSIGINT caught
^CSIGINT caught
^CSIGINT caught
^CSIGINT caught
^CSIGINT caught
^CSIGINT caught
^CSIGINT caught
^CSIGINT caught
^CSIGINT caught
^CSIGINT caught
^CSIGINT caught
3) 1번 주석이 없는 상태에서 여러번 SIGINT를 발생시켜 보자. 어떠한 일이생기며, 그 이유는 무엇인가?
SIGINT - ctrl + c
4) 1번 주석이 없는 상태에서 foreground에서 실행했을 경우, 어떻게 프로세스를 종료시킬 수 있는가? 그 이유는?
프로세스를 종료 시킬수 없다,
SIGINT를 설정하였기 때문이다.
3. sigact.c를 컴파일하고 실행한 후 아래의 물음에 답하시오.
- 1 #include <signal.h>
2 #include <stdio.h>
3
4 void sigint_handler(int signo)
5 {
6 write(1, "SIGINT caught\n", 14);
7 pause();
8 }
9
10 int main()
11 {
12 struct sigaction sigint;
13 struct sigaction sigint_backup;
14
15
16 sigint.sa_handler = sigint_handler;
17 sigemptyset(&(sigint.sa_mask));
18 // 1
19 // sigaddset(&(sigint.sa_mask), SIGALRM);
20 sigint.sa_flags = 0;
21
22 if(sigaction(SIGINT, &sigint, &sigint_backup))
23 {
24 perror(NULL);
25 return 0;
26 }
27 alarm(3);
28 pause();
29 - 30 return 0;
31 }
1) sigact를 실행하면 어떠한 결과를 보이는가? 그 이유는 무엇인가?
자명종 시계
시그널 발생 - 3초후에 알람이 발생한다. (SIGALRM)
2) 1번 주석을 제거하고 실행해보자. 어떠한 결과를 보이는가? 그 이유는 무엇인가?
시그널이 실종되었다.
4. kill.c와 kill_child.c를 컴파일하고 실행한 후 아래의 물음에 답하시오.
- kill.c
- 1 #include <signal.h>
2 #include <stdio.h>
3 #include <unistd.h>
4 #include <stdlib.h>
5
6 void sigint_handler(int signo)
7 {
8 signal(SIGINT, sigint_handler);
9 write(1, "SIGINT handler for parent\n", 26);
10 }
11
12 int main()
13 {
14 int child_pid;
15
16 signal(SIGINT, sigint_handler);
17
18 child_pid = fork();
19
20 if(child_pid != 0)
21 {
22 pause();
23 write(1, "Sending SIGINT to child\n", 24);
24 kill(child_pid, SIGINT);
25 wait(NULL);
26 }
27 else
28 {
29 execl("./kill_child", "./kill_child", NULL);
30 perror("kill_child");
31 exit(1);
32 }
33
34 return 0;
35 }
- kill_child.c
- 1 #include <signal.h>
2 #include <stdio.h>
3 #include <unistd.h>
4
5 void sigint_handler(int signo)
6 {
7 signal(SIGINT, sigint_handler);
8 write(1, "SIGINT handler for child\n", 25);
9 }
10
11 void sigalarm_handler(int signo)
12 {
13 signal(SIGALRM, sigalarm_handler);
14 write(1, "SIGALRM handler for child\n", 26);
15 }
16
17 int main()
18 {
19 // 1
20 signal(SIGINT, sigint_handler);
21 // 2
22 signal(SIGALRM, sigalarm_handler);
23 alarm(3);
24 pause();
25 return 0;
26 }
1) kill을 실행하면 어떠한 결과를 보이는가? 그 이유는 무엇인가?
^CSIGINT handler for parent
Sending SIGINT to child
2) kill_child.c의 1번 주석을 제거하고 kill을 실행해보자. 어떠한 결과를 보이는가?
^CSIGINT handler for parent
Sending SIGINT to child
SIGINT handler for child
3) 1번 주석이 제거된 상태에서 kill_child를 실행해보자. 3초 전에 ctrl+c를 누른것과 그렇지 않은 것은 어떠한 차이를 보이는가?
ccl@localhost ~/sp/ex5 $ ./kill_child
^CSIGINT handler for child
ccl@localhost ~/sp/ex5 $ ./kill_child
4) 2번 주석을 제거하고 실행해보자. 3초 뒤 어떤 일이 발생하는가?
^CSIGINT handler for child
ccl@localhost ~/sp/ex5 $ ./kill_child
SIGALRM handler for child
5. block.c를 컴파일하고 실행한 후 아래의 물음에 답하시오.
- block.c
- 1 #include <signal.h>
2 #include <unistd.h>
3 #include <stdlib.h>
4
5 void sigalarm_handler(int signo)
6 {
7 signal(SIGALRM, sigalarm_handler);
8 write(1, "SIGALRM caught\n", 15);
9 }
10
11 void sigint_handler(int signo)
12 {
13 sigset_t sigset;
14 sigset_t sigset_backup;
15
16
17 signal(SIGALRM, sigalarm_handler);
18 write(1, "SIGINT caught\n", 14);
19
20 // 4
21 /*
22 sigemptyset(&sigset);
23 sigaddset(&sigset, SIGALRM);
24 sigprocmask(SIG_UNBLOCK, &sigset, &sigset_backup);
25 */
26
27 write(1, "End of SIGINT handler\n", 22);
28
29 }
30
31 int main()
32 {
33 int child_pid;
34
35 sigset_t sigset;
36 sigset_t sigset_backup;
37
38 signal(SIGINT, sigint_handler);
39 signal(SIGALRM, sigalarm_handler);
40 sigemptyset(&sigset);
41 sigaddset(&sigset, SIGALRM);
42
43
44 // 1
45 //sigprocmask(SIG_BLOCK, &sigset, &sigset_backup);
46
47 // 3
48 child_pid = fork();
49 // 5
50
51 if(child_pid == 0)
52 {
53 execl("./block_child", "./block_child", NULL);
54 perror("./block_child");
55 exit(0);
56 }
57
58
59 alarm(3);
60 pause();
61
62 // 2
63 //sigprocmask(SIG_UNBLOCK, &sigset, &sigset_backup);
64 return 0;
65 }
- block_child.c
- 1 #include <signal.h>
2
3 void sigalarm_handler(int signo)
4 {
5 signal(SIGALRM, sigalarm_handler);
6 write(1, "SIGALRM caught\n", 15);
7 }
8
9 int main()
10 {
11 signal(SIGALRM, sigalarm_handler);
12 alarm(5);
13 pause();
14
15 return 0;
16 }
1) block을 실행하면 어떠한 결과를 보이는가?
3초후에 알람시그널이 발생되어서 프로그램 종료
SIGALRM caught
2) block.c의 1번 주석을 제거하고 실행하면 어떠한 결과를 보이는가? 그 이유는?
^CSIGINT caught
End of SIGINT handler
3) block.c의 1번과 2번 주석을 모두 제거하고 실행하면 어떠한 결과를 보이는가? 그 이유는?
^CSIGINT caught
End of SIGINT handler
SIGALRM caught
4) 1번과 3번 주석만 제거한 후 block을 background에서 실행해보자. 어떠한 결과를 보이는가?
[1] 12354
5) 4번 주석만 제거한 후 block.c를 컴파일하고 실행해보자. 어떠한 결과를 보이는가?
^CSIGINT caught
End of SIGINT handler
ccl@localhost ~/sp/ex5 $ ./block
SIGALRM caught
6) 1, 3, 5번 주석만 제거한 후 block.c와 block_child.c를 컴파일하고 실행해보자. 어떠한 결과를 보이는가?
7) 3, 5번 주석만 제거한 후 block.c와 block_child.c를 컴파일하고 실행해보자. 어떠한 결과를 보이는가? 왜 이러한 차이를 보이는가?
^CSIGINT caught
End of SIGINT handler
ccl@localhost ~/sp/ex5 $ ./block
SIGALRM caught
ccl@localhost ~/sp/ex5 $ SIGALRM caught
실습과제
block.c 수정하기
block.c를 수정하여 Mask를 써서 SIGALRM이 Pending되어 있는지, 메시지를 출력하여 제출
주석은 1번만 지우고 나머지는 다 주석처리
sigpending()을 쓸것.
실습과제는 submit cclta splab5 로 제출
일요일 오후 11시까지 클래스넷과 서버로 동시에 과제 제출해야함
Fedora Core 7에서 Fedora Core 8로 Upgrade하기
May 11th, 2008
Fedora Project Wiki - Upgrading Fedora Using Yum | Fedora Core 7 -> Fedora Core 8
이번에 잘쓰던 학교 연구실 컴퓨터에 깔려진 Fedora Core 7를 Fedora Core8로 버전 업하기로 하였다.
이런 것은 버전 업이라는 용어보다는 Upgrade라는 말이 더 맞을듯 하다.
학교 연구실 컴퓨터는 64bit 컴퓨터이며, Fedora Core 7를 쓰고 있다.
준비전 작업
우선 Fedora Core 7에서 쓰는 Kernel Version을 Check를 하였다.
[root@localhost ~]# cat /proc/version
Linux version 2.6.23.15-80.fc7 (mockbuild@xenbuilder2.fedora.redhat.com) (gcc version 4.1.2 20070925 (Red Hat 4.1.2-27)) #1 SMP Sun Feb 10 16:52:18 EST 2008
[root@localhost ~]#
Fedora Core 7에서 2.6.23.15 버전의 Kernel을 쓴다는 것을 알수있다.
(Kernel에 대한 자세한 이야기는 IT EXPERT 리눅스 커널 프로그래밍이라는 책에서 보면 쉽게 이해될 것이다.)
우선 yum으로 모든 패키지를 업그레이드 하기로 한다. 의존성문제를 없애기 위해서 아래의 작업을 해준다.
yum -y upgrade
그리고 난 다음 Fedora Core 8을 업그레이드를 하기 위한 절차를 진행하기로 한다.
Fedora Core 8로 업그레이드 하기
Fedora Core 8로 업그레이드 하기 위하여 적당한 위치에서 파일을 내려받고 설치한다
위의 작업을 해야 Fedora Core 8 배포판 파일을 받을 수 있다.
아래의 wget명령어로 rpm파일을 다운로드받는다.
[root@localhost ~]# wget ftp://ftp.kaist.ac.kr/fedora/releases/8/Fedora/i386/os/Fedora/fedora-release-8-3.noarch.rpm
[root@localhost ~]# wget ftp://ftp.kaist.ac.kr/fedora/releases/8/Fedora/i386/os/Fedora/fedora-release-notes-8.0.0-3.noarch.rpm
그리고는 설치를 한다.
설치를 하였으면 아래의 /etc/yum.repos.d/fedora.repo 파일과 /etc/yum.repos.d/fedora-updates.repo 을 수정한다.
수정하는 이유는 속도 빠른 국내서버에서 다운로드 빨리 받기 위해서이다. Upgrade하는데에 대략 2.0G정도의 파일을 다운로드 받는데 외국서버에서 다운로드 받으면 엄청난 시간을 잡아먹기때문에 수정을 한다.
/etc/yum.repos.d/fedora.repo 수정
Upgrade하기 전에 /etc/yum.repos.d/fedora.repo 파일을 수정한다.
[fedora]
name=Fedora $releasever - $basearch
failovermethod=priority
#baseurl=http://download.fedora.redhat.com/pub/fedora/linux/releases/$releasever/Everything/$basearch/os/
baseurl=ftp://ftp.kaist.ac.kr/fedora/linux/releases/$releasever/Everything/$basearch/os/
mirrorlist=http://mirrors.fedoraproject.org/mirrorlist?repo=fedora-$releasever&arch=$basearch
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora file:///etc/pki/rpm-gpg/RPM-GPG-KEY
[fedora-debuginfo]
name=Fedora $releasever - $basearch - Debug
failovermethod=priority
#baseurl=http://download.fedora.redhat.com/pub/fedora/linux/releases/$releasever/Everything/$basearch/debug/
baseurl=ftp://ftp.kaist.ac.kr/fedora/linux/releases/$releasever/Everything/$basearch/debug/
mirrorlist=http://mirrors.fedoraproject.org/mirrorlist?repo=fedora-debug-$releasever&arch=$basearch
enabled=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora file:///etc/pki/rpm-gpg/RPM-GPG-KEY
[fedora-source]
name=Fedora $releasever - Source
failovermethod=priority
#baseurl=http://download.fedora.redhat.com/pub/fedora/linux/releases/$releasever/Everything/source/SRPMS/
baseurl=ftp://ftp.kaist.ac.kr/fedora/linux/releases/$releasever/Everything/source/SRPMS/
mirrorlist=http://mirrors.fedoraproject.org/mirrorlist?repo=fedora-source-$releasever&arch=$basearch
enabled=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora file:///etc/pki/rpm-gpg/RPM-GPG-KEY
/etc/yum.repos.d/fedora-updates.repo 수정
/etc/yum.repos.d/fedora-updates.repo 파일도 수정한다.
[updates]
name=Fedora $releasever - $basearch - Updates
failovermethod=priority
#baseurl=http://download.fedora.redhat.com/pub/fedora/linux/updates/$releasever/$basearch/
baseurl=ftp://ftp.kaist.ac.kr/fedora/linux/updates/$releasever/$basearch/
mirrorlist=http://mirrors.fedoraproject.org/mirrorlist?repo=updates-released-debug-f$releasever&arch=$basearch
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora
[updates-debuginfo]
name=Fedora $releasever - $basearch - Updates - Debug
failovermethod=priority
#baseurl=http://download.fedora.redhat.com/pub/fedora/linux/updates/$releasever/$basearch/debug/
baseurl=ftp://ftp.kaist.ac.kr/fedora/linux/updates/$releasever/$basearch/debug/
mirrorlist=http://mirrors.fedoraproject.org/mirrorlist?repo=updates-released-debug-f$releasever&arch=$basearch
enabled=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora
[updates-source]
name=Fedora $releasever - Updates Source
failovermethod=priority
#baseurl=http://download.fedora.redhat.com/pub/fedora/linux/updates/$releasever/SRPMS/
baseurl=ftp://ftp.kaist.ac.kr/fedora/linux/updates/$releasever/SRPMS/
mirrorlist=http://mirrors.fedoraproject.org/mirrorlist?repo=updates-released-source-f$releasever&arch=$basearch
enabled=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora
아래와 같이 파일을 수정을 하였으면 아래와 같이 yum으로 업그레이드를 한다.
아마, 2.0GB라는 어마어마한 용량을 받는다는 메시지를 보일것이다.
[root@localhost ~]# yum clean all
[root@localhost ~]# yum -y upgrade
그러다가 의존성 문제로 에러가 난다. -_-;;
이런 문제는 dbus.i386를 제거하면 된다고 한다. (http://fedoraproject.org/wiki/YumUpgradeFaq#head-56b13936246769f517ac488a0098d193c7fc3600 참조)
이렇게 dbus.i386 package를 지우고서는 다시 yum으로 업그레이드를 한다.
[root@localhost ~]# yum clean all
[root@localhost ~]# yum -y upgrade
Complete!라는 메시지가 뜨면서 성공을 하였다!
성공을 하였으면 Reboot을 한다.
아님 아래 명령어를 써도 된다.
결과
제대로 설치가 되면서 Fedora Core 8로 업그레이드가 되었다.
Linux localhost.localdomain 2.6.24.5-85.fc8 #1 SMP Sat Apr 19 11:18:09 EDT 2008 x86_64 x86_64 x86_64 GNU/Linux
[root@localhost ~]# cat /proc/version
Linux version 2.6.24.5-85.fc8 (mockbuild@xenbuilder2.fedora.redhat.com) (gcc version 4.1.2 20070925 (Red Hat 4.1.2-33)) #1 SMP Sat Apr 19 11:18:09 EDT 2008
[root@localhost ~]#
Fedora Core 9가 조금 있으면 나오는데 Fedora Core 7로 계속 유지하기가 뭐랄까? 점차 뒤쳐질것 같은 느낌이 들어서 업그레이드를 해버렸다.
어차피 시스템을 내맘대로 만질수 있는 컴퓨터다 보니 왜이리 삽질의 욕구가 자꾸만 늘어가군요. -_-;;
원격접속하였을때에는 아무런 문제가 없다가, 컴퓨터 앞에서 업그레이드가 제대로 되었는지 확인해보니 GNOME Desktop이 날라갔습니다 -_-;;
아마 yum erase dbus.i386 으로 날려진것 같더군요, 나머지는 정상인데 말이죠 ㅠㅠ
그래서 마지막으로
으로 GNOME Desktop설치를 합니다. -_-;;
Ruby on rails 설치
June 19th, 2008
Ruby On Rails Linux Setting Log
이번에 학교 연구실 Linux서버에 Ruby on rails를 설치하게 되었다.
여기서는 Ruby on rails를 설치한 일대기를 기록해보기로 한다.
Linux는 Fedora Core 7을 사용하였다.
어떻게 설치를 하였나?
황대산님이 쓰신 웹개발 2.0 루비 온 레일스 라는 책에서는 Windows와 MAC OS에서 설치하는 방법만 나와있어서 Linux에서 설치하려고 할때에는 어떻게 설치하는지 몰라서 홈페이지에서 찾아보았다.
이번에 Ruby, Ruby on rails 설치는 링크(http://www.dreamincode.net/forums/index.php?showtopic=30705&hl)를 참고로 설치를 하였다.
필요한 Fedora package설치
우선 설치하기 전에 httpd와 mysql은 기본적으로 깔려있어야 한다.
혹시나 모를까봐 httpd(웹서버)와 Mysql(DB-데이터베이스)가 설치가 되었는지를 확인해본다.
[root@localhost ~]# yum install httpd mysql-server mysql
깔려져있다는 것을 확인을 하였다.
[root@localhost ~]# yum install httpd mysql-server mysql
Setting up Install Process
Parsing package install arguments
Package httpd - 2.2.8-1.fc7.x86_64 is already installed.
Package mysql-server - 5.0.45-6.fc7.x86_64 is already installed.
Package mysql - 5.0.45-6.fc7.x86_64 is already installed.
Nothing to do
[root@localhost ~]#
readline 라이브러리가 이 Linux에 깔려있다는 것을 확인하였다.
[root@localhost ~]# yum install readline
Setting up Install Process
Parsing package install arguments
Package readline - 5.2-4.fc7.i386 is already installed.
Package readline - 5.2-4.fc7.x86_64 is already installed.
Nothing to do
[root@localhost ~]#
깔려 있다는 것을 확인하였다.
Ruby Package 설치
Ruby는 우선 Fedora core 7 배포판에 있는 것으로 사용하기로 하였다.
[root@localhost ~]# yum install ruby
fedora 100% |=========================| 2.1 kB 00:00
macromedia 100% |=========================| 1.9 kB 00:00
updates 100% |=========================| 2.3 kB 00:00
primary.sqlite.bz2 100% |=========================| 3.9 MB 01:59
adobe-linux-i386 100% |=========================| 951 B 00:00
Setting up Install Process
Parsing package install arguments
Package ruby - 1.8.6.114-1.fc7.x86_64 is already installed.
Nothing to do
[root@localhost ~]#
이미 설치가 되어 있다는 것을 확인하였다 -_-;; (언제 깔았는지는 나도 잘 모른다. 컴퓨터를 받은 3월초에 Ruby를 사용한답시고 설치했을듯 하다.)
그리고 나서 RubyGems(루비젬)을 설치해보자.
루비젬(RubyGems)은 루비의 각종 라이브러리를 자동으로 설치하고 관리해주는 패키지 관리 유틸리티로 레일즈 설치에 사용된다.
루비젬은 Fedora Core 7 배포판에서 받아 설치를 한다.
설치하면 아래와 같이 다른 프로그램도 깔리게 된다. 이것도 깔아야 설치가 된다.
[root@localhost rubygems-1.1.1]# yum install rubygems
Setting up Install Process
Parsing package install arguments
Resolving Dependencies
--> Running transaction check
---> Package rubygems.noarch 0:0.9.4-1.fc7 set to be updated
--> Processing Dependency: ruby-rdoc for package: rubygems
--> Running transaction check
---> Package ruby-rdoc.x86_64 0:1.8.6.114-1.fc7 set to be updated
--> Processing Dependency: ruby-irb = 1.8.6.114-1.fc7 for package: ruby-rdoc
--> Running transaction check
---> Package ruby-irb.x86_64 0:1.8.6.114-1.fc7 set to be updated
--> Finished Dependency ResolutionDependencies Resolved
=============================================================================
Package Arch Version Repository Size
=============================================================================
Installing:
rubygems noarch 0.9.4-1.fc7 updates 498 k
Installing for dependencies:
ruby-irb x86_64 1.8.6.114-1.fc7 updates 274 k
ruby-rdoc x86_64 1.8.6.114-1.fc7 updates 342 kTransaction Summary
=============================================================================
Install 3 Package(s)
Update 0 Package(s)
Remove 0 Package(s)Total download size: 1.1 M
Is this ok [y/N]:
y(yes)를 입력하고 나서 설치를 한다.
설치를 하면 아래와 같은 글자들이 나온다.
Downloading Packages:
Running rpm_check_debug
Running Transaction Test
Finished Transaction Test
Transaction Test Succeeded
Running Transaction
Installing: ruby-irb ######################### [1/3]
Installing: ruby-rdoc ######################### [2/3]
Installing: rubygems ######################### [3/3]Installed: rubygems.noarch 0:0.9.4-1.fc7
Dependency Installed: ruby-irb.x86_64 0:1.8.6.114-1.fc7 ruby-rdoc.x86_64 0:1.8.6.114-1.fc7
Complete!
[root@localhost ~]#
그리고는 Complete!라 나오면서 설치가 끝난다.
그리고 나서 나머지도 설치를 한다.
[root@localhost ~]# yum install install ruby ruby-devel ruby-irb ruby-libs ruby-rdoc ruby-ri rubygems
아래와 같이 설치가 된다.
[root@localhost lib]# yum install install ruby ruby-devel ruby-irb ruby-libs ruby-rdoc ruby-ri rubygems
fedora 100% |=========================| 2.1 kB 00:00
macromedia 100% |=========================| 1.9 kB 00:00
updates 100% |=========================| 2.3 kB 00:00
primary.sqlite.bz2 100% |=========================| 3.1 MB 00:15
adobe-linux-i386 100% |=========================| 951 B 00:00
Setting up Install Process
Parsing package install arguments
No package install available.
Package ruby - 1.8.6.114-1.fc7.x86_64 is already installed.
Package ruby-irb - 1.8.6.114-1.fc7.x86_64 is already installed.
Package ruby-libs - 1.8.6.114-1.fc7.x86_64 is already installed.
Package ruby-rdoc - 1.8.6.114-1.fc7.x86_64 is already installed.
Package rubygems - 0.9.4-1.fc7.noarch is already installed.
Resolving Dependencies
--> Running transaction check
---> Package ruby-libs.i386 0:1.8.6.114-1.fc7 set to be updated
---> Package ruby-devel.i386 0:1.8.6.114-1.fc7 set to be updated
---> Package ruby-ri.x86_64 0:1.8.6.114-1.fc7 set to be updated
---> Package ruby-devel.x86_64 0:1.8.6.114-1.fc7 set to be updated
--> Finished Dependency ResolutionDependencies Resolved
=============================================================================
Package Arch Version Repository Size
=============================================================================
Installing:
ruby-devel i386 1.8.6.114-1.fc7 updates 770 k
ruby-devel x86_64 1.8.6.114-1.fc7 updates 778 k
ruby-ri x86_64 1.8.6.114-1.fc7 updates 2.0 M
Installing for dependencies:
ruby-libs i386 1.8.6.114-1.fc7 updates 1.7 MTransaction Summary
=============================================================================
Install 4 Package(s)
Update 0 Package(s)
Remove 0 Package(s)Total download size: 5.2 M
Is this ok [y/N]: y
Downloading Packages:
(1/4): ruby-devel-1.8.6.1 100% |=========================| 778 kB 00:06
(2/4): ruby-ri-1.8.6.114- 100% |=========================| 2.0 MB 00:05
(3/4): ruby-devel-1.8.6.1 100% |=========================| 770 kB 00:03
(4/4): ruby-libs-1.8.6.11 100% |=========================| 1.7 MB 00:05
Running rpm_check_debug
Running Transaction Test
Finished Transaction Test
Transaction Test Succeeded
Running Transaction
Installing: ruby-libs ######################### [1/4]
Installing: ruby-devel ######################### [2/4]
Installing: ruby-ri ######################### [3/4]
Installing: ruby-devel ######################### [4/4]Installed: ruby-devel.i386 0:1.8.6.114-1.fc7 ruby-devel.x86_64 0:1.8.6.114-1.fc7 ruby-ri.x86_64 0:1.8.6.114-1.fc7
Dependency Installed: ruby-libs.i386 0:1.8.6.114-1.fc7
Complete!
[root@localhost lib]#
설치를 다 하였으면 아래 명령어로 rails를 설치하자.
[root@localhost ~]# gem install rails --include-dependencies
아래와 같이 설치가 된다.
[root@localhost ~]# gem install rails --include-dependencies
Bulk updating Gem source index for: http://gems.rubyforge.org
Successfully installed rails-2.0.2
Successfully installed rake-0.8.1
Successfully installed activesupport-2.0.2
Successfully installed activerecord-2.0.2
Successfully installed actionpack-2.0.2
Successfully installed actionmailer-2.0.2
Successfully installed activeresource-2.0.2
Installing ri documentation for rake-0.8.1...
Installing ri documentation for activesupport-2.0.2...
Installing ri documentation for activerecord-2.0.2...
Installing ri documentation for actionpack-2.0.2...
Installing ri documentation for actionmailer-2.0.2...
Installing ri documentation for activeresource-2.0.2...
Installing RDoc documentation for rake-0.8.1...
Installing RDoc documentation for activesupport-2.0.2...
Installing RDoc documentation for activerecord-2.0.2...
Installing RDoc documentation for actionpack-2.0.2...
Installing RDoc documentation for actionmailer-2.0.2...
Installing RDoc documentation for activeresource-2.0.2...
[root@localhost ~]#
rails를 설치를 하였으면 mongrel를 설치하기로 한다.
아래와 같이 명령어 쳐서 설치하면 된다.
[root@localhost ~]# gem install gem_plugin daemons capistrano --include-dependencies
[root@localhost ~]# gem install mongrel mongrel_cluster railsmachine --include-dependencies
아래와 같이 설치가 된다.
[root@localhost ~]# gem install gem_plugin daemons capistrano --include-dependencies
Successfully installed gem_plugin-0.2.3
Installing ri documentation for gem_plugin-0.2.3...
Installing RDoc documentation for gem_plugin-0.2.3...
Successfully installed daemons-1.0.10
Installing ri documentation for daemons-1.0.10...
While generating documentation for daemons-1.0.10
... MESSAGE: Unhandled special: Special: type=33, text="All"
... RDOC args: --ri --op /usr/lib/ruby/gems/1.8/doc/daemons-1.0.10/ri --quiet lib README Releases TODO
(continuing with the rest of the installation)
Installing RDoc documentation for daemons-1.0.10...
Successfully installed capistrano-2.3.0
Successfully installed net-ssh-2.0.1
Successfully installed net-sftp-2.0.0
Successfully installed net-scp-1.0.0
Successfully installed net-ssh-gateway-1.0.0
Successfully installed highline-1.4.0
Installing ri documentation for capistrano-2.3.0...
While generating documentation for capistrano-2.3.0
... MESSAGE: Unhandled special: Special: type=33, text="Notes"
... RDOC args: --ri --op /usr/lib/ruby/gems/1.8/doc/capistrano-2.3.0/ri --quiet lib
(continuing with the rest of the installation)
Installing ri documentation for net-ssh-2.0.1...
While generating documentation for net-ssh-2.0.1
... MESSAGE: Unhandled special: Special: type=33, text="This"
... RDOC args: --ri --op /usr/lib/ruby/gems/1.8/doc/net-ssh-2.0.1/ri --quiet lib
(continuing with the rest of the installation)
Installing ri documentation for net-sftp-2.0.0...
While generating documentation for net-sftp-2.0.0
... MESSAGE: Unhandled special: Special: type=33, text="Net::SFTP"
... RDOC args: --ri --op /usr/lib/ruby/gems/1.8/doc/net-sftp-2.0.0/ri --quiet lib
(continuing with the rest of the installation)
Installing ri documentation for net-scp-1.0.0...
While generating documentation for net-scp-1.0.0
... MESSAGE: Unhandled special: Special: type=33, text="Provides"
... RDOC args: --ri --op /usr/lib/ruby/gems/1.8/doc/net-scp-1.0.0/ri --quiet lib
(continuing with the rest of the installation)
Installing ri documentation for net-ssh-gateway-1.0.0...
While generating documentation for net-ssh-gateway-1.0.0
... MESSAGE: Unhandled special: Special: type=33, text="A"
... RDOC args: --ri --op /usr/lib/ruby/gems/1.8/doc/net-ssh-gateway-1.0.0/ri --quiet lib
(continuing with the rest of the installation)
Installing ri documentation for highline-1.4.0...
While generating documentation for highline-1.4.0
... MESSAGE: Unhandled special: Special: type=33, text="A"
... RDOC args: --ri --op /usr/lib/ruby/gems/1.8/doc/highline-1.4.0/ri --title HighLine Documentation --main README --quiet lib README INSTALL TODO CHANGELOG LICENSE
(continuing with the rest of the installation)
Installing RDoc documentation for capistrano-2.3.0...
Installing RDoc documentation for net-ssh-2.0.1...
Installing RDoc documentation for net-sftp-2.0.0...
Installing RDoc documentation for net-scp-1.0.0...
Installing RDoc documentation for net-ssh-gateway-1.0.0...
Installing RDoc documentation for highline-1.4.0...
[root@localhost ~]#
[root@localhost ~]# gem install mongrel mongrel_cluster railsmachine --include-dependencies
Select which gem to install for your platform (x86_64-linux)
1. mongrel 1.1.4 (ruby)
2. mongrel 1.1.4 (java)
3. mongrel 1.1.4 (x86-mswin32-60)
4. mongrel 1.1.3 (java)
5. mongrel 1.1.3 (i386-mswin32)
6. mongrel 1.1.3 (ruby)
7. Skip this gem
8. Cancel installation
> 1
Select which gem to install for your platform (x86_64-linux)
1. fastthread 1.0.1 (mswin32)
2. fastthread 1.0.1 (ruby)
3. fastthread 1.0.1 (i386-mswin32)
4. Skip this gem
5. Cancel installation
> 2
Building native extensions. This could take a while...
Building native extensions. This could take a while...
Successfully installed mongrel-1.1.4
Successfully installed fastthread-1.0.1
Successfully installed cgi_multipart_eof_fix-2.5.0
Installing ri documentation for mongrel-1.1.4...
Installing ri documentation for fastthread-1.0.1...No definition for dummy_dump
No definition for dummy_dump
No definition for rb_queue_marshal_load
No definition for rb_queue_marshal_dump
Installing ri documentation for cgi_multipart_eof_fix-2.5.0...
Installing RDoc documentation for mongrel-1.1.4...
Installing RDoc documentation for fastthread-1.0.1...No definition for dummy_dump
No definition for dummy_dump
No definition for rb_queue_marshal_load
No definition for rb_queue_marshal_dump
Installing RDoc documentation for cgi_multipart_eof_fix-2.5.0...
Successfully installed mongrel_cluster-1.0.5
Successfully installed railsmachine-1.0.0
[root@localhost ~]#
For the last install, it may ask which version you want, choose the latest ruby versions.
마지막 설치에서 어떤 버전을 원하는지를 물어보는데 나는 최신 Ruby 버전을 선택하였다.
Select which gem to install for your platform (x86_64-linux)
1. mongrel 1.1.4 (ruby)
2. mongrel 1.1.4 (java)
3. mongrel 1.1.4 (x86-mswin32-60)
4. mongrel 1.1.3 (java)
5. mongrel 1.1.3 (i386-mswin32)
6. mongrel 1.1.3 (ruby)
7. Skip this gem
8. Cancel installation
> 1
Select which gem to install for your platform (x86_64-linux)
1. fastthread 1.0.1 (mswin32)
2. fastthread 1.0.1 (ruby)
3. fastthread 1.0.1 (i386-mswin32)
4. Skip this gem
5. Cancel installation
> 2
이유는 간단하다. 웹페이지에 쓰여져 있기 때문이다. 물어보는것도 Platform을 어떤 것으로 하는 가를 물어보기 때문에 선택할 것이 Ruby밖에 없었다. (Ruby 설치하는 법도 잘 모르므로 -_-;; 자세한 것은 고수님 Help~)
Mongrel 설정
root권한에서 설정을 하였다.
* Creating a mongrel user to run mongrel as: /usr/sbin/adduser -r mongrel* Create mongrel conf directory: mkdir /etc/mongrel_cluster* Symlink mongrel initscript
ln -s /usr/lib/ruby/gems/1.8/gems/mongrel_cluster-1.0.5/resources/mongrel_cluster /etc/init.d/mongrel_cluster* Make it executable chmod 755 /usr/lib/ruby/gems/1.8/gems/mongrel_cluster-1.0.5/resources/mongrel_cluster* Add it to chkconfig chkconfig --add mongrel_cluster* Enable it in chkconfig chkconfig mongrel_cluster on
여기서 중요한 점은 mongrel_cluster 버전이 뭔가에 따라 폴더이름이 다르다. 이 점을 유의해야 한다.
후기
설치는 링크(http://www.dreamincode.net/forums/index.php?showtopic=30705&hl)를 참고로 설치를 하였다.
나도 웹에서 보고 찾은 내용들을 한글로 정리하니까 뿌듯(?)까지는 아니지만 한글 Rails문서를 쓴다는 것에 보람을 느낀다.
말로만 듣던 Ruby on Rails를 나도 개발하게 되는 것인가? ㅎㅎ
첫번째 스프링로그 글
April 29th, 2008
Blue Ocean
July 7th, 2007
Marketing Case Study #2. Blue Ocean Strategy(블루오션전략)
by W.Chan kim and Renée Mauborgne
홍익대학교 컴퓨터공학과
2학년 A511151 성대현
블루오션을 창출하라
○ 새로운 시장 공간
레드오션은 오늘날 존재하는 모든 산업을 뜻하며 이미 세상에 알려진 시장 공간이다. 블루오션은 현재 존재하지 않는 모든 산업을 나타내며 아직 우리가 모르고 있는 시장 공간이다.
블루오션은 미개척 시장 공간으로 새로운 수요 창출과 고수익 성장을 향한 기회로 정의 됨, 기존 산업의 경계선 바깥에서 완전히 새롭게 창출되는 경우도 있으나 기존산업을 확장하여 만들어졌다, 블루오션은 경쟁과 무관하다.
레드오션에서는 경쟁자를 능가하기 위해 붉은 바다를 잘 헤쳐 나가는 것이 중요함, 공급이 수요를 초과하는 대부분의 사업의 경우, 축소되는 시장 공간에서 점유율 경쟁이 필요하나 지속적으로 높은 실적을 내기는 어렵다
기업은 이러한 한계를 뛰어넘어야 한다. 그리고 수익과 성장의 새로운 기회를 잡기 위해 블루오션을 창출해야 한다.
○ 지속적 블루오션 창출 : 산업의 역사는 전쟁과 달리 시장공간이 결코 한정적이지 않음.
블루오션은 시간의 흐름에 따라 지속적으로 창조됐다. 따라서 레드오션에 포커스를 두는 것은 경쟁 없는 새로운 시장 공간을 창출하는 비즈니스 세계의 탁월한 힘을 부정하는 것이다.
○ 블루오션 창출의 효과 : 블루오션 창출에 따른 수익이 레드오션보다 확연히 높음.
○ 블루오션 창출의 절대적인 필요성
기술적 진보가 가속화됨에 따라 산업 생산성이 실질적으로 향상됐으며 공급자들은 제품과 서비스 상품을 생산할 수 있게 되었다. 그 결과 많은 산업 분야에서 공급이 수요를 초과하였다.
세계화 추세는 국가와 지역 간 무역 장벽이 무너지고, 제품과 가격 정보는 세계 어디서나 즉시 얻을 수 있으며 틈새시장과 독점시장이 설 자리가 점점 좁아지고 잇다.
글로벌 경쟁이 강화되면서 공급은 확실히 늘어나고 있지만, 세계적으로 수요가 증가한다는 명확한 증거는 없다.
레드오션이 점점 핏빛으로 물들어감에 따라, 오늘날 경영진은 블루오션 창출을 위해 더 많은 노력을 기울어야 한다.
○ 기업과 산업에서 전략적 이동까지
블루오션의 접근법
1. 분석의 기본 단위를 정의 : 전략적 이동(Strategic move)
전략적 이동은 주요 시장(비즈니스 기회)을 창출하기 위한 경영 실행과 결정을 말함. 비약적인 수요 증가로 새로운 시장 공간을 열고, 이 시장을 장악하는 제품과 서비스를 만들어내게 하는 것이다.
그러나 기업은 높은 실적과 블루오션의 근원을 규명하는 적합한 분석 단위가 아님
○ 가치혁신 : 블루오션 전략의 초석
가치혁신 : 구매자와 회사를 위한 가치 도약을 이뤄 새로운 비경쟁 시장 공간을 창출함으로써 경쟁 자체에서 벗어남.
가치혁신은 가치와 혁신에 동등한 중요성을 둠. 그러나 기술혁신이나 시장 선구자(market pioneering)와 확연히 구별된다.
가치혁신은 새로운 전략적 사고와 전략 실행 방법으로 블루오션을 창출하고 경쟁의 굴레에서 벗어나게 한다. 블루오션 창출을 추구하는 기업들은 차별화와 비용우위를 동시에 모색한다.
!그림1-2
가치혁신은 기업 활동이 회사의 비용구조와 구매자에게 제공하는 가치 두 가지 모두에 긍정적 영향을 주는 곳에서 창출된다. 비용 절감은 업계가 경쟁하는 요소를 제거하거나 줄이면서 이루어진다. 구매자 가치는 업계가 아직도 제공하지 못한 요소를 증가하고 창출함으로써 상승된다. 시간이 흐르면서 우수한 가치가 생성되는 대량매출에 의해 규모의 경제가 시작되면서 비용은 더욱 절감된다.
블루오션을 창출하면 구매자가 얻는 가치는 높아지고 동시에 비용은 낮아진다. 기업과 구매자가 동시에 가치 도약을 이룰 수 있다. 구매자를 위한 가치는, 기업이 구매자에게 제공하는 효용성과 가격에서 온다. 그리고 기업을 위한 가치는 가격과 비용 구조에 달려있다. 가치혁신은 효용성, 가격, 비용 이 세 가지 시스템이 적절히 배합됐을 때 이뤄진다. 블루오션 전략은 기업의 기능적, 운영적 활동의 범위 등 전체 시스템을 통합하는 전략이다.
레드오션에서 차별화는 기업들이 서로 동일한 최상의 실행 법칙으로 경쟁하기 때문에 비용이 든다.(비용우위 추구)
○ 블루오션 전략 체계화(formulating)와 실행(executing)
블루오션 전략의 6가지 원칙
|
체계화 원칙 |
각 원칙이 약화시키는 리스크 요소 |
|
시장 경계선을 재구축 하라 수치가 아닌 큰 그림에 포커스하라 비고객을 찾아라 정확한 전략적 시퀀스를 만들어라 |
↓탐색 리스크 ↓기획 리스크 ↓규모 리스크 ↓비즈니스 모델 리스크 |
|
실행 원칙 |
각 원칙이 약화시키는 리스크 요소 |
|
조직의 주요 장애를 극복하라 전략 실행을 전략화하라 |
↓조직 리스크 ↓관리 리스크 |
Chapter2. 분석적 툴과 프레임워크를 통해 실행하라
○전략 캔버스
전략 캔버스는 매력적인 블루오션 전략을 구축하기 위한 상태 분석의 진단 도구이자 실행 프레임 워크이다.
1. 이미 알려진 시장 공간에서 업계 참가자들의 현 상황을 파악해 일목요연하게 보여준다.
2. 고객들이 기존 시장의 경쟁상품으로부터 얻은 것은 무엇인지를 보여준다.
한 산업의 전략캔버스를 근본적으로 전환하려면 처음부터 전략 포커스를 바꿔야 한다. 즉, 경쟁자에서 대안품으로, 고객에서 비고객으로 방향을 재설정해야 한다.
○4가지 액션 프레임 워크
제거(Eliminate) : 업계에서 당연한 것으로 받아들이는 요소들 가운데 제거할 요소는 무엇인가?
감소(Reduce) : 업계의 표준 이하로 내려야 할 요소는 무엇인가?
증가(Raise) : 업계의 표준이상으로 올려야 할 요소는 무엇인가?
창조(Create) : 업계가 아직 한번도 제공하지 못한 것 중 창조해야 할 요소는 무엇인가?
○제거, 감소, 증가, 창조(ERRC) 구성표
● 가치와 비용의 상쇄관계를 깨는 차별화와 저비용을 동시에 추구할 수 있다.
● 기업들이 그동안 공통적으로 겪은 고통(증가와 창조에만 집중해 비용 구조를 올리고, 제품과 서비스를 과잉 설계하는)에서 벗어나게 해준다.
● 사내 모든 직급의 관리자들이 회사 전략을 쉽게 이해하게 하여 그들의 실행 참여도를 높인다.
● ERRC 구성표의 각 항을 충족시킨다는 것은 쉽지 않은 과제이므로 기업으로 하여금 무의식적으로 경쟁하게 만드는 암시적 가설의 범위를 발견해 나가면서 업계가 경쟁하고 있는 각 요소를 철저하게 조사하게 만든다.
○좋은 전략의 3가지 특성
효과적인 블루오션 전략이 가치곡선을 통해 표현되면 세 가지 상호 보완적 우수성(포커스, 차별화, 매력적인 슬로건)을 갖게 된다. 이 세 가지 특징은 블루오션 아이디어의 상업적인 생존 가능성을 알라보는 리트머스 시험지와 같은 역할을 한다.
포커스 : 기업의 전략적 프로파일이나 가치곡선은 이를 명확하게 보여줘야 한다.
차별성 : 블로오션의 ERRC(제거, 감소, 증가, 창조) 액션 적용을 통해 자신들의 프로파일을 업계의 일반적인 프로파일과 차별화 했다.
멋진 슬로건 : 훌륭한 전략은 전달 메시지가 뚜렷하고 강렬한 멋진 슬로건을 갖고 있다.
○가치곡선 읽기
블루오션 전략 : 가치곡선은 어떤 비즈니스가 승리할 가치가 있는 지 없는지 여부를 답해준다. 포커스, 차별성, 멋진 슬로건 이 3가지에 부합하면 그 기업은 훌륭한 블루오션 전략 창출을 위한 궤도에 놓여있음.
레드오션에 빠진 기업 : 기업의 가치곡성이 경쟁자들과 같은 방향으로 집중되면 유혈 경쟁의 레드오션에 빠짐
투자 회수 없는 과잉 제공 : 기업 가치 곡성이 모든 요소에 걸쳐 높은 수준으로 나타날 때 투자에 부합되지 않으면 회사가 구매자들의 부분적 가치 제공 요소에 치우쳐 과잉 제공을 하고 있을 지고 모른다는 것을 보여줌.
일관성 없는 전략 : 가치 곡선이 지그재그 식으로 나타나면 일관성 없는 전략들을 갖고 있음.
전략적 모순 : 회사가 어떤 한 경쟁 요소에 많은 투자를 하면서도 그것을 지원하는 다른 요소를 간과하는 것을 뜻함.
내부 지향적 기업 : 전략 캔버스에서 사용된 언어는 기업의 전략 비전이 수요 측면을 토대로 외부에서 내부로 향한 ‘아웃사이드-인’ 관점에서 세워졌는지 또는 내부에서 운영적으로 추진돼 외부로 향하는 ‘인사이드-아웃’관점을 바탕으로 수입되었는가?
PART 02 블루오션 전략 체계화(Formulating Blue Ocean Strategy)
Chapter 03. 시장 경계선을 재구축하라
블루오션 전략의 첫 번째 원칙 : 경쟁의 틀을 깨고 시장 경계선을 재구축해 블루오션을 창출하는 것이다.
시장경계선을 다시 만드는 6가지 기본 접근법 “6가지 통로 프레임워크”
1. 대안산업을 관찰하라
2. 산업 내 전략적 그룹들을 관찰하라
3. 구매자 체인을 관찰하라
4. 보완적 제품과 서비스 상품을 관찰하라
5. 구매자에 대한 상품의 기능적 또는 감성적 매력 요소 관찰
6. 시간 흐름을 고찰하라
○새로운 시장 공간을 위한 아이디어를 착상하라
블루오션 발견과 창출 프로세스는 새로운 방법으로 시장의 질서를 재정립하는 구조적 프로세스와 관련이 있다.
Chapter 05 비고객을 찾아라
일반적으로 기업은 고객들을 유지하고 확대하기 위해 노력하고, 이는 고객들의 취향에 더욱 부합하는 상품의 세분화와 타깃 맞춤식으로 이어진다. 이러한 경쟁이 심화될수록 지나친 고객 세분화로 너무 적은 규모의 타깃 시장을 만들게 된다.
고객을 포커스 하는 대신 비고객을 찾을 필요가 있다. 그리고 고객들의 차이점에 초점을 맞추기 보다는 구매자들이 가치를 두는 강력한 공통점에 기초를 둘 필요가 있다. 이것은 기존 고객을 뛰어넘어 그 전에 없던 새로운 대다수 고객층을 발견할 수 있게 한다.
비고객의 세 종류
첫 번째 계층 : 당신 시장의 가장자리에 위치한 이탈 가능성이 있는 ‘머지않아 고객이 될 수 있는(STB)’ 비고객
두 번째 계층 : 의식적으로 당신 시장을 선택하지 않는 ‘거부하는’ 비고객
세 번째 계층 : 당신 시장에서 가장 먼 곳에 위치한 ‘미개척’ 비고객
결론 : 블루어션 전략의 지속성과 재개
블루오션 기업과 초기 모방자들이 성공을 거두고 시장이 확대됨에 따라, 더욱 많은 기업들이 뛰어든다. 이는 ‘기업이 언제 블루오션 창출을 다시 시작해야 하는가’라는 질문으로 이어진다.
언제 가치 혁신을 다시해야 하는가?
블루오션 전략은 근본적으로 모방 차단 장벽을 내재하고 있다. 그렇지만 언젠가 결국 거의 모든 블루오션 전략은 모방될 것이다. 모방자들이 여러분의 블루오션 공간의 한 부분을 차지하려 애씀에 따라 여러분은 힘들게 얻은 고객 기반을 지키기 위해 전형적인 방어자세를 취할 것이다. 그리고 시장 점유율 유지 강박관념에 사로잡혀 새로운 경쟁자를 이겨야 한다는 경주의 덫에 빠질 수 있다.
그렇게 되면, 여러분의 가치곡선의 기본 형태는 경쟁자들의 것과 같은 방향으로 집중되기 시작할 것이다. 이런 경쟁의 함정을 피하려면 전략 캔버스에 가치곡선을 모니터할 필요가 있다. 가치곡선 모니터링은 언제 가치 혁신을 해야하는지를 보여줄 것이다. 여러분의 가치곡선이 경쟁자들의 것과 비슷한 형태를 나타내기 시작하면, 이것은 또 다른 블루오션을 창출해야 한다는 경보다. 경쟁이 심화되고 전체 공급이 수요를 초과하면, 유혈 경쟁 싸움이 시작되고 블루오션은 붉은 색으로 물들 것이다. 경쟁자의 가치곡선이 여러분의 방향으로 향하는 경향이 나타나면, 새로운 블루오션 창출을 위한 또 다른 가치혁신 달성을 향해 나아가야 한다.
Competing in overcrowded industries is no way to sustain high performance. The real opportunity is to create blue oceans of uncontested market space.
(붐비는 산업에서의 경쟁은 높은 성장을 유지하는 방법이 아니다. 실제의 기회는 무경쟁의 시장 공간의 블루오션을 창출하는 것이다.)
cirque did not make its money by competing within the confines of the existing industry or by stealing customers from Ringing and the others. Instead it created uncontested market space that made the competition irrelevant. It pulled in a while new group of customers who were traditionally noncustomers of the industry.
The business universe consists of two distinct kinds of space, which we think as red and blue oceans.
Red oceans represent all the industries in existence today-the known market space. In red oceans, industry boundaries are defined and accepted, and the competitive rules of the game are well understood. Here companies try to outperform their rivals in order to grab a greater share of existing demand. As the space gets more and more crowded, prospects for profits and growth are reduced.
|
Red Ocean vs Blue Ocean 전략 Red Ocean과 Blue Ocean의 차이점
|
In blue oceans, demand is created rather than fought over. There is ample opportunity for growth that is both profitable and rapid.
(블루오션에서는 싸우는 것 이상으로 창조(혁신)가 필요하다. 이익과 신속함 둘 다 성장하는 데 엄청난 기회를 줄 것이다.)
