Index . 블로그창고 . Any comments?

고유링크가 가능한가?

블로그에서 재미있는 글을 보면 링크 따라 삼만리 시간 가는 줄 모르고 보는 스타일이라 막상 글 읽기 시작하는게 두렵다. 그래서 블로그를 억지로 멀리 하고 살았는데 요즘 이글루스가 SK로 넘어가고 그 와중에 여러가지 문제가 생기는 것 같아 아는 것은 별로 없지만 이러면 어떨까 싶어 글 하나 남겨본다.

우선 고유링크(Permalink)라는 것이 가능한가? 서비스를 옮기면서 서버명이 바뀌는 것까지는 어쩔 수 없다고 해도 블로그의 특성상 설치형이 아니면 상당수 블로그툴도 바뀌기 마련이다. 이럴 경우 기존의 글을 새로운 시스템에 유연하게 옮길 수 있는 대책이 있는가? 블로그툴에 대해 잘 아는 것이 없어 깊게는 못 들어가겠지만 정적인 html을 생성하는 블로그의 경우 html 파일들을 단순히 옮기는 것부터 시작하리라 짐작한다. 운 좋게도 시스템끼리의 변환툴이 있을 수도 있다. 어쨌든 기존의 글을 잘 옮겼든지 지웠든지 했다고 치자. 서버명을 제외한 그 뒤의 URL이 많이 바뀌었을 것이다. 당연히 기존의 링크들은 깨져버린다. 자기사이트내에서 조차. 뭐 고유링크가 이렇게 쉽사리 고유하지 않게 되어버리니 과연 가능은 한 것일까?

그러면 뭔가 다른 대책이 있어야 하지 않을까 싶다. 링크를 고유하게하는 것이 어렵다면 글을 고유하게 하면 어떨까? 즉, 생성되는 글(html) 내부에 고유한 id를 심은 후 간단한 검색툴로 이 고유id를 검색해서 해당 글을 뿌려주는 것이다. 이 검색툴은 블로그시스템 독립적인 단순한 perl 스크립트로도 가능하다. 다음은 search_article.cgi의 소스이다.

#!/usr/bin/env perl
# 설치형 블로그툴의 경우 툴의 수정이 가능하므로 html의 첫줄에 고유번호를
# 삽입한다.
use strict;
use vars qw($archive_dir $id $html $fname $fid);

$archive_dir = ".";

$id = $ENV{QUERY_STRING};
if($id eq ""){
	print "Content-Type: text/plain\n\n글의 고유번호를 지정하지 않았습니다.\n";
	exit;
}

$html = "";

chdir $archive_dir;
opendir DH, ".";
foreach(grep /\.html$/o, readdir DH){
	$fname = $_;
	open FH, $fname;
	$fid = <FH>;
	close FH;
	$fid =~ s/[\r\n]//g;
	if($fid eq "<!-- $id -->"){
		$html = $fname;
		last;
	}
}
closedir DH;

if($html ne ""){
	print "Location: $archive_dir/$html\n\n";
}else{
	print "Content-Type: text/plain\n\n$id: 해당하는 글을 찾을 수 없습니다.\n";
}

글의 고유번호는 글의 작성완료시간을 기준으로 하면 한 사람이 동시에 여러글을 완성할 수는 없다는 가정하에 중복되지 않을 것이다. 따라서 고유번호는 YYYYMMDDhhmmss쯤으로 한다. 여기서 YYYY는 년도, MM은 월, DD는 날짜, hhmmss는 시분초 순이다. 검색시간을 줄이기 위해 맨 첫줄에 "<!-- YYYYMMDDhhmmss -->"와 같이 삽입한다. 이 방법의 가장 큰 문제라면 역시 이와 같은 고유번호를 삽입할 수 있게 블로그툴을 수정하는 일이다. 일반사용자가 수정하기에는 힘들 수도 있고 가입형 블로그의 경우 소스에 접근 자체가 불가능하니 말이다. 그럴 경우 템플릿기능이 있다면 시간정보를 가진 변수를 활용할 수도 있겠다. 본문에는 보이지 않게 "<!-- ID:"와 " -->"로 둘러싸서 일관된 형식이 되도록 한 후 글 전체를 검색하게 search_article.cgi를 다음과 같이 수정한다.

#!/usr/bin/env perl
# 가입형 블로그의 경우 툴의 수정이 불가능하므로 사용자가 글을 작성하는 공간에서
# 직간접적으로 번호를 입력해야 하는 불편함이 있으며 글 전체를 검색해야 한다.
use strict;
use vars qw($archive_dir $id $html $fname);

$archive_dir = ".";

$id = $ENV{QUERY_STRING};
if($id eq ""){
	print "Content-Type: text/plain\n\n글의 고유번호를 지정하지 않았습니다.\n";
	exit;
}

$html = "";

chdir $archive_dir;
opendir DH, ".";
foreach(grep /\.html$/o, readdir DH){
	$fname = $_;
	open FH, $fname;
	while(<FH>){
		if(substr($_, 0, 8) eq "<!-- ID:"){
			s/[\r\n]//g;
			if($_ eq "<!-- ID:$id -->"){
				$html = $fname;
			}
			last;
		}
	}
	close FH;
	last if($html ne "");
}
closedir DH;

if($html ne ""){
	print "Location: $archive_dir/$html\n\n";
}else{
	print "Content-Type: text/plain\n\n$id: 해당하는 글을 찾을 수 없습니다.\n";
}

이제 사이트를 옮겨다녀도 기존의 글은 http://블로그주소/search_article.cgi?글고유번호로 링크할 수 있다. 사실 링크라기보다는 검색이라고 해야겠지만, 정말 고유한 링크가 필요하다면 이와 비슷한 블로그툴에 독립적인 방법이 필요하다고 생각한다. 이제 블로그도 인터위키처럼 myblog http://myblog.address/blog.dir/search_article.cgi?와 같이 접근이 가능하다.

이 방법이 항상 좋은 것은 아니다. 가장 큰 문제라면 글 전체를 검색하게 될 수도 있다는 것이다. 블로그툴에 따라 파일명을 YYYYMMDDhhmmss와 유사하게 만들어서 검색구간을 좁힐 수도 있겠지만 역시 툴 독립적이지는 않다. 가장 좋은 방법이라면 기존의 글에 대해 id: html과 같은 간단한 텍스트파일로 된 데이타베이스를 구축한후 새로운 글이 생성될 때마다 추가하는 것이다. search_article.cgi은 이 파일을 검색하면 된다. 이것은 설치형에서나 가능한 얘기이고 가입형에서는 좀 더 효율적인 검색알고리듬이 필요하리라 생각된다.

구현은 간단할 것 같은데 실제 적용시 얼마나 효율적일까가 의문으로 남는다. 관심있는 분들은 시도해 보시고 결과를 알려주시면 감사하겠다.

그러고 보니 가입형에서 cgi를 만들 수나 있나? 없다면 헛소릴 한거군. -.-;;

Sat Mar 18 03:27:54 2006

트랙백 보고 왔습니다. 와우, 정말로 생산적인 얘기인데요. 잘 지내시나요? :-) - Raymundo

Sat Mar 18 08:26:09 2006

오~ InterLink처럼(?) pagelink.map과 같은 별도의 텍스트 파일을 이용하는 방식이군요. -- forXtra

Tue Feb 20 11:56:38 2007

지우라는 글은 안 지워지고 엉뚱한 글만 지웠네 :-(

블로그창고 . 댓글문법

All the works in this site except software and copyrighted materials by others (e.g., 문학) are licensed under a Creative Commons License. 소프트웨어 및 문학과 같이 다른 이에게 저작권이 있는 작품을 제외하고 모두 크리에이티브 커먼즈 라이센스를 따른다.
Fri Apr 19 11:06:04 2024 . XHTML . CSS (lightbox.css is not part of Uniqki. ;-) . Powered by Uniqki!
refresh . edit . loginout . index