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 안되도 실망하지 않아

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

      귀찮아서 그냥 신청~

밀린 RSS들을 보다가 EP님의 scalaris 소개 글을 보게 되었다.

scalaris 프로젝트 사이트
에 들어가 GettingStarted를 읽어보니

svn으로 소스 받아

README를 읽어보라는 것이었다.

이 밤중에 재미있겠다 싶어서

재빨리 cygwin+putty로 콘솔을 열고

checkout~!

README를 읽어보니

You will need:
- Erlang R12
- GNU Make
- rrdtool

Optional:
- java
- ant
- libxsl
아뿔사..

얼랭도 깔아야..
메이크도 깔아야
rrd툴도 깔아야..

ㅠ.ㅠ

있는건 자바밖에 없구나..

귀차니즘에 압박속에

슬그머니 창을 닫아버렸다.

맥없는 생활이 벌써 6개월을 지나간다..

iMac lineup

MacBook Pros.
MacBook Air closed.
MacBook Pros.

 무엇으로 지를까?

고민된다.


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

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

  1. 2008/07/27 11:10
    댓글 주소 수정/삭제 댓글
    제 맥북 사세요. 싸게 드릴테니 ㅋㅋㅋ.
    • 2008/07/29 15:35
      댓글 주소 수정/삭제
      가능하다면 가운데 두개중 고르고 싶어요.. ㅋ
  2. 2008/08/02 15:00
    댓글 주소 수정/삭제 댓글
    에어는 프로그래머에게는 별로 인 것 같고, 9월에 파워북, 맥북 신모델이 나온다고 하니 기다려 보세요.
    • 2008/08/04 09:08
      댓글 주소 수정/삭제
      저도 맥루머에서 봤어요.. ㅋ

      파워북은 솔직히 디자인 바뀔때가 된 것 같아요..

      하지만 요즘 애플 초기 품질이 너무 떨어져서

      내년쯤 혹은 연말에 지르는게 좋을 것 같아요~

      아. 얼렁 지르고 싶다. ㅋ

사파리와 구글간의 연동이 미약하다는 이유와 사소한 버그로

다시 파폭으로 옮겨온지 한달 정도 된 것 같다.

노트북이 다시 내품으로 돌아왔다는 것도 하나의 이유가 될 것 같다.

이번에 새로 노트북을 셋팅하면서

하나 새롭게 찾은 확장기능이 있다.

(파폭에서 제일 좋아하는 기능은 확장기능이다.)

바로 Morning Coffee가 그것이다.

아침에 회사에 출근해 보면

사내 사이트나 RSS 리더, 뉴스, 블로그들 등

꼭 열어보는 사이트 들이 꼭 있다.

버튼 하나로 월화수목금토일 미리 등록을 해두고

아침에 전부 열어주는 것이 기능의 전부이다.

하지만 모닝커피라는 어감

출근해서 하루를 시작하는 느낌

그 느낌을 잘 살린 어플리케이션이라고 할 수 있겠다.

적극 추천

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

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

  1. 2008/07/23 07:51
    댓글 주소 수정/삭제 댓글
    오 재밌겠다 ㅋㅋ

민달군과의 대담 중 나온 것 처럼

저에게는 B급 아이디가 많이 있는 편입니다.

그 중 최근의 아이디어를 잠깐 설명해 볼까 합니다.

첫 시작은 대학교 동아리 홈페이지 입니다.
후배들이 자체 제작한 시스템이었는데 모든 게시글에 트랙백 붙이는 것을 지원해 주었습니다.
(어떻게 로그인을 위한 사이트에 트랙백을 붙였는지 지금 생각해보면 의아하군요)

두번째 영향은 포럼이라는 형식의 여러 커뮤니티 였습니다. 글을 한참 읽다 보면 어떤 질문에 대해 답변자가 자기 블로그에 이미 다 정리된 글을 보라면서 링크를 남기는 것을 보았습니다.
으흠 링크 타고 들어가서 정리해 보기에는 영 귀찮은 것입니다.

세번째 영향은 블로그 메타 사이트들의 영향입니다. 의견이 분분한 사건에 대해 여러 사람들이 의견을 나누고 그것을 블로그스피어라고 통칭 하지만 컨텐츠 소비자인 저에게는 글들의 흐름이라든지 전후 관계를 파악하는 것이 무척이나 어려운 일이라는 생각이 들었습니다.

네번째 영향은 커뮤니티의 죽음에 대한 글입니다. 어렴풋이 인지하고 있었지만, 확실하게 느끼지 못하고 있었던 사건은 바로 블로그의 성장과 대비되는 커뮤니티의 몰락입니다. 물론 아직까지 블로깅을 하지 않는 분들이 많고 그런 분들 중에서는 카페 같은 곳에서 많은 활동을 하는 분들이 있지만, 최소한 어느 커뮤니티들을 운영하거나 깊은 개입을 할 수 있을 정도의 영향력 있는 분들은 대부분 파워 블로그라는 타이틀로 자신들의 블로그들을 운영 중이라는 생각이 들었습니다.
풍요 속의 빈곤이라는 말처럼, 혹은 그 섬에 가고 싶다는 말 처럼
풍부한 인터넷의 바다에서 외롭게 굶어 가고 있는 무인도 같은 느낌이었습니다.
메타 블로그들은 아직까지 그런 엮음에 대한 반영을 하지 못하고 있다고 생각합니다.

다섯째 영향은 아고라라는 토론 서비스 입니다. 정보의 자기복제및 재 생산을 끊임없이 하고 있는 모습을 보면서 만약 내 글이 쓰게 되어지는 문맥들을 전달할 수 있다면 어떤 결과가 나올지 무척 궁금해졌습니다. 글을 쓰면서 전, 후 문맥 관계를 매번 설정하고 알리는 것은 무척이나 까다로운 일입니다.
어떤 과정이 있어서 이런 생각을 하게 되었다는 부분을 전달하고 싶었습니다.
현대 사회는 너무 단편적이고, 순간적인 정보가 있다고 느껴집니다.

구슬도 꿰어야 보배라는 말과 같이
여러 보화 같은 블로그들을 하나의 실로 꿰어 낼 수 있는
그런 포럼이 필요 했습니다.

그것이 바로 Open Thread : 열린 글타래 입니다.

이것을 위해 시작한 프로젝트가 있습니다.

S.H.O.T(코드명)

python + Django 시스템을 기반으로 하고 있습니다.
파이선은 다루어 본 적이 있지만 장고에 대해서는 문외한이라
조금 어려움을 겪고 있지만, 구글 코드(프로젝트관리서비스)에 의존해 관리 할 생각입니다.
추후 구글앱스에 얹어내고 구글 광고 시스템으로 서비스 운영비를 충당해 볼 생각입니다.

많은 기대를 하지 않습니다.
단순한 실험일 뿐이지만 좋은 결과가 있으면 좋겠습니다.
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 허혁

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

  1. 2008/07/07 13:45
    댓글 주소 수정/삭제 댓글
    B급 아이디어 얘기는 반은 농담이였는데 블로그에 쓸 줄은 몰랐네 ㅋㅋ 구체적으로 어떤 결과가 나올지는 모르겠지만 재미날만한 이슈들을 http://www.nabble.com에서 메일링 가지고 서비스 하는 것처럼 잘 묶어주면 재미있을 것 같다는 생각이 들어. 주로 트랙백이 달릴 정도의 포스트는 품질이 좋은 경우가 많았던 것 같아.
    • 2008/07/08 11:32
      댓글 주소 수정/삭제
      가능하면 다른 매체(메일링, RSS) 같은 것에는 의지 하지 않을 생각이야

      그냥 생각없이 들어왔다가 글을 쓰고 싶게끔 만들어 보고 싶어..
  2. 2008/08/03 00:29
    댓글 주소 수정/삭제 댓글
    와아~ Python과 Django에도 발을 들이시는건가요. =ㅅ=
    저도 요즘 회사에서 그 둘로 프로젝트를 하나 하고 있어서...

    여기저기 흩어진 글들을 하나의 글타래로 묶어주는 서비스인가요?
    재미있을거 같네요~
    • 2008/08/04 09:09
      댓글 주소 수정/삭제
      토론도 되고..
      네이버의 미스터 블로그씨도 되고..

      포스팅 하기에 주제 찾기도 만만치 않고

      열정도, 흥도 나기 힘든 상황에서
      뭐라도 해보자는 생각에.. ㅋㅋ

      첨엔 루비온레일즈로 해보려다가..

      장고는 안해봤길래 ㅋㅋ

데비안 문서중 Vim과 Emacs의 명령어 비교를 잘 정리해 둔 것을 찾았다.

콘솔환경에서부터 시작된 유명한 에디터들이다.

Vim을 접한지는 꽤나 오래 되었지만,

사실 그렇게 잘 사용하지는 못한다.

오히려 그 후에 접한 이클립스가 주력 도구라고 할 수 있겠다.

그래도 서버 관련 작업들을 하다 보면

꼭 사용하기 마련인데

너무 성급하게 접근하는 것보다

그때 그때 하나하나씩 암기 해 나가는 것이 좋다고 생각해서

책상에 Quick Reference들을 붙여 두고 흘깃흘깃 보고 있다.

이제는 익숙해진 것들은

hjkl 이나

i, I, O, o, a, A

혹은

e, sp

등인데

창을 분활해두고 보니깐

다음창으로 넘어가는 것을 잊어버렸다.

사실 다음과 같다

^w+hjkl 이 제일 간단한 방식

이전 창은 ^w+p

으흠

그밖에 유용하게 쓰는게

:%s/old/new/g

이정도?

아 원래 붙여 넣기도 안쓰고 있었는데

yy 가 복사이고  p,P 가 붙여 넣기..

조금씩 배워가고 있다.


이건이맥스얘기


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

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

사실 IE8가 나온지는 꽤 되었다.

그럼에도 불구하고 다시 찾아보게 된 이유는

사내 TF팀이 생겨서 수정 할 것들이 나타나게 되었다.

설치 화면을 보니 아직 한글판도 없고

설치 이후에는 6,7도 못쓴다고 하니

조만간 하드 업글 할 예정인 내 놋북에 설치를 하게 되었다.

흐으

당분간 7은 안녕~
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 허혁
태그 IE7, IE8

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

이번주에 있을 프로토타입 구현 대회에 출품한 프로젝트를 위해

장고 프레임워크를 사용하기로 결정했다.

친숙한 mysql과 연동은 32비트와 64비트의 어려운 동거 때문에

파이선은 64비트 마이에스큐엘은 32비트

중간 연결 모듈들이 꼬여버렸다.

다른 서버에 sqlite를 사용해서

좀 더 진행해보았는데..

8000번 포트가 막혀 있어서 테스트가 안되는 상황

털썩~

이제 어떻게 하나요?

문제는 127.0.0.1로 내장 서버를 열었는데
이게 내부에서만 접속 된다는 것
0.0.0.0으로 열면 외부에서도 접근 가능하다

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

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

  1. 2008/07/27 11:13
    댓글 주소 수정/삭제 댓글
    장고 기본이 SQLite 아닌가요? 쿼리 직접 짤일도 없을테니 걍 SQLite 쓰시는게 ㅋㅋ
    • 2008/07/28 16:13
      댓글 주소 수정/삭제
      네 개발 서버에서는 SQLite를 썼었는데요

      같이 하는 친구가 친근하다면서 ㅡ.ㅡ mysql 쓰자고..

      검색 붙일때 그게 편하다고 하네요..
  2. 2008/08/03 00:36
    댓글 주소 수정/삭제 댓글
    Django에서 db lookup을 할 때 full-text 서치가 가능한데 mysql은 네이티브로 그 기능을 지원한다고 하더군요. =ㅅ=

    그리고 실제로 개발하다가 부딪힌 문제인데, sqlite에서는 db lookup시에 좀 복잡한 query문을 만들면 에러를 뿜어내기도해요. ;;

    웹서버는 django 내장 서버를 쓰시는건가요? =ㅅ=
    • 2008/08/04 09:12
      댓글 주소 수정/삭제
      db lookup은 어떤 것을 말하는 것이야?
      full-text라면 like 구문을 이용한 전체 텍스트 검색이라고 할지 = 를 이용한 비교문이라고 해야할지..

      ㅋㅋ

      요즘 내 블로깅의 최대 화두가 이해하기 쉬운 글쓰기라서..
    • 2008/08/05 01:07
      댓글 주소 수정/삭제
      Django의 DB API를 살펴보면 field lookup 방법 중에 search가 있어요.

      search

      A boolean full-text search, taking advantage of full-text indexing. This is like contains but is significantly faster due to full-text indexing.

      이런 설명을 달고 있는 녀석입니다. =ㅅ=

      문자열로 검색을 하긴 하지만 MySQL에서 지원하는 full-text indexing이 있으면 'LIKE' 구문을 사용하는 contains 보다 훨씬 빠르다는군요 =ㅅ=

      근데 MySQL에서 MyISAM 엔진을 사용해야만 가능하다네요. -ㅂ-

얼마전 까지만 해도 프리마커(Freemarker)를 View단 템플릿 엔진으로 사용 했었는데.

프리마커에서는 if, elseif 가 지원했었다.

하지만 JSP로 넘어오면서 부터

if는 지원해도 else는 지원하지 않는 사태가 발생 ㅠ.ㅠ

when choose 문법을 복잡하게 사용하게 되는데

그래서 특히나 삼항연산자( = ? : )으로 처리 하는 경우가 많아졌다.

EL과 붙으면 나름 편리하다

${reason=='ETC'?'enable':''}



혹은

${reason=='ETC'?:'enable':(reaseon=='SOME'?'disable':'')}



중간의 () 는 가끔 발생하는 에러를 사전에 처리해주기 위해서이다.

이런 삼항 연산자에 맛들이면

마구마구 난발하게 되는데

그럴 경우는 코드 가독성이 떨어지게 되고

다음과 같은 방식을 사용하기도 한다.

<c:set var="isInputBoxDisable">${reason=='ETC'?:'enable':(reaseon=='SOME'?'disable':'')}</c:set>

가독성을 그나마 지켜주기 위한 발버둥?

역시 난 뛰어난 코더인 것일까?

좀 더 큰 그릇이 되고 싶은데..
크리에이티브 커먼즈 라이선스
Creative Commons License