아래 한 줄의 코드 실행으로 Firefox 3(FF3), Firefox 2(FF2), Firefox(FF), Internet Explorer(IE), Safari(Saf) 그리고 Chrome(Chr)의 결과 값을 얻을 수 있다:

B=(function x(){})[-5]=='x'?'FF3':(function x(){})[-6]=='x'?'FF2':/a/[-1]=='a'?'FF':'\v'=='v'?'IE':/a/.__proto__=='//'?'Saf':/s/.test(/a/.toString)?'Chr':/^function \(/.test([].sort)?'Op':'Unknown';

퍼 나른 곳 = The Spanner – Detecting browsers javascript hacks

물론, 각 브라우저의 차기 버전이 배포되면 결과 값은 틀려질 수가 있으므로 사용에 주의를 요하지만, 종종 단순한 작업을 위한 긴급 처방으로 요긴할 때가 있다.

MySQL 서버는 기본적으로 데이타 갱신과 관련된 모든 선언문 기록들을 Binary Log 형태로 저장하도록 설정되어 있는데, 이 놈은 그냥 놔두면 절대 지워지지 않아서 나중에 무한 증식해서 디스크 용량을 크게 잡아먹을 수도 있다. 그래서, 무제한 증식을 막기위한 조치로, 아래 처럼 서버 설정 파일에다 expire_logs_days 값을 설정해 놓으면, 지정 기간이 지난 log 파일들은 서버를 재시동할 때마다 확인해서 자동 삭제해 준다.

# expire binary log files automatically after a given number of days
expire_logs_days = 30

물론, 지금 당장 모두 지워버리고 싶다면, 긴급 조치로서 아래의 방법을 사용할 수도 있다:

mysql> FLUSH LOGS;
mysql> RESET MASTER;

여태 신경 안 쓰고 그냥 놔두었더니, 위 명령으로 500MB 이상을 줄일 수 있었다. :oops:

꼬리표:

서울시에서 도시 정체성과 브랜드 가치를 높이기 위한 시도로 명조 계열인 서울한강체와 고딕 계열의 서울남산체를 Mac과 Windows 용으로 무료 배포하고 있단다.

그 동안 Mac에서 부담없이 사용할 수 있었던 글꼴의 상황은 가뜩이나 형편없고 선택의 여유마저 제한적이었었는데, 이제야 한 줄기 숨통이 트이는듯해서 아무쪼록 널리 사용되었으면 한다. 이참에, 블로그에 있는 제목의 글꼴도 서울남산체(SeoulGothic)로 바꾸어 봤는데, 작은 변화지만 어쩐지 새로운 느낌. 8)

그나저나, 서울남산체의 Tpyeface는 모두 5가지(Light, Medium, Bold, Extra Bold, vert)의 정보를 가지고 있는데, CSS의 font-weight 속성normal로 주어져 있을 경우, 얼추 Bold typeface 정보를 가져와서 표시해 주는듯하다. 만약 font-weight의 속성이 bold로 주어진다면, 이게 참 복잡해진다. :roll:

현재 Ruby 홈 페이지에서 제공하고 있는 Ruby의 최신 Stable Version은 Ruby 1.8.6-p110 (실제 가장 최근의 patch 버전은 p111)이다. 이 놈은 Leopard에 기본 설치되어 있는 놈 보다도 더 많은 패치가 이루어져서 설치를 위해 터미널에서 일반적인 configure 명령을 입력하면 다음과 같은 오류가 뜨고 만다.

$ ./configure --prefix=/usr/local --enable-pthread --with-readline-dir=/usr/local --enable-shared --enable-install-doc
checking build system type... i686-apple-darwin9.0.0
.
.
.
ar rcu libruby-static.a array.o bignum.o class.o compar.o dir.o dln.o enum.o error.o eval.o file.o gc.o hash.o inits.o io.o marshal.o math.o numeric.o object.o pack.o parse.o process.o prec.o random.o range.o re.o regex.o ruby.o signal.o sprintf.o st.o string.o struct.o time.o util.o variable.o version.o  dmyext.o
gcc -g -O2  -fno-common -pipe -fno-common  -DRUBY_EXPORT  -I. -I.  -c main.c
gcc -g -O2  -fno-common -pipe -fno-common  -DRUBY_EXPORT  -I. -I.  -c dmydln.c
gcc -g -O2  -fno-common -pipe -fno-common  -DRUBY_EXPORT  -L.    main.o dmydln.o libruby-static.a -lpthread -ldl -lobjc   -o miniruby
./mkconfig.rb:191: [BUG] Segmentation fault
ruby 1.8.6 (2007-09-23) [i686-darwin9.0.0]

make: *** [.rbconfig.time] Abort trap

결국, 문제의 원인을 알아보기 위해 Google에게 물어 본 결과 다음과 같은 해결책을 담아놓은 글타래를 찾아냈다.
ruby-1.8.6-p111 build on osx 10.5.0 fails; ok on 10.4.10. bug or config? – Ruby Forum

해결 방법은 먼저, 터미널에서 내려받은 최신 Ruby 소스 디렉토리로 이동후, 위 글타래에서 제공하고 있는 ignore-gsetcontext.diff이름의 패치 파일을 내려받아 다음과 같이 적용해준다.

$ patch < ignore-gsetcontext.diff

그리고 나서 다시 컴파일 해주면 정상적으로 설치되면서 다음과 같은 최신 버전을 확인할 수 있다.

$ ruby --version
ruby 1.8.6 (2007-09-24 patchlevel 111) [i686-darwin9.0.0]

Leopard에서 최신 Ruby 버전을 설치할 때 문제를 일으켰던 원인은, 위 글타래의 말을 빌리자면, setcontext/getcontext 함수가 Leopard에 와서는 일반 UNIX 형식을 따르기 위해 수정되면서 생긴 문제라고 한다. 문제 해결을 위한 패치가 벌써 몇 주전에 ruby-core 팀에게 전달되었으나 아직 안 고쳐진 모양이다.

꼬리표:
  • IE에서는 event listeners를 붙이거나 없앨 때, addEventListener/removeEventListener 대신에, attachEvent/detachEvent를 쓴다.
  • IE에서는 event 이름의 형식이, event가 아닌, onevent 형식을 쓴다.
  • IE에서는 event object를 해당 listener의 한 전달 변수(argument)로 돌려주지 않아서, 대신 global event 변수를 써서 접근해야 한다.
  • event 발생시 기본적으로 주어진 action이 실행되는 것을 막으려면 preventDefault method를 쓰는 것이 정석이지만, IE에서는 event object의 returnValue 속성 값을 false로 지정해 주어야 한다.
  • IE는 event 전달 과정(propagation) 중에서 보통 맨 처럼 진행되는 capture phase를 지원하지 않는다.
  • 다른 객체들로의 event 전달 과정을 멈추려면, stopPropagation method를 쓰는 대신에, event object의 cancelBubble 속성 값을 true로 지정해 줘야 한다.
  • IE에서는 event listeners를 method가 아닌 독립된 function으로 불러와서, event를 일으킨 target element를 알아볼 때 간단한 this 키워드를 쓸 수가 없고, 대신에 여러 단계의 상당히 복잡한 과정을 거처야만 얻을 수 있다.

    if (typeof element.addEventListener != "undefined") 
    { 
        element.addEventListener("event", eventListener, false); 
    } 
    else if (typeof element.attachEvent != "undefined") 
    { 
        var thisListener = function() 
        { 
            var event = window.event; 
            if (Function.prototype.call) 
            { 
                eventListener.call(element, event); 
            } 
            else 
            { 
                target._currentListener = eventListener; 
                target._currentListener(event); 
                target._currentListener = null; 
            } 
        }; 
        element.attachEvent("onevent", thisListener); 
    }
  • IE에서는 어느 한 element의 event listener가 DOM에 속해있는 또 다른 node의 reference를 포함하고 있을 경우, 사용자가 다른 페이지로 이동하더라도 해당 listener와 함께 관련된 DOM node들이 메모리에서 지워지지 않고 상주하게 된다. (IE 6의 memory leak 현상은 근래에 있었던 보안 패치에도 불구하고 여전한 듯.)

프휴~ :(