IE에서는 CSS에서 javascript를 호출 할 수 있도록 expression 함수를 지원한다.

이유가 어떻게 되던지 간에

표현을 맡은 부분에 자바스크립트를 지원해준다는 것 자체가

설계상 문제점을 지니고 있는 것이 아닌가 싶다.

정말 그렇게 하고 싶었다면

자바스크립트 함수를 호출하게 하는 방식은 안되었던 것일까?

너무나 성급한 API에 오늘도 실망을 감추지 못한다.
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 허혁

댓글을 달아주세요:: 네티켓은 기본, 스팸은 사절

1. 현상
최근에 검색 서버를 이전하면서 유예기간을 두어 옛 서버와 새 서버를 동시에 지원해두기로 결정했다. 그런데 DNS에 두 IP를 Round-Robin 방식으로 요청할 때마다 다른 IP를 줄 수 있도록 변경했는데, 실제 JVM의 서비스에서는 아무리 해도 새 서버 IP으로 요청을 하지 않는 것이 었다.

2. 첫 시도
일단 캐시를 의심을 했다. 이런 경우 실정보 반영이 느린 캐시가 범인인 경우가 많은데, 여러가지 캐시들을 차근차근 정리했다.
  1. console에서의 반영 여부 확인
  2. 아파치(Apache) 웹 서버 재시작
  3. 톰캣(Tomcat) 컨테이너 재시작
예상대로라면 정상적으로 처리되어야 할 상황이었지만, 현상은 유지되고 있었다.

3. JVM
JVM에서는 Host Name resolutions에 caching을 지원하고 있다. 캐시 방법에는 두가지 방식이 있는데 positive, negative로 각각 성공했을 경우와 실패했을 경우 캐시 유지 정책을 뜻한다. 이 값을 설정하는 방법에는 두가지가 있는데,
  1. $JAVA_HOME/jre/lib/security/java.security 에서 설정값을 넣어주는 경우
  2. java.security.Security.setProperty("key","value")으로 값을 넣어주는 경우
이며 그 키와 밸류 값은 다음과 같다.
  • networkaddress.cache.ttl : name lookup이 성공했을 경우 갱신할 초, 기본값 -1으로 영원한 캐시
  • networkaddress.cache.negative.ttl : 실패했을 경우 갱신할 초, 기본값 10초
설정값을 변경하고 Tomcat을 종료, 시작 했다.

4. 현상 지속
현상은 지속되고 있었다. HttpClient 라이브러리를 사용하고 있었기 때문에 도대체 어떤일이 벌어지고 있는지 알 필요성을 느꼈다. 마침 사내에서 JProbe 8.0을 구매해두었기 때문에 설치에 들어갔다.
한참은 보다가 문득 JVM단위에서 문제가 있을 수도 있다는 생각이 들었다. 예전에 CVM(cdc)이라는 Sun에서 나온 J2ME 구현체를 포팅할 때 Multicast관련 설정 문제로 한참 고생하다 결국 CVM의 버그인 것을 밝혔던 경험이 영향을 미친 것 같다.

5. 문제 발견
먼저 가장 손쉽게 JVM 어플리케이션을 띄울 수 있는 방법은 Groovy라고 판단이 들었다. 그루비 설치 후 간단한 스크립트로 확인했다.
#! /usr/bin/env groovy


import java.io.*;

def address = InetAddress.getAllByName("blog.hyukhur.com")

println(address)

for ( each in 0..100){
println(InetAddress.getByName( "blog.hyukhur.com" ).getHostAddress())
}
의외의 결과를 볼 수 있었다.
{blog.hyukhur.com/192.168.0.1, blog.hyukhur.com/192.168.0.2}
192.168.0.1
192.168.0.1
192.168.0.1
192.168.0.1
192.168.0.1
192.168.0.1
192.168.0.1

아무래도 이상하다 Round-Robin이 동작하는 것 같지 않았다. 특히 getByName에서 강한 냄새를 느낄 수 있었다.

6. 문제 검증
혹시 나만 이런 현상을 느끼고 있는 것은 아닌지 구글링을 통해 다른 사람들의 아우성들을 보도록 했다. 특히 눈길 끈 문서는 톰캣 개발팀의 메일링 리스트 였다. networkaddress.cache.ttl이라든지 getByName이라든지 현상이라든지 유사점이 무척 많았다.
The multiple InetAddress.getByName() calls in the above for-loop all return
the first IP returned from InetAddress.getAllByName() as though it is cached,
even though the network.cache.ttl setting is clearly changed to "0".

하지만 Tomcat 4이라는 너무 오래된 버전에서의 이야기였다. 그리고 Tomcat에서의 문제라니. 그럼 그루비에서는 발생하지 않아야 하는 법이다.

7. 원인
getByName을 집중적으로 공략해보기로 했다. 일단 Java Doc에서는 아무런 언급이 없었다. 소스를 보아도 내부 필드를 바로 반환하는 방식으로 별 도움은 되지 못했다. Inet4Address 클래스도 보았다.
첫번째 의심 코드는 sun.net.util.IPAddressUtil.textToNumericFormatV4이었는데 소스를 보니 단순히 포맷팅과 관련있었다. 두번째 의심코드는 InetAddress.getAddressFromNameSevice이었는데 이부분은 모든 InetAddress를 반환하도록 되어 있었다.
    public static InetAddress getByName(String host)
    throws UnknownHostException {
    return InetAddress.getAllByName(host)[0];
    }

찾았다. 의도인지 아닌지 알 방법은 없지만 분명히 여러개의 DNS가 등록되어 있어도 첫번째를 반환하는 코드이다. 특히 프로젝트에 등록된 여러 라이브러리에서도 의존을 가지고 있는 메소드라서 자바독에서 설명을 해주어야 하는 것이 아닌가? 싶었다.

일주일동안 지지부진 끌었던 작업이 결국 JRE의 문제였다면, 아무리 뛰어난 코더라도 실수는 할 수 있다.
...

그런데 버그 리포팅은 어떻게 해야하나? 말아야하나? 한다면 어떻게 해야하나?
포스팅꺼리를 하나 덥석물었다. ㅎㅎ

하지만 바로 낚인 듯..

apache 나 tomcat 등의 데몬이 RFC3484 rule 9를 적용한 리눅스 커널 2.6.x의 특정 함수 ( getaddrinfo() )를 사용한 경우에 발생하는 현상이라는 참고문서가 있다.

그래도 위의 코드는 수정 하여 sort 문제를 보완해주어야 하는 것은 당연한 수순일 듯 싶다.





크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 허혁

댓글을 달아주세요:: 네티켓은 기본, 스팸은 사절

이미 많이들 알려진 것과 같이
구글에서는 웹 개발을 위한 오픈 플랫폼을 내놓았다.






likejazz님의 분석, 한날님의 사용기 등 관련 글을 손쉽게 찾을 수 있을 정도로 이미 많은 개발자들의 관심을 받고 있다.

오픈 당시 계정 신청이 너무 폭주하여 좀 가라앉으면 신청하고자 좀 기다리고 있었는데, 계정 활성화 소식도 들리고
2주 전쯤에 지인이 계정 활성화시켰다는 얘기를 듣고 서둘러 신청하게 되었다.

Sign up Site로 가보면 gmail 인증을 하라는 페이지로 가게 되고, 로그인하고 들어가보면
Create Application 페이지가 나오게 된다.
순조로운 출발



여기까지이다.

Verify를 mobile로 SMS 메세지를 사용하게 되어 있는데
지원 리스트에 대한민국은 없다.
대한민국의 모든 통신사의 지원은 없는 것이다.

이렇게 SMS을 보내지 못하는 경우 FAQ를 마련해 두었다.
특히 carrier가 존재하지 않는 경우 설명을 보면
SMS issues form으로 직접 글을 남기도록 되어 있는데

여기에 버그가 존재한다.
항목은 Country, Carrier, Comments로 이루어 지게 되는데
아무리 Comments에 값을 넣어보아도
값을 채우라는 에러 메세지만 보여주게 된다.

이 경우는 IE6에서만 확인해보았는데
FF3에서는 정상처리 되는 것을 확인했다.(08/04 2:18)

정상적으로 폼처리가 되었기 때문에
일주일 후에 계정활성화가 될 것으로 예상된다.

그럼 나머지 절반의 성공을 기다리자.

ps. 이런 삽질을 하는 이유 : 2008/07/04 - [direct] - Open Thread 라는 서비스를 생각 중입니다.

크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 허혁

댓글을 달아주세요:: 네티켓은 기본, 스팸은 사절

  1. 2008/08/05 20:55
    댓글 주소 수정/삭제 댓글
    저도 얼마전에 핸드폰 인증을 하려다가 실패했는데,
    얼마 지나서 다시 해보니까 인증 문자가 오더라구요? -ㅂ-;;

    +82-10-xxxx-xxxx 식으로 입력했더니 되던데... 다른 방법이 있었나보네요. =ㅅ=
    • 2008/08/06 13:54
      댓글 주소 수정/삭제
      그 방법이 맞지..

      하지만.. 난 LGT 안되도 실망하지 않아

      당연히 안된다고 생각하지.. ㅋ

      귀찮아서 그냥 신청~


BLOG main image
안녕하세요. 안정된 코딩, 여유로운 프로젝트, 떠오르는 코더 by 허혁

카테고리

분류 전체보기 (97)
direct (55)
indirect (22)
transmissive (12)
agenda (5)
idea (3)

달력

«   2008/08   »
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31            

최근에 달린 레몬펜 쪽지

Statistics Graph
Creative Commons License

이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-동일조건변경허락 2.0 대한민국 라이선스에 따라 이용하실 수 있습니다.