manywaypark's Blog
개발, 검색, 함수

sqlite3 backend로 clsql을 쓸때 다음과 같은 에러가 나는 경우가 있다.
"Error 21 / library routine called out of sequence"
기본적으로 라이브러리를 잘못 사용하고 있다는 말인데, 현재 상황에 비추어 검색한 결과 thread safe 문제인듯했다. 아래 참고 링크에서 SQLite 사이트의 FAQ를 인용해 놓은 것을 보면,
It is never safe to use the same sqlite3 structure pointer in two or more threads.
라고 되어 있으나 현재의 FAQ에서는 찾아 볼 수 없다 (FAQ.6에 비슷한 말이 나온다. sqlite 3.3.1이전 버전은 sqlite3 structure를 같은 thread에서만 열어야하며 thread safe를 위해서는 3.3.1 이후 버전을 SQLITE_THREADSAFE = 1로 설정하고 컴파일을 해야만한다. 아쉽게도 dapper에 깔리는 sqlite3는 버전이 3.2.8-1ubuntu1로 좀 낮다).
개발 중인 프로그램이 multithread인데 이전 버전들(sbcl 1:0.9.14.0-2 + cl-sql 3.6.3-1 on edgy)의 조합에서는 나타나지 않던 문제였으나 얼마전 내가 만든 backport들 (sbcl 1.0 + cl-sql 3.7.8 on dapper)의 조합에서는 나타났다.

DB 연결부분을 다음과 같이 기존 연결이 있을 때는 경고를 내고 그것을 재사용하도록 한 것이 문제일 수도 있겠지만, 문제의 여지를 남겨두기 싫어서 필요할 때마다 연결하고 끊는 매크로를 사용하고, thread간에는 mutex를 사용해서 동기화 해버렸다.
(clsql:connect (list *db-file*) :database-type +DB-TYPE+ :if-exists :warn-old)

(기존 연결 재사용은  thread safe 버전의 sqlite3를 사용하면 간단히 해결될 수도 있을 것같다.)

참고:
http://trac.edgewall.org/ticket/2196

happy hackin'

일단 잡담부터...
서버쪽에서는 하드웨어 문제나 안정성 때문에 웬만하면 그냥 Dapper LTS를 쓰려고했는데, sbcl이 0.9.8에서 더이상 버전이 안올라 가는 듯보였다. 내가 필요한 thread 및 timer기능이 온전하게 돌아가는 버전이 아니었다.

그래서 손쉬운 방법으로 서버 한대를 Edgy로 업그레이드를 해버렸다. 그런데, 이놈이 자주 죽는거 같더니 마지막으로는 부트파티션이 깨졌다. Orz.
아무래도 SATA RAID랑 궁합이 잘 안맞는다는 추측만 했다. 결론은 역시 LTS 버전이 안정적이라는 것.

이제 여기부터 backport이야기...
그래서 SBCL을 backport해보기로 했다.
날로 먹어버리겠다는 일념으로(좀 얍삽한가?) IDC에 있는 서버중에 동일 아키텍쳐(AMD64)에 Feisty가 깔려있는 곳에서 sbcl의 버전을 확인했더니 1.0이다. 충분하다! 그래서 그 머신에서 "apt-get source"로 소스를 받은 다음 통째로 Dapper LTS가 깔린 곳에 옮겨서 debian package를 만들었다.

"dpkg -i"".deb"파일을 설치하면 끝
이라고 생각했는데, 그게 아니였다. common-lisp-controller의 버전이 너무 낮다고 불평을 했다.
살짝 좌절했다. '이거 common-lisp-controller 하나만 더 가지고 온다고 될까? 그 놈을 설치하려면 또 다른 놈(들)에게 의존성이 걸려있는거 아닐까? 결국에는 시스템 전체 업그레이드?' 불안이 밀려왔다. 그래도 해보는데까지는 해보기로 했다. 어차피 내 잘못으로 빚어진 일이니 내 손으로 끝장을 봐야했다(데스크탑(edgy)에서 열심히 개발하고 서버(dapper)에 올리니 안돌아갔다. Orz).

비장한 각오로 common-lisp-controller를 위의 과정과 똑같이 backport했더니 그냥 해결됐다.
잠시 비장했던 마음가짐이 아까웠다.

잡설끝.

설치에 관한 간략한 설명:
  1. 먼저 dapper 박스에 sbcl이 안깔려 있다면 일단 깐다.
    ~$ sudo apt-get install sbcl
  2. 첨부파일을 다운로드 후에 적당한 곳에 압축을 풀고 패키지 두 개를 설치한다 (md5sum 체크도 한번 해주면 좋다).
    ~$ tar xvzf sbcl_1.0.0.0-1~dapper1_amd64.tgz
    ~$ sudo dpkg -i common-lisp-controller_6.1~dapper1_all.deb
    ~$ sudo dpkg -i sbcl_1.0.0.0-1~dapper1_amd64.deb
  3. 실행해보고 버전 확인한다.
    ~$ sbcl --version
    SBCL 1.0

대충 package cache 디렉토리 뒤져서 눈짐작으로 버전과 아키텍쳐사이에 ~dapper1을 넣는 것이 backport한 패키지의 명명법이란 것을 추측했는데 정확한 건지는 잘 모르겠다.
하고 나서 보니 backport라기보다는 build가 아닐까 하는 생각도 좀 든다. ^^;

happy hackin'

invalid-file

package 압축파일

invalid-file

md5sum

"apt-get install devscripts build-essential fakeroot" 으로 대충 build에 필요한 기본 패키지들을 깔고,
만약 less를 빌드한다면 다음과 같이 해서 소스 받고 build에 필요한(의존성이 있는) 패키지들을 깔고

~$ apt-get source less
~$ apt-get build-dep less
빌드한다.
~$ cd less-###/
~$ fakeroot ./debian/rules binary

"../less_###_XXX.deb"가 생성된다.

"dpkg -i less_###_XXX.deb" 로 시스템에 설치할 수 있다.

"dpkg-deb -c less_###_XXX.deb" 로 .deb 파일의 내용을 확인할 수도 있다 (다른 사람이 만들어 놓은 .deb 파일을 구했을 때는 한번 해보는 것이 좋을 듯).

참고: http://www.debian-administration.org/articles/20 (약간 오래된 글이라 ./debian/rules를 사용하지 않는 듯하다.)

happy hackin'

apache2에 mod_lisp2 설치하기

함수형 언어/Lisp 2007. 10. 11. 18:57 by manywaypark
apache2에 mod_lisp2 를 설치하는 방법을 간단히 설명한다.
  1. mod_lisp2.c 다운로드 (http://www.fractalconcept.com/asp/html/mod_lisp.html)

  2. 컴파일 및 설치 (gcc, apxs2 필요):
    sudo apxs2 -i -c mod_lisp2.c
    /usr/lib/apache2/modulesmod_lisp2.so가 설치 되었는지 확인.

  3. apache2 설정:
    /etc/apache2/mods-available/ 에 다음 내용의 파일을 적당한 이름(lisp.load)으로 저장.
    LoadModule lisp_module /usr/lib/apache2/modules/mod_lisp2.so
    모듈 활성화:
    sudo ln -s /etc/apache2/mods-available/lisp.load /etc/apache2/mods-enabled/lisp.load
     
  4. apache2 재시작:
    sudo /etc/init.d/apache2 restart
    /var/log/apache2/error.log 파일에 다음과 같은 로그가 찍히는지 확인.
    [Mon Oct 08 22:00:38 2007] [notice] caught SIGTERM, shutting down
    [Mon Oct 08 22:00:39 2007] [notice] Apache/2.0.55 (Ubuntu) mod_lisp2/1.3.1 configured -- resuming normal operations

happy hackin'


방금 KLDP에 Debian Binary Package Building HOWTO 한글 번역을 올렸다.

happy hackin'

Linux에서 java 한글 글꼴 설정

java 2007. 10. 1. 16:30 by manywaypark
먼저 Windows의 윤곽선 글꼴을 쓰기 위해,
Windows의 %windir%\Fonts 디렉토리의 batang.ttc, gulim.ttc를 리눅스의 ~/.fonts 디렉토리로 복사한다.
http://bebop.emstone.com/research/linux/ubuntu_java15_hangul/view에서 다운로드 받은 fontconfig.properties 파일을 /usr/lib/jvm/java-1.5.0-sun/jre/lib에 복사한다.
fontconfig.properties 내의 /home/lethean/을  $HOME으로 변경한다.

java application에서 멋지게 나오는 한글을 감상한다.

happy hackin'




이젠 Lisp Hacker가 되고싶다.

잡담 2007. 8. 21. 20:05 by manywaypark
아주 어렸을 적에 나는 프로그래머가 되고 싶었다.
92년 겨울, ARS로 지원한 대학의 전산과 합격을 확인하고부터 나는 프로그래머의 길에 들어서게되었다.
(사실, 중2때 아버지의 발주(?)로 베이직을 이용해 작은 프로그램을 만들어 드리고 당시 중학생으로서는 거금인 5만원을 받았을 때 이미 professional programmer였다고 가끔 주장하기도 한다.)

근래에 lisp을 현업에 적용하고 있다.
물론, 특유의 learning curve 때문에 좀 고생한 면이 있지만 현재로선 아주 만족스럽다.

이젠 Lisp Hacker가 되고싶다.
내 마지막 도구가 되어줄지도 모른다는 막연한 기대와 함께......

happy hackin'

산 자여 따르라.

잡담 2007. 8. 15. 03:32 by manywaypark
새벽에 영화를 봤다.
마지막에 약간은 편곡된 그 곡이 흘렀다.

산 자여 따르라...
여기서 산자는 생물학적으로 산 사람이 아니다.
의식이 깨어 있는 사람이다.

사랑도, 명예도, 이름도 남김 없이...
약간은 억지스러운 스토리도 권력욕으로 학살을 자행한 놈들보다 억지스럽지는 않았다.

동지는 간데 없고 깃발만 나부껴...
동지들은 싸늘하게 식었거나, 이탈했다.
깃발은 우리가 다시 드높이 들어야한다.

그리고,
전 재산이 이씹팔만원인 전전통께서는 두발 뻗고 잘 주무시는지 참 궁금하다.
그 이씹팔만원 모을라고 그 많은 피를 봤던가?

현재 진행중인 프로젝트에 cl-ftp를 사용해 자동화 하는 모듈을 작성 중이다. 그런데 cl-ftp의 기능들 중 내가 원하는 기능은 대부분 잘 작동했다. 제일 중요한 파일 다운로드만 빼고... T.T
약간의 공부와, 약간의 삽질 끝에 cl-ftp를 조금 손보았더니 제대로 동작했다.
내경우에는 다음과 같은 에러를 내면서 파일 다운로드가 실패했다.
error message:
The value -117 is not of type (UNSIGNED-BYTE 8).
  [Condition of type TYPE-ERROR]
msb가  1인 바이트가 음수로 읽혀지는 듯했다 (나중에 확인해본 결과 실제로 그랬다).
ftp.lisp의 소스를 좀 뒤졌더니 소켓을 생성할 때 cl-acl-compat 패키지의 acl-socket.lisp 내의 make-socket()을 이용해 소켓을 생성하고 있었다. 다음은 make-socket()의 일부다.
(defun make-socket (&key
......
(let ((element-type (ecase format
(:text 'base-char)
(:binary 'signed-byte)
(:bivalent 'unsigned-byte)))
......
ftp.lisp에서는 make-socket()을 부를 때 :binary 또는 :text를 사용할 수 있으며, :binary의 경우 (unsigned-byte 8) stream에, :text의 경우 character stream에 저장하게 되어있었다. 양쪽에서 :binary를 처리하는 방식이 다르니 에러가 날수 밖에 없어 보였다.
데이터 전송 소켓 생성 부분인 ftp.lispestablish-data-transfer()에서,
;;; ftp.lisp
;;; change underlined :binary to :bivalent.
(defmethod establish-data-transfer
......
(let ((data-socket
(make-socket :remote-host dtp-hostname
:remote-port dtp-port
:format (ecase type
((:binary :image) :binary)
(:ascii :text)))))
......
(let ((server-socket (setup-port conn
:format (ecase type
((:binary :image)
:binary)
(:ascii :text)))))
......
밑줄친 :binary를 전부 :bivalent로 바꾼후 테스트를 해보니 정상적으로 동작했다.

편의를 위해 패치를 첨부한다.
patch file:
--- ftp.lisp.ORIG       2007-08-04 16:44:18.000000000 +0900
+++ ftp.lisp 2007-08-04 18:09:20.000000000 +0900
@@ -307,7 +307,7 @@
(make-socket :remote-host dtp-hostname
:remote-port dtp-port
:format (ecase type
- ((:binary :image) :binary)
+ ((:binary :image) :bivalent)
(:ascii :text)))))
(when (and rest (integerp rest))
(send-raw-line conn (format nil "REST ~A" rest)))
@@ -317,7 +317,7 @@
(let ((server-socket (setup-port conn
:format (ecase type
((:binary :image)
- :binary)
+ :bivalent)
(:ascii :text)))))
(unwind-protect
(progn

테스트환경은 cl-ftp 1.3.3-1, sbcl, ubuntu edgy box이고 기본적인 시스템 정보는 다음과 같다.
$ sbcl --version
SBCL 0.9.14
$ uname -a
Linux hyper-server 2.6.17-12-386 #2 Mon Jul 16 19:35:45 UTC 2007 i686 GNU/Linux

패치를 데비안 패키지 관리자에게 보내긴 했는데 적용될지는 잘 모르겠다.

happy hackin'



얼마전에 emacs를 21에서 22으로 버전업을 했는데, 미니 버퍼에서의 자동 완성 기능이 동작하지 않았다.
M-x 후에 몇 글자 입력하고 tab을 눌렀을 때 분명히 자동완성이 존재하는 문자열임에도 불구하고 "No completions of blabla~~"라고 표시되며 동작하지 않았다.
검색을 해도 쉽게 나오진 않았는데, 해결법은 의외로 간단했다. 참고
.emacs 파일에서 다음과 같은 라인을 찾아서
;; find a line like this in .emacs
(define-key minibuffer-local-map [tab] 'comint-dynamic-complete)
다음과 같이 바꾼다.
;; replace the line with this line
(define-key minibuffer-local-map "\t" 'comint-dynamic-complete)

emacs 새 버전의 reader의 구현이나 설정이 "[tab]" 같은 형태의 입력을 못 받아들이는 듯하다.

happy hackin'
1 ··· 25 26 27 28 29 30 31 
분류 전체보기 (306)
잡담 (20)
함수형 언어 (65)
emacs (16)
java (18)
tips & tricks (154)
사랑 (1)
가사 (0)
독서 (4)
mobile (6)
비함수형 언어 (2)

공지사항

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

04-27 08:09