Linux2011. 4. 13. 19:11
계속 error starting client-server protocol (code 5)가 떠서 고생했다. (사용자 인증에 문제가 있으면 뜨는 에러인 것 같다.)

클라이언트에서 rsync로 접속시 domain:path를 이용하면 ssh로 로그인을 시도하는 것 같다. 익명으로 접속하거나, 서버 계정이 아닌 rsync.secrets에 등록된 계정으로 접속하려면 domain::moduleName 또는 user@domain::moduleName을 사용해서 접속해야 한다.

/etc/rsync.secrets의 경우 plain text로 암호를 저장하고, 현재로서는 hash 기능을 제공하지 않는다. 그래서 root만 접근 가능하도록 설정되어 있다. 아무튼 암호 관리를 잘 해야 한다.

slp는 뭐하는 건지 아직 모르겠다.
read only = true
gid = users
use chroot = true
transfer logging = true
log format = %h %o %f %l %b
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
hosts allow = trusted.hosts
slp refresh = 300
use slp = false
motd file = /etc/rsyncd.motd

#[Example]
#       path = /home/Example
#       comment = An Example
#       auth users = user
#       secrets file = /etc/rsyncd.secrets

[moduleName]
        path = /path/to/data
        comment = Some comment
        uid = nobody
        gid = nobody
        use chroot = true
        read only = true
        hosts allow = 0.0.0.0/0 # ALL
#       auth users = user_name
#       secrets file = /etc/rsyncd.secrets
Posted by asdfzxcv
아직미분류2011. 4. 13. 04:20
\[e^{\pi i}+1=0\] 버전 1.1로 바꿨다. 버전 1.1이 되면서 CDN 기능이 제공되었기 때문에, 설치가 엄청 쉽다.
<script type="text/javascript"
src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_HTML">
</script>
이거 한 줄 넣고 --- 가로로 길어지면 블로그에서 이상하게 보여서 여기선 세 줄이지만 --- inline math는 \(\) 사이에 적으면 되고, display math는 \[\] 사이 또는 $$$$ 사이에 적으면 된다.
Posted by asdfzxcv
web2011. 4. 12. 20:40

Syntax Highlighter re-collapse addon


Syntax Highlighter의 설치 방법에 대해서는 http://noexists.tistory.com/172를 참고하면 된다.

Syntax Highlighter는 collapse 기능을 제공하는데, 기본적으로 한 번 expand 해버리면 다시 collapse가 안 된다. (Version 3.0.83 기준.) 인터넷을 뒤져봐도 version 3.0에 맞는 해결 방법이 나오지 않았고, ver. 2.0에 맞는 방법만 찾을 수 있었지만, ver. 2.0은 ver. 3.0과 구조적으로 너무 많이 달라서 적용이 불가능 했다. 그래서 직접 뜯어 고쳐서 re-collapse가 되도록 만들었다.

사실 shCore.js를 뜯어 고치면 더 쉽게 고칠 수 있는데, 가급적 원본에는 손을 대지 않고, 추가적인 코드만 적어서 뜯어 고치는 방법을 선택했다. (그렇게 하는 것이 관리가 편하다.) 그러나 몇몇 함수는 scope의 문제로 내가 원본의 함수를 call할 수가 없었다. 그래서 일부 함수는 어쩔 수 없이 copy and paste해야 했다.

그리고 collapse 기능이 활성화 된 경우에만, 수정된 코드가 작동하게 만들었다. 그렇지 않으면 collapse한 뒤, re-expand가 불가능해지는 사태가 발생할 수도 있기 때문이다. 그리고 expand의 기본 메시지도 제목만 나오는 것이 이상해서 조금 고쳤다.

결론적으로, shCustom.js와 shCustom.css를 만들어 업로드하고, 적절히 불러오면 된다. 당연한 얘기지만 shCustom를 나중에 불러와야 제대로 동작한다.

아무튼 완성(?)된 코드는 다음과 같다.
/* Copied from source of Syntax Highlighter 3.0.83
   by Alex Gorbatchev */
function hasClass(target, className)
{
        return target.className.indexOf(className) != -1;
};
function addClass(target, className)
{
        if (!hasClass(target, className))
                target.className += ' ' + className;
};
function removeClass(target, className)
{
        target.className = target.className.replace(className, '');
};
function getHighlighterId(id)
{
        var prefix = 'highlighter_';
        return id.indexOf(prefix) == 0 ? id : prefix + id;
};
function getHighlighterById(id)
{
        return sh.vars.highlighters[getHighlighterId(id)];
};
function getHighlighterDivById(id)
{
        return document.getElementById(getHighlighterId(id));
};
/* Customized by me */
SyntaxHighlighter.toolbar.items.list.push('collapseSource');
SyntaxHighlighter.toolbar.items.collapseSource = {
        getHtml: function(highlighter)
        {
                if (highlighter.getParam('collapse') != true)
                        return '';
                return SyntaxHighlighter.toolbar.getButtonHtml(highlighter,
                                                'collapseSource',
						'Collapse');
        },
        execute: function(highlighter)
        {
                if (highlighter.getParam('collapse') != true)
                        return;
                var div = getHighlighterDivById(highlighter.id);
                 addClass(div, 'collapsed');
        }                
};
SyntaxHighlighter.toolbar.items.expandSource.getHtml = function(highlighter)
{
	if (highlighter.getParam('collapse') != true)
		return '';
	var title = highlighter.getParam('title');
	return SyntaxHighlighter.toolbar.getButtonHtml(highlighter,
						       'expandSource',
						       (title ? title : '')
						       + ' ('
						       + SyntaxHighlighter.config.strings.expandSource
						       + ')');
};
SyntaxHighlighter.config.strings.expandSource = 'Expand';
SyntaxHighlighter.config.strings.aboutDialog = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>About SyntaxHighlighter</title></head><body style="font-family:Geneva,Arial,Helvetica,sans-serif;background-color:#fff;color:#000;font-size:1em;text-align:center;"><div style="text-align:center;margin-top:1.5em;"><div style="font-size:xx-large;">SyntaxHighlighter</div><div style="font-size:.75em;margin-bottom:0.0em;"><div>version 3.0.83 (July 02 2010)</div><div><a href="http://alexgorbatchev.com/SyntaxHighlighter" target="_blank" style="color:#005896">http://alexgorbatchev.com/SyntaxHighlighter</a></div><div>JavaScript code syntax highlighter.</div><div>Copyright 2004-2010 Alex Gorbatchev.</div><hr/><div>Syntax Highlighter re-collapse addon</div><div>version 1.0 (April 12 2011)</div><div><a href="http://noexists.tistory.com/174" target="_blank" style="color:#005896">http://noexists.tistory.com/174</a></div><hr/></div><div>If you like this script, please <a href="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=2930402" style="color:#005896">donate</a> to <br/>keep development active!</div></div></body></html>';
SyntaxHighlighter.defaults['smart-tabs'] = false;
SyntaxHighlighter.defaults['tab-size'] = 8;
SyntaxHighlighter.all();
.syntaxhighlighter .toolbar {
	padding: 0.1em 0.8em 0em 0.8em !important;
	font-size: 1em !important;
	position: static !important;
	width: auto !important;
	height: auto !important;
}
.syntaxhighlighter .toolbar span {
	display: inline !important;
	margin-right: 1em !important;
}
.syntaxhighlighter .toolbar a {
	display: inline !important;
}
.syntaxhighlighter {
	padding-bottom: 1px;
}
<link href="./images/shCore.css" rel="stylesheet" type="text/css" /> 
<link href="./images/shThemeDefault.css" rel="stylesheet" type="text/css" /> 
<link href="./images/shCustom.css" rel="stylesheet" type="text/css" /> 
<script src="./images/shCore.js" type="text/javascript"></script> 
<script src="./images/shAutoloader.js" type="text/javascript"></script> 
<script src="./images/shCustom.js" type="text/javascript"></script> 
<script type="text/javascript">
//<![CDATA[
function path()
{
  var args = arguments,
      result = []
      ;
       
  for(var i = 0; i < args.length; i++)
      result.push(args[i].replace('@', './images/'));
       
  return result
};
SyntaxHighlighter.autoloader.apply(null, path(
  'applescript            @shBrushAppleScript.js',
  'actionscript3 as3      @shBrushAS3.js',
  'bash shell             @shBrushBash.js',
  'coldfusion cf          @shBrushColdFusion.js',
  'cpp c                  @shBrushCpp.js',
  'c# c-sharp csharp      @shBrushCSharp.js',
  'css                    @shBrushCss.js',
  'delphi pascal          @shBrushDelphi.js',
  'diff patch pas         @shBrushDiff.js',
  'erl erlang             @shBrushErlang.js',
  'groovy                 @shBrushGroovy.js',
  'java                   @shBrushJava.js',
  'jfx javafx             @shBrushJavaFX.js',
  'js jscript javascript  @shBrushJScript.js',
  'perl pl                @shBrushPerl.js',
  'php                    @shBrushPhp.js',
  'text plain             @shBrushPlain.js',
  'py python              @shBrushPython.js',
  'ruby rails ror rb      @shBrushRuby.js',
  'sass scss              @shBrushSass.js',
  'scala                  @shBrushScala.js',
  'sql                    @shBrushSql.js',
  'vb vbnet               @shBrushVb.js',
  'xml xhtml xslt html    @shBrushXml.js'
));
//]]>
</script>
Posted by asdfzxcv
web2011. 4. 12. 16:11

설치 방법

파일 업로드

아래 웹 사이트에서 download 항목으로 간 뒤, 최신 버전을 받는다. 압축을 풀면, 폴더가 여러 개 있는데, 여기서 scripts 폴더와 styles 폴더의 내용을 업로드해야 한다. 스킨 편집의 파일 업로드 기능을 이용하면 전부 images 라는 경로로 업로드 된다. http://alexgorbatchev.com/SyntaxHighlighter/

스킨 편집에서 skin.html을 편집

경로만 주의하면 된다. 경로를 적을 때 "./images/"로 시작하는 경로를 넣어야 제대로 인식된다.
<head>와 </head> 사이 적당한 곳에 다음 코드를 넣는다.
<link href="./images/shCore.css" rel="stylesheet" type="text/css" />
<link href="./images/shThemeDefault.css" rel="stylesheet" type="text/css" />
<script src="./images/shCore.js" type="text/javascript"></script>
<script src="./images/shAutoloader.js" type="text/javascript"></script>
<script type="text/javascript">
//<![CDATA[
SyntaxHighlighter.defaults['smart-tabs'] = false; /* optional */
SyntaxHighlighter.defaults['tab-size'] = 8; /* optional */
SyntaxHighlighter.all();
//]]>
</script>

</body> 바로 위에 다음 코드를 넣는다. 잘은 모르겠지만 autoloader의 코드가 먼저 나오고, 나중에 처리되어야 할 코드가 나오면 제대로 작동하지 않는다. head가 아닌 곳에 스크립트가 들어가는 것이 마음에 안 들면, autoloader를 쓰지 말든가, 아니면 autoloader의 동작 원리를 분석해서 코드를 고쳐야 할 것 같다. 아니면 head에는 스크립트를 전혀 안 넣고, 전부 뒤에 넣어도 좋다.
<script type="text/javascript">
//<![CDATA[
function path()
{
  var args = arguments,
      result = []
      ;
       
  for(var i = 0; i < args.length; i++)
      result.push(args[i].replace('@', './images/'));
       
  return result
};
SyntaxHighlighter.autoloader.apply(null, path(
  'applescript            @shBrushAppleScript.js',
  'actionscript3 as3      @shBrushAS3.js',
  'bash shell             @shBrushBash.js',
  'coldfusion cf          @shBrushColdFusion.js',
  'cpp c                  @shBrushCpp.js',
  'c# c-sharp csharp      @shBrushCSharp.js',
  'css                    @shBrushCss.js',
  'delphi pascal          @shBrushDelphi.js',
  'diff patch pas         @shBrushDiff.js',
  'erl erlang             @shBrushErlang.js',
  'groovy                 @shBrushGroovy.js',
  'java                   @shBrushJava.js',
  'jfx javafx             @shBrushJavaFX.js',
  'js jscript javascript  @shBrushJScript.js',
  'perl pl                @shBrushPerl.js',
  'php                    @shBrushPhp.js',
  'text plain             @shBrushPlain.js',
  'py python              @shBrushPython.js',
  'ruby rails ror rb      @shBrushRuby.js',
  'sass scss              @shBrushSass.js',
  'scala                  @shBrushScala.js',
  'sql                    @shBrushSql.js',
  'vb vbnet               @shBrushVb.js',
  'xml xhtml xslt html    @shBrushXml.js'
));
//]]>
</script>

사용방법

방법 1
<pre class="brush: c">
//코드를 적고
</pre>
방법 2
<script
type="syntaxhighlighter"
class="brush: c; collapse: true"
title="title"><![CDATA[
// 코드를 적고
]]></script>
여기서 brush는 언어에 따라 선택하면 된다.
그리고 class="brush: c; collapse: true"처럼 적으면 처음에 코드가 collapse된 상태로 나타나게 된다.

주의사항

<pre> 태그 내부에 있는 "<"나 ">"를 "&lt;"와 "&gt;"로 치환해야, 다양한 웹브라우저에서 제대로 보인다. 이 문제를 해결하기 위해 <script>를 쓰는 법도 있는데, 이건 코드 내부에 </script>가 있으면 오작동하는 경우가 있다. 그리고 script를 사용한 경우 syntax highlighter가 오류로 작동하지 않으면 화면에 코드가 전혀 안 나타나는 것도 문제다. Escape하는 것이 귀찮더라도 pre를 사용하는 것이 좋은 것일까?

테스트

#include <stdio.h>
int main()
{
	printf("Hello, World!\n");
	return 0;
}

기타

이글을 보면 알겠지만, 여기서는 re-collapse 기능을 사용하고 있다.
이것은 필자가 소스를 고쳐서 추가한 기능이다.
자세히 알아보려면 다음 글을 읽어보면 된다.
2011/04/12 - [web] - Syntax Highlighter : re-collapse 기능 추가하기
Posted by asdfzxcv
아직미분류2011. 4. 7. 18:47
http://kldp.org/node/52160
http://dinomite.net/2008/subversion-diff-with-vimdiff/

1. ~/vimdiff.sh
 #!/bin/bash
shift 5
vimdiff "$@"


2.
다음 명령으로 svn diff 실행
svn diff --diff-cmd ~/vimdiff.sh file.c

또는
~/.subversion/config를 고쳐서
diff-cmd = ~/vimdiff.sh

Posted by asdfzxcv
윈도우2011. 3. 29. 19:07
아래 내용을 backup.vbs 등의 파일로 만들고 실행하면 된다. (VBScript이다.)
폴더가 존재하지 않으면 그냥 넘어간다. (폴더를 알아서 만들어주면 좋겠지만...)
덮어쓰기 전에 물어본다.

백업
set objShell = CreateObject("Shell.Application")
set WshShell = WScript.CreateObject("WScript.Shell")
appdata = WshShell.ExpandEnvironmentStrings("%AppData%\")
userprofile = WshShell.ExpandEnvironmentStrings("%USERPROFILE%\")
current = Left(WScript.ScriptFullName,InStrRev(WScript.ScriptFullName,"\"))

Function XmanagerBackup(productName)
	Dim srcFolder
	Dim destFolder
	Dim srcFolderItems
	set srcFolder = objShell.NameSpace(appdata & "NetSarang\" & productName & "\Sessions")
	set destFolder = objShell.NameSpace(current & productName)
	if not srcFolder is nothing then
		if not destFolder is nothing then
			set srcFolderItems = srcFolder.Items()
			destFolder.CopyHere(srcFolderItems)
			WScript.Echo "Restore " & productName & " Sessions: Done"
		end if
	else
		WScript.Echo "Restore " & productName & " Sessions: Fail"
	end if
End Function

XmanagerBackup("Xmanager")
XmanagerBackup("Xshell")
XmanagerBackup("Xftp")

리스토어
백업에서 srcFolder, destFolder의 변수명만 바꿔주면 된다. 
set objShell = CreateObject("Shell.Application")
set WshShell = WScript.CreateObject("WScript.Shell")
appdata = WshShell.ExpandEnvironmentStrings("%AppData%\")
userprofile = WshShell.ExpandEnvironmentStrings("%USERPROFILE%\")
current = Left(WScript.ScriptFullName,InStrRev(WScript.ScriptFullName,"\"))

Function XmanagerRestore(productName)
	Dim srcFolder
	Dim destFolder
	Dim srcFolderItems
	set destFolder = objShell.NameSpace(appdata & "NetSarang\" & productName & "\Sessions")
	set srcFolder = objShell.NameSpace(current & productName)
	if not srcFolder is nothing then
		if not destFolder is nothing then
			set srcFolderItems = srcFolder.Items()
			destFolder.CopyHere(srcFolderItems)
			WScript.Echo "Backup " & productName & " Sessions: Done"
		end if
	else
		WScript.Echo "Backup " & productName & " Sessions: Fail"
	end if
End Function

XmanagerRestore("Xmanager")
XmanagerRestore("Xshell")
XmanagerRestore("Xftp")
이 코드가 제대로 동작한다는 보증은 없다.
Posted by asdfzxcv
LaTeX2011. 3. 27. 12:17
방법 1.
패키지 관리자를 쓰지 말고, 그냥 texlive를 직접 설치한다. 이 경우 tlmgr로 ko.TeX을 설치할 수 있다. 그러나 패키지 관리자를 안 쓰고 직접 설치하는 것은 권장하지 않는다나...
tlmgr --repository=http://ftp.ktug.or.kr/KTUG/texlive/2010 install collection-kotex

방법 2. (테스트 중)
zypper 등으로 texlive를 설치하면 tlmgr이 없다. 그리고 openSUSE에는 ko.TeX을 위한 3rd party 패키지도 없는 것 같다. (아마도...) 이런 문제는 openSUSE뿐만 아니라 꽤 많은 배포판에서 나타난다. (우분투처럼 패키지가 있는 경우도 있지만.)

그래서 노가다로 추가 패키지를 설치해야 한다. 그러니 http://ftp.ktug.or.kr/KTUG/texlive/2010/archive/에 가서 자신에게 필요해 보이는 것들을 다운받는다.
#!/bin/bash
BASE=http://ftp.ktug.or.kr/KTUG/texlive/2010/archive/ # 2011이 나오면 수정
ARCH=x86_64-linux # ARCH는 적절히 수정
mkdir -p /root/kotexinstall && cd /root/kotexinstall # 적절히 수정
wget $BASE/kotex.tar.xz
wget $BASE/kotex.doc.tar.xz
wget $BASE/kotex-base.tar.xz
wget $BASE/kotex-extra.tar.xz
wget $BASE/kotex-utils.tar.xz
wget $BASE/kotex-utils.${ARCH}.tar.xz
# 더 필요한 것들 추가
그리고 "xz -d kotex.tar.xz && tar -xf kotex.tar"과 같은 방법으로 압축을 해제한다.
추가: tar --xz -d로 한번에 풀자.

이것들을 TEXMF로 복사해야 하는데, 시스템에서 관리하는 TEXMF를 덮어 씌우는 것은 역시 불안하다. 그러므로
vi `kpsewhich texmf.cnf`
로 texmf.cnf를 열어보자. 그러면 "TEXMFLOCAL = /usr/local/share/texmf"라는 부분이 나오는데, 여기에 ko.TeX 패키지의 파일들을 복사하면 된다. 이미 texmf tree는 맞게 되어 있으므로 그냥 복사만 하면 된다. 그리고 "kotex-utils.tar.xz"는 압축을 해제하면 "texmf-dist" 디렉토리에 들어 있는데, 이 디렉토리는 무시하고 내부를 복사하자. (openSUSE에는 texmf-dist라는 이름의 디렉토리가 없다.)

이제 다음 명령을 내려준다.
texhash
updmap --nohash --nomkmap --enable Map=kotex-base.map
updmap --nohash --nomkmap --enable Map=kotex-extra.map
updmap 
그리고 "updmap"의 출력에 "kotex-base.map"과 "kotex-extra.map"이 잘 들어있나 확인해 보면 된다.
(updmap-sys일 수도 있음)

아마 permission은 이미 잘 되어 있어서 별로 신경 쓸 필요가 없을 것이지만, 확인은 해보자. 실행 파일들은 /usr/bin에 심볼릭 링크를 생성해줘야 편하게 쓸 수 있으니 이 작업도 해 주자. 먼저 "/usr/local/share/texmf/bin/x86_64-linux" 디렉토리에 가보자. 물론 "x86_64-linux" 부분은 시스템마다 다르다. 여기에는 8개의 파일이 있는데, "hbibtex"와 "hmakeindex"를 제외하면 심볼릭 링크들이다. (그래서 아까 texmf-dist가 있던 것이다.) 그러나 우리는 이 심볼릭 링크들을 수작업으로 다시 만들어야 한다. 그리고 "hbibtex"와 "hmakeindex"를 통채로 "/usr/bin"에 복사하는 것보다는 심볼릭 링크를 사용하는 것이 안전해 보인다.
cd /usr/bin
ln -s /usr/local/share/texmf/bin/x86_64-linux/hbibtex hbibtex
ln -s /usr/local/share/texmf/bin/x86_64-linux/hmakeindex hmakeindex
ln -s /usr/local/share/texmf/scripts/kotex-util/perl/euc-bookmark.pl euc-bookmark
ln -s /usr/local/share/texmf/scripts/kotex-util/perl/hypua2jamo.pl hypua2jamo
ln -s /usr/local/share/texmf/scripts/kotex-util/perl/insertjamofiller.pl insertjamofiller
ln -s /usr/local/share/texmf/scripts/kotex-util/perl/jamo2hypua.pl jamo2hypua
ln -s /usr/local/share/texmf/scripts/kotex-util/perl/komkindex.pl komkindex
ln -s /usr/local/share/texmf/scripts/kotex-util/perl/ttf2kotexfont.pl ttf2kotexfont 
이제 잘 되나 테스트해 보자.
Posted by asdfzxcv
서버2011. 3. 26. 19:02
도메인 네임 대신 IP address를 사용했더니 메일이 안 가는 경우가 있을 것이다. 예를 들면 "user@127.0.0.1"로 메일을 보냈더니 메일이 안 가고 "Bad recipient address"라고 나오는 것이다. 구글 등에서 검색해봐도 원하는 답을 쉽게 찾을 수가 없지만, 아주 잘 찾아보면 나오긴 나온다.

결론은 "user@[127.0.0.1]"처럼 IP 주소를 "["와 "]" 사이에 적어야 한다는 것이다.
Posted by asdfzxcv
프로그래밍/C/C++2010. 11. 22. 19:33
Posted by asdfzxcv
LaTeX2010. 11. 19. 01:11
http://tug.ctan.org/pkg/fixltx2e
\RequirePackage{fix-cm}
\documentclass{ ... }
\usepackage{fixltx2e}[<date>]
Posted by asdfzxcv