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 이상을 줄일 수 있었다. 😳

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

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

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

현재 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 현상은 근래에 있었던 보안 패치에도 불구하고 여전한 듯.)

프휴~ 🙁

얼마있으면 Leopard 발표와 더불어 함께 공개될 WebKit 엔진에 기초한 Safari 3를 앞두고, Apple에서는 웹 표준에 기반한 웹 개발을 도모하기 위해 더 엄격해진 코딩 기술을 요구하게 될 예정이며, 이를 위해 몇 가지 웹 표준화 대비 지침 사항들을 공개하였다.

이미 잘 알려져 있다시피, 의도하지 않은 렌더링 오류를 피하려면 올바른 Doctype의 사용을 권장하고 있으며 CSS에서 색깔 지정시 hex 값은 항상 hash(#)로 시작할 것을 요구하고 있다. 또 특정 요소에 접근할 때는 그 요소의 id 값을 사용해서, document.getElementById('myInput')처럼 쓸 것이며, document.myForm.myInput과 같은 축약 용법은 name 속성이 지정되어 있을 때만 사용할 수 있다.

이 밖에도, 어떤 요소의 속성 값을 얻을 때 다음과 같은 축약 용법 대신에,

var target = document.getElementById('someID');
var targetTitle = target.title;

표준에 정의되어 있는 method인 getAttribute, setAttribute을 쓰라고 하는데, getAttribute method의 경우 실제 다른 브라우저들에서는 돌려주는 값이 상황에 따라 저마다 다르기 때문에, 어차피 이에 대한 대비도 필요할 것이다.

그리고 그림의 크기 지정과 관련해서, 보통 지정된 그림의 크기가 실제 그림 크기와 다를 경우 이미지의 크기는 자동적으로 조절되어 표시되는데 , 만약 이 차이가 한 쪽에서만 발생할 경우 어떤 브라우저에서는 실제 그림의 측면 비율을 무시하고 지정된 한 쪽 면의 크기만 조절되어 표시되는데, Safari 3에서는 CSS 규약에 나와있는 대로 가로 세로 측면 비율에 따라 양쪽 면의 크기가 함께 자동 조절되어 표시된다. 여기서 의도되지 않은 상황을 피하려면, 양쪽 가로 세로의 크기를 함께 지정해 주면 되겠다.

결국, 웹 표준 코딩의 중요성은 앞으로도 더욱 부각될 것이지만, 더욱 성가시게 된 것은 바로 IE 6 잔당들이지.