실제 설치는 내일 작성하도록 하겠습니다. 2장. Trac On Windows - Trac 실제로 설치하기 이제 앞장에서 살펴본대로 버전에 맞게 모든 프로그램 및 모듈들을 다운로드 받았다면 설치를 시작해 보도록 하겠습니다. 1. 아파치 설치 윈도우즈용 아파치 바이너리 파일은 현재 모두 인스톨본으로 제공하고 있기 때문에 뭐 별 문제없이 설치하실 수 있겠죠? 뭐 아파치 설치는 그냥 실행시켜서 Next누르고 도메인명, 호스트명, 관리자 이메일 정도 적어주면 쉽게 설치할 수 있으니까 설명하지 않도록 하겠습니다. 단, 저의 경우는 IIS와 톰캣이 모두 설치되어 있어서 C:\Program Files\Apache Software Foundation\Apache2.2\conf\httpd.conf 파일에서 "Listen 80" 부분을 "Listen 88"로 바꾸어 주었습니다. 웹서버 포트 변경하는 건지는 다 들아시죠? 2. 서브버전 설치 서브버전은 그냥 압축된 형태의 것과 설치본 두가지 모두를 제공합니다. 저는 그냥 압축본을 사용하도록 하겠습니다. 압축본의 압축을 풀어서 C:\Program Files\Subversion이라는 디렉토리에 복사하였습니다. 위의 C:\Program Files\Subversion\bin디렉토리를 환경변수 PATH에 등록하여 주세요. 또한 추후 svn 사용시 한글 문제를 해결하기 위해서 환경변수 APR_ICONV_PATH 을 만들고 값으로 C:\Program Files\Subversion\iconv 를 입력하세요. 나중에 커밋을 위해 메시지를 입력할 수 있는 에디터를 정하기 위해 환경변수에 SVN_EDITOR을 만들고 값을 notepad.exe 나 원하는 에디터를 입력하세요. 이런 설정을 별도로 하는 것이 귀찮으면 압축본이 아닌 설치본을 받아서 설치하세요. 3. 파이썬 설치 파이썬은 인스톨본 밖에 없기 때문에 그냥 그걸로 설치합니다. 설치 중 설치과정이 멈춰져 있는듯 하다면 웹브라우져가 열려있는 경우는 닫아 주세요. 저는 C:\Program Files\Python24 디렉토리에 설치하였습니다. 위의 경로는 환경변수 PATH에 등록하여 주세요. 또한 C:\Program Files\Python24\Script-xs디렉토리도 환경변수 PATH에 등록하여 주세요. 다음 작업을 좀 편하게 하기 위해서 입니다. 4. 파이썬과 서브버전의 연계 모듈 설치 이 모듈 역시 그냥 설치본으로 설치하셔도 상관은 없구요. 다음은 압축파일로 설치할 경우는 svn-win32-1.4.4_py24.zip 파일의 압축을 풀고 C:\Program Files\Python24\Lib\site-packages 디렉토리에 압축을 푼 파일 중 libsvn과 svn 디렉토리를 복사합니다. 5. 아파치와 파이썬 연계 모듈 설치 다운 받은 mod_python-3.3.1.win32-py2.4-Apache2.2.exe 파일을 그냥실행해서 설치하시면 됩니다. 설치 중간에 아파치가 설치된 디렉토리를 물어보게 되는데... C:\Program Files\Apache Software Foundation\Apache2.2 디렉토리를 선택해 주시면 됩니다. 6. 닥유틸스 설치 다운 받은 파일 docutils-snapshot.tgz의 압축을 알집 같은 걸로 풉니다. 명령창을 열어 풀린 디렉토리들 중 docutils-snapshot\docutils 디렉토리로 이동합니다. python ./setup.py install 위와 같은 명령으로 설치를 하시면 됩니다.
7. PySQLite 설치 다운 받은 pysqlite-2.3.5.win32-py2.4.exe파일을 실행해서 설치를 합니다.
8. 클리어실버 설치 다운 받은 clearsilver-0.9.14.win32-py2.4.exe파일을 실행해서 설치를 합니다. 9. Trac을 설치 다운받은 Trac파일 (영문일 경우 trac-0.10.4.tar.gz, 한글일 경우 trac-0.10.4-ko.tar.gz)의 압축을 해제 합니다. 뭐 한글이나 영문이나 설치 방법이 다르지는 않습니다. 저는 한글로 하겠습니다. 명령창을 열어서 압축이 풀린 trac-0.10.4-ko.tar\trac-0.10.4-ko 디렉토리로 이동합니다. python ./setup.py install 위와 같은 명령으로 설치할 수 있습니다. python ./setup.py install --prefix=/path/to/installdir 위와 같이 하여 설치될 디렉토리를 지정할 수 도 있습니다. 10. WebAdmin 설치 우선 ez_setup을 먼저 설치합니다. 다운 받은 ez_setup.py 파일을 C:\Program Files\Python24\Script-xs 디렉토리에 복사해 놓습니다. 그런 다음 명령창을 열어서 다음과 같이 실행합니다. 참 인터넷에 컴퓨터가 연결되어 있어야 합니다. 파일을 다운 받거든요. python "C:\Program Files\Python24\Script-xs\ez_setup.py" 위의 명령을 실행시키면 다음과 같은 화면이 나타납니다. C:\>python "C:\Program Files\Python24\Script-xs\ez_setup.py" Downloading http://cheeseshop.python.org/packages/2.4/s/setuptools/setuptools-0.6c6-py2.4.egg Processing setuptools-0.6c6-py2.4.egg creating c:\program files\python24\lib\site-packages\setuptools-0.6c6-py2.4.egg Extracting setuptools-0.6c6-py2.4.egg to c:\program files\python24\lib\site-packages Adding setuptools 0.6c6 to easy-install.pth file Installing easy_install-script-x.py script-x to C:\Program Files\Python24\Script-xs Installing easy_install.exe script-x to C:\Program Files\Python24\Script-xs Installing easy_install-2.4-script-x.py script-x to C:\Program Files\Python24\Script-xs Installing easy_install-2.4.exe script-x to C:\Program Files\Python24\Script-xs Installed c:\program files\python24\lib\site-packages\setuptools-0.6c6-py2.4.egg Processing dependencies for setuptools==0.6c6 Finished processing dependencies for setuptools==0.6c6 C:\> http://cheeseshop.python.org 에 접속해서 setup tool을 다운로드 받아서 설치하는 것을 알 수가 있을 것입니다. 최종적으로 위의 실행 결과에 의해 C:\Program Files\Python24\Script-xs\easy_install.exe 파일이 생성됩니다. 자 이제 WebAdmin을 설치해 보도록 하지요. WebAdmin은 설치하는 방법으로 두가지 있습니다. 하나는 다운 받은 파일을 이용하는 방법이 있구요. svn서버에서 소스를 다운 받아 설치하는 방법이 있습니다. 우선 첫번째 방법으로 다운 받은 TracWebAdmin-0.1.2dev_r4240-py2.4.egg.zip 파일의 압축을 해제 해서 생성된 TracWebAdmin-0.1.2dev_r4240-py2.4.egg 디렉토리와 easy_install을 이용해서 다음과 같이 설치합니다. easy_install.exe TracWebAdmin-0.1.2dev_r4240-py2.4.egg 또 다른 방법으로는 다음과 같이 입력하여 서브버전을 이용해서 소스를 다운받아 설치하는 방법입니다. easy_install http://svn.edgewall.com/repos/trac/sandbox/webadmin 저는 이 방법으로 하도록 하겠습니다. 다음은 설치시에 나타나는 화면입니다. 참고하십시오. C:\>easy_install http://svn.edgewall.com/repos/trac/sandbox/webadmin Downloading http://svn.edgewall.com/repos/trac/sandbox/webadmin Doing subversion checkout from http://svn.edgewall.com/repos/trac/sandbox/webadmin to c:\temp\easy_install-p8q8nb\webadmin Processing webadmin Running setup.py -q bdist_egg --dist-dir c:\temp\easy_install-p8q8nb\webadmin\egg-dist-tmp-psawjc zip_safe flag not set; analyzing archive contents... webadmin.plugin: module references __file__ Adding tracwebadmin 0.1.2dev-r5753 to easy-install.pth file Installed c:\program files\python24\lib\site-packages\tracwebadmin-0.1.2dev_r5753-py2.4.egg Processing dependencies for tracwebadmin==0.1.2dev-r5753 Finished processing dependencies for tracwebadmin==0.1.2dev-r5753 C:\> 자 여기까지 해서 CygwinSSHD만 빼고 모두 설치하였네요. 저는 CygwinSSHD는 설치하지 않도록 하겠습니다. 설치가 무지 복잡하죠? 어찌되었건 설치는 했으니 다음장에서 설정과 실행을 시켜보도록 하겠습니다.
by Anna 안나 2008. 7. 11. 20:42
회사에서 프로그램 버전 관리의 필요성이 생겨서 CVS를 할까 Subversion을 할까 아니면 SourceSafe를 할까 고민을 하다가... SourceSafe는 좋긴하지만 상용에다가 윈도우즈 외의 플랫폼에서는 쥐약이라 포기하고.... CVS를 검토하다가 알게된 Subversion이 CVS의 기능을 보강한 새로운 버전관리 프로그램이라고 해서 Subversion을 사용하기 맘 먹었습니다. 서브버전을 설치하고 이것 저것 쓰다가 보니깐... 검색을 할 수가 없다는 단점이 있어서... 또 뒤적거리다가 Trac이라놈이 있다는 걸 알게 되었습니다. 1장. Trac On Windows - 설치 파일 버전맞추기 Trac은 서브버전에 위키 웹을 합쳐놓은 형태라서 게시판처럼 사용도 하고 버전도 관리하도록 되어 있더 군요. 그런데 다 좋은데... 설치가 너무 어려웠습니다. Python을 잘 모르는 저에게는 더욱 어려웠습니다. 사실은 아직 완전한 설치를 하질 못했습니다. 이글은 지금까지 삽질 했던 부분과 앞으로의 삽질 할 부분을 정리하기 위해 작성하고 있습니다. 이것 저것 보면서 삽질을 하다가 보니 나중에 다시 설치하라고 하면 못 할것 같아서.. ㅠㅠㅠ 그럼 이제 시작해 봅도록 합시다. 1. 설치해야 할 프로그램 목록 제가 설치하면 삽질한 원인 중 가장 큰 원인이 설치를 해야할 것이 너무 많은데... 이것들이 서로 버전을 맞춰주지 않으면 안된다는 것이었습니다. 될 수 있으면 최신버전이 반듯이 설치에 성공할 수 있다는 보장을 할 수 없습니다.아마도 Trac을 설치해보셨던 분들은 모두 마찬가지 이유로 삽질을 하셨을 겁니다. 그래서 설치하기 전에 필요한 버전의 모듈이 모두 있는지 확인하는 과정이 필요합니다. 1) 반듯이 필요한 프로그램 혹은 모듈들... - Apache Web Server
- Subversion
- Python
- Subversion for the Python bindings (파이썬과 서브버전의 연계를 위함)
- Apache Module fro the Python (파이썬과 아파치 연동을 위함)
- DocUtils
- PySQLite
- ClearSilver
- TRAC 위에서 PySQLite는 Trac이 DB를 사용해야 하는데 SQLite를 사용할 때 필요합니다. 참고로 SQLite 대신에 MySQL을 사용할 수도 있습니다. 2) 필요하다면 설치할 수 있는 모듈들... - WebAdmin (Trac의 Plug-In) - 한글 Trac Template (한글화를 위함) - CygwinSSHD (보안 강화를 위함) 설치해야 할 항목만 봐도 기가 확 죽죠? ㅠㅠ 저도 답답해 옵니다. 거기다가 이것들이 버전을 가린다니 더욱 그렇습니다. 모두 오픈 소스기 때문에 버전이 안맞다면 컴파일을 해서 사용해도 되겠지만 다른 놈은 괜찮은데... ClearSilver라는 놈을 윈도우즈에서 컴파일하려면 윈도우즈에 리눅스 환경을 만들어야 해서 그거 하나 컴파일 하려고 더 복잡하게 만들 수는 없지 않겠습니까? ㅎㅎ 그래서 될 수 있으면 바이너리를 구해서 사용하려다 보니깐... 해당 버전의 파일들의 바이너리를 제공하고 있는지 확인을 꼭 해야 합니다. 2. 설치할 프로그램 다운로드 및 버전 체크 문제는 각각의 프로그램을 연결해 주는 모듈들입니다. 버전이 맞는 놈(바이너리 파일)이 있는지 주로 체크해야 할 것은 다음과 같습니다. - 아파치와 서브버전 - 아파치와 파이썬 - 서브버전과 파이썬 - 파이썬과 클리어실버 현재 제가 글을 쓰고 있는 시점을 기준으로 이야기 하도록 하겠습니다. 지금은 버전을 맞추는 방법을 설명하고 있으므로 바로 다운로드 하지 말고 우선 종이에다가 버전들을 적으면서 살펴만 보세요.
1) 아파치 웹서버 아파치 웹서버를 다운로드 할 수 있는 곳 http://httpd.apache.org/ 현재 최신 Release버전은 2.2.4입니다. 그리고 2.0.59버전도 있네요. 2) 서브버전 서브버전을 다운로드 받을 수 있는 곳 http://subversion.tigris.org/project_packages.html 이 페이지의 맨 아래에는 윈도우즈 바이너리를 다운받을 수 있는 링크가 있습니다. 보면 아파치 버전에 따라서 다운 받을 수 있는 경로가 구분되어 있습니다. Win32 packages built against Apache 2.0 Win32 packages built against Apache 2.2 다행이도 현재 아파치 웹서버의 최신버전이 2.2.4에서 돌아갈 수 있는 서브버전이 있네요. 그래서 Win32 packages built against Apache 2.2 에 가보면 여러 서브버전이 있는데... 1.4.4가 최신 버전이 구요. 1.4.3도 있습니다. 한가지 더 확인할 것은 파이썬과의 연동을 위해 파이썬 연동 모듈이 파이썬의 어떤 버전까지를 지원하는지 확인합니다. 보니깐.. py23, py24, py25 까지 지원하는 모듈이 있군요. 3) 파이썬 파이썬을 다운로드 받을 수 있는 곳 http://www.python.org/download/ 파이썬은 2.5.1, 2.4.4, 2.3.6 버전을 다운 받을 수 있습니다. 4) 파이썬과 서브버전의 연계 모듈 이 모듈은 아까 2)번 항목에서 이미 살펴 보았습니다. py23, py24, py25가 있었죠. 즉, 파이썬 2.3.x 부터 파이썬 2.5.x까지 모두 연동이 가능하군요. 5) 아파치와 파이썬 연동 모듈 이 모듈은 http://httpd.apache.org/modules/python-download.cgi 에서 확인합니다. 이 모듈은 파이썬 스크립트가 CGI방식이 아니라 아파치의 기능확장 모듈(Fast-CGI)로 동작할 수 있도록 해 줍니다. 최신 버전은 3.3.1인데 윈도우즈용 바이너리가 있는 링크를 가보면.. 파이썬과 아파치 연동 버전관계를 파일명을 통해서 알 수 있는데... 현재는 다음과 같은 쌍으로 연동할 수 있는 바이너리를 제공하고 있습니다. py2.3.x - Apache2.0.x
py2.3.x - Apache2.2.x
py2.4.x - Apache2.0.x
py2.4.x - Apache2.2.x
py2.5.x - Apache2.0.x
py2.5.x - Apache2.2.x 6) 닥유틸스 이 모듈은 http://docutils.sourceforge.net/ 에서 다운 받을 수 있습니다. 현재 버전은 0.4인데 파이썬 스크립트로만 되어 있고 파이썬으로 설치할 거기 때문에 특별히 버전을 체크할 필요는 없습니다. 7) PySQLite 이 모듈은 http://initd.org/tracker/pysqlite/wiki/pysqlite 에서 다운 받을 수 있습니다. 현재 버전은 2.3.5 이고 Python 2.3, 2.4. 2.5 를 지원하는 바이너리를 받을 수 있습니다. 8) 클리어실버 이 모듈은 http://www.clearsilver.net/downloads/ 에서 다운 받을 수 있습니다. 현재 버전은 0.10.5 인데... 윈도우즈용 바이너리로 제공하는 놈은 0.9.14까지만 제공하고 있으며 게다가 Python은 2.3과 2.4만을 지원하네요. 지금까지는 좋았는데... 여기서 문제가 생겼네요. 즉, 이놈 때문에 Python 2.5버전을 사용할 수 없다는 것입니다. 고로 파이썬의 버전은 2.4이하로 되어야 겠네요. 9) 트랙(Trac) 이 모듈은 http://trac.edgewall.org/wiki/TracDownload 에서 다운 받을 수 있습니다. 현재 버전은 0.10.4이고 특별하게 버전을 맞출 필요는 없습니다. 참고로 아래의 11)에 의해 한글 트랙을 사용하실 분은 영문 트랙을 굳이 다운 받으실 필요가 없습니다. 10) 웹어드민 웹어드민은 트랙의 관리를 웹상에서 해 줄 수 있는 모듈입니다. 이 모듈은 SetupTool을 다운 받아 설치하고 이 SetupTool을 이용해서 설치해야 합니다. 우선 SetupTool을 다운 받는 곳은 http://trac.edgewall.org/wiki/TracPlugins 입니다. 여기에서 http://peak.telecommunity.com/dist/ez_setup.py 파일을 다운 받습니다. 그 다음 웹어드민은 http://trac.edgewall.org/wiki/WebAdmin 에서 다운 받습니다. 이놈은 트랙 버전과 파이썬버전을 동시에 체크해야 합니다. 보니깐 최근버전이 0.11인데 트랙 0.93이상을 요구하며 파이썬 2.3과 2.4를 지원하는 군요. 11) 한글 Trac Trac을 한글화 하고 있는 사이트로 http://kldp.net/projects/trac-ko/ 이 있으며 http://kldp.net/frs/?group_id=724 에서 다운 받을 수 있습니다. 현재 버전은 0.10.4네요... 다행히도 최신버전의 영문 Trac이 한글화 되어 있습니다. 12) CygwinSSHD 이 프로그램은 Secure Shell Daemon으로 트랙의 보안을 강화 시킬 수 있습니다. http://ist.uwaterloo.ca/~kscully/CygwinSSHD_W2K3.html 에서 다운받을 수 있습니다. 13) 버전체크 결과 자 여기까지 해서 버전체크를 마쳤습니다. 결과적으로 다음의 조합이 현재 상태에서 컴파일 없이 윈도우즈에 가장 최신 모듈들을 이용해서 트랙을 설치할 수 있는 조합입니다. 아파치는 2.0.59, 서브버전 1.4.4, 파이썬 2.4.4 그리고 나머지는 이에 맞는 최신버전들을 사용하면 되겠습니다. 이제 버전체크 결과가 나왔으니 해당 사이트에서 다운로드를 받아 한 디렉토리에 담아 놓으세요. 바이너리의 경우 인스톨본을 제공하는 경우도 있고 그냥 zip이나 tar로 묶어져 있는 경우도 있습니다. 저는 zip이나 tar로 묶여 있는 놈들을 주로 받을 생각입니다. 고생한 김에 좀 더 고생해 보려구요. 여러분들은 인스톨본을 받으세요. 그러면 설정이 좀 자동화 되는 부분이 있습니다. 마지막으로 한가지 더 이야기 하자면... 윈도우즈 상에서 트랙을 돌려보기가 넘 어려워서 인지 다음의 웹사이트에서 압축만 풀어서 트랙을 사용할 수 있도록 묶음 버전을 만들고 있습니다. http://sourceforge.net/projects/traconwindows 이 묶음 파일에서의 각 파일들의 버전은 다음과 같습니다. Python 2.4.3 for win32
Apache 2.2 for win32
mod_python
clearsilver 0.9.14 for win32
Subversion 1.4.2
svn-python 1.4.2 for win32, Python 2.4
pysqlite 2.3.2 for win32, Python 2.4
Trac 0.10.3
이 TracOnWindows(ALLinOne)은 현재 0.1 alpha 2가 최신버전입니다. 단, C:\Trac이라는 디렉토리 고정되어 있습니다. 다운 받은 후 압축을 풀고 C:\Trac디렉토리에 가서 run-apache.bat 파일을 실행시킨 후 웹브라우저로 http://localhost:8080/projects 에 접속하면 됩니다. 관련내용은 http://yeoupooh.us.to:8080/wiki/display/pu/TracOnWindows 을 참조하세요.




출처 : http://www.nicklib.com/menu/study/
by Anna 안나 2008. 7. 11. 20:24
시작하기 전에 이미지 다운로드 - 문단이나 항목 정리에 있어서, Unorderd List 태그인 <ul>과 항목 리스트를 나타내는 <li>태그는 매우 유용한 태그입니다. 다만, 웹브라우저에 따라 여백이나 패딩의 및 불릿 이미지를 표기하는 방식이 꽤나 다르기 때문에 사용상 주의도 필요합니다. 또한, 그동안 웹페이지의 레이아웃을 유지하기 위해 그동안 테이블<table>을 많이 이용했으나, 리스트 태그와 CSS를 이용한 방법이 바람직하다고 여깁니다. 기본적으로, 여백과 패딩값은 설정해 주어야 IE7과 FireFox2사이의 레이아웃 차이를 없앨 수 있습니다. ul{ margin: 0; padding: 0;}/* li태그는 해당 내용 상속됨 */ <li> 및 display속성값이 [list-item]인 경우 다음과 같은 스타일을 적용할 수 있습니다. * <ol> <ul> 에 다음의 속성을 지정하면, 해당 태그의 서브 <li>요소에는 모두 상속됩니다. [ 리스트 속성의 일괄 지정 ] list-style: type image position; 리스트의 글머리표의 종류를 지정(type), 글머리표의 이미지를 지정(image) 글머리표의 표시위치 지정(position)을 지정합니다. 속성값인 type, image, position은 아래에서 설명할 속성값을 따릅니다. [ 글머리표의 종류 지정 ] list-style-type: disc(초기값); 글머리표의 이미지가 있는 경우에는, 이미지가 우선적으로 표시됩니다. 이미지가 없거나(none) 지정한 이미지를 표시할 수 없는 경우, 이 설정값이 유효하게 됩니다. 구버전의 IE에서는 인식되지 않으나, IE7에서는 인식이됩니다. 다음과 같은 속성값을 이용할 수 있습니다. none : 글머리표를 표시하지 않습니다. disc : 검은색 원(기본 값) circls : 선으로 그려진 원 square : 선으로 그려진 사각형 lower-roman : 로마숫자 소문자 upper-roman : 로마숫자 대문자 lower-greek : 그리스 문자 소문자 decimal : 일반 숫자 decimal-leading-zero : 첫 자리에 0을 붙인 숫자 lower-latin, lower-alpha : 알파벳 소문자 upper-latin, upper-alpha : 알파벳 대문자 hebrew : 히브리 숫자 armenian : 아르메니아 숫자 georgian : 그로지아 숫자 <ul style="list-style-type: lower-roman;"> index content postscripe [ 글머리표 이미지 지정 ] list-style-image: url(); 디폴트 값은 none입니다. 아래와 같이 사용할 수 있습니다. <ul style="list-style-image: url(ico_note.gif);"> index content postscripe [ 글머리표 이미지 표시 위치 지정 ] list-style-position: outside(초기값); 리스트 항목의 박스에 대한 글머리표의 위치를 설정하는 속성입니다. 사용할 수 있는 속성값으로는 inside 와 outside가 있으며 디폴트 값은 outside입니다. <ul style="border: 1px solid; list-style-image: url(ico_note.gif);"> index content postscripe <ul style="border: 1px solid; list-style-position: inside; list-style-image: url(ico_note.gif);"> index content postscripe 위 예의 경우, margin: 0; padding: 0; width: 200px로 지정되어 있습니다. 테두리를 1px로 설정하였으므로, 박스의 레이아웃은 가로 202px가 됩니다. 글머리표 이미지를 inside로 설정한 경우는 이 202px안에 모두 표기가 됩니다. outside의 경우는 해당 박스의 여백이나 패딩값에 관계없이 박스의 외곽에 표기됩니다. 심지어 외곽 박스의 영역 을 침범해서라도 표기가 됩니다. 다만, 외곽 박스가 <body>인 경우에는, IE7의 경우에는 패딩영역에만 표기됩니다. 즉, FireFox2경우에는 패딩영역이든 여백(margin)영역이든 표기할 공간이 있으면 표기해 주나, IE7의 경우에는 여백(margin)영역만 존재하고 패딩영역이 없는 경우 글머리표 이미지는 표기가 되지 않습니다. <ul style="border: 1px solid; list-style-position: inside; list-style-image: url(ico_note.gif);"> <li style="list-style-position: outside;">index</li> index content postscripe 이 상, 리스트 항목의 글머리표에 대한, 속성설정에 대하여 살펴보았습니다. 이 항목들만을 가지고 글머리표 레이아웃을 설정하는 방법에는 한계가 있습니다. 글머리표로 사용한 이미지의 크기에 따라, 상하 높이를 설정하는 부분이 없기 때문입니다. ul{ list-style: none; margin: 0; padding: 0;} 따라서, 레이아웃을 위한 일반적인 사용에는 위와 같이 사용할 뿐입니다. http://blog.naver.com/einmong/10011586136
by Anna 안나 2008. 7. 9. 19:25
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <htmlxmlns="http://www.w3.org/1999/xhtml"> <head> <metahttp-equiv="Content-Type"content="text/html; charset=euc-kr"/> <title>Tabs</title> <!-- Description : XHTML Tabs style code [ IE6 , IE7 , FF2] --> <!-- Author : blueb(http://blueb.net/blog) --> <!-- Date : 2008-05-08 --> </head> <body> <scripttype='text/javascript'> function tabs(idx){ for(i = 1; i <= 3 ; i++ ){ document.getElementById('tab'+i).className = ""; document.getElementById('content'+i).className = "content hide"; } document.getElementById('tab'+idx).className = "active"; document.getElementById('content'+idx).className = "content show"; } </script> <!--[if IE 6]> <styletype='text/css'> /* IE 6 */ div.tabs-area { position:relative; z-index:2; width:100%; height:48px; padding:0;margin:0;overflow:hidden; } div.tabs-line { position:relative; z-index:1; width:100%; height:0; top:-1px; border-top:1px solid #D3D9E6; } </style> <![endif]--> <!--[if IE 7]> <styletype='text/css'> /* IE 7 */ div.tabs-area { position:relative; z-index:2; height:48px;width:100%;padding:0;margin:0 } div.tabs-line { position:relative; z-index:1; width:100%; height:1px; top:-2px; border-bottom:1px solid #D3D9E6; } </style> <![endif]--> <!--[if !IE]>--> <styletype='text/css'> div.tabs-area { position:relative; z-index:2; width:100%; height:45px; padding:0;margin:0;overflow:hidden; } div.tabs-line { position:relative; z-index:1; width:100%; height:1px; top:-1px; border-top:1px solid #D3D9E6; } </style> <!--<![endif]--> <styletype='text/css'> ul.tabs { padding:0px;margin:0px; z-index:2; } ul.tabs li { list-style:none; display:inline; height:50px; } ul.tabs li a { padding:5px 20px 3px 20px; border:1px solid #D3D9E6; text-decoration:none; font-size:9pt; line-height:30px; color:#4B69AF; background:#E9ECF2; } ul.tabs li a:hover { background:#E8FFFF; } ul.tabs li a.active { background:#fff; color:#4B69AF; border:1px solid #D3D9E6; border-bottom: 1px solid #ffffff; padding:10px 20px 3px 20px; font-weight:bold; line-height:70px; } div.content { /* 컨텐츠 영역 박스 스타일 지정 하는곳 */ } div.show { display:block;} div.hide { display:none; } </style> <h3>IE6, IE7, FF2 Tabs</h3> <div> <divclass='tabs-area'> <ulclass='tabs'> <li></li> <li><aid='tab1'title="Tab1 Desc"href="javascript:tabs('1');"class='active'>Tab 1</a></li> <li><aid='tab2'title="Tab2 Desc"href="javascript:tabs('2');">Tab 2</a></li> <li><aid='tab3'title="Tab3 Desc"href="javascript:tabs('3');">Tab 3</a></li> </ul> </div> <divclass='tabs-line'></div> </div> <divid='content1'class='content show'> <h1>Content 1</h1> </div> <divid='content2'class='content hide'> <h1>Content 2</h1> </div> <divid='content3'class='content hide'> <h1>Content 3</h1> </div> </body> </html> http://blueb.net/blog/1224
by Anna 안나 2008. 7. 9. 19:21
<head>
<STYLE type='text/css'>
li.1 { list-style-type : lower-roman } /* 로마숫자 소문자으로된 목록 */
li.2 { list-style-type : upper-roman } /* 로마숫자 대문자으로된 목록 */li.3 { list-style-type : lower-alpha } /* 알파벳 소문자으로된 목록 */
li.4 { list-style-type : upper-alpha } /* 알파벳 대문자으로된 목록 */
li.5 { list-style-type : disc } /* 점으로 된 목록 */
li.6 { list-style-type : circle } /* 속이 하얀색 원으로 된 목록 */li.7 { list-style-type : square } /* 사각형으로 된 목록 */li.8 { list-style-type : decimal } /* 숫자로 된 목록 */li.9 { list-style-type : none } /* 아무 표시 없음 */</STYLE>
</head> 리스트 태그(ul, ol, li)와 같은 기능을 CSS로 만들기.(list-style-type)

<ol>
<LI class='1'>리스트 항목 lower-roman</LI>
<LI class='2'>리스트 항목 upper-roman</LI>
<LI class='3'>리스트 항목 lower-alpha</LI>
<LI class='4'>리스트 항목 upper-alpha</LI>
<LI class='5'>리스트 항목 upper-alpha</LI>
<LI class='6'>리스트 항목 disc</LI>
<LI class='7'>리스트 항목 circle</LI>
<LI class='8'>리스트 항목 square</LI>
<LI class='9'>리스트 항목 none</LI>
</ol> 출처 : http://bbs.freecount.net/bbs/bbs.php?m=view&bid=study_2&id=21&page=1&cate=&q=
by Anna 안나 2008. 7. 9. 19:20
버젼 관리의 필요성

여러 사람이 함께 작업할 경우 작업 결과를 모아두는 곳이 필요하다. 이때 쉽게 떠올릴 수 있는 것이 FTP 서버나 공유 서버에 작업 결과물을 모아둘 저장소를 만들어 두는 것이다. 그 저장소에는 프로그램의 소스 코드도 있을 것이고, 개발 과정을 정리한 문서, 프로그램에서 사용하는 라이브러리 등도 있을 것이다.

각각의 개발자는 작업을 하기 위해서 그 저장소에 저장된 파일을 가져와서 자신의 로컬 PC에 복사본을 만들어서 작업을 수행한다. 그런 다음 작업이 끝나면 다시 그 결과물을 저장소에 넣어둘 것이다. 이런 상황에서는 몇 가지 문제점이 발견된다.

우선 서로 다른 두 명의 개발자가 동시에 같은 파일을 복사해서 작업한 다음 저장소에 올리는 경우를 생각해보자. 열심히 작업을 해서 한 명이 먼저 작업을 끝내서 저장소에 올렸다. 잠시 후에 그 사실을 모르고 있는 또 다른 개발자가 저장소에 자신의 작업 결과물을 저장소에 보내는 순간 덮어쓰기가 일어나며 앞선 개발자의 작업은 덧없이 날아가 버린다.

물론 저장소에 올리기 전에 내가 내려 받은 파일의 최종 수정일을 기록해뒀다가, 올리기 전에 서버의 최종수정일이 변하지 않았는지를 확인하면 되지만 너무나 귀찮은 일이다.

혹 그런 귀찮음을 무릅쓰고 철저하게 확인을 한다 하더라도, 날짜가 변경되어 있을 때 도대체 누가 어떤 목적으로 그 파일의 어떤 부분을 수정했는지 알아내려면 모든 개발팀에게 “누가 언제 왜 어떤 목적으로 어떤 부분을 수정했나요?”하고 일일이 물어봐야 한다.

물론 이러한 확인이 이뤄진 후에도 앞서 작업한 개발자와 상의해서 서로 다른 두 개의 결과물을 조정해서 합의된 최종 결과물을 만든 후에 서버에 올리는 것도 여러분의 몫이다.

또 다른 경우는 며칠 전의 상태로 작업 결과를 되돌려야 하는 상황이 발생할 때이다. 1차 개발을 완료한 시점에서 추가적인 요구 사항을 처리하기 시작했다고 가정해보자. 이 때 잘못된 판단으로 도저히 회복하기 힘든 큰 실수를 저질러서 차라리 1차 개발이 완료된 시점에서 다시 개발하는 것이 좋을 때도 있을 것이다.

단순한 공유 서버를 사용했을 때 이런 상황을 해결하기 위한 방법은 전체 작업 결과물을 특정 날짜 별로 복사해서 따로 관리하는 것이다.

이 방법은 물론 특정 날짜의 작업으로 되돌릴 수 있지만, 작업 결과물의 덩치가 크고 개발기간이 길수록 불필요한 디스크의 낭비가 심해진다. 만일 2시간 전의 상태로 저장소를 되돌리고 싶다면 어떻게 할까?

매 시간마다 또 특정 태그를 붙인 복사본을 만들면서 작업을 할 것인가? 또 어떤 내용은 그대로 두고 특정 파일만을 이틀 전의 상태로 되돌리고 싶을 때는 어떻게 할 것인가?

소프트웨어의 큰 특징 중 하나는 프로젝트가 진행되는 기간 동안 그 소프트웨어는 계속해서 변경된다는 것이다. 이 때 변경되는 것은 여러분이 작성한 코드 뿐 아니라, 관련된 문서나 적용하는 라이브러리를 포함한 프로젝트의 모든 산출물이다.

여러 명이 동시에 작업하는 프로젝트라면 그러한 변경으로 인해 모든 개발자의 작업이 영향을 받게 된다. 바로 이런 문제들을 해결하기 위해 등장한 것이 바로 버전관리 시스템이다.


요약하자면


개발 버전과 릴리즈 버전이 섞이지 않고 쉽게 관리 할 수 있습니다.
소스를 잘못 수정 했더라도 기록이 남고 되돌리기가 쉽습니다.(많은 파일의 경우 유용)
수정, 추가, 삭제 등의 기록이 모두 남고 변경 사항을 추적하기 쉽습니다.
개발자들이 따로 따로 백업을 하지 않아도 됩니다.

버전 관리 시스템의 종류
현재 나와 있는 소프트웨어 버전 관리 시스템은 여러 종류가 있습니다. 각각 장단점이 있습니다.


- CVS (Concurrent Version System) : 가장 널리 사용되며 역사가 깊은 버전 관리 시스템입니다. http://www.cvshome.org

- Subversion : CVS의 단점을 개선하고 CVS를 대체할 목적으로 개발 되었습니다. 이 문서에서 설명할 버전 관리 시스템입니다. http://subversion.tigris.org

- Visual Sourcesafe : Microsoft에서 만든 버전 관리 시스템입니다. CVS와는 버전 관리 관점에서 조금의 차이점이 있습니다. 윈도우 기반 소프트웨어의 버전 관리를 할 때 자주 사용됩니다. http://msdn.microsoft.com/ssafe/

- Clear Case : Rational이라는 회사에서 만든 버전 관리 시스템입니다. 지금은 IBM에 합병되었습니다. 상용 소프트웨어입니다. http://www-306.ibm.com/software/rational

- BitKeeper : 리눅스 커널이 BitKeeper를 이용해서 개발 하고 있습니다. 상용 소프트웨어입니다. http://www.bitkeeper.com


SVN 과 CVS의 차이점

- 소스 코드 뿐 아니라 바이너리 파일, 문서 지원 - 커밋의 단위가 파일이 아니라 변경된 작업 단위
- 디렉토리, 파일별로 세밀한 접근 가능
- CVS에 비해서 빠르다.



SVN 기본 용어 정리

리비전 (rivision) : 변경들의 논리적인 단위(?), 변경 집합이라고 해석한 책도 있음 리비전 번호 (rivision %d) : 변경들의 논리적인 증가, 0부터 새로운 변경 집합이 발생하면 1 증가

저장소 (repository) : 여러 가지 버전들을 저장하는 하나의 장소 작업본 (working copy) = 작업 디렉토리 (working directory) = 작업장 (workspace) : 저장소의 파일들은 직접 변경할 수 없다. 변경하기 위해서는 저장소의 파일들을 작업하는 컴퓨터 시스템(즉, 로칼)으로 받아 사용해야 한다. 이런 저장소의 파일들이 로칼에 저장되는 공간을 workspace라고 한다. 체크 아웃 (check out) : 작업장을 처음 사용하기 위해서는 저장소에서 필요한 파일들을 받아야 한다. 처음으로 작업장에 파일을 채우는 과정을 "체크 아웃"이라 한다. 체크 아웃(쉽게 다운로드)을 통해 작업장에 최신 파일이 저장된다. 체크 아웃의 주어를 "파일들"이라고 생각하면 이해가 쉽다. 파일이 호텔(=저장소)에 들어가 숙박(=저장) 후 호텔을 나와 직장(=작업장)에 일하러 가기 위해 프런트에서 "체크 아웃"한다고 생각해보자. 그러면 이해가 쉽다. 커밋 (cummit) : 작업 후에 작업장의 파일은 변경된다. 이 변경된 파일들을 다시 저장소에 저장하고 싶을 때, 저장소에 다시 올려 보내는 것(쉽게 업로드)을 '커밋'이라 한다. 커밋하게 되면 리비전의 번호가 증가하게 된다. 갱신 (update) : 지난 작업을 마치고 커밋한 이후에 다른 사람이 저장소의 파일을 변경(커밋)할 경우가 있다. 있든 없든, 변경 여부를 확인하기 위해(=변경 여부를 작업장에 반영하기 위해) 작업장의 파일들을 갱신 하는 과정을 거친다. 이를 체크 아웃이라고 설명하는 책, 문서 등등도 있다. 태그 (tag) : 특정 시점(리비전)에 태크(=이름)을 부여하여 기억하기 쉽게 할 수 있다. 그 태크를 이용해서 체크 아웃할 수 있다. 체크 인 (check in) : commit Import : 저장소에 파일들을 집어 넣는다. svn import 명령 차이 (diff) : 리비전 간의 코드의 차이점, 작업중인 버전과 HEAD(=저장소의 최신버전)을 비교할 때 [ + ] 기호는 작업장에서 변경된 부분, [ - ] 기호는 다른 사용자에 의해 변경된 부분을 표시하는데 사용 svn diff 명령 패치 (patch) : svn diff 명령의 출력을 파일에 저장하면 그 자체가 패치다. 패치를 이용한 갱신은 patch 명령


윈도우에서 SVN을 사용하기 위해 필요한것들

1. SVN

2. 아파치

3. Tortoise http://beehone.egloos.com/1945767
by Anna 안나 2008. 7. 6. 23:07
Version Control System에서 공통적으로 사용하는 용어들 저의 잘못된 번역으로 인한 오해와 잘못된 지식의 전달을 우려해서 원문과 함께 번역문을 기술합니다. ! NOTICE ! This article is excerpted from http://en.wikipedia.org/wiki/Revision_control Baseline (베이스 라인) An approved revision of a document or source file from which subsequent changes can be made. 계속 변경된 문서 또는 소스파일의 승인된 리비전 Branch (가지,분기,브랜치) A set of files under version control may be branched or forked at a point in time so that, from that time forward, two copies of those files may be developed at different speeds or in different ways independently of the other. 시간상 어떤 시점에서 버전 관리하의 한 셋트의 파일들은 분기될 수 있다. 그래서 그 분기 시점 이후 이러한 파일들의 두 복사본들은 서로 독립적으로 다른 속도로 또는 다른 방법으로 개발될 수 있다. Check-out (체크아웃) A check-out (or checkout or co) creates a local working copy from the repository. Either a specific revision is specified, or the latest is obtained. 체크 아웃은 저장소로 부터 로컬 작업본을 생성한다. 특정 리비전이 명시되거나 최근 리비전이 획득된다. Commit (커밋, 체크인) A commit (check-in, ci or, more rarely, install or submit) occurs when a copy of the changes made to the working copy is written or merged into the repository. 작업본에 변경이 있거나 저장소로 병합되었을 때 커밋이 일어난다(발생한다). Conflict (충돌) A conflict occurs when two changes are made by different parties to the same document, and the system is unable to reconcile the changes. A user must resolve the conflict by combining the changes, or by selecting one change in favour of the other. 충돌은 동일한 문서에 다른 부서에 의해 두개의 변경있을 때 그리고 시스템이 변경사항들을 조정, 일치시킬수 없을 때 발생한다. 사용자는 변경사항들을 결합하거나 하나의 변경을 선택함으로써 충돌을 해결해야만 한다. Change (변경) A change (or diff, or delta) represents a specific modification to a document under version control. The granularity of the modification considered a change varies between version control systems. 변경은 버전 관리하에 문서상에 특정 수정을 말한다. Change list (변경 리스트) On many version control systems with atomic multi-change commits, a changelist, change set, or patch identifies the set of changes made in a single commit. This can also represent a sequential view of the source code, allowing source to be examined as of any particular changelist ID. 극소 다중 변경 커밋을 지원하는(?) 많은 버전 관리 시스템에서, 변경 리스트, 변경 셋, 패치는 단일 커밋에 있어서의 변경사항들의 한 셋트이다. 이는 소스코드의 순차적인 관점을 나타내며, 어느 특정한 변경 리스트 ID로서 소스가 검사되도록 한다. Dynamic stream (동적 스트림) A stream (a data structure that implements a configuration of the elements in a particular repository) whose configuration changes over time, with new versions promoted from child workspaces and/or from other dynamic streams. It also inherits versions from its parent stream. 스트림(특정 저장소에서 요소들의 구성을 수행하는 데이타 구조)의 구성은 자식 워크스페이스 또는 다른 동적 스트림에 의해 시간에 따라 변경된다. 이는 부모 스트림으로 부터 버전을 상속한다(물려받는다). Export (엑스포트) An export is similar to a check-out except that it creates a clean directory tree without the version control metadata used in a working copy. Often used prior to publishing the contents. 엑스포트는 작업본에서 사용되는 버전 관리 메타데이타 없이 순수한 디렉토리 트리를 생성한다. 종종 항목들을 공표하기에 앞서 사용된다. Head (헤드, 최신 리비전) The most recent commit. 가장 최근의 커밋 Import (임포트) An import is the action of copying a local directory tree (that is not currently a working copy) into the repository for the first time. 임포트는 처음에 (현재의 작업본이 아닌) 로컬 디렉토리 트리를 저장소로 복사하는 작업이다. Mainline (메인 라인) Similar to Trunk, but there can be a Mainline for each branch. Trunk와 유사하지만 각 브랜치에 대한 메인라인이 있다. Merge (병합) A merge or integration brings together two sets of changes to a file or set of files into a unified revision of that file or files. 병합 또는 통합은 파일 또는 파일 세트상의 두 변경 세트를 파일 또는 파일들의 단일 리비전으로 만든다. This may happen when one user, working on those files, updates their working copy with changes made, and checked into the repository, by other users. Conversely, this same process may happen in the repository when a user tries to check-in their changes. It may happen after a set of files has been branched, then a problem that existed before the branching is fixed in one branch and this fix needs merging into the other. It may happen after files have been branched, developed independently for a while and then are required to be merged back into a single unified trunk. Repository (저장소) The repository is where the current and historical file data is stored, often on a server. 저장소는 현재 그리고 옛 파일 데이타가 서버상에 저장되는 곳이다. Reverse integration (역 통합) The process of merging different team branches into the main trunk of the versioning system. 다른 팀 분기를 버전 시스템의 주요 본체(trunk)로 병합하는 프로세스이다. Revision (리비전, 버전) A revision or version is one version in a chain of changes. 리비전 또는 버전은 일련의 변경사항들에 있어서 한 버전이다. Tag (태그) A tag or release refers to an important snapshot in time, consistent across many files. These files at that point may all be tagged with a user-friendly, meaningful name or revision number. 태그 또는 릴리즈는 일관된 많은 파일들과 시간상의 중요한 스냅샷을 참조로 한다. 이 시점에서의 파일들은 친숙한, 의미있는 이름 또는 리비전 넘버로 태그될 수 있다. Trunk (트렁크, 본체) The unique line of development that is not a branch (sometimes also called Baseline or Mainline) 분기가 아닌 개발의 유일한 라인이다. (때때로 베이스 라인 또는 메인 라인으로 불려진다.) Resolve (해결) The act of user intervention to address a conflict between different changes to the same document. 동일 문서상에 다른 변경사항들 사이의 충돌을 설명하기 위한 사용자 중재 활동이다. Update (갱신) An update (or sync) merges changes that have been made in the repository (e.g. by other people) into the local working copy. 갱신은 (다른 사람에 의해) 저장소에서의 변경 사항을 로컬 작업본에 병합한다. Working copy The working copy is the local copy of files from a repository, at a specific time or revision. All work done to the files in a repository is initially done on a working copy, hence the name. 작업본은 저장소로 부터 특정 시간 또는 리비전의 파일 로컬 복사이다. 저장소에서 파일들에 모든 작업의 완료는 초기에 작업본에 완료된다. Version Control System에서 알아두어야 할 용어
by Anna 안나 2008. 7. 6. 17:27
버그 관리의 중요성 팀 단위로 개발을 할 경우 서로가 서로의 버그를 발견하는 경우가 있는데, 많은 경우 구두로 이러한 과정이 이루어진다. 간단하면서도 심각한 버그라면 발견시 바로 해결하기도 하지만, 많은 버그들이 뒤로 미루거나 다른일과 겹치거나 하면서 잊혀져 버진다. 그 결과 버그가 계속적으로 누적되고, 발생했던 버그가 또 다시 발생하고 이 버그가 해결했던 버그인지 아닌지도 헷갈리고 해결해야 되는건지 아닌건지도 헷갈리는 최악의 상황에 도달하게 된다. 때에 따라서는 소모적인 책임공방도 벌어지게 된다. 메일로 발견된 버그를 보고하면 그나마 좀 낳긴 하지만 임시방편일 뿐이라는 건 사용해본 사람은 안다. 결국 프로젝트는 이런저런 자잘한 버그들 때문에 문제가 계속되고 어찌어찌해서 급하게 출시를 하더라도 완성도가 떨어지는 제품을 고객에게 내놓게 된다. 버그 관리 버그를 관리하고 감시하기 위해서는 버그에 대해서 심각도와 우선순위등을 할당하게 된다. 그래서 아래의 용어에 대해서 명확히 이해를 하고 있어야 버그관리가 제대로 이루어질 수 있을 것이다. 버그 심각도 (Severity) Blocker :개발 혹은 테스트 작업을 진행할 수 없게 만듦 버그 처리 결과 버그에 어떤 일이 발생했는지 나타낸다. FIXED (해결됨) : 테스트가 완료되었으며 버그 트리에 해결되었다고 표시된다. INVALID (버그아님) : 기술된 문제는 버그가 아니었음. WONTFIX (해결불가) : 기술된 문제는 해결될 수 없는 버그이다. LATER (나중에) : 기술된 문제는 본 제품에서는 수정될 수 없다. 차후 제품에 수정이 가능할 수 있다. REMIND (기억할 것) : 기술된 문제는 본 제품의 현재 버전에서는 수정할 수 없는 버그이지만, 앞으로 계속 영향을 끼칠 것으로 예상된다. DUPLICATE (중복됨) : 기술된 문제는 기존의 버그와 중복되었다.(혹은 유사 버그가 이미 존재함) 버그를 중복되었다고 표시하기 위해서는 기존의 버그 번호를 필요로 한다. WORKSFORME (파악할 수 없음) : 버그를 재현해 보려고 많은 노력을 기울였지만 실패했으며, 생성된 코드를 분석해봐도 왜 보고된 문제가 발생했는지를 파악할 수 없는 상태이다. 이 문제를 해결하기 위해서는 추가적인 정보가 필요하고, 그럴경우 이 버그는 다시 할당될 수 있다. 혹은 문제를 파악할 수 있을 만한 다른 개발자에게 할당할 수 있을 것이다. [출처] Bug Tracking System에서 알아두어야 할 용어|작성자 지연아빠 Critical : 프로그램이 깨지거나, 데이터 손상 및 메무리 누수가 발생함 Major : 기능상 중요한 결정이 발견됨 Normal : 일반적인 문제로 반드시 고쳐야할 버그 Minor : 기능상 그리 중요하지 않은 결점 혹은 쉽게 해결할 수 있는 문제 Trivial : 오탈자, 텟스트 정렬 문제와 같은 외형적인 문제 Enhancement : 기능 및 성능 개선 관련 사항 버그 처리 우선순위 (Priority) 즉시 (P1) : Prevents work from getting done, causes data loss, or BFI("Bad First Impression") 가장 먼저 처리해야함 긴급 (P2) : Workaround required to get stuff done. 보통 (P3) : Like P2, but rarely encountered in normal usage. 낮음 (P4) : Developer concern only, API stability ro cleanliness issue. 없음 (P5) : Nice to fix, but in a pinch we could live with it. 가장 나중에 처리해도 됨 버그 상태 정보 UNCONFIRMED (승인되지 않음) : 최근에 테이터베이스에 등록된 버그로, 아무도 이 버그에 대해서 확인을 해보지 않았다. 즉 아직 버그인지 아닌지도 검증이 되지 않은 상태다. 등록된 버그를 Confirm할 수 있는 사용자는 이 버그를 승인할 수 있으며, NEW(새로운 버그)로 하거나 해결될 경우 RESOLVED등의 상태로 변경이 가능하다. NEW (신규 버그) : 이 버그는 최근에 버그를 할당받은 담당자에 의해서 버그로 인정되었으며, 이에 대한 처리가 이루어져야 한다. 이 상태의 버그는 수락(accept)될 수 있으며, 필요한 경우 다른 사람에게 전달될 수(ASSIGNED)있다. 만약 다음 단계로 더 이상 진행이 안된다면 계속 NEW상태로 남아 있을 것이고, 문제가 해결된다면 RESOLVED 상태로 전이될 수 있을 것이다. ASSIGNED ( 할당됨 ) : 이 버그는 아직 해결되지 않았지만, 버그를 처리할수 있는 적합한 사람에게 할당되어져 있음을 의미한다. REOPENED (다시 오픈됨) : 이전에 해결(CLOSED)되었던 버그라고 하더라도 다시 재현될 수 있고, 혹은 담당자가 봤을 때 버그처리가 명확하게 되어있지 않음을 인지할 수도 있을 것이다. 이 경우 REOPENED 상태가 될수 있을 것이다. 이 상태의 버그들은 ASSIGNED 혹은 RESOLVED 상태로 전이될 수 있다. RESOLVED (처리됨) : 처리가 되었으며, 품질보증(QA) 담당자의 검증을 기다린다. 이 상태의 버그들은 REOPENED, VERIFIED 상태로 혹은 CLOSED 상태로 전이될 수 있다. VERIFIED (검증됨) : QA 담당자가 버그와 처리결과를 보고 적절하게 처리가 완료되었는지를 검증하게 된다. CLOSED (닫힘) : 버그가 완전히 사라졌다고 간주되는 상태다. 그러나 불행히도 다시 살아나는 경우가 발생할 수 있는데, 이때는 REOPENED 상태가 되어야 한다. http://blog.naver.com/eddykim72?Redirect=Log&logNo=40040460022
by Anna 안나 2008. 7. 6. 17:25
웹에서 리스트를 만들면 때로는 제목이나 기타등등이 길어질 때가 있다
이때 많은 사람들이 substring 을 해서 점을 붙이는 형태로 작업을 하는데, 영어나 한글 등의 언어에 따라 길이가 제각각이 되므로 보기에 상당히 안 좋다.

제목이 긴경우 ... 으로 해준다
<div style="position:relative; width:100px; text-overflow:ellipsis; overflow:hidden; cursor:hand"><nobr>텍스트 어쩌구저쩌구 이러쿵 저러쿵...</nobr><div>


<table width="100%" border="1" class="v1" style='table-layout:fixed'>
<tr>
<td width="50"><img src="<?=$strImage?>" width="50" height="50"></td>
<td width="100%">
<div style='width:100%;height:16px;overflow:hidden;text-overflow:ellipsis'><nobr><b><?=$strTitle?></b></nobr></div>
</td>
</tr>
</table>
by Anna 안나 2008. 7. 6. 01:38
보통 css 에서 폰트 속성을 지정할 때 아래와 같이 하지요...

{font-family:굴림; font-size:9pt; color:black}

이것을 좀 더 간단하게 지정할 수 있습니다.

{font:9pt "굴림"; color:black}
by Anna 안나 2008. 6. 30. 18:13
설치 방법에 대한 기본 준비물은 자신이 사용할 웹 서버 계정과 FTP 프로그램, 그리고 현 시점에서 배포중인 MM게시판 배포 압축파일 입니다. 아래 설명글은 미리내 웹 서버, 알 FTP, MMB 2.00 기준으로 작성했습니다. 1. 먼저 배포 포스트에 첨부되어 있는 mmb2-ion01.zip 파일을 다운로드 받습니다. 다운로드 받으시고 압축을 푸시면 사용하시는 압축 프로그램에 따라 다르지만 대략 mmb100-ion01 폴더 안에 파일들의 압축이 풀립니다.
((-------IMAGE-------)) 2. mmb2-ion01 폴더 안에는 mmb라는 폴더가 있으며, mmb 폴더 안에는 아래 그림과 같이 php 파일들과 폴더 세개가 있습니다. mmb 폴더의 이름은 원하시는대로 마음대로 바꾸셔도 좋지만 한글은 피하시는 편이 좋습니다. 아래 설명에서는 그대로 mmb 상태인 채로 설명합니다. ((-------IMAGE-------)) mmb 폴더안에서 env.php 파일을 "워드패드"로 엽니다. 파일 내용중에서 //---------------- 사이에 $cfg_admin_passwd = " ~ "가 있습니다. 큰 따옴표("") 사이에 띄어 쓰기 없이 원하시는 관리자 비밀번호를 바꿔줍니다. 그 줄 아래의 $cfg_member_passwd는 회원 인증 비밀번호입니다. 이것도 큰 따옴표 사이를, 관리자 비밀번호와 다르되, 간단한 비밀번호로 바꿔주신 후 저장하시고 env.php 파일을 닫습니다. 3. FTP 프로그램을 켜고 자신이 사용하는 계정에 접속합니다. 화면에 서 "접속하기" 버튼을 누르시만 아래와 같이 창이 하나 뜹니다. ftp 주소란에는 자신이 사용하는 계정의 ftp 주소를, (미리내 경우엔 아래에서 ***** 부분을 자신의 아이디나 계정명으로 바꾸시면 됩니다.) 사용자 아이디에 계정명을, 비밀번호란에 계정 비밀번호를 적으시고 반드시 Passive Mode 패시브 모드 에 체크하신 후 확인 버튼을 누릅니다. ((-------IMAGE-------)) 4. 아래는 정상적으로 자신의 웹 서버 계정에 접속한 모습입니다. 사용하시는 웹 서버마다 환경은 다르지만, 미리내 경우엔 / 아래에 html 폴더가 있는 모습이 보이실겁니다. ((-------IMAGE-------)) 5. html 폴더 안을 들어갑니다. 뭔가 잡다한 파일이 많습니다만.. 그냥 둡니다. ((-------IMAGE-------)) 6. 아래 그림에서, 윗 화면은 "웹 서버" 쪽의 상태를, 아래쪽은 "자신의 하드의 폴더" 를 나타냅니다. 아래쪽 화면에서, 아까 하드에 압축을 풀어 둔 mmb100-ion01 폴더 안으로 이동하신 후 mmb 폴더에서 마우스 오른쪽을 누르시고 "업로드" 를 누릅니다. ((-------IMAGE-------)) 7. 아래는 하드의 mmb폴더 내용물이, 웹 서버의 /html/mmb 폴더로 자동으로 업로드 되고있는 모습입니다. 죽~ 죽~ 다 올라갑니다.. 아래 빨간 화살표의 파일들이 전부 사라지면 다 올라간겁니다. ((-------IMAGE-------)) 8. 웹 서버에 하드의 mmb 폴더가 폴더 통째로 다 올라간 모습입니다. 웹서버 화면에서 mmb 폴더가 생겨있는것을 보실 수 있습니다. ((-------IMAGE-------)) 9. 웹서버의 mmb 폴더에서 마우스 오른쪽을 누르시고 권한설정을 누릅니다. (사용하시는 FTP 프로그램에 따라 "퍼미션" 이라고 되어있을 수 있습니다.) ((-------IMAGE-------)) 10. 권한 변경 창이 뜹니다. 거기에서 현재 Mode, 즉 권한의 숫자를 "755" 로 바꿔줍니다. 사용하시는 서버에 따라 다르지만 이미 755가 되어있을 수도 있습니다. 755가 맞으시면 "확인" 을 누릅니다. ((-------IMAGE-------)) 11. 웹 서버의 mmb 폴더안으로 들어가시면 폴더 3개와 php파일들이 쭉 보이실겁니다. 그 중에서, data 폴더와 image 폴더 두개를 선택하시고 마우스 오른쪽을 누르신 후 권한설정을 누릅니다. 그리고 권한을 "777" 로 바꾸시고 나서 "확인" 을 누릅니다. ((-------IMAGE-------)) 그리고 나서는 php 파일중에서, config_data.php 파일과 option_data.php 파일을 찾으시고 각각 마우스 오른쪽을 누르신 후 "권한설정"을 누르고 권한을 "666" 으로 바꾼 뒤 "확인"을 누릅니다. 다음으로는 data 폴더 안에 들어가셔서 blockw_data.txt, emote_data.txt 두 파일의 권한을 "666" 으로 바꾼 뒤 "확인"을 누릅니다. 즉, 11번 단계에서 폴더 2개와 파일 4개의 권한을 바꾸시는 겁니다. ((-------IMAGE-------)) 12. 게시판 설치가 끝났습니다. FTP 프로그램을 끄시고 익스플로러를 켜신 뒤 주소창에 자신이 비툴을 설치한 계정의 주소를 씁니다. 미리내 경우라면, 아래 그림에서 ***** 부분만 자신의 계정명을 쓰시면 됩니다. 다른 서버를 사용하시는 분은 http://웹서버주소/mmb(또는 바꾼 폴더이름) 입니다. ((-------IMAGE-------)) 13. 주소를 쓰신후 엔터를 치시면, 게시판 설치 후 최초로 접속 하셨을 때는 아래와 같은 메세지가 나타납니다. ((-------IMAGE-------)) 나타난 메세지를 따라서, 관리자 모드를 누르셔서 로그인 하신 뒤, 환경설정 란에 들어가셔야 합니다. ((-------IMAGE-------)) 환경설정 버튼을 누르면 아래와 같은 로그파일 생성 완료 메세지가 나타납니다. ((-------IMAGE-------)) 설치가 완료된 것입니다. 이후로는 사용하시기 편한 대로 게시판의 환경 설정을 바꾸시면 앞으로 mm 게시판을 사용하실 준비가 끝나신겁니다. btool 버튼을 누르시고 제대로 로그가 작성되는지 테스트 해보시길 바랍니다.
by Anna 안나 2008. 6. 22. 11:44
현재 작업하고있는 사이트의 자체 요구사항(Needs For Me)중 한가지가 크로스 브라우징이다. 모든 브라우저에서 이상없게 구현하기 위해선 CSS가 걸레가 될듯 싶고, 최소한 Firefox, IE6, IE7, Opera까지는 동일한 Layout을 보장받고 싶다. 작업하면서 특정 브라우저에 맞춰서 작업하다보면 다른 브라우저에선 여지없이 깨지는 상황을 겪게되었다. 가장 적은 삽질로 동일한 Layout을 보장 받을 수 있는 나름의 Tip은 Firefox를 base로 작업하고 IE7 Hack적용, IE6Hack적용 즉, 첫번째 작업의 기본브라우저를 Firefox로 한다. 두번째 IE7에서 Layout을 확인하고, 깨지는 부분에 대해서 IE7용 Hack을 적용한다. 세번째 IE6에서 Layout을 확인하고, 깨지는 부분에 대해서 IE6용 Hack을 적용한다. 이런경우 오페라는 거의 보너스로 Layout이 잘 맞는다. 더불어 IE7, IE6 적용 Hack은 다음과 같다. Only IE7 : *:first-child+html #dividname {

} Only IE6: *html #divname {

} --------------------------------------------- 이상 간단한 팁이었습니다. 꼭 위처럼 하지 않으셔도 됩니다. 하지만, 제딴엔 가장 효율적이라 생각되는 방법을 적어놓은것 뿐입니다.^^
by Anna 안나 2008. 6. 21. 19:59
패딩과 마진의 문제라면 DTD 설정을 하시면 파폭과 익스 모두에서 동일한 "박스모델"을 가지게 됩니다.
이부분을 검색 해보시면 보다 많은 정보를 접하실수 있습니다.

익스 : width = 박스의 width (패딩 마진등의 영향을 받지 않습니다 )
그외 브라우져 : width = width + padding + margin + border
여기서 DTD (검색신공)를 선언 해주시면
익스 + 그외 브라우져에서 동일한 박스 모델을 가져요.
by Anna 안나 2008. 6. 21. 19:23
※ 이 팁은 배경그림이 바뀌는 약간 조잡한 결과를 보여줍니다.


배경 패턴 이미지를 랜덤으로 보여주는 방법

미리보기(293가지 배경 랜덤 출력)
http://simulz.nayana.kr/zbxe/


이미지가 많을 때는 mt_rand()을 사용하는 것이 좋습니다.

이미지 폴더를 원하는 곳에 생성하여 이미지들을 넣고

이미지 파일명은 marble_95.jpg, mottled_198.jpg 등으로 숫자가 포함된 파일명으로 변경합니다.

가능한 1부터 순서대로 지정합니다.

레이아웃/layout.html 상단에 아래 소스를 알맞게 편집하여 삽입합니다.

{@ $img_rand = array(mt_rand(1, 100))} <style type="text/css"> body { background-image:url("/images/wallpaper/pattern/{$img_rand}.jpg"); } </style>


제가 사용중인 소스
{@ $img_array = array("marble_", "mottled_")} {@ $img_rand = array(mt_rand(1, 95),mt_rand(1, 198))} {@ $img_tag = mt_rand(0, 1)} <style type="text/css"> body { background-image:url("/images/wallpaper/pattern/{$img_array[$img_tag]}{$img_rand[$img_tag]}.jpg"); } </style>
by Anna 안나 2008. 6. 21. 15:22

안녕하세요.^^

일반적으로 제로보드에서 채팅 쓰시려면

위젯으로 배포된 가가채팅을 쓰고 계실텐데,,

가가채팅은 플래시로 짜여져서 정말 복잡하게 만들어진거라

정말 그 제작자의 정성이 듬뿍 담겨져 보입니다. :-)




저는, 위젯도 아니고 애드온도 아니고

그냥 채팅소스를 팁으로 올려드립니다.

편한데로 쓰세요.



채팅소스는 사리님의 블로그에서 배포중이시고요.
(http://www2.ssam.biz/blog/?tb=1&ct=6)

by Anna 안나 2008. 6. 8. 14:44
그동안 요청이 많았는데,
채팅방id에 한글되도록 수정했습니다.
((채팅방id에는 "한글영문_-"만 되고 "~`!@#$%^&*()+=|[]{}" 이건 안됩니다.))
..
ie6하고, ie7하고 Firefox에서 테스트했습니다.
한글제목의 파일 업다운도 문제없이 됩니다.

mysql 안쓰고, php파일 하나로 돌아갑니다.
압축풀어 폴더채로 업로드하고, chat폴더권한 777주고(설치끝),
index.php에 접속해서 사용하면 됩니다.




타이틀에 현재시간의 초가 나오도록 했습니다.
혹시 브라우저가 먹통이 되면,, 새로고침하라고,,,
방문자목록에 시간나오는건,, 그냥 허전해서 갖다붙인거고...
새글확인하는 과정하고는 무관해서,
새글확인하는 ajax함수가 먹통이 되더라도, 그건 그냥 돌아갑니다.
그래서 먹통여부가 그걸로는 판별이 안됩니다.
.. 그래서 새글확인하는 함수에서,
타이틀에 현재시간의 초를 출력하도록 했습니다.
by Anna 안나 2008. 6. 8. 10:56
요청으로 두가지를 수정했습니다.
첫째, 이미지링크를 클릭했을때,
이미지넓이가 소스7번줄에 정해진 것보다 크면, 소스7번줄에 정해진 넓이로 줄입니다.
그리고 이미지위에 [새창으로] [다운로드] 버튼을 달았습니다.
새창으로 : 새창으로 이미지를 띄우는 것이고,
다운로드 : 업로드한 이미지파일일때(외부url이 아니라), 바로 다운로드창이 뜹니다.

둘째, .htaccess파일로 내부파일의 외부접근(직접적인)을 막고 있는데,
그게 아마 apache서버에서만 되는 것으로 알고 있습니다.
그래서 그게 되지 않는 경우가 있어서, 업로드파일의 확장자제한을 요청하셨는데,
문제는 서버의 파싱(스크립트해석)입니다.
어떤 서버에서는 htm확장자파일도 파싱하고, 어떤 서버에서는 하지 않는등,
서버에 따라, 파싱되는 확장자가 다릅니다.

그래서 확장자는 여전히 제한하지 않고,
대신 업로드파일이 저장되는 폴더이름을,, 숨기는 방식으로 했습니다.

방장이 채팅방을 개설했을때, 방장의 PHPSESSID를 이름으로 해서, 업로드저장경로를 만들고,
upload.php파일을 생성시켜서, 그 내역을 저장하도록 했습니다.
그래서 파일업로드/다운로드 할때, upload.php파일을 인클루드해서
업로드저장경로의 변수정의를 얻도록했습니다.

upload.php 파일은 원래는 외부접근도 안되지만,
혹시 되더라도, 파싱된 결과만 보여지기 때문에 아무것도 안나오게 됩니다.

그러니까,, 업로드파일의 경로를 감추는 것입니다.
FTP로 열어보기전에는 어떤 폴더가 있는지 알수없도록..
물론 디렉토리목록이 그냥 출력되면, 허당입니다.
(간혹 그런곳이 있더군요. 경로까지의 주소만 넣으면, 그 경로안의 파일이 그냥 주루룩 나열되는)

셋째, 채팅방 한글아이디되도록 요청하셨는데,
요건 해보니,, 폴더가 생성이 안되는등..문제가 있어서,
뭔가 좀 더 복잡한 처리가 필요할거 같아서,,, 다음으로 미뤘습니다.

mysql 안쓰고, php파일 하나로 돌아갑니다.
압축풀어 폴더채로 업로드하고, chat폴더권한 777주고(설치끝),
index.php에 접속해서 사용하면 됩니다.
by Anna 안나 2008. 6. 8. 10:55
채팅방리스트에, 작은 채팅방.. 글이 두번씩 올라가길래 수정했습니다.


mysql 안쓰고, php파일 하나로 돌아갑니다.
압축풀어 폴더채로 업로드하고, chat폴더권한 777주고(설치끝),
index.php에 접속해서 사용하면 됩니다.
by Anna 안나 2008. 6. 8. 10:55
글쓰는 부분에 ajax함수를 비동기화에서 동기화로 바꿀라고 했는데,
하여튼 바꾸긴 했는데, 먼저도 그게 비동기식이었는지,, 잘 모르겠더군요..

하여튼 그래서, 자기가 글 올리고 새글바로 확인하는 간격을 0.2초로 했습니다.
.. 원래 읽어오는 주기가 0.2초 안에 있으면, 그냥 기다리고,
아니면 새글확인주기와 무관하게 다시 새글확인하도록 하는데,, 거기서의 기다리는 시간.
기존에 0.25초였었는데,, 0.2초로.. == 뭐 별 의미는 없습니다.

새글이 올라오면, document.title='새글이 올라왔습니다' 라고 표시됩니다.
새글이 없으면, 원래 채팅방에서 표시되는대로 '채팅방 - 채팅방id'로 돌아옵니다.
새글 확인주기가 대충 1초니까, 새글이 올라왔다는 표시도 1초동안 유지된다고 보면 되겠네요.


mysql 안쓰고, php파일 하나로 돌아갑니다.
압축풀어 폴더채로 업로드하고, chat폴더권한 777주고(설치끝),
index.php에 접속해서 사용하면 됩니다.
by Anna 안나 2008. 6. 8. 10:54
인코딩이 외부적으로 euc-kr / 내부적으로는 utf-8인
방문자목록없는 간단한 채팅소스를 수정한 것입니다.

새글이 올라오면 어떻게 표시해달라는 요청이 있어서,
document.title에 새글이 올라왔다는 문구를 적었습니다.
새글확인이 1초마다 이뤄지니까, 타이틀에 새글이 올라왔다는 문구는 1초동안 유지됩니다.
1초뒤에 새글이 없으면, 다시 채팅방으로 돌아가고..

간단한 수정인데, 꽤 유용하네요.
채팅소스에도 적용하면 좋을거 같습니다.

하여튼 좋은 기능을 제안해주셔서 감사합니다.
잘쓰세요...

아래는 소스. 위에는 업로드한 파일압축입니다.

그리고
FF에서 Enter로 글이 안올라가길래,
form을 달아서 Enter로 글이 올라가도록 했습니다.


<?
session_start();
$chat = "chat.php";
if($_POST[xname] || $_SERVER[QUERY_STRING]){
header ("Content-Type: text/html; charset=UTF-8");
header ("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header ("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header ("Cache-Control: no-cache, must-revalidate");
header ("Pragma: no-cache");
if($_POST[xname] && $_POST[text]) {
if(!$_SESSION[name] || $_SESSION[name] != $_POST[xname]) {
$_POST[xname] = str_replace('<', '&lt;', str_replace(' ', '', stripslashes(trim($_POST[xname]))));
$_POST[xname] = preg_replace("` [\s]`i", "", $_POST[xname]);
$_POST[xname] = preg_replace("`[\x1b\x18\x7f\t]`", "", $_POST[xname]);
if($_SESSION[name]) $nickc = "--\x1b<font class=mc><font class=mm>".$_SESSION[name]."</font> ==> <font class=mm>".$_POST[xname]."</font></font>\n";
session_unregister("name");
$name = $_POST[xname];
session_register("name");
}
if($_POST[xname]) {
$_POST[text] = preg_replace("`[\x1b\x18\x7f<]`", "", stripslashes($_POST[text]));
$nickc .= $_POST[xname]."\x1b".$_POST[text]."\n";
$fp = fopen("./_text", "a");
fputs($fp, $nickc);
fclose($fp);
if(filesize("./_text") > 2048) {
$fp = fopen("./_text", "r");
fread($fp, 1536);
fgets($fp);
while(!feof($fp)) $fpo .= fgets($fp);
fclose($fp);
$fp = fopen("./_text", "w");
fputs($fp, $fpo);
fclose($fp);
}
}
exit;
}
if($_GET[tex]) {
if(file_exists("./_text")){
if($_GET[tex] == -1) $_GET[tex] = 0;
$fze = filesize("./_text");
if($fze != $_GET[tex]) {
echo $fze."\x7f";
$fp = fopen("./_text", "r");
while(!feof($fp)) {
if($_GET[tex] && $fze > $_GET[tex]) fread($fp, $_GET[tex]);
if($fpo = trim(fgets($fp))) echo $fpo."\x7f";
}
fclose($fp);
}
}
exit;
}
if($_GET[delete] == "text" && $_SESSION[admin_pass]) {
$fp = fopen("./_text", "w");
fclose($fp);
}
exit;
}
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=euc-kr">
<title>채팅방</title>
</head>
<body>
<script>
function go() {
var url = '<?=$chat?>?tex=' + document.getElementsByName('ntim')[0].value;
if(window.ActiveXObject) {
var xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}
else if(window.XMLHttpRequest) {
var xmlHttp = new XMLHttpRequest();
}
xmlHttp.onreadystatechange = function(){
if(xmlHttp.readyState==4 && xmlHttp.status==200) {
var str = xmlHttp.responseText;
if(str) {
var vew = str.split("\x7f");
allc = vew.length -1;
if(allc > 1) {
document.getElementsByName('ntim')[0].value = vew[0];
if(document.getElementById('AA').innerHTML == '') str = "<table border=0 cellspacing=0 cellpadding=0 width=100% style='margin-bottom:20;table-layout:fixed'>";
else str = "";
for(i = 1;i < allc;i++){
var nam = vew[i].split("\x1b");
str += "<tr class=trh><td class=name>"+ nam[0] +"</td><td width=10>:</td><td class=memo>"+ nam[1] +"</td></tr>";
str += "<tr><td colspan=3 bgcolor=#E6E6E6 height=1><img height=1></td></tr>";
}
str += "</table>";
document.getElementById('AA').innerHTML = document.getElementById('AA').innerHTML.substring(0,document.getElementById('AA').innerHTML.length-8) + str;
document.getElementById('AA').scrollTop = 10000000;
document.title='새글이 올라왔습니다';
}
} else document.title = '채팅방';
setTimeout('go()', 1000);
delete xmlHttp;
}
}
xmlHttp.open("GET", url, true);
xmlHttp.send(null);
}

function wte(){
if(window.ActiveXObject) {
var xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}
else if(window.XMLHttpRequest) {
var xmlHttp = new XMLHttpRequest();
}
var param = '<?=$chat?>?&xname='+ document.getElementsByName("xname")[0].value.replace(/[&'"]/gi,"") +'&text='+ document.getElementsByName("text")[0].value.replace("&","%26");
xmlHttp.open("POST", param, true);
xmlHttp.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
xmlHttp.setRequestHeader("Content-length", param.length);
xmlHttp.setRequestHeader("Connection", "close");
xmlHttp.onreadystatechange = function(){
if(xmlHttp.readyState==4 && xmlHttp.status==200) {
document.getElementsByName('text')[0].value = '';
document.getElementsByName('text')[0].focus();
delete xmlHttp;
}
}
xmlHttp.send(param);
}
window.onload = function(){setTimeout("document.getElementsByName('ntim')[0].value='-1';", 50);}
setTimeout('go()', 100);
</script>
<center>
<table border=0 cellspacing=0 cellpadding=5 width=330 style='border:1px solid black'>
<tr height=200><td colspan=3><div id=AA style='width:320;height:200'></div></td></tr>
<tr height=30><td colspan=3><form onsubmit="wte();return false;" style="margin:0"><input type=text name='xname' maxlength=10 style='width:65' value='<?=iconv('UTF-8', 'CP949//IGNORE', $_SESSION[name])?>'>
<input type='text' name='text' style='width:200;'>
<input type='submit' value='쓰기' onclick="wte();return false;" class='button'>
<input type='hidden' name='ntim' value='-1'></form>
</td></tr>
</table>
</center>
<style>
body {font-size:9pt;font-family:gulim;word-break:break-all;}
td {word-break:break-all;font-size:9pt;}
.mm {color:#D7D7D7;font-weight:bold;font-family:gulim;text-align:center;padding-top:5}
.mc {color:#D7D7D7;font-family:gulim;text-align:center;padding-top:5}
.button {background-color:#D7D7D7;border:0;border:1px solid black;margin-right:4px;margin-left:4px;width:35px}
.name {width:50;padding-left:5;font-weight:bold;}
.memo {padding:5px 0px 5px 5px;width:210;}
.trh {padding:6px 0px 6px 0px;}
#AA {overflow-x: hidden; overflow-y: auto;background-color:#FFFFFF;border:1px solid black; }
</style>
</body>
</html>
by Anna 안나 2008. 6. 8. 10:54
예제는 우선 여기:http://whoami.webzero.co.kr/chat_/small.php

euc-kr 찾는 분이 있어서,, 만들었습니다. (물론 기존꺼 수정해서)

iconv를 많이 쓰게 될줄 알았는데,
별로 안쓰게 됐습니다.

하여튼,, 보여지는 부분은 euc-kr 이고,
보여지지 않는 기능적인 부분은 utf-8입니다.
뭐.. 그래도 브라우저에 인코딩은 euc-kr로 나오니까요......

이걸 인클루드하는 실험은 하지 않았는데,
아마 그냥저냥 될거 같습니다. (물론 euc-kr에)

소스 3줄에,
$chat = "index.php";
이렇게 있는데, 혹시 이걸 팝업등으로 독립적으로 띄우질 않고,
다른 곳에 이 소스를 인클루드할때라도,
처리하는 부분은 인클루드되지 않은, 이 파일 단독으로 작동시키기 위해섭니다.

아래가 소스인데,,, 아래내용을 텍스트에디터에 붙여넣고,
$chat = "index.php";
여기 이름하고 맞춰서 저장하면 됩니다. 저장되는 경로(폴더)의 권한은 777 주시고....

------
icov() -- php에서 텍스트의 인코딩바꾸는 함수 --
함수는 세션에 저장한 닉네임에 사용합니다.
닉네임이 바뀌었는지 계속 확인하니까,, 세션닉네임을 자주 거기서 쓰게 되는데,
그래서 세션닉네임을 UTF-8로 저장했습니다.
그래놓고, 창을 새로고침하거나 할때, 닉네임칸에 자동으로 들어갈 세션닉네임은
인코딩을 euc-kr로 바뀌어서 ... 들어가도록 했구요...

문제가 조금 있는게,
닉네임을 바꿨을때, 닉네임 바뀌었다고 뜨고, 그거 바꾸면서 올린 글이 안보입니다.
F5 새로고침해보면,, 나오는걸로 봐서,
저장이 안된건 아닌데, 읽을때,,, 이상하게 못읽어오는군요..
아마 닉네임을 바꾼 본인에게만 그럴겁니다.
우선은 닉네임 바꾸면 F5 (새로고침) 하세요.....

혹시나 그 문제인가해서,
글 올리는 부분이 ajax함수를 비동기화였던거에서 동기화로 바꿔봤는데,
마찬가지더군요...
어쨌거나,, 이왕 바꿨으니까,, 그건 그대로 갑니다.

<?
session_start();
$chat = "index.php";
if($_POST[xname] || $_GET[tex] || $_GET[delete]){
header ("Content-Type: text/html; charset=UTF-8");
header ("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header ("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header ("Cache-Control: no-cache, must-revalidate");
header ("Pragma: no-cache");
if($_POST[xname] && $_POST[text]) {
if(!$_SESSION[name] || $_SESSION[name] != $_POST[xname]) {
$_POST[xname] = str_replace('<', '&lt;', str_replace(' ', '', stripslashes(trim($_POST[xname]))));
$_POST[xname] = preg_replace("` [\s]`i", "", $_POST[xname]);
$_POST[xname] = preg_replace("`[\x1b\x18\x7f\t]`", "", $_POST[xname]);
if($_SESSION[name]) $nickc = "--\x1b<font class=mc><font class=mm>".$_SESSION[name]."</font> ==> <font class=mm>".$_POST[xname]."</font></font>\n";
session_unregister("name");
$name = $_POST[xname];
session_register("name");
}
if($_POST[xname]) {
$_POST[text] = preg_replace("`[\x1b\x18\x7f<]`", "", stripslashes($_POST[text]));
$nickc .= $_POST[xname]."\x1b".$_POST[text]."\n";
$fp = fopen("./_text", "a");
fputs($fp, $nickc);
fclose($fp);
if(filesize("./_text") > 2048) {
$fp = fopen("./_text", "r");
fread($fp, 1536);
fgets($fp);
while(!feof($fp)) $fpo .= fgets($fp);
fclose($fp);
$fp = fopen("./_text", "w");
fputs($fp, $fpo);
fclose($fp);
}
}
exit;
}
if($_GET[tex]) {
if(file_exists("./_text")){
if($_GET[tex] == -1) $_GET[tex] = 0;
$fze = filesize("./_text");
if($fze != $_GET[tex]) {
echo $fze."\x7f";
$fp = fopen("./_text", "r");
while(!feof($fp)) {
if($_GET[tex] && $fze > $_GET[tex]) fread($fp, $_GET[tex]);
if($fpo = trim(fgets($fp))) echo $fpo."\x7f";
}
fclose($fp);
}
}
exit;
}
if($_GET[delete] == "text" && $_SESSION[admin_pass]) {
$fp = fopen("./_text", "w");
fclose($fp);
}
exit;
}
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=euc-kr">
<title>채팅방</title>
</head>
<body>
<script>
function go() {
var url = '<?=$chat?>?tex=' + document.getElementsByName('ntim')[0].value;
if(window.ActiveXObject) {
var xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}
else if(window.XMLHttpRequest) {
var xmlHttp = new XMLHttpRequest();
}
xmlHttp.onreadystatechange = function(){
if(xmlHttp.readyState==4 && xmlHttp.status==200) {
var str = xmlHttp.responseText;
if(str) {
var vew = str.split("\x7f");
allc = vew.length -1;
if(allc > 1) {
document.getElementsByName('ntim')[0].value = vew[0];
if(document.getElementById('AA').innerHTML == '') str = "<table border=0 cellspacing=0 cellpadding=0 width=100% style='margin-bottom:20;table-layout:fixed'>";
else str = "";
for(i = 1;i < allc;i++){
var nam = vew[i].split("\x1b");
str += "<tr class=trh><td class=name>"+ nam[0] +"</td><td width=10>:</td><td class=memo>"+ nam[1] +"</td></tr>";
str += "<tr><td colspan=3 bgcolor=#E6E6E6 height=1><img height=1></td></tr>";
}
str += "</table>";
document.getElementById('AA').innerHTML = document.getElementById('AA').innerHTML.substring(0,document.getElementById('AA').innerHTML.length-8) + str;
document.getElementById('AA').scrollTop = 10000000;
}
} else window.status = '새 글이 없습니다.';
setTimeout('go()', 1000);
delete xmlHttp;
}
}
xmlHttp.open("GET", url, true);
xmlHttp.send(null);
}

function wte(){
if(window.ActiveXObject) {
var xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}
else if(window.XMLHttpRequest) {
var xmlHttp = new XMLHttpRequest();
}
var param = '<?=$chat?>?&xname='+ document.getElementsByName("xname")[0].value.replace(/[&'"]/gi,"") +'&text='+ document.getElementsByName("text")[0].value.replace("&","%26");
xmlHttp.open("POST", param, true);
xmlHttp.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
xmlHttp.setRequestHeader("Content-length", param.length);
xmlHttp.setRequestHeader("Connection", "close");
xmlHttp.onreadystatechange = function(){
if(xmlHttp.readyState==4 && xmlHttp.status==200) {
document.getElementsByName('text')[0].value = '';
document.getElementsByName('text')[0].focus();
delete xmlHttp;
}
}
xmlHttp.send(param);
}
window.onload = function(){setTimeout("document.getElementsByName('ntim')[0].value='-1';", 50);}
setTimeout('go()', 100);
</script>
<center>
<table border=0 cellspacing=0 cellpadding=5 width=330 style='border:1px solid black'>
<tr height=200><td colspan=3><div id=AA style='width:320;height:200'></div></td></tr>
<tr height=30><td colspan=3><input type=text name='xname' maxlength=10 style='width:65' value='<?=iconv('UTF-8', 'CP949//IGNORE', $_SESSION[name])?>'>
<input type='text' name='text' style='width:200;'>
<input type='submit' value='쓰기' onclick="wte()" class='button'>
<input type='hidden' name='ntim' value='-1'>
</td></tr>
</table>
</center>
<style>
body {font-size:9pt;font-family:gulim;word-break:break-all;}
td {word-break:break-all;font-size:9pt;}
.mm {color:#D7D7D7;font-weight:bold;font-family:gulim;text-align:center;padding-top:5}
.mc {color:#D7D7D7;font-family:gulim;text-align:center;padding-top:5}
.button {background-color:#D7D7D7;border:0;border:1px solid black;margin-right:4px;margin-left:4px;width:35px}
.name {width:50;padding-left:5;font-weight:bold;}
.memo {padding:5px 0px 5px 5px;width:210;}
.trh {padding:6px 0px 6px 0px;}
#AA {overflow-x: hidden; overflow-y: auto;background-color:#FFFFFF;border:1px solid black; }
</style>
</body>
</html> 보기 / 닫기
by Anna 안나 2008. 6. 8. 10:52
2008/6/5 이전의 mmb 1.27 버젼을 사용하시는 분들은 업로드 기능이 정상적으로 동작하지 않을 것입니다. 1.27 제작중에 실수로 업로드 기능부분 소스를 전혀 갱신하지 않아서 발생한 일입니다. 불편을 끼쳐드려 죄송합니다.

이 파일을 실행시키면 2개의 파일이 생성되는데, 이를 기존의 1.27 폴더안의 파일에 덮어쓰면 패치는 완료됩니다.
by Anna 안나 2008. 6. 5. 23:29
* 설치시 첨부된 readme.txt 파일의 뒷부분에 있는 설치방법을 꼭 참고하시기 바랍니다.
* 이 파일은 업로드 기능이 동작하지 않았던 버그가 패치된 파일입니다. 따라서 위에 등록된 1.27 업로드기능 패치파일을 사용할 필요가 없음을 알려드립니다.


1.27 갱신사항
--------------------------------------------------------------------------------------
1. index.php 파일의 복잡한 코드 부분을 대부분 함수화 하여 확장함수라이브러리(extend_lib.php)로 옮김으로서 index.php 파일 수정이 한결 용이하게 됨. (1.27 전용)

2. 기존 검색(search)루틴을 삭제. 새 검색루틴 삽입. (1.27 전용)
기존 방식에서는 검색표시 페이지와 메인 페이지가 search.php 와 index.php로 따로 존재하였으나 새 검색루틴에서는 인덱스파일 하나로 단일화 되어 파일수 감소 및 디자인 수정시에도 검색파일과 인덱스파일 수정에서 인덱스 수정만으로 감소됨. 또한 검색시에도 페이지 바를 이용한 이동이 가능해 지고 리플표시건수로 제한되어있던 검색건수 표시 제한이 없어짐. 또한 관리자모드 삭제시에도 검색후 검색결과를 유지한 채 삭제가 가능해짐으로서 관리 편의성 증대.

3. 기존 리플순 표시기능을 제거하고 상단의 리플순 링크를 표시, 클릭시 해당 게시물만 표시하도록 변경.(1.11.04.a 에서)

4. 환경설정에 전체로그 초기화 기능을 추가. 기능사용시 모든 로그정보 및 그림을 삭제함으로서 완전 초기화 시킴. 복구가 불가능하므로 사용시 주의 요망.(1.11.04.a & 2.00 공통 기능, 로직은 1.11.04.a 에서)

5. 약간이라도 서버 부하를 덜어주기 위해, 페이지바 생성에 필요한 로그파일을 읽는 회수를 감소시키도록 로직이 수정됨.(1.11.04.a 에서)

6. 공지사항 파일(notice.html) 위치가 새로운 skin_data 폴더 안으로 이동됨. (1.11.04.a 에서)

7. 1.11.02 에서의 리플추가시 실제 데이터를 삭제하는 루틴이 로그만 삭제할 뿐 실제 그림파일은 제거하지 않아 용량문제가 쉽게 발생할 수 있었던 버그를 그림 포스트시 보존갯수를 넘는 리플과 그림파일을 모두 삭제하도록 수정. (1.11.04.a 에서)

8. 1.11.03과 1.11.04 에서 제거되었던 이모티콘 미리보기 기능을 다시 포함 시킴. (1.11.04.a & 2.00 공통 기능, 로직은 1.11.04.a 에서)

9. 인덱스 화면에서 각 리플 표시시, 그림작성자가 리플을 달 경우에는 이를 표시하도록 개선됨. 그림 작성자 이외에는 모두 일반코멘트로 분류됨. (1.11.04.a 에서)

10. 공지사항을 환경설정에서 편집할수 있게 됨(1.27 전용)

11. 이모티콘 편집기능 추가(2.00 에서)

12. 에스카르고 리플레이 기능 추가 (2.00 에서)

13. 이모티콘 표시시 가로 표시갯수 조절기능 추가(2.00 에서)

14. 이모티콘 리스트 파일이 없을 경우 무한오픈 에러를 내는 버그를 수정(1.27)
by Anna 안나 2008. 6. 5. 23:28
Mic 님께서 제작하신 MMB v2.00 게시판 & 1.xx -> 2.00 데이터 변환툴, 2.00 -> 1.xx 변환툴 통합 파일. 실행시키면 3개의 압축파일이 생성됩니다.

자세한 기능 및 설명, 설치방법은 믹님의 블로그에 잘 설명되어 있으므로 참고하시기 바랍니다. 사용자 편의 기능이 크게 강화되었고, 로그초기화 문제도 상당히 완화되었습니다.

이 파일은 가장 최근의 패치(24일 두번째 패치)까지 적용된 파일입니다.
by Anna 안나 2008. 6. 5. 23:28
1.11 - 1.11.04에서 빠져있는 이모티콘 미리보기 기능 추가 패치파일입니다. 추가방법은 다운로드 받은 파일을 실행시켜 생성되는 폴더안에 있는 readme.txt 파일내에 설명되어 있습니다.

** 제작시는 M타입 1.03과 MMB 1.11.03 ~ 04 버젼에 호환을 고려하였으나 원칙적으로 M타입 1.03 부터 1.11.04 까지 호환 됩니다.
by Anna 안나 2008. 6. 5. 23:27
v1.11.03.a 에서 달라진 점

* 영문스팸방지처리. 완벽까진 못가도 대략 90%쯤 잡는것 같습니다. 처리추가후 영문스팸 한 두건 ? 본듯.

* 이모티콘 팝업 표시기능 교체

* ip, 작성툴, 시간 선택옵션 무효화 버그 수정
- 1.11.03.a 에서 수정했...는데 그만 깜빡 잊고 option_list 파일을 교체하지 않아서 제대로 움직이지 않고 있었습니다.(--) option_list.php 파일 교체.

* 페이지 이동 버튼 삭제, 페이지 이동 바 도입
- 제로보드 스타일의 페이지 이동 바를 적용했습니다. 서버에 약간 부담을 줄 수 있기에 심사숙고 했으나, 기존에 3페이지 이동버튼이 부정확하고, 기존의 전후 이동 버튼은 불편해서......원치 않으시는 분들은 1.11.03.a 를 그대로 쓰시면 됩니다.

* ip 옵션 off 시 화면 전체에서 ip 표시가 사라집니다.(리플 작성시 포함)

* 공지사항 기능 추가
- 공지사항 작성법 : v1.11.04 에 포함된 notice.html 파일이 공지사항의 샘플 예제입니다. 공지사항은 이렇게 notice.html 이란 이름으로 만들어 업로드 시킵니다.
작성형식은 보통의 html 그대로.
- 표시위치 : index.php 파일을 열어보면 <?=notice($notice);?> 이런 것이 있습니다. 이 부분에 공지사항이 표시되므로, 이 부분을 표시하기 원하는 위치로 옮겨주고 저장한뒤, 계정에 업로드 시키면 이후는 notice.html 파일을 갱신하는 것만으로 공지사항을 바꿔줄 수 있습니다.
- 공지사항 표시는 환경설정에서 off 시키면 notice.html 파일 존재여부에 관계없이 표시되지 않습니다.
by Anna 안나 2008. 6. 5. 23:26
** 이어그리기 오류를 수정(1.02 -> 1.03)

** 설명 **
오리지널 비툴 게시판, 즉 비툴만 있는 구형 게시판에 에스카르고를 선택할 수 있도록 추가하여 비툴+에스카르고게시판 으로 만들어주는 추가 업데이트 파일입니다.

압축을 풀어 나오는 4개의 파일을 계정에 그대로 업로드 하면(덮어씌우면) 업데이트는 완료됩니다.

** 재배포는 허용하지 않습니다.
** 제가 배포한 것과 다른 임의의 개변이나 수정이 가해진 소스의 경우 질문 및 문제해결, 업데이트 등의 서포트 대상에서 제외됩니다.
by Anna 안나 2008. 6. 5. 23:26
((-------IMAGE-------))

비툴 오리지널 게시판 입니다. 에스카르고가 없는 비툴 단독 게시판입니다. 소스의 여러부분이 2007.1월 기준으로 수정되어 있어 설치후 소스수정이 거의 필요없습니다. 참고로 이 게시판은 현재 반디님홈에서 서포트 하지 않으므로 반디님 홈에 질문하시지 마시고 이곳으로 해주시기 바랍니다.
이 게시판 설치방법은 FAQ 10번 게시물을 참조하면 됩니다. 다만 혼자서 아무리 해봐도 잘 안되는 경우에는 저도 시간이 많지는 않지만 자유게시판 쪽에 글 남기시면 여유가 되는대로 대신설치도 해드리겠습니다. 물론, 여유가 되면 말이죠.
by Anna 안나 2008. 6. 5. 23:25
오에카키 프리사이즈 통합 버젼 입니다.

비툴 1,2,0,2 버젼
오에카키 1.32 버젼
페인트 비비에스 2.22_8 버젼

총 3개 툴을 사용 할 수 있습니다.
by Anna 안나 2008. 6. 5. 23:23
시이-페인터 애플릿의 최신 1.11_4 버젼입니다.
by Anna 안나 2008. 6. 5. 23:23
| 1 2 3 4 5 6 7 |