'copy'에 해당되는 글 2건

  1. 2013.02.07 [Javascript] Drag, Select & Copy 방지와 해법
  2. 2012.02.23 [S3] key.copy와 bucket.copy_key에서 발생하는 NoSuchKey 에러

[Javascript] Drag, Select & Copy 방지와 해법

웹은 모든 사람들과의 정보 공유를 위해 존재합니다.

그런데 언제부터인가 불펌이 횡행하면서 

자신들의 컨텐츠에 복사 방지 코드를 삽입하는 사람들이 늘어나고 있습니다.


물론 남의 컨텐츠를 함부로 도용하는 것은 문제가 있지만,

이런 방지장치가 정말 짜증이 나는 경우가 있습니다.

그것은 바로 소스코드를 복사해야 할 때입니다.


시스템 설정이나 스크립트 코드, 프로그램 소스코드 등

직접 보고 치기에는 실수할 확률도 높고 그 양이 많은 경우에

복사해서 바로 실행하거나 컴파일하면 더 편한 것은 두말하면 입이 아픕니다.

그게 아니라면, 별도의 완성된 파일을 다운로드 받도록 제공하는 것도 한 방법이죠.

그러나 대부분 그렇지 않습니다.


일반적으로 소스코드 복사 방지는 다음과 같은 자바스크립트로 동작합니다.

// contextmenu(마우스 우측키)를 방지합니다.
document.oncontextmenu = function { return false; }
// 선택을 방지합니다.
document.onselectstart = function { return false; }
// 드래그를 방지합니다.
document.ondragstart = function { return false; }

그렇다면 이를 무력화 시키려면 정확히 반대로 해주면 됩니다.

document.oncontextmenu = null;
document.onselectstart = null;
document.ondragstart = null;

요즘 브라우저에는 대부분 디버그툴(or 개발자도구)이 있고,

그 안에는 자바스크립트 콘솔 역시 포함되어 있습니다.

자바스크립트 콘솔을 열어 위의 세 줄을 차례로 실행시키면 

대부분의 경우 선택 및 복사가 가능해 집니다.

[S3] key.copy와 bucket.copy_key에서 발생하는 NoSuchKey 에러


배경:

아마존의 클라우드 서비스를 프로젝트에 적용하면서, 프로젝트가 Python 기반의 장고이기에 AWS를 제어하기 위하여 boto를 사용하고 있다. 지금까지는 무탈하게 사용하여 왔으나, S3의 데이터를 다른 위치로 복사하는 기능을 구현하기 위하여 작업하던 중 난감한 에러를 만나게 되었다.
복사를 위하여 Key의 copy와 Bucket의 copy_key를 모두 사용하여 보았는데, 지속적으로 아래와 같은 에러를 발생하는 것이었다.

S3ResponseError: 404 Not Found

<Error>

<Code>NoSuchKey</Code>

<Message>The specified key does not exist.</Message>

<Key>/path/of/file/in/bucket</Key>

<RequestId>****************</RequestId>

<HostId>****************************************************************</HostId>

</Error>


특별히 사용법이 어려운 것도 아니고, 개인적으로 오픈소스를 무한 신뢰하는 성격이라서 boto를 최신 버전으로 업데이트까지 해가며 몇 시간을 삽질하다가 결국 boto의 함수를 직접 열어 보았다.


환경:
Mac OS X Lion
Python 2.6
boto 2.2.2


원인:
본인은 일반적으로 bucket의 key를 열 때, 키의 문자열을 다음과 같이 만들어 연다.
대부분의 API에서는 아래와 같이 사용했을 때, key도 바르게 열리고 문제가 발생하지 않는다.

keypath = os.path.join('/', project_id, filename)

 
그런데 문제는 copy와 copy_key API 내부에서 복사 리퀘스트를 날릴 때, bucket 이름과 key를 연결하여 인자로 날리는데, 위와 같이 key를 지정할 경우 'bucket//project_id/filename'으로 인자를 만들어 날리고, S3에서는 존재하지 않는 key라고 응답을 하는 것이다. 이런 황당할 때가...


해결:
코드를 아래와 같이 수정한다.

keypath = os.path.join(project_id, filename)

 
 

이걸 버그라고 신고해야하나 말아야 하나... ㅋ