노스모크모인모인/FAQ

FrontPage|FindPage|TitleIndex|RecentChanges| UserPreferences U P RSS
노스모크모인모인/질문답변에 있는 내용을 다큐먼트모드로 정리하는 페이지.

목차

1. 설치
1.1. 파이썬 버전 질문
1.1.1. 파이썬이 깔려있지 않은 계정에서 노스모크모인모인 사용하는 방법
1.2. CGI 설정 질문
1.2.1. 웹 브라우저 상에서 보면은 moin.cgi 파일이 소스만 보인다
1.2.2. 페이지를 열 때마다 한글이 깨져서 나온다. Character Coding이 Western으로 설정이 되어버린다
1.2.3. CGI Wrapper를 사용하는 경우
1.2.4. 퍼미션suexec 관련
1.2.5. Premature end of script headers
1.2.6. NotImplementedError: Unsupported web interface
1.3. 운영체제 질문
1.3.1. 윈도우즈 서버(IIS)에서 텍스트 파일 업로드만 되고 이진 파일 업로드는 되지 않는 경우
1.3.2. IIS에서 파일 업로드할 때 CGI timeout이 뜨는 경우
1.3.3. 윈도우즈 환경에서 diff가 되지 않을 경우
2. 설치 후
2.1. 주요 에러 메시지
2.1.1. Index Error: string index out of range
2.1.2. IO Error: Disk quota exceeded
2.2. 문법 질문
2.2.1. 표에서 한줄 띄어쓰기
2.2.2. 표에서의 정렬을 정의하는 법은?
2.3. 매크로 질문
2.3.1. UploadFile 매크로에서 보이는 파일 목록의 링크 위치가 올바르지 않다
2.4. 관리 및 유지 보수 질문
2.4.1. 메뉴 막대를 수정하는 방법
2.4.2. CSS 수정하는 방법
2.4.3. 회원 관리
2.4.4. 불필요한 WikiSeed는 어떻게 해야하는가?
2.4.5. 아이디 생성을 제한하기
2.4.6. 회원만 글 내용 수정할 수 있게 하기
2.4.7. 이모티콘 이미지 바꾸기, 추가하기
2.4.8. 백업 파일(히스토리)이 너무 많아서 rm -f *으로 지워지지 않는다
2.4.9. 노스모크처럼 주소에 moin.cgi가 나타나지 않게 하는 방법
2.4.10. EditText 할 때 열리는 편집창의 크기를 바꾸려면?
2.4.11. 위키네임 뒤에 붙는 빨간 물음표를 없애려면?
2.4.12. CMyClass와 같은 프로그램 소스에서의 이름을 위키네임으로 인식하지 않게 하려면?
3. 패치 정보

1. 설치


1.1. 파이썬 버전 질문


노스모크모인모인은 파이썬 2.2 버전에서 작동하는 것과 2.3에서 작동하는 것이 있다.

1.1.1. 파이썬이 깔려있지 않은 계정에서 노스모크모인모인 사용하는 방법



A.1 괜찮은웹호스팅, 개인위키에서 유료가 아니면서 파이썬을 허용하는 곳을 참고하고, 정 안되면 UseModWiki같은 다른 위키엔진을 대안으로 검토한다.

A.2 아무곳이나 C언어 컴파일러를 사용할 수 있게 해주는 곳을 선택하십시오. 대부분의 쉘 계정은 이를 허용합니다. http://www.python.org 에서 소스 코드를 다운 받아서 직접 컴파일해 쓰십시오. 컴파일은 간단하며 5분도 걸리지 않습니다. 컴파일시 --prefix=somewhere라는 옵션을 주면, somewhere라는 디렉토리 밑에 파이썬이 깔립니다.


1.2. CGI 설정 질문


1.2.1. 웹 브라우저 상에서 보면은 moin.cgi 파일이 소스만 보인다

아파치에서 CGI를 활성화 시켜야 한다. AddHandler cgi-script .cgi줄이 httpd.conf에 있어야 한다.

1.2.2. 페이지를 열 때마다 한글이 깨져서 나온다. Character Coding이 Western으로 설정이 되어버린다

아파치 설정 파일에서 다음 라인을 찾아 그 라인의 앞에 #를 붙여 비활성화시킨다.
#AddDefaultCharset ISO-8859-1

1.2.3. CGI Wrapper를 사용하는 경우

wiki/ 이하를 CGI Wrapper가 아닌 곳으로 통채로 복사하고 url_prefix를 그쪽으로 걸어주어야 한다.


1.2.4. 퍼미션suexec 관련



퍼미션 에러가 납니다. ls -al 로 살펴본 결과 501 입니다. 무슨무슨 화일을 어떻게 퍼미션 바꾸어야 할까요? http.conf의 설정에서는 유저도 www-data 이고 그룹도 www-data 입니다. 이것은 데비안의 기본설정입니다.

기억이 잘 안나는데 비슷한 설명이 어딘가에 있을겁니다. suexec를 안쓰시나 보군요.
root로 들어가서 # chown -R www-data.www-data data/{user,text,cache} data/editlog cache하면 될 것같군요. 기타 여러 문제는 /var/log/httpd(혹은 apache)/error_log를 참고하세요

계속되는 답변 너무 감사합니다. 그런데 문제가 해결되지가 않는군요.. 지금 데비안 사이트쪽이랑 같이 포스팅을 하고 있는데 결과적으로 퍼미션 에러입니다. 제가 내려준 명령어는
chown -R www-data /var/www/wiki
chmod +x /var/www/wiki/moin.cgi
과 moin.cgi을 777로 변경했답니다. 그리고 데비안에서는 suexec를 기본적으로 쓰게 컴파일 한답니다. 님이 가르쳐 주신 명령중에서
# chmod -R 755 www-data.www-data data/{user,text,cache} data/editlog cache
에서 {}가 이해가 되지 않아서 못해봤답니다. 계속되는 답변 너무 감사드립니다

suexec로 되어있다면 777로 변경하면 안됩니다. suexec_log에 에러가 기록되어 있을겁니다. 그리고, 헉... chown -R www-data.www-data (유저와 그룹을 함께 지정할 때 하는 방법) chmod -R 777을 섞어 썼군요 ㅡㅡ;; 다 무시하세요.

suexec가 설정되어 있다면, 파일들은 744 디렉토리는 755로 moin.cgi도 755로 하고 유저,그룹은 자신의 것으로 변경하셔야 합니다. (/var/log/apache(혹은 httpd?)/suexec_log를 살펴보세요)

1.2.5. Premature end of script headers


Premature end of script headers: /home/user/www/wiki/moin.cgi 라는 에러로 500 Internal server에러가 나는 경우.

일단 웹서버의 에러 로그를 살펴보아야 한다.
  1. 에러 로그에서 파이썬 exception일 경우 그 메시지가 적혀 있으므로 그 메시지를 바탕으로 문제를 해결한다.
  2. suexec를 쓰는 경우에는 스크립트가 들어있는 디렉토리의 그룹 쓰기 권한이 writable이 되면 안 된다. ([http]Premature end of script headers on everything의 Article #9758을 참고)

1.2.6. NotImplementedError: Unsupported web interface

아파치에 mod_python이라던가 하는 것이 설치되어있을 경우 발생하는 현상이다.

webapi/init.py에서
# load the appropriate interface here
if os.environ.get('GATEWAY_INTERFACE') == 'CGI/1.1':
    from cgiMoin import *
else:
    raise NotImplementedError("Unsupported web interface")
위 부분을 다음과 같이 주석처리한다. 주석처리할 때 from cgiMoin import * 부분의 들여쓰기를 당겨줘야한다는 것에 유념.

# load the appropriate interface here
#if os.environ.get('GATEWAY_INTERFACE') == 'CGI/1.1':
from cgiMoin import *
#else:
#    raise NotImplementedError("Unsupported web interface")



1.3. 운영체제 질문


1.3.1. 윈도우즈 서버(IIS)에서 텍스트 파일 업로드만 되고 이진 파일 업로드는 되지 않는 경우


moin.cgi 파일의 첫 라인(#!/path/python.exe)에 옵션 -u를 붙인다.
#!/path/python.exe -u 이런 식으로.

python.org에서 찾아보면 The -u (unbuffered) option on NT and win95 prevents the interpreter from altering newlines in the standard input and output. Without it post/multipart requests will seem to have the wrong length and binary (eg, GIF) responses may get garbled (resulting in, eg, a "broken image").라고 되어다

이렇게 해도 되지 않을 경우에는 IIS에서 CGI 매핑할때 ~/Python.exe -u %s %s로 해야한다.

1.3.2. IIS에서 파일 업로드할 때 CGI timeout이 뜨는 경우

IIS에서는 무한루프에 걸리는 것을 방지하기 위해 스크립트 타임아웃을 쓰는 것이므로 IIS의 설정을 바꾸면 된다.

1.3.3. 윈도우즈 환경에서 diff가 되지 않을 경우


GNU Util 호환 패키지를 설치하라.

2. 설치 후


2.1. 주요 에러 메시지

2.1.1. Index Error: string index out of range

페이지에서 제목 태그(= 등)이 하나라도 쓰일 경우 발생.

파이썬 2.1이하에서 2.2 로 넘어오면서 dictionary.items() 의 순서가 바뀌어서 발생하는 현상이다. MoinMoin의 구현이 items의 순서에 의존 했기 때문에 parser/wiki.py에서 다음 부분을 고쳐야 한다.

formatting_rules에서 hmarker앞에 밑줄

(?P<heading>^\s*(?P<_hmarker>=+)\s.*\s(?P=_hmarker) $)
----
replace에서 _로 시작하는 아이템은 생략

    def replace(self, match):
        matched=match.groupdict().items()
        matchedItemsToReplace=filter(lambda item:item[0][0]!='_',matched)
        for type, hit in matchedItemsToReplace: 

위처럼 수정해도 안 되는 경우에는 다음 fix를 적용시킨다.





2.1.2. IO Error: Disk quota exceeded


계정에 허용된 디스크 사용량을 초과했을 경우. 불필요한 파일을 정리해서 용량을 확보해야 한다. 모인모인을 오랜 기간 운영했을 경우 data/backup 디렉토리에 너무 많은 파일이 쌓여있는 경우가 있다. 노스모크모인모인/팁의 백업 지우기 스크립트를 사용하라.


2.2. 문법 질문


2.2.1. 표에서 한줄 띄어쓰기


[[BR]]태그를 쓰면 된다.
ex)
|| line 1 [[BR]] line 2 ||
line 1
line 2



2.2.2. 표에서의 정렬을 정의하는 법은?


오리지널 MoinMoin 1.x에서는 가능하지만 노스모크모인모인에서는 불가능하다.

2.3. 매크로 질문


2.3.1. UploadFile 매크로에서 보이는 파일 목록의 링크 위치가 올바르지 않다


업로드된 파일 리스트는 "config.url_prefix"/"config.upload_dir"/"filename"의 URL로 구성된다.

moin_config.py에서 url_prefix와 data_dir만 제대로 설정해 주면 정상 작동한니다. 단, url_prefix를 공백으로 하면 안 된다.

2.4. 관리 및 유지 보수 질문


2.4.1. 메뉴 막대를 수정하는 방법


moin_config.py을 열어서 필요한 부분에 HTML을 직접 입력하면 된다.

2.4.2. CSS 수정하는 방법

default.css를 수정한다.

2.4.3. 회원 관리

Q: 제로보드 회원방식과는 별개로 회원가입/관리를 해야하는가?

A. 제로보드와 호환될 수 없고, 제로보드식의 회원 관리 방법을 제공하지도 않는다. 편집 권한 제어를 해야한다면 수동으로 사용자 아이디를 moin_config.py에 써줘야한다.

2.4.4. 불필요한 WikiSeed는 어떻게 해야하는가?

  1. TitleIndex로 들어가서 일일이 DeletePage로 지운다.
  2. 쉘에서 data/text 로 들어가서 rm으로 지운다. 시스템 관련 페이지까지 지울 수 있으니 주의해야 한다.
  3. 그냥 놔두고 신경 쓰지 않는다.

2.4.5. 아이디 생성을 제한하기


Q : 설치후에 개인적으로 사용하기 위해 사용사의 추가 프로파일 생성을 막으려면 어떻게 해야하나?

A : 설정을 통해 막는 기능은 제공하지 않지만, 소스에서 UserPreferences의 Create Profile 버튼이 표시되는 부분을 제거하는 꽁수를 쓰면 된다.

2.4.6. 회원만 글 내용 수정할 수 있게 하기


moin_config.py에 변수 3개를 설정한다.
access_requires_login, edit_requires_login : 이 둘은 0 혹은 1의 값을 가지게 한다.
guestbook_page : 회원이 아니더라도 편집할 수 있는 페이지의 이름을 튜플로 넣어준다.

그리고 Page.py에서 send_editor에서 다음 코드를 찾아보면 된다.

if not config.access_requires_login and config.edit_requires_login and (self.page_name not in config.guestbook_page) and (not user.current.valid):
    Page(self.page_name).send_page(form, msg='<strong>%s</strong>' % user.current.text('<b>Please <a href="UserPreferences">log in</a> before editing</b>')) 
    return

튜플은 파이썬 기본 데이터 타입의 하나를 말하는데, tuple=(1,2,3) 처럼 괄호와 , 로 만든다. 항목이 1개만 있을 때도 (1,) 식으로 , 를 넣어줘야 한다.

2.4.7. 이모티콘 이미지 바꾸기, 추가하기

이미지를 바꿀 때는 img 디렉토리에 같은 이름의 파일로 덮어씌우면 된다.
추가할 때는 wikiutil.py 소스를 수정하면 된다.

2.4.8. 백업 파일(히스토리)이 너무 많아서 rm -f *으로 지워지지 않는다


몇 달만에 히스토리를 삭제하려고 cd public_html/cgi-bin/data/backup && rm -f * 을 했는데, /bin/rm: Arg list too long 이라는 메세지가 뜬다.

쉘에서 쓰이는 * 문자는 일정 갯수를 넘는 파일을 처리하지 못하기 때문에 뜨는 메세지다. 대처법은
  1. GUI FTP 클라이언트로 접속해서 파일목록을 보고 지운다.
  2. find를 사용한다. find public_html/cgi-bin/data/backup -exec rm {} \;

평소에 가끔씩 노스모크모인모인/팁의 백업 지우기 스크립트를 사용하라.

2.4.9. 노스모크처럼 주소에 moin.cgi가 나타나지 않게 하는 방법


웹서버의 Redirect 지시자를 쓰면 된다. See 노스모크모인모인/팁

2.4.10. EditText 할 때 열리는 편집창의 크기를 바꾸려면?


UserPreferences에서 정할 수 있다.


2.4.11. 위키네임 뒤에 붙는 빨간 물음표를 없애려면?


  1. {{{내용}}} 형식으로, 원하는 단어를 중괄호를 사용하여 묶는다.
  2. #format plan 을 페이지 처음에 적는다.
  3. 여섯따옴표를 사용하여 원하는 단어를 묶는다.
  4. 소스 고칠 필요없이 moin_config.py 에서 nonexist_qm = 0 으로 설정.

2.4.12. CMyClass와 같은 프로그램 소스에서의 이름을 위키네임으로 인식하지 않게 하려면?


바로 위의 내용을 참조하거나, parser/wiki.py를 다음 부분을 삭제한다.

(?P<word>\b([%(u)s]([%(u)s]+[%(l)s]|[%(l)s]+[%(u)s])[%(u)s%(l)s]*)\b)

그러면 위키네임은 더이상 사용되지 않고, 페이지는 링크는 각괄호를 통해서만 할 수 있게 된다.


3. 패치 정보




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