Category Archives: 삽질

데이터베이스와 함께한 오전

뷁키백과는 데이터베이스 엔진으로 미디어위키를 쓴다. 그런데, 뷁키백과 데이터베이스를 흔드는 과정에서 미디어위키 데이터베이스에 너무 많은 글이 들어가서 글 개수 통계가 섞이는 등 만행이 일어났기 때문에 이런 특단의 조치로 전체 리비전을 지웠다.

  1. 우선 리비전을 지울 글을 클릭해서 “편집”을 누른다.
  2. 그 다음, 명령줄에서 "php -cli nukePages.php [페이지_제목]"을 입력한다.
  3. 다 되면 저장을 누른다.

그런데 이 과정에서 ㅅㄱㅎ 문서가 제대로 복구되지 않아서 옛 버전으로 남아있었다는 것을 망각했던 채

php -cli nukePages.php ㅅㄱㅎ

이 명령을… 때렸다! 처참한 결과만 남아서 울고 있었다. 위키백과의 특정 버전 삭제와는 다르게 이 명령은 데이터베이스 자체적으로 모든 것을 지우기 때문에, undo가 가능한 특정 버전 삭제와는 달리 동작은 한 방향이다. 이럴 때 쓸 수 있는 말이 OTL이지.
그러나 하늘이 무너져도 희망은 있는 법. 윈도우 서버 RWAPM이라는 것이 떠올라서 그 녀석을 통해서 전에 받아 두었던 DB 전체 백업을 다시 올렸다. 그리고 phpMyAdmin으로 들어가서 페이지를 찾아야 했다. 그렇지만 미디어위키의 너무 철저한 리비전 때문에 한 문서를 가르키는 테이블이 총 3종류 있다. 그 셋은 [prefix]_page, _text, _revision이다. 이제 이 세 테이블을 따라가 보자. [prefix] 값은 적절한 것을 찾으면 되고 여기서는 brw_이다.
우선, brw_page 테이블에서 page_title을 기준으로 ㅅㄱㅎ를 검색한다. 그러면 그에 대응하는 page_id와 page_latest 값을 찾을 수 있다. page_id 값과 page_latest 값을 기억한 다음, brw_revision에서 rev_id 기준으로 아까 찾은 값을 대입해서 검색한다. 그러면 rev_page 값과 page_id 값이 같으면 빙고라는 뜻을 이야기한다. 그 다음 brw_text로 간다.
그런데 이 녀석이 BLOB으로 기록되어 있다? 그래서 phpMyAdmin은 보여 주기를 거부하고 있다. 그것 때문에 MySQL을 직접 건드려도 봤으나 별 소득이 없었다. 그러다가 내 눈에 들어온 것이…

Export

였다! 즉, CSV 파일로 내보낸 다음에 검색하면 된다는 뜻이다. 이것을 몰라서 오늘 오전 내내 허공에다가 삽질하고 있었다. CSV 파일에서 검색은 page_latest 값을 기준으로 검색하면 내용이 나온다. 그러나, 다행히도 내용의 일부를 기억하고 있기 때문에 그것을 기준으로 검색을 해서 결국 문서를 살렸다.
오늘의 결론.

  • 백업과 복원을 생활화하자.
  • 무엇이든지 원리와 구조를 알고 논리적으로 접근하자.
  • 경희누나 미안.

신기술 도입

위키백과 같은 경우에는 “액세스 키”라는 기능이 있어서 alt+무언가를 누르면 최근 바뀜, 편집, 토론 같은 것을 마우스에 손 안대고 할 수 있다. 가령 이렇게 말이다.
위키백과 액세스키
이 기능은 이미 자바스크립트로 구현이 되어 있고 많은 사이트에서 사용한다. 그래서 “이 블로그로 무언가 갖고 놀 만 한 게 없나” 해서 생각해 본 것이 바로 액세스 키 집어넣기였다. 집어넣는 건 의외로 간단하다. 다음의 코드를 보자.
<script language="JavaScript" type="text/javascript">
function accesskeys(){
  if (document.getElementsByTagName){
  var anchors = document.getElementsByTagName("a");
  for (var i=0; i<anchors.length; i++){
   var anchor = anchors[i];
   if(anchor.innerHTML == "위치로그") anchor.accessKey = "l";
   if(anchor.innerHTML == "방명록") anchor.accessKey = "g";
   if(anchor.innerHTML == "태그") anchor.accessKey = "t";
   if(anchor.innerHTML == "◀ PREV ") anchor.accessKey = "p";
   if(anchor.innerHTML == "NEXT ▶") anchor.accessKey = "n";
   if(anchor.innerHTML == "") anchor.accessKey = "h";
  }
  }
}
window.onload = accesskeys;
</script>

자… 스킨이 다르다면 여기에 나오는 텍스트만 적절히 바꿔치기 해 주면 된다. 그리고 메인 화면을 보면 [l], [g] 같은 게 있을 것인데, Alt 키와 그것을 같이 눌러 주면 해당하는 페이지로 이동한다. 참고로 관리자 모드와 새 글 쓰기에는 별도의 처리를 할 필요가 없다. 뭐 나 혼자만 글을 쓰는 게 블로그니까.
덧. 이게 얼마나 편한지는 써 보면 안다. 그리고 Alt+G 한번씩 눌러 주고 가세요! 또 Firefox 2.0 Beta 2의 경우에는 Alt+Shift+G입니다!

결국 Drupal 포기

최근 KSA Ubuntu 서버를 Ubuntu 5.10->6.06.1로 업그레이드하면서 많은 것이 바뀌었다. 가장 크리티컬했던 것은 MySQL 5였다. 그런데 MySQL 4에서 물어 보지도 않고 그냥 5로 올려 버렸기 때문에 문자 인코딩 문제를 건너뛸 수 없었고, 결국에는 Drupal과 Mediawiki가 충돌하는 사태까지 벌어졌다.
게다가 Drupal 4.7의 로그인 버그는 이제 참고 쓰기에 심각한 수준이 되었으며, 옛날에 버렸던 태터툴즈가 GPL이라는 옷을 입고 다시 도착했기 때문에 TT로 복귀하는 데 대해서 미련이 없어졌다. 하지만 기존의 Drupal로 썼던 글들을 어떻게 처리하냐? 그 문제가 있었다. 단지 테이블의 헤더만 바꾸어 주면 된다. Drupal의 node_revisions 테이블에서 tt_Entries 테이블로 다음과 같이 처리해 주면 된다.
owner - 1
id - nid 값 사용
draft - 0
visibility - 2
category - 1
title - 그대로
slogan - title에서 공백을 하이픈으로 변경
content - body
location - /
password - 글을 테스트로 쓴 다음 거기서 추출
published - timestamp
created - timestamp
modified - timestamp

그 동안 정도 많이 들었던 Drupal이지만, 이렇게 떠나보낸다는 게 서운도 하다. 하지만 난 절대로 Drupal을 개인 블로그용으로 권장하고 싶지 않다. 호랑이를 토끼 우리 안에 집어넣고 키우는 꼴이라고 할까.