2009년 5월 8일 금요일

Subversion 설치

초간단 Subversion 설치 문서라고 할 수 있겠다. 초간단이란 이유는 Apache와의 연동 부분이 빠져 있어 svnserve 를 사용한 서버로 동작시켜 3690 포트 상으로 사용하는 것을 말한다.
즉, http://server-ip 로 시작하는 것이 아니라 svn://server-ip 라고 하는 svn 단독 서버로 동작시키는 방법이다.
(사실, 아파치와 연동하지 않은 것은 이미 아파치+톰캣 형태로 해당 서버를 사용하고 있어서이다. 귀찮이즘...ㅡㅡ;;)

먼저, 서버 환경은 다음과 같다.

- x86
- OS : Redhat ES 4.x
- Subversion : 1.5.1 rpm version

언제나 그렇치만 대부분의 문서가 환경을 언급하지 않아 곤란한 적이 많았다. Subversion 1.1 이상인 경우 특별한 차이는 없지만 그래도 최신 버전을 사용하였다.
그리고 소스를 사용하지 않고 Redhat 에서의 운영때문에 rpm 을 사용하였다.

먼저, Redhat ES 4.x 버전에서 subversion 1.5.1 RPM 버전을 받아서 설치할 경우 에러가 발생한다. 다음과 같은 dependecy가 발생하는 라이브러리들을 설치해 주어야 한다.
일단, 필요한 rpm 파일들을 받아보자.

http://the.earth.li/pub/subversion/summersoft.fay.ar.us/pub/subversion/latest/

위의 URL을 통해서 가장 최신의 subversion을 구할 수 있다. 일단, 여기선 최종 아래의 링크까지 따라가서 rpm 파일들을 사용하였다.

http://the.earth.li/pub/subversion/summersoft.fay.ar.us/pub/subversion/latest/rhel-4/i386/

여기서 받아야 할 파일들은 다음과 같다.

apr-0.9.12-2.i386.rpm
apr-util-0.9.12-1.i386.rpm
neon-0.27.2-1.i386.rpm
subversion-1.5.1-1.i386.rpm

콘솔에서 먼저 subversion-1.5.1-1.i386.rpm 을 설치해 보자. 위에서 이야기한 대로 에러가 발생한다. 때문에 다음과 같이 apr, apr-util을 업데이트 시켜 주어야 한다.
새로 설치가 아닌 업데이트이다. rpm - qa 명령어를 사용하여 apr을 찾아보면 이미 설치가 되어 있기 때문인데 다음과 같이 해서 찾아보고 업데이트 해 준다.

rpm -qa | grep apr
rpm -Uvh ./apr-0.9.12-2.i386.rpm
rpm -Uvh ./apr-util-0.9.12-1.i386.rpm
rpm -ivh ./neon-0.27.2-1.i386.rpm


그리고, subversion을 rpm 형태로 설치하자.

rpm -ivh ./subversion-1.5.1-1.i386.rpm

특별하게 에러가 발생하진 않았다^^

이제 몇 가지 설정을 통해서 svn repository를 만들고, svnserve 를 데몬으로 돌리고 사용자 아이디와 패스워드를 사용하여 접속하게 해 보자.

1. svn repository 만들기
다음과 같이 "/home/svn" 디렉토리로 이동하고, svn repository를 만들자.

cd /home/svn
svnadmin create --fs-type fsfs sample

svnadmin 명령어를 사용하여 repository를 만드는데 옵션 중에 --fs-type 뒤의 fsfs는 파일 시스템을 저장소로 이용한다는 뜻이고, "fsfs" 대신에 "bdb"라고 기입하면 버클리 데이터베이스를 저장소로 사용한다는 뜻이다.
즉, 버클리 데이터베이스를 파일 저장소로 사용하고 싶은 경우 버클리 디비를 설치해 주어야 한다. 여기선 이러한 과정을 생략한 것이다.

리눅스 특성상 특별한 에러를 리턴하지 않으면 정상적으로 repository 를 생성한 것이다.

2. svnserve 데몬
다음과 같이 명령어를 실행해 보자.

svnserve -d -r /home/svn/

"/home/svn" 디렉토리를 저장소로하여 서버 데몬 형태로 subversion 서버를 구동한 것이다.

여기서 잠시 subversion client 를 사용하여 svn://server-ip/sample 라고 접근해 보면 접속되는 것을 확인하고 가는 것이 좋을 거 같다.
만약, subversion client 를 사용하여 위에서 처럼 접속되지 않으면 잘못 설치한 것임으로 원인을 찾아야 할 것이다.

정상적으로 설치가 되면 anonymous 계정으로 권한이 풀린 상태로 접속이 된 것이다.
보통은 아이디/패스워드를 사용하여 subversion을 사용할 것임으로 보안 설정을 해 보자.

3. subversion 보안 설정
"/home/svn/sample" 디렉토리가 repository로 설정되었음으로 해당 디렉토리에 보면 "conf" 디렉토리가 생성되어져 있는 것을 볼 수 있을 것이다.

따라서 다음과 같이 vi 명령어를 사용하여 svnserve.conf 파일을 열어보자.

vi /home/svn/sample/conf/svnserve.conf

파일을 열었다면 다음과 같이 svnserve.conf 파일을 수정해 보자.


### This file controls the configuration of the svnserve daemon, if you
### use it to allow access to this repository.  (If you only allow
### access through http: and/or file: URLs, then this file is
### irrelevant.)

### Visit http://subversion.tigris.org/ for more information.

[general]
### These options control access to the repository for unauthenticated
### and authenticated users.  Valid values are "write", "read",
### and "none".  The sample settings below are the defaults.
anon-access = none
auth-access = write
### The password-db option controls the location of the password
### database file.  Unless you specify a path starting with a /,
### the file's location is relative to the directory containing
### this configuration file.
### If SASL is enabled (see below), this file will NOT be used.
### Uncomment the line below to use the default password file.
password-db = passwd
### The authz-db option controls the location of the authorization
### rules for path-based access control.  Unless you specify a path
### starting with a /, the file's location is relative to the the
### directory containing this file.  If you don't specify an
### authz-db, no path-based access control is done.
### Uncomment the line below to use the default authorization file.
# authz-db = authz
### This option specifies the authentication realm of the repository.
### If two repositories have the same authentication realm, they should
### have the same password database, and vice versa.  The default realm
### is repository's uuid.
realm = My First Repository

[sasl]
### This option specifies whether you want to use the Cyrus SASL
### library for authentication. Default is false.
### This section will be ignored if svnserve is not built with Cyrus
### SASL support; to check, run 'svnserve --version' and look for a line
### reading 'Cyrus SASL authentication is available.'
# use-sasl = true
### These options specify the desired strength of the security layer
### that you want SASL to provide. 0 means no encryption, 1 means
### integrity-checking only, values larger than 1 are correlated
### to the effective key length for encryption (e.g. 128 means 128-bit
### encryption). The values below are the defaults.
# min-encryption = 0
# max-encryption = 256

수정할 부분은 실제론 다음과 같다.

anon-access = none
즉, anonymous 계정의 접근을 허락하지 않는다.

auth-access = write
즉, 사용자의 권한이 read/write 이다. "read"라고 수정하면 read 권한만 가진다.

password-db = passwd
"/home/svn/conf/passwd" 파일을 사용하여 ID=Password 형태로 사용자 권한을 부여한다.

파일을 저장하고, password-db property의 설정에서 지적한 것과 같이 "/home/svn/conf/passwd" 파일에 사용자 ID와 password를 설정해 보자.
여기서 패스워드가 암호화되지 않는다는 것을 명심하고 셋팅해 주어야 한다. 예제는 다음과 같다.


user=password

자, 이제 별도의 재가동 없이도 subversion client를 사용하여 subversion 서버에 연결해 보자. 아이디와 패스워드를 물어볼 것이다.
위에서 설정한 아이디/패스워드를 입력해 주어 정상적으로 접속이 완료되면 성공한 것이다.

이것으로 subversion 설치 과정을 마친도록 한다.
추후에 시간이 되면 eclipse 플러그인(subclipse)를 사용하여 연결해 보는 것도 올리도록 하겠다.


[참고 링크]
http://www.pyrasis.com/main/Subversion-HOWTO : 오랫동안 subversion 설치 문서로 사용되고 있음.
http://blog.jidolstar.com/82 : 위의 설치문서를 보고 재정리 둠.

Too many open files Exception 발생시 대처방법 정리

서버 운영 중에 Too many open files Exception 이 발생한 경우라면 대부분 동시 접속자가 갑자기 증가한 것에 따른 소켓도 파일 IO로 처리하는 특성 때문에 발생하는 문제이다.
이에 대한 대처 방법으로 다양하게 포스팅 해 둔 블로거들 및 글이 있어 정리해 본다.

BEA 지원 진단 패턴

풍경소리
Too many open files

scarable 님의 여러 포스팅

2009년 5월 7일 목요일

JAMWiki 설치

이전 WikiMartix 소개 글에서 wiki에 대한 연구를 조금씩 하게 되었는데, 일단 1.x 대 소스가 완료되진 않았으나 괜찮은 거 같은 wiki 오픈소스를 발견하게 되어 간단하게 소개하고 설치해 보았다.


물론 java를 기반으로 하고 있으며 LGPL 라이센스를 따름으로 다른 솔루션으로 활용해도 무방할 거란 생각이 든다.
소개하기로는 MediaWiki 의 대부분의 특징을 다 가지고 있다고 소개한다.
암튼, 내부적으로는 하나씩 살펴보아야 하는데 일단 설치하고 셋팅하는 방법부터 살펴보자.

[환경]
- 소스 빌드 : eclipse3.4.1 + m2eclipse(maven eclipse plugin) + subeclipse(svn eclipse plugin)
- JDK1.6.0_10
- WAS : Tomcat-6.0.18


먼저, eclipse svn repository를 이용하여http://jamwiki.svn.sourceforge.net/svnroot/jamwiki/ 에 접속한 후, wiki -> trunk 에서 "Check out as maven project"를 이용하여 check 해 준다.

그러면 현재 0.6.7 버전을 기준으로 살펴보면 디렉토리가 다음과 같다.

- addons
- jamwiki-core
- jamwiki-war
- jamwiki-web
- javadiff
- repository
- target
- webtests

JAMWiki 에서 소개하고 있는 문서와는 상당한 차이가 있다.
eclipse 에서 보면 다음과 같이 프로젝트가 생성되어져 있다.

- addons
- bliki-parser
- jamwiki
- jamwiki-core
- jamwiki-war
- jamwiki-web
- javadiff

자, 일단 maven project 형태이기 때문에 jamwiki 프로젝트의 "pom.xml" 파일을 선택하고 "maven build..." 를 선택하고, goals를 'package' 라고 해 보자.
말 그대로 war로 패키지를 한다는 말인데, 에러가 발생한다. 기본 maven에서 package로 할 경우 JUnit을 통한 test하게 되는데 여기서 에러가 발생한다. 일단 test를 하지 않아도 war로 패키징 할 수 있음으로 다음과 같이 goals를 해 보자.

-Dmaven.test.skip package

command 상인 경우 "workspace/jamwiki" 디렉토리에서 다음과 같은 명령어를 입력한다.

mvn -Dmaven.test.skip package
그래도 에러가 난다. 문제가 다음의 메시지와 비슷하면 처리를 할 수 있다.

[INFO] Installing C:\Documents and Settings\이상협\workspace\jamwiki\addons\bliki-parser\target\bliki-3.0-SNAPSHOT.jar t
o C:\Documents and Settings\이상협\.m2\repository\bliki\bliki\3.0-SNAPSHOT\bliki-3.0-SNAPSHOT.jar
[INFO] ------------------------------------------------------------------------
[ERROR] BUILD ERROR
[INFO] ------------------------------------------------------------------------
[INFO] Error installing artifact 'bliki:bliki:jar': Error installing artifact: File C:\Documents and Settings\이상협\wor
kspace\jamwiki\addons\bliki-parser\target\bliki-3.0-SNAPSHOT.jar does not exist

정상적으로 bliki-3.0-SNAPSHOT.jar 파일이 생성되지 않은 경우인데, "workspace/jamwiki/repository/bliki/bliki/3.0-SNAPSHOT" 디렉토리로 이동해서 command 상에서 다음과 같이 입력해 준다.

mvn install:install-file -DgroupId=bliki -DartifactId=bliki -Dversion=3.0-SNAPSHOT -Dpackaging=jar -Dfile=bliki-3.0-SNAPSHOT.jar

그러면, "bliki-3.0-SNAPSHOT.jar" 파일이 자동으로 생성된다.이제, eclipse "jamwiki" 프로젝트의 "pom.xml"을 이용한 "-Dmaven.test.skip package" 또는 command 상에서"mvn -Dmaven.test.skip package" 입력하면 "workspace/jamwiki/jamwiki-war/target" 디렉토리에 "jamwiki-war.war" 파일이 생성되어 package 된다.


[Tomcat 으로 설치]

패키징한 "jamwiki-war.war" 파일을 "%TOMCAT_HOME%/webapps" 디렉토리로 복사하고 간단하게 url을 입력하기 위해서 "jamwiki.war" 로 파일명을 변경하자.Tomcat을 실행하면 당연히 jamwiki 디렉토리가 생성되면 정상적으로 설치가 된다.


[JAMWiki 셋팅]

브라우저에서 http://localhost:8080/jamwiki 라고 입력해 보자. 다음과 같이 초기 셋팅을 해 주어야 한다.

데이터베이스를 mysql로 해 주고, jamwiki 데이터베이스를 만들어주고, 계정을 주었지만 다음의 에러가 발생한다.

A connection could not be established with the database; please re-check the settings: com.mysql.jdbc.Driver

드라이버를 로딩하지 못한 것인데 JAMWiki는 기본으로 hsql을 사용하기 때문에 MySQL driver가 설치되어 있지 않다.
간단하게 "mysql-connector-java-5.0.3.jar" 파일을 "%TOMCAT_HOME%/webapps/jamwiki/WEB-INF/lib" 디렉토리에 복사해 주면 된다. 혹시, Tomcat 공통 라이브러리에 mysql-connector-java-5.0.3.jar 파일이 있는 경우에는 에러가 발생하지 않을 것이다. 이렇게 정상적으로 셋팅이 완료되면 브라우저에서 자동으로 http://localhost:8080/jamwiki/en/StartingPoints 로 이동할 것이다.다음과 같이 JAMWiki 초기 화면을 보게되면 성공한 것이다.

앞으로 틈이 나는대로 Wiki 및 JAMWiki 관련된 글을 작성할 생각이다.

씽크 이노베이션 - 경쟁자가 못하는 것을 하라

사용자 삽입 이미지
2009년의 화두를 던지면서 스스로에게 던져본 말 중에 하나가 "Creative Innovator" 였다.
생각이란 것이 시간이 지나면 자신도 모르게 잊혀지든지 아니면 몸 속에 스며들어 베어나오게 된다.

그리고 이 책이 내게 위의 것 중에 이노베이션이란 단어, 생각들이 내 속에서 잊혀졌는지, 내 몸속에 베여 있는지 확인해 주었다.

책의 내용은 각 장 마다 하나의 성공사례에 대한 재밌는 이야기를 해 주고, 각 성공사례를 통해서 배울 점들을 이론적 근거와 확신으로 말해주고 있다.
그리고 계속해서 책의 처음부터 끝까지 이야기하는 바가 이노베이터의 조건이다.
꼭 "피터 드러커의 이노베이터의 조건" 처럼!

그리고 이 책은 이노베이터의 조건을 원칙에서 벗어나지 않고 잘 말해준다. 존재의 목적(개인이든 사업이든), 확고한 신념, here and now, 동물적 감각, 논리적인 분석력 등...
단어들만 언급해도 여러 가지이지만 이러한 모든 조건들이 복합적으로 작용할 때 성공에 이르는 것 처럼 이노베이터의 조건들이 사람의 삶 속에서 우러나오고 베어 있을 때 진정으로 가치를 발휘한다는 것이다.

책에 내용을 인용해서 이러한 주장을 뒷받침해주는 것을 잠시 볼 필요가 있다.
"나는 무엇을 하고 싶은가? 나는 무엇을 위해 존재하는가? 자기 자신에게 질문해보고 고뇌하는 가운데 삶의 자세를 확립한다. 자신의 삶의 자세를 확립하고 있지 않는 한, 사물을 주관적으로 생각한다든가 새로운 것을 상상하는 일은 불가능하다. 더욱이 환경을 바꿀 정도의 이노베이션을 일으킬 수 없다. 이노베이터로서 진정한 리더가 될 인재와 그렇지 않은 인재의 차이는 최종적으로 거기에 있다" - p.329~330

"자신의 머리로 생각하고 행동하는 것은, 달리 표현하자면 스스로 미래의 가능성을 발견하는 것이다. 미래의 가능성이 보이면 비로서 과거가 부정적으로 재검토되어 지금 여기서 here and now 무엇을 해야 하는지를 알게 된다. 자기 나름의 삶의 방식을 갖지 못한 사람은 미래의 가능성을 그리기는커녕 자신의 머리로 생각하는 것 자체를 기대할 수 없다.
논리적 사고는 연습하면 누구든지 어느 정도 가능하게 되지만, 논리는 대상의 형식을 따지기 때문에 그 사람의 인생은 별개로 간주한다. 가장 나쁜 것은 자신의 삶의 자세도 없이 빌려온 듯한 논리를 내걸고, 위험도 감당하지 않고 책임도 지지 않는 유형이다. 만일 자기 나름대로 미래의 가능성을 그릴 수 없다면 다시 한 번 삶을 재검토해야 한다. 이노베이션의 길은 그곳에서 시작된다." - p.332

책의 인용이 너무 긴 듯 하기도 하지만 이 책에서 말하고자 하는 핵심 요소를 전부 포함하고 있다.
이후에도 원칙, 적용, 가치관적인 관점을 두고 좋은 책이라 할 수 있다. 다시금 손에 들어보고 싶은 책이다.

피터 드러커의 위대한 혁신

사용자 삽입 이미지
2009년이 2008년에 이은 세계적인 경제불황의 바톤을 이어받아 시작해서인지 많은 사람들의 입에 오르는 말이 '위기는 곧 기회다'라는 말을 많이하는 것을 볼 수 있다.
나 역시 사실 공공연하게 이런 말을 해 가며 스스로에게도 채찍을 가해 보던 중에 문뜩 떠 오른 단어하나가 'Creative Innovator' 였다.

'위기가 곧 기회'라고 하는데 그렇다면 나와 우리 사회에 몰아친 위기를 어떻게 하면 극복해 나갈 수 있을까? 하는 것이 올해 초 내가 고민했던 것 중에 하나였다. 그리고 그 해답의 하나로 떠 올랐던 것이 'Creative Innovator' 였던 것이다.

그리고는 문득 문득 '혁신'이란 단어에 초점을 가져보았고 이전에 서점에서 보았던 책 한권을 생각하고는 주말을 맞이해서 부담없이 읽어나간 책이다.
이미 저자의 책 몇 권을 읽었던 터라, 부담감 보다는 기대감을 갖고 읽게 된 책이다. 그리고 이러한 작은 기대는 빚나가지 않고 조금씩 저자가 말하고자 하는 의도에 빠져 들기도 하고, 또 한번 박학다식함과 통찰력 등에 놀라기도 했다.

그리고 이전에 다른 책에서 읽었던 것 하곤 다르게 간결하면서도 문제와 핵심을 정곡으로 찌르는 맛이 감칠맛 날 정도였다.
구구절절 설명하지 않아도 문제의 핵심이 명확하고 해결책 역시 명확하니 더 이상 거론하지 않더라도 공감이 가는 부분이 많았다.

그래도 굳이 책을 잠시 정리하자면 제목처럼 '혁신'에 대한 이야기이다.
주로 기업가 정신을 위주로하여 대상이 기업(대기업, 소기업, 벤처기업), 공공기간, 비영리 단체등을 함께 언급하고 있다. 이건 퍼터 드러커 책의 특징이기도 하다.
책에서 말하고자 하는 '혁신'의 핵심은 다음 두 가지란 생각이 든다.

- 기회에 따른 분석
- '고객' 중심의 사고방식

개인적으로 철저한 분석에 대한 이해를 더욱 키운 것 같았다. 주먹구구식의 분석이 아닌 철저한 사전 조사와 연구, 생각의 정리를 통한 분석이 반드시 필요할 것이다.
'고객' 중심의 사고방식은 다음 책의 문구를 통해서 살펴볼 수 있다. 특히 벤처기업의 경영자 또는 예비 창업자에겐 필수적인 요소이다.

벤처기업은 생산자에 의해서 규정되는 것이 '제품' 또는 '서비스'가 아니라 고객에 의해 규정된다는 것을 절대 잊지 않는 기업 체질을 구축하지 않으면 안 된다. 또한 자사의 제품 또는 서비스가 고객에게 제공하는 효용 및 가치와 관련해 스스로 좀더 나은 것을 제공하려는 노력을 끊임없이 지속해야 한다.
- p.207 중에서 -

오랜만에 집에서 천천히 읽어본 책이어서 많은 곳에 메모와 밑줄이 그어져 있다. 개인적인 아이디어도 많이 얻고 생각해 볼 꺼리도 많이 얻었다.
결국 '혁신'의 또 다른 핵심은 스스로에게 채찍질하는 과정도 필요하게 될거 같다.

CEO의 습관

사용자 삽입 이미지
2009년 처음으로 완독한 책이 되었다.
2008년 말부터 읽기 시작했었는데, 짧은 지하철 출/퇴근 시간에 읽다보니 진도가 빨리 나간것은 아니지만 연일 하나의 스토리를 읽는 것처럼 재미있게 읽었다.

'성공하는 CEO를 만든 아주 작지만 특별한 49가지 습관'이라고 소개하고 있기 때문에 선뜻 손이 가지 않는 책이었다.
CEO들의 습관이나 성공원칙들은 많은 대중매체나 글, 책등을 통해서 접해 왔던 터라 '뭐... 그저 그런 내용이겠지'하는 생각이 많았다.
그리고 한 책에서 49가지나 다루니 깊이 면에서도 그렇게 좋은 책은 아니란 생각이 들었다.

하지만, 2009년 처음으로 완독한 책으로서도 기쁘지만 좋은 책을 읽게된 기쁨도 한층 더해지는 책이다.

평소 짤막한 에피소드나 이야기 형식의 짧은 글보다는 내용은 좀 지루하더라도 한 주제등을 가지고 깊이 있게 다루는 책을 좋아하는지라 CEO의 습관을 49가지나 다루고 있는 이 책을 재밌고 유익하게 읽을 것이라고는 생각도 하지 않았다.

하지만, 여러 분야의 CEO들의 실제 이야기와 에피소드를 중심으로 한 이 책은 내심 자기화를 통한 정리와 생각의 여운을 남기는 책이다. 특히, 그동안 CEO들의 성공 원칙이나 습관들을 알고만 있었지 정리한 적은 없었던 내게 옆에 두고서 또 다시 읽어보면서 그 때 그 때 부딪히는 문제에 도움이 될만한 내용이다.
뿐만 아니라 짧은 메시지 중에 말하고자 하는 내용이 분명하기 때문에 독자로 하여금 생각의 여지를 남겨둔 것이 적절하다.

이 책에서 다루고 있는 모든 CEO의 습관을 다 가질수는 없지만 자신의 스타일에 맞고, 또 반드시 필요할 경우에는 자기화를 이루어 충분히 적용해보면 좋은 성과를 낼 수 있을 것 같다.
많이 생각하고 고민할 수 있는 점은 남겨준 좋은 책이다.

마지막으로 그동안 내가 잘 하지 못하거나 앞으로 고쳐야 할 부분을 이 책에서 다루고 있는 습관 중에 나열해 보면 다음과 같다.

- 자투리 시간을 전략적으로 활용한다.
 : 점심시간에 대한 문제였는데 현재는 단순히 내 자신의 계발에 치중을 하는 편인데 점심시간을 이용한 사람을 만나는 CEO들의 습관은 내게 재고해 볼만한 문제였다.

- 사소한 것에 목숨 건다
 : 째째하다거나 소심한 것이 나쁜 것으로만 인식되어진 사회 속에 '아니다'라고 돌을 던질 수 있는 부분이었다.

- 식사 시간을 경영하라
 : 앞의 자투리 시간과 비슷한 맥락

- 상사를 자기 편으로 만드는 5가지 방법
 : 흠... 어디든지 자기와 안맞는 상사 또는 동료는 있는 법... 이 책에서도 그렇게 이야기하고 있고...
  결국, 반하는 것보다는 자기 편으로 만드는 것이 좋을 듯 하다.

- CEO는 휴먼 비지니스에 강하다
 : 평소 소신과 일맥상통하다! 하지만 대부분의 CEO 들이 그렇치 않아서 고민인데 오히려 이를 통해 더 고민해보려고 한다.

오른쪽 마우스, 붙여넣기 기능 막기[익스플로러만 해당]

Javascript를 이용하여 익스플로러에서 오른쪽 마우스 기능과 붙여넣기 기능을 사용하지 못하게 막는다.
사용하지 못한다는 메시지를 던져주는 것도 아니고, 말 그대로 그냥 사용하지 못하게 한다.

head 태그에 다음의 Javascript 코드를 삽입한다.

<script> 
function ctrl(e) { // ctrl+v 무반응 스크립트 
  if(document.all) { 
    if(event.keyCode == 86) { 
      event.returnValue=false; 
    } 
  } 
  if(document.layers) { 
    if(event.keyCode == 86) { 
      event.returnValue=false; 
    } 
  } 
} 

document.onkeydown=ctrl; 
</script>


그리고, <body> 태그의 속성으로 다음과 같은 코드를 삽입한다.

<body oncontextmenu="return false">