펄 모듈 Net::Trackback 과 그 하위 모듈들이 필요하다. [여기]에서 다운받아 재주껏 설치한다. 아마 이것을 설치하기 위해서는 다시 LWP 모듈 등이 필요할 것이다. 관리자를 졸라 시스템에 설치를 하던가, Perl/모듈설치를 참조하여 자신의 계정에 설치를 한다.
/Comments매크로에서 사용했던 DoPostMain 을 다시 사용하므로 이 패치가 이미 적용되어 있어야 한다.
리턴 코드가 1일 경우는 HTTP 요청은 제대로 이뤄졌으나 요청 데이타에 오류가 있다던가 상대방 블로그 쪽에 문제가 있어서 상대방 쪽에서 에러를 보낸 경우
리턴 코드가 404 등일 경우는 HTTP 요청 자체가 성공하지 못한 경우 (URL 이 올바르지 않다던가 등)
원칙적으로는 에러코드 옆에 에러 메시지까지 떠야 하나, Net::Trackback 모듈의 문제인지 에러 메시지를 제대로 가져오지 못하고 있다. 일단 [버그리포트]를 해 둔 상태이고, 현재 GyparkWiki 에서는 서버에 있는 펄 모듈 자체를 고치는 만행을 저질렀기 때문에 메시지가 나오긴 한다. (대신 무슨 부작용이 있을지..)
트랙백을 보낼 때, 트랙백URL 외에 별도로 Permalink URL (한글로는 "해당 글의 URL")을 줄 수 있다. 이것은 아래 "보낸 트랙백 목록"에서 사용된다.
pMachine : 본문에서 부등호로 둘러쌓인 부분이 사라져 버린다. <lt; 와 >gt; 로 치환해서 보냈는데 사라지는 이유를 모르겠음.
IRiS ell: 2.11b by http://nvyu.net/ : 오직 POST 로 날아온 요청만 처리하게 되어 있는데, 위키 쪽에서는 트랙백URL에 "?"가 포함되어 있으면 GET 으로 보내 버린다. (현재 트랙백 스펙상에서는 GET 을 더 이상 지원하지 않는다고 하였으므로, 안 받아줘도 할 말 없다 -_-;) 그래서 전달이 안 됨.
[블로그인] : pMachine 과 마찬가지로 부등호로 둘러쌓인 부분은 사라진다. 다른 곳들과 달리 줄바꿈문자가 <br> 로 처리되어 줄바꿈이 적용된다.
[이글루스] : 부등호로 둘러쌓인 부분은 사라짐 (어차피 태그로 인식되어 안 보일 수 있다고 일부러 빼어 버리는건가?
subMacroTrackbackSent{
my ($itself, $trackbacks) = @_;
my$title = &T('No Trackback sent');
my$count = ($trackbacks =~ s/((^|\n)\*.*)/$1/g);
$title = &Ts('Trackback sent [%s]', $count) if ($count);
return&MacroMemo("", $title, $trackbacks, "trackbacklist");
}
subMacroTrackbackReceived{
my ($itself, $trackbacks) = @_;
my$title = &T('No Trackback received');
my$count = ($trackbacks =~ s/((^|\n)\*.*\n\*\*.*\n\*\*.*)/$1/g);
$title = &Ts('Trackback received [%s]', $count) if ($count);
return&MacroMemo("", $title, $trackbacks, "trackbacklist");
}
다음 함수 수정
subGetParam{
my ($name, $default) = @_;
my$result;
$result = $q->param($name);
### POST 로 넘어올 경우의 데이타 처리 - 아래 세 줄 추가if (!defined($result)) {
$result = $q->url_param($name);
}
if (!defined($result)) {
...
}
subDoOtherRequest{
...
} elsif ($actioneq"rss") {
&DoRss();
### Trackback - 아래 줄 추가
} elsif ($actioneq"send_ping") {
&DoSendTrackbackPing($id);
##################
} else {
# Later improve error reporting&ReportError(Ts('Invalid action parameter %s', $action));
}
return;
}
...
}
아래 함수의 제일 마지막 줄 수정
subDoPostMain{
...
&ReBrowsePage($id, "", 1) if ($idne"!!"); # if 문 추가
}
이 함수는 나름대로 중요하여, 따로 빼어서 표시해 둔다. 이 함수는 스트링을 인자로 받아서, 다음 문자를 제외하고는 한바이트씩 "%FF"와 같이 두자리의 16진수로 변환한다.
a~z
A~Z
0~9
"_", ".", "-"
"/" - 주의: 다른 곳에서 보는 urlencode 함수들은 "/"도 "%2F"로 인코딩한다. 그러나 여기서는 아래와 같은 이유로 "/"를 인코딩하지 않도록 했다.
1) 쿼리에 들어간 스트링의 경우는 "/"나 "%2F"나 동일하게 동작한다.
2) URL에 들어간 경우는 "/"여야만 제대로 웹서버가 인식한다. /SlashLinks처리를 할 때 이것이 문제가 된다.
3) (무책임한 말이지만) 현재는 EncodeUrl()이 쓰이는 곳이 이 /TrackBack과 /RSS제공의 action=rss, /blog매크로시리즈의 action=blog_rss, 이렇게 세 곳 밖에 없다. 셋 다 페이지이름을 URL에 포함시킬 때 인코딩하는 것이라서, "%2F"보다는 "/"가 낫다고 판단된다.
참고로, Firefox 주소창에 한글을 쓸 경우 자동으로 인코딩해서 보여주는데 이 때도 EUC-KR, UTF-8 두 경우 다 "/"는 인코딩하지 않고 있다.
// msg - 사용자에게 확인창을 띄울때 출력되는 메시지// - ""이면 확인창 띄우지 않음// text - 클립보드에 복사될 텍스트// 출처: http://www.krikkit.net/howto_javascript_copy_clipboard.html// modified by raymundo, gypark@gmail.com// Copyright (C) krikkit - krikkit@gmx.net// --> http://www.krikkit.net// This program is free software; you can redistribute it and/or// modify it under the terms of the GNU General Public License// as published by the Free Software Foundation; either version 2// of the License, or (at your option) any later version.function copy_clip(msg, text) {
if (msg != "") {
if (!confirm(msg)) return;
}
// IE
if (window.clipboardData) {
window.clipboardData.setData("Text", text);
}
// Firefox/Mozilla
else if (window.netscape) {
// firefox/mozilla 에서 동작하기 위해서는 사용자 프로파일 디렉토리에 prefs.js 파일에 다음과 같이 적어준다
// user_pref("signed.applets.codebase_principal_support", true);
// 또는 "about:config" 페이지를 열어서 다음 항목의 값을 true로 설정해 준다
// signed.applets.codebase_principal_support
alert("If it fails to copy, check the option:\n\nsigned.applets.codebase_principal_support = true\n\nin \"about:config\" page.");
netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
var clip = Components.classes['@mozilla.org/widget/clipboard;1'].createInstance(Components.interfaces.nsIClipboard);
if (!clip) return;
var trans = Components.classes['@mozilla.org/widget/transferable;1'].createInstance(Components.interfaces.nsITransferable);
if (!trans) return;
trans.addDataFlavor('text/unicode');
var str = Components.classes["@mozilla.org/supports-string;1"].createInstance(Components.interfaces.nsISupportsString);
var copytext=text;
str.data=copytext;
trans.setTransferData("text/unicode",str,copytext.length*2);
var clipid=Components.interfaces.nsIClipboard;
if (!clip) return false;
clip.setData(trans,null,clipid.kGlobalClipboard);
}
return false;
}
Send Trackback
트랙백 주고받기
Send Trackback Ping of this page to:
이 페이지의 트랙백 핑을 다음 주소로 보냄:
Trackback URL:
트랙백 URL:
Permalink URL (optional):
해당 글의 URL (선택사항):
Send Ping
트랙백 핑 보내기
You are not allowed to send Trackback ping of this page
이 페이지의 트랙백 핑을 보낼 권한이 없습니다
No Ping URL
트랙백 핑을 받을 주소가 없습니다
New Trackback Sent
트랙백 핑을 보냄
Error occurred: %s
에러가 발생했습니다: %s
Send Trackback Ping
트랙백 핑 보내기
Ping successfully sent
핑을 보내는 데 성공했습니다
Trackback address of this page:
이 페이지의 트랙백 주소:
Copy
복사
Copy the address to the clipboard.
이 주소를 클립보드에 복사합니다.
This page can not receive Trackback
이 페이지로는 트랙백을 보낼 수 없습니다
Trackback from %s
%s 로부터의 트랙백
Title:
제목:
Content:
내용:
New Trackback Received
트랙백 핑을 받음
No Trackback sent
보낸 트랙백 없음
Trackback sent [%s]
보낸 트랙백 [%s]
No Trackback received
받은 트랙백 없음
Trackback received [%s]
받은 트랙백 [%s]
ext1.61b - TrackBack 의 소스를 차용. (기존 인터페이스를 바꾸기 싫어서 실제 구현과 사용방법은 좀 다름)
소스 코드 내에서 함수 이름이나 변수, 스트링 등에 있는 "TrackBack"을 "Trackback"으로 고쳤습니다. 원하지 않는 곳에서 위키네임으로 인식될 우려가 있어서.. 스트링만 고치고 나니 일관성이 없어보여서 죄다 고쳤습니다.
trackbacksent 와 trackbackreceived 매크로 구현 변경 - memo 매크로처럼 자동으로 목록을 숨겨주며, 펼치는 링크 부분에 보내거나 받은 트랙백들의 갯수를 출력해 줍니다.
ext1.61c -
트랙백을 보낼 때, excerpt 값에는 페이지 본문 텍스트에서 부등호로 둘러쌓인 부분을 제거하고 남은 것들 중에 처음 255자를 넣어준다. 페이지 초반에 위키태그를 넣는 경우가 많아서 트랙백을 날렸을 때 받은 쪽에서 보면 너무 지저분해 보여서.
태그가 아니더라도 부등호로 둘러쌓인 것들은 사라지니 주의
ext1.82b -
/액션모듈화 관련. DoReceiveTrackbackPing 함수와 SendTrackbackResponse 함수를 별도의 파일로 분리.
존재하지 않는 페이지의 트랙백을 다른 곳으로 보낼 수 있는 문제 수정.
ext1.90a - 다른 사이트에 트랙백을 보낼 때, 트랙백 핑 데이타의 url항목의 값에 한글이 들어간 경우 (한글이름 페이지의 경우) 인코딩하도록 함.
ext1.96b - 스팸트랙백을 막을 수 있을까 해서, 페이지의 트랙백 주소를 하이퍼링크가 아니라 평범한 텍스트로 출력하게 함.
ext1.100
받는 트랙백 주소를 "wiki.pl?action=trackback&id=***"에서 action=tb 로 고침. 거창한 이유는 없고, 이미 스팸 트랙백으로 고생하는 사이트의 경우 일시적인 해결책이 될 것으로 기대함.
wiki.pl의 코드에 있는 action=trackback이라는 문자열을 action=tb로 고침
action/trackback.pl 파일을 action/tb.pl 로 이름을 바꾸고, 첫줄에 sub action_trackback 을 sub action_tb로 수정
일단 트랙백 보내기나 받기 매크로가 없는데 트랙백이 일어났다면, 그 순간 페이지 아래에 강제로 새로 매크로를 붙이고 치환해버리는게 왔따라고 생각합니다. 아래 붙은 모양이 보기 흉하면 알아서 메모 매크로로 감싸던가 하면 되겠죠. 트랙백을 허용하는 이상, 받는거야 받은게 맘에 안들면 지우면 되는거고, 보내는건 소스에서 권한 설정해놓은 걸로 넘어가고요. 아예 안되는 것 보다야 이 쪽이 좋을 것 같습니다.
그리고 trackback sent 매크로가 큰 의미가 있는지 저는 잘 모르겠습니다. 있으면 좋겠지만, 지금처럼 트랙백 주소가 나오면 실제로 어떤 글에 트랙백이 갔는지는 직접 주소보고 때려맞추기를 해야하는데... -_-;;; 사실은 트랙백을 보내고 그 사후처리에 대한 내용이 트랙백 규칙에 없다는 것도 지금 알았습니다. 성공했을 경우 reply에서 성공했을 경우 실제 URL과 타이틀만 넘겨줘도 깔끔하게 처리할 수 있을텐데 말이죠. 이글루스같은 경우는 아예 남의 이글루스 블로그를 볼 때 관련글 쓰기가 있어서 글 본문에 링크 걸어주고 트랙백도 처리해줍니다만. 다른 블로그나 위키 사이에서는 불가능한 일일테고요. 아예 트랙백을 보낼 때 실제링크(와 타이틀)을 옵션으로 입력하게 하는건 너무 귀찮겠죠? (뭐 저라면 쓸 것 같기도 합니다만.) 파일업로드도 새창 띄우는데, 트랙백 보내기도 새창 띄워서 처리하는건 어떨까요.
received 강제 추가는 고려를 했었는데, 그럼 트랙백받을URL을 어디에 (현재는 received 매크로 자리에 치환되는데) 표시할 것인가가 고민거리였습니다. 페이지 하단에 무조건 표시하게 만들 수도 있는데, Diary처럼 다른 페이지들 여러 개를 include 해서 먹고사는 페이지들과, 대문처럼 잠궈둔 페이지에 트랙백이 멋대로 (뭐 악의로 그러지야 않겠지만) 날아오고 그걸 뒤늦게 발견해서 지워야 한다는 것은 생각만 해도 끔찍하더라고요. 페이지 잠금이나 숨김 속성처럼 트랙백 허용 속성(디폴트는 허용이고 불허 속성이라 해야겠군요)을 별도로 추가하기도 너무 군더더기가 많아지는것 같고... 블로그 중에도 게시물 별로 트랙백 허용 여부를 정할 수 있는 걸 봤던 것 같기도 하고요. 이건 잘 모르겠습니다. 다른 분들 생각도 듣고 싶고.
강제추가할 때 열리고 닫히는 것을... 매 트랙백 데이타별로 그렇게 감싸주자는 건가요? 통채로 감싸려면 그 이후에 날아오는 트랙백을 어떻게.. 아 강제 추가할 때 매크로도 추가해 넣을 테니 큰 상관없을 듯 하기도 하군요.
sent 목록의 불편함은 동감입니다. 핑URL 필드 이외에 실제 글 URL과 타이틀까지 옵션 필드로 넣도록 하지요. 어쨌거나 보낸 로그를 담을 공간은 필요하고, 그 로그를 어딘가 치환해 넣어야 할테니 매크로가 하나 있긴 해야겠지요. 이것은 정말 강제추가할 사항이 아닌듯 하고...
주소가 http주저리주저리/wiki.pl?action=trackback&id=페이지이름 인데, 이것을 첫번째 & 를 기준으로 잘라서 앞은 URL 로 뒤의 것은 트랙백데이타 쪽에 덧붙인 후 POST 로 보내네요. 즉
http....wiki.pl?action=trackback 이 주소이고
blog_name=***&title=****...등등&id=페이지이름 이 POST 데이타인데,
희한하게 이 경우 wiki.pl 이 주소에 붙은 action=trackback 을 인식을 못하는군요. 그래서 결국 어떤 action 도 취할 수가 없이 다른 인자만 있으니 Invalid URL 에러.
반대로 트랙백 주소를 id=페이지이름&action=trackback 으로 주면 이번에는 action 인자는 POST 로 가는데 id 인자를 인식을 못해서 결국 트랙백 처리 도중 No page 에러가 나는군요. 원래 POST 로 보낼 때는 ? 뒤에 있는 인자를 처리 못하는게 맞는가요? 맞다면 이것은 IRiS ell 쪽의 잘못이 아닐런지.
IRiS ell 이 트랙백을 받지 못하는 이유도 발견. IRiS ell 은 오직 POST 로 들어왔을 때만 처리하는데, Net::Trackback::Client 에 있는 send_ping() 함수는 ping_url 에 "?"가 들어가 있을 경우는 GET 으로 보냄. 게다가 IRiS ell 의 트랙백 URL 에는 "?"가 들어가 있음... -_-;;; 어쩌라고!!! 트랙백의 스펙상으로는 GET 을 지원하지 않아도 할 말이 없긴 하다.
크으... 조프님과 MSN으로 수시로 의견을 교환하면 좋을 것 같네요. 저도 Encode 모듈 들여다보고 있었거든요. 근데 그 모듈을 테스트했는데 제 생각처럼 되지 않아서... 그리고 이글루스쪽에서 오는 건 utf-8 도 아닌 것 같습니다. Encode 모듈의 guess() 함수를 돌려보면 알 수 없는 인코딩이라 하네요. 제가 제대로 돌렸는지 모르겠으나...
결국 이쪽에서 트랙백URL 에 한글을 없애는 것이 나을 듯 한데, 의외로 간단한 코드가 있더군요.
trackbackreceived 가 없는 페이지에 트랙백이 날아올 경우 자동으로 매크로를 제일 아래에 삽입하여 치환시킵니다.
페이지가 잠겨 있거나, 숨겨져 있을 경우 트랙백 주소도 보여주지 않고, 실제로 트랙백을 날려도 거부하도록 했습니다.
트랙백을 보내는 주체는 사용자가 아니라 해당 블로그 또는 위키 cgi 이기 때문에, 자기가 관리자 권한이 있더라도 잠겨 있거나 숨겨진 페이지에는 트랙백을 보내지 못합니다. 페이지를 잠그거나 숨긴 의도를 생각해 볼 때 트랙백을 보내지 못한다고 해서 큰 불편은 없을 것이라 생각합니다.
이 정도면 거의 된 것 같네요. 위에 말한 자바스크립트를 함수로 뽑아내는 것만 해결하면 마무리지을까 합니다만, 또 다른 문제가 있나요?
Canday님 홈페이지의 경우 이글루스로부터 트랙백을 받았다 하면 에러가 나면서 락이 안 풀리는 현상이 발생하는데, 조사해 보니 환경변수 UseLookup = 1 이라서 이글루스 서버의 IP주소의 도메인네임을 얻으려다 타임아웃에 걸리는 것 같습니다. /Download에서 받아서 아무런 수정없이 설치한 버전에서는 잘 되는데 내가 좀 고쳐서 쓰는 버전에서는 안 되더라..는 경우는 이렇게 환경변수들 중에 자기가 변경한 값을 의심해 보는 것도 필요하겠습니다.
이상하게 트랙벡 핑을 보낼 수가 없네요. 내부 서버 문제라고는 하는데 어디가 문제인지는 나오지도 않고, 서버 로그도 어디 갔는지 모르겠고, 당황스럽습니다.
설정문제일까요?
-- 死海文書 2005-12-16 9:43 pm
글쎄요, cafe24에서 사용하는 다른 분들이 있다면 비교해 볼 수 있겠지만... 트랙백이 예전에 되었다가 언젠가부터 안 된다는 얘기는 아닌 거죠? 제일 유력한 것은 트랙백 핑을 보낼 때 사용하는 펄 모듈들이 없는 게 아닐까 하는 겁니다. 그건 관리자에게 문의해서 설치해달라고 하던가 Perl/모듈설치를 참조해서 직접 설치하던가 하셔야 할 것 같네요.
만들 때 이런 경우를 전혀 생각지 않았기 때문에, 개별 페이지를 잠그던가 숨기는 것 이외에는 트랙백을 받지 않게 할 방법이 없습니다.
쓸 수 있는 방법으로는...
관리자모드에서 금지어를 등록하여 트랙백에 금지어가 들어와 있는 경우 거부하게 하는 방법이 있겠고, 현재 쓰시는 버전이 최근 거라면 action/trackback.pl 파일을 지워버리면, 트랙백이 날아와도 아무런 일처리를 못하게 됩니다. 다만 페이지 하단에 있는 트랙백 주소 등은 여전히 나오고 있으니, 선의의 피해자가 생기겠죠. 트랙백 주고받기 란도 없애고 싶다면 그때는 wiki.pl 의 해당 출력 부분을 찾아서 지워주어야 합니다.
음 참고 있지 않는 정도가 아니라, 이 패치 때문에 오히려 그 Linkifcation 이 트랙백 주소 부분에 대해서 동작을 못하는군요. 동작하게 해주려면, Linkifcation 설정에 들어가서 고급->차단된 요소에 *[@onclick] 항목을 제거해줘야 하더군요. 이건 이거대로 불편한데... 표시된 주소를 클릭했을 때 복사하지 말고 옆에다가 따로 버튼을 만들던가 해야겠습니다.
아 그렇잖아도 제가 물어보려고 했었는데 :-) 저번에 바벨 계정 들어가서 봤더니만 wikiscript.js 를 wiki가 설치된 곳에 있는 걸 쓰지 않고 "/wikiscript.js"를 쓰도록 설정해뒀었더군요. 아마도 스크립트는 공유하면서 여러 위키 디렉토리를 돌리려고 하나 싶어서 놔뒀습니다만.
지금 보니까 수정하신 건 wiki/ 디렉토리의 js 파일인데 여전히 config 파일에서는 "/wikiscript.js"를 쓰게 되어 있길래, 제가 config_gypark.pl을 고쳐서 wiki/ 아래에 있는 걸 쓰도록 해놨습니다. 지금은 잘 될거예요
위 코드를 실행할때 그 옵션에 따라서 성공/실패가 갈리는데, 옵션이 꺼져 있으면 그냥 스크립트가 종료되어버리는 것 같더군요.
if (netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect')) {
alert("성공");
} else {
alert("실패");
}
이런 식으로 if 를 써서 비교하려고 해도 안 되더라고요. (해 보면, 옵션이 켜져 있으면 "실패"- 뜻밖에도 -가 뜨고, 꺼져 있으면 아무 반응 없음)
따라서 복사를 시도하기 전에 창을 띄워야 합니다. 그럼 FF 사용자는 무조건 확인창을 한번 눌러줘야 하는 것도 불편하고... 더 큰 문제는 옵션이 켜져 있어도 알림창은 뜰 것이기 때문에 찾아온 사람 입장에서는 "옵션이 켜져 있는데 왜 자꾸 뜨냐"라고 생각할까봐.. =.=;;; 어찌 보면 별 거 아닌데 괜히 신경 쓰이더라고요 ^^
창을 띄우는게 아니라 버튼의 title 속성에 넣어서 클릭하기 전에 가리켰을 때 나오게 할까도 했는데... 정작 FF에서는 title 문자열이 길면 뒤를 잘라먹고 말줄임표로 줄여서 표시해버리더군요 OTL
별 수 없이 "만일 복사에 실패했다면, 이 옵션을 체크하라"는 식으로 창을 띄울 생각입니다. 근데 스크립트에 직접 넣을 스트링이라 영작해야 되겠군요 =.=; "If it failes to copy, check the option:" 정도면 되려나요.
Can't locate object method "charset" via package "Net::Trackback::Client" (perhaps you forgot to load "Net::Trackback::Client"?) at /home/4/nyxity35/www/wiki/wiki.pl line 9143.
For help, please send mail to the webmaster (postmaster@nyxity.com), giving this error message and the time and date of the error.
9143째 줄은 DoSendTrackbackPing 함수의
$client->charset("$HttpCharset");
부분입니다.
이야, 반나절만에 설치를 해주다니 정말 빠르군요 ^^ 말씀하신 것처럼 여전히 기존 버전을 사용하는 것으로 보입니다. 그렇지만 대부분의 경우 "서버에 설치된 것보다 내 계정에 직접 설치한게 더 최신 버전"이라고 보는 것이 합리적이기 때문에, wiki.pl에 있는 경로를 바꾸는 건 좋은 생각 같지 않고요. Nyxity 님 계정에 있는 perl 디렉토리에서 Net/Trackback.pm 파일과 Net/Trackback 디렉토리를 (Net은 말고요) 지워보세요. (불안하면 백업해두시고)