분류없음2010/08/03 22:02

Eclipse 3.6 에서 Subversive Team Provider 플러그인을 설치하고, Update / Commit / Synchronize 단축키를 쓰려 해도 동작하지 않는다. 기본적으로 비활성화되어 있기 때문인데, Window –> Customize Perspective –> Command Groups Availability 에서 활성화시켜 줄 수 있다.

image

창에서 Available command groups 에서 체크해주면 활성화가 되는데, 이 작업만 해줄 경우 툴바에도  단축 아이콘들이 나타난다.

image

툴바에서 보고 싶지 않다면, Tool Bar Visibility 탭에서 체크를 빼주면, 단축키만 동작하고 툴바에서는 보이지 않는다.

image

Posted by Gloridea
분류없음2010/07/14 01:07

평소 BC로 결제하려면 으레 보게 되는 요 창도 맘에 안들었는데,

이젠 넷피아까지 설치하려 든다. (분명히 Ctrl + PrtSc 를 눌러서 캡처를 뜬 거 같은데 클립보드에 저장되지 않아서 설치 팝업 이미지는 여기를 참고… )

그래서 기껏 ActiveX 범벅을 설치해가며 결제 마지막 단계에까지 도달한 수고에도 불구하고, 망설임 없이 결제를 취소한 뒤 비자 안심클릭으로 다시 결제했다. 넷피아 참 질기다. (그리고 나도 참 까칠하다.)

Posted by Gloridea
분류없음2010/07/04 22:28

이런 광고 참 성가시다. 컨텐츠 위로 마우스만 지나가려 치면 불쑥 불쑥 나타나서 사라지지도 않는 저 DirectKeyword 검색을 비롯해서, 화면 조금만 멈출 성 싶으면 불쑥 튀어나오고, 심지어는 스크롤 시에 종종 사라지지도 않는 RealClick 등등... 스마트폰에서는 훨씬 더 심각하다. 닫기 버튼을 누르기도 쉽지가 않다.

그래서 만들었다. 컨텐츠내 광고 제거 북마클릿.

사용법은 다른 북마클릿이랑 크게 다르지 않다. 북마클릿을 즐겨찾기에 저장해 뒀다가, 필요할 때 즐겨찾기에서 찾아 실행해주면 된다. hosts를 차단하거나,  브라우저 확장 기능을 만드는 등의 과격한(?) 대응도 가능하지만, 뭐 그렇게까지 씩이나... 게다가 스마트폰에서도 쓰고 싶었다는 게 가장 큰 이유... (였는데 어째서인지 아이폰에서 잘 동작 안한다. 뭐가 문젤까. -ㅂ-; )

적용한 결과

아, 깨끗하고 알흠답다.

덧. 차단하는 광고 종류가 추가되어도, 북마클릿을 새로 생성할 필요는 없음. 클릭 시마다 최신 스크립트를 가져옴.

저작자 표시 비영리 변경 금지
Posted by Gloridea
분류없음2010/07/04 19:22

메일서버가 하는 일을 나누자면 크게 3가지가 있다. 메일 접수, 메일 발송, 메일 수신. (RFC 명세상의 용어는 MSA, 즉 Message Submission Agent 이다. 하지만 '제출'은 받는 입장이고, '접수'는 하는 입장이라 메일서버를 주어로 했을 때는 '접수'가 더 어울리는 듯하여 접수라고 썼다.)

Outlook 등을 통해서 메일 서버에 접속하여 메일 발송을 의뢰하면, 메일 서버는 이 메일을 수신자의 메일 서버로 발송한다. 그리고 타인이 해당 메일서버의 사용자에게 보낸 메일을 수신해준다. 뿐만 아니라, 제3자의 메일을 중계해 주기도 한다. 이를 Relay라고 한다.

초창기 인터넷은 학교나 연구소 등지에서만 사용 가능했기 때문에, 당연히 스팸메일 같은 것을 고려할 필요는 없었고, 이에 따라 메일 서버는 SMTP (RFC 821) 프로토콜에 따라 '누구에게서 받았건 상관하지 않고 적합한 메일서버로 전달해주는' 형태로 구성되어 있었다. 그러나 인터넷이 널리 보급되면서, 스팸메일이 점점 늘어났는데, Relay가 열려있는 메일 서버를 사용하여 스팸메일을 발송하는 일이 빈번하게 발생하였다. 이때문에 Extemded SMTP (RFC 1869) 라는 확장 규격이 제정되면서, SMTH AUTH (RFC 4954)라는 인증 규격을 새로 정의하게 된다. 그리고 이 기능은 꾸준히 보급되어 1998년에 55%의 메일 서버가 Relay를 허용했던 것에서, 2002년에는 1% 미만으로 감소하였다.

SMTP AUTH를 도입한 메일 서버는, 접속자가 자신에게 등록된 사용자인지를 확인하는 인증을 거치면 자신을 발송 서버로 사용할 수 있게 해주지만, 인증을 거치지 않으면 메일 서버의 로컬 사용자에게만 메일을 보낼 수 있고, 제3의 목적지로는 보낼 수 없다.


그러자 스패머들은 마침 급속히 보급되던 초고속 인터넷망을 십분 활용하여, 개인 PC를 메일 서버로 만들어 메일을 직접 발송하였다. 개인 PC를 메일 서버로 구성하여, 수신자의 메일 서버에 직접 접근하여 스팸을 남기기 시작한 것이다. 뿐만 아니라, 일반 사용자의 PC를 감염시켜 사용자도 모르는 사이에 PC를 스팸 발송용 메일 서버로 만들어 버리는 사례도 빈발하였다. 이렇게 발송되는 스팸메일을 필터링하기 위해 각국 ISP 및 메일 업체들은 다방면으로 노력을 해왔다. 그중 몇 가지 시도가, 메일 발송 블랙리스트를 만들고 관리하는 RBL 이라던가, 자신의 메일서버를 인증시키는 SPF (RFC 4408, Experimental) 나 DKIM (RFC 4871, Proposed Standard) 같은 방법들이 강구되어 왔다. 

그러나 이러한 방법들은 발신자가 스패머라는 것을 확증하도록 할 수 있는 방법은 아니었다. 오래 전에 셋업된 후 업그레이드 되지 않은 메일 서버들은 정상 서버임에도 불구하고 SPF나 DKIM 설정 등이 없기 때문이기도 하고, IP 대역의 사용처가 바뀌거나 했을 경우 RBL은 종종 멀쩡한 IP를 블랙리스트로 지정하곤 했기 때문이었다. 이러한 방법들은 단지 해당 메일이 얼마나 스팸에 가까울지를 판별하는 스팸 점수 산정에 참고가 될 뿐이었다.

그래서 메일 서버의 기능을 분리하고자 하는 시도가 RFC 2476, Message Submission이라는 형태로 정리되었다. 이 명세는 사용자의 메일 클라이언트 (MUA: Message User Agent - Outlook, Firebird와 같은)로부터 메일 발송 요청을 접수하는 (MSA:Mail Submission Agent)기능과 메일을 수신자의 서버로 전달하는 (MTA: Mail Transfer Agent) 기능을 분리하기기 위한 명세를 정의하였다. 그리고 MSA에 접속한 사용자는 인증이 없이는 어떤 일도 할 수 없도록 설정하는 것을 권장하였다.

시간 상으로는 RFC 2476이 정의된 것이 SPF(2006), DKIM(2007) 보다 훨씬 이전이다. 다만, 사용자의 설정을 바꿔야 하는 부담과, 한 사업자만 이 규칙을 적용해봤자 거의 쓸모가 없다는 이유로 적용되지 않았다. 그러다가 JEAG (Japan Email Abuse Group) 에서 2006년에 이 Message Submission 적용을 권장하고, 각 ISP에게 유동 IP로부터는 25번 포트 접속을 할 수 없도록 차단하도록 요청하는 한편. 이를 OP25B (Outbound Port 25 Block) 라고 명명하였다. 대략적인 구조는 다음과 같다.


이와 같은 정책을 적용한 결과, 포트 차단을 시행한 ISP의 스팸 발송 비율은 급격히 감소하였다. (자료 출처 : 한국 인터넷 진흥원 )

반면, 이 정책을 적용하지 않은 ISP는 오히려 스팸 발송 비율이 급상승 하였다. 스패머들이 스팸 발송이 가능한 ISP로 옮겨갔기 때문으로 추정된다. 이는 최대한 많은 ISP가 이 정책 적용에 동참하여야 효율적으로 스팸 발송을 차단할 수 있음을 의미한다. 이에 따라 한국 인터넷 진흥원에서도 유동 IP 대역에서의 25번 포트 접속 제한을 2010말에 시행하도록 권고하고 있다.

http://www.block25.or.kr/ 홈페이지에서 메일서버별 설정 방법 등이 제공되므로, 자세한 내용은 이를 참고하여도 좋다.

저작자 표시 비영리 변경 금지
Posted by Gloridea
분류없음2010/06/24 01:05

11.8.6 The instanceof operator
The production RelationalExpression: RelationalExpression instanceof ShiftExpression is evaluated as follows:

  1. Let lref be the result of evaluating RelationalExpression.
  2. Let lval be GetValue(lref).
  3. Let rref be the result of evaluating ShiftExpression.
  4. Let rval be GetValue(rref).
  5. If Type(rval) is not Object, throw a TypeError exception.
  6. If rval does not have a [[HasInstance]] internal method, throw a TypeError exception.
  7. Return the result of calling the [[HasInstance]] internal method of rval with argument lval.


15.3.5.3 [[HasInstance]] (V)
Assume F is a Function object.
When the [[HasInstance]] internal method of F is called with value V, the following steps are taken:

  1. If V is not an object, return false.
  2. Let O be the result of calling the [[Get]] internal method of F with property name "prototype".
  3. If Type(O) is not Object, throw a TypeError exception.
  4. Repeat
    1. Let V be the value of the [[Prototype]] internal property of V.
    2. If V is null, return false.
    3. If O and V refer to the same object, return true.


11.2.2 The new Operator
The production NewExpression : new NewExpression is evaluated as follows:

  1. Let ref be the result of evaluating NewExpression.
  2. Let constructor be GetValue(ref).
  3. If Type(constructor) is not Object, throw a TypeError exception.
  4. If constructor does not implement the [[Construct]] internal method, throw a TypeError exception.
  5. Return the result of calling the [[Construct]] internal method on constructor, providing no arguments (that is, an empty list of arguments).


13.2.2 [[Construct]]
When the [[Construct]] internal method for a Function object F is called with a possibly empty list of arguments, the following steps are taken:

  1. Let obj be a newly created native ECMAScript object.
  2. Set all the internal methods of obj as specified in 8.12.
  3. Set the [[Class]] internal property of obj to "Object".
  4. Set the [[Extensible]] internal property of obj to true.
  5. Let proto be the value of calling the [[Get]] internal property of F with argument "prototype".
  6. If Type(proto) is Object, set the [[Prototype]] internal property of obj to proto.
  7. If Type(proto) is not Object, set the [[Prototype]] internal property of obj to the standard built-in Object prototype object as described in 15.2.4.
  8. Let result be the result of calling the [[Call]] internal property of F, providing obj as the this value and providing the argument list passed into [[Construct]] as args.
  9. If Type(result) is Object then return result.
  10. Return obj.


교훈: 삽질 하지 말고 명세 보자.

저작자 표시 비영리 변경 금지
Posted by Gloridea