Hierarchical Wiki

FrontPage|FindPage|TitleIndex|RecentChanges| UserPreferences P RSS
계층화된 위키.

하나의 페이지 밑에 서브위키 혹은 페이지 그룹이 존재할 수 있다.

예를 들어 "토요독서모임"이란 페이지가 있을 때 "토요독서모임/사랑방"이라는 페이지를 만들 수 있고, "토요독서모임/사랑방"이라는 페이지에서, "토요독서모임/공지사항" 페이지로 링크를 걸기 위해서는 전체 주소를 적을 필요 없이 "공지사항"이라고만 적으면 된다. 일종의 독립적 서브위키가 되는 것이다.

그러나

HierarchicalWiki의 부작용은 지식의 교섭과 통합을 통한 잡종적지식을 추구하는 것과는 달리 지식의 분절화로 갈 수가 있다는 점이다. 특히 분류패턴HierarchicalWiki로 대신하는 것은 바람직하지 못하다. "생물학", "물리학", "진화" 등으로 개별위키를 나누는 셈이 된다. 이렇게 되면 위키의 장점을 잃게 된다.

하지만

"홍춘이/자주가는페이지", "술퍼맨/자주가는페이지"나, "홍춘이/오늘할일" 등을 통해서 이름공간 확장이 가능한 것은 큰 장점이 될 수 있다. (각자 개인위키를 만들기가 무척 쉬워진다)

또, 자신이 "철학적논고"라는 제목의 글에서 "사랑"이라는 章을 쓰는 경우, 기존의 "생존의기술"이란 글에 역시 "사랑" 章이 이미 존재해도, "철학적논고/사랑"과 "생존의기술/사랑" 등이 공존할 수 있다. 또 "철학적논고"라는 글을 쓰는 동안에는 간단히 [사랑]이라고만 써도 자동으로 "철학적논고/사랑"으로 링크가 된다.

과학혁명의구조 내에서 상호 링크를 하기 위해서 과학혁명의구조/서론 식으로 써 줘야 했던 것을 이제는 과학혁명의구조 페이지 그룹 내에서는 (예: 과학혁명의구조/총정리 페이지) 단순히 [서론]이라고만 써주면 된다.

따라서

HierarchicalWiki 기능은 다음 두 가지 경우에 사용하는 것이 좋다:
  • 서브위키 내에서 서로 레퍼런스할 일이 많을 때 (e.g. "어쩌구저쩌구논증/제1장"에서 "어쩌구저쩌구논증/거시기개념"을 링크걸 일이 종종 있다면)
  • 이름공간이 겹치는 것을 피해야 할 때 (e.g. "노스모크모인모인/페이지이름"이 루트의 "페이지이름"과 중복되면서 논의되는 내용은 다른 경우)

하지만, 항상 HierarchicalWiki 사용 이전에 모든 공간에서 레퍼런스할 수 있는 "별도의 이름을 만들어 내는 것"이 낫지 않을까 고민해봐야 한다. "한국경제의문제점/족벌체제"보다는 "족벌체제"가 낫고, "거시기사용기/홍춘이"보다는 "홍춘이의거시기사용기"가 낫다.

현재 UseModWiki에서는 한 단계의 서브위키만 가능하고, 서브위키로의 링크는, 해당 페이지 그룹 내에서 링크할 경우 앞에 슬래쉬(/)를 붙여줘야 한다. 슬래쉬가 없으면 최상위공간으로 링크가 된다.

현재 김창준이 작업 중인 HierarchicalWiki 구현은 OOP의 상속을 이용한다. 마치 독립적인 위키인 것처럼 사용할 수 있는데, 만약 해당 링크가 존재하지 않으면 상위 이름 공간의 이름으로 링크된다. 즉, "월요세미나"라는 페이지가 있고, 그 밑에 "월요세미나/사랑방"이라는 페이지가 있는데, 그곳에 누가 글을 쓰고 --[홍춘이]라고 썼다면, "월요세미나" 페이지 그룹에 "홍춘이"라는 페이지가 없는 경우, 최상위 공간의 "홍춘이" 페이지로 링크가 연결된다. 이렇게 되면 "홍춘이"의 개인 홈페이지를 여러 페이지 그룹에 만들 필요가 없다. 그러나, 만약 서브그룹과 상위그룹 내에 동일한 페이지이름이 중복 존재할 때, 서브그룹 내에서 상위 그룹의 페이지이름을 참조하려면 앞에 슬래쉬를 붙여준다. 일종의 절대 경로가 된다.



MoinMoin/설치노스모크모인모인/설치 를 가지고 [설치]가 서로 다르게 참조 되길 바라고 테스트 해 봤는데 참조 자체가 안되네요. [설치]는 서로 다르게 참조되지 않고 해당 페이지 내에서 [MoinMoin] 과 [노스모크모인모인] 상위 참조만 된다면, 즉 2단계에서의 상위참조만 가능한 상태라면 계층이 없는 것이나 진배 없어 보입니다. 물론 3단계 이상에서는 의미가 있겠지만요. 그치만 운영되고 있는 시스템에서 [A] [A/B] [A/B/C] 3단계로 해서 참조 테스트를 하겠다고 테스트할만큼 강심장도 못되구요. 또한 제가 개념을 제대로 파악하지 못해서 테스트 지점을 잘못 설정한 것일 수도 있구요. 아무튼, 제가 제대로 이해를 하는 게 우선입니다. --맑은
노스모크에선 안 되는지도 모르겠군요. 노스모크모인모인에서는 지원이 됩니다. [노스모크모인모인/제안] 페이지에서 [설치] 로 링크를 걸었을때 [노스모크모인모인/설치]로 링크가 걸립니다. [노스모크모인모인/제안] 페이지에서 [/설치]로 걸면 [설치]로 링크가 걸립니다.
이대로라면 현재 모인모인 1.x와 정 반대로 작동하는 겁니다. 모인모인페이지에서 [/설치]라고 링크를 걸면 [모인모인/설치]로 링크가 걸리며, [설치]라고 하면 맨 상위의 [설치]가 링크가 걸립니다. --무신

어찌된 연유인지는 모르겠습니다만, 확인해보니 노스모크에서 사용하는 코드에는 HierarchicalWiki가 빠져있네요. 그런데 노스모크모인모인(적어도 CVS버전)에는 이 기능이 들어있습니다. --희상

HierarchicalWiki에 대응하고 있는 위키엔진

PmWiki
위키엔진OpeningStatement에서 설명한 방식을 거의 그대로 따르고 있습니다.
  • http://www.pmichaud.com/wiki/PmWiki/PmWiki
  • 계층 구분자: /.
    • 기본으로 모든 페이지는 &Main&의 하위에 있다.
    • &인모인/설치&페이지에서 &리&를 링크를 걸면 &인모인/관리&로 링크가 걸린다.
    • &인모인/설치&페이지에서 그 상위의 페이지에 링크를 걸려면 &Main/페이지이름&으로 한다.
    • &인모인/설치&라고 걸면 설치라고만 표시되고, &인모인.설치&라고 링크걸면 모인모인.설치라고 표시된다.
  • 각 계층의 RecentChanges가 따로 있으며, Main/AllRecentChanges가 또 있다.

토론

아직 노스모크에서 HierarchicalWiki 자동화를 지원하고 있진 않지만, 이 형식의 페이지이름은 얼마든지 사용할 수 있다.

많은 위키클론이 HierarchicalWiki를 (다단계 지원은 차치하고라도) 지원하지 않는다. 이 상황에서 책 한 권 분량의 내용을, 아니 직접적으로 책을 위키에 싣는다고 할 때, 과연 어떤 페이지이름을 지어야 할 것인가? MagicStoryBookMagicStoryBookOneMagicStoryBookTwo로 분기했지만, 이런 단순 분기를 series, part, chapter, paragraph처럼 여러 단계로 나뉘는 구성에까지 적용하기엔 문제가 있다고 본다.

이 설계의 장점은 확장성과 편리성으로 대별되는 자유라 할 수 있겠으나 자유에는 항상 그에 걸맞는 댓가가 따른다. 시간이 지나감에 따라 손에 닿지 않는 페이지들이 많아지게 되고 그것들이 쓰레기로 남게 될 가능성이 있다. 따라서 관리부담과 공간낭비의 문제가 제기된다. 또한 관심이 집중되지 못하고 산재하게 되는 결과도 우려된다. 어떤 설계든 문제는 있기 마련이니 쓰레기 자료까지 끌어안을 수 있을 만큼의 공간적 여유가 충분히 허락된다면 결정판은 최대의 자유를 주는 설계가 될 것이다. 최대의 자유 속에서 책임을 다하여 최대한 잘 사용하는 것만이 답이라 생각한다. 중요한 것은 현재 시스템이 정말로 부족한가를 물어보고 개선을 요하는지 대체를 요하는지 또한 물어 보아야겠다. --맑은

{{|
I thought I'd mention why I don't do hierarchy on my wiki.

I see wiki as a place where people work out the names of things that they will say. Since our spoken vocabulary is small, we must struggle to find words that carry value commensurate with the space they consume in our brains. Where works collide in wiki they will also collide in our thoughts. Usually that is a happy circumstance.



"; if (isset($options[timer])) print $menu.$banner."
".$options[timer]->Write()."
"; else print $menu.$banner."
".$timer; ?> # # ?>