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

PLT Scheme - mysqlclient

함수형 언어/Scheme 2007.06.27 19:14 by manywaypark
mysql과 scheme을 연동해보자.
http://www.cs.uvm.edu/~dvanhorn/scheme/
unix/linux에서는 mysqlclient.ss에 있는 설명으로 충분히 빌드가 가능하다.
window환경에서는 다음 링크의 설명대로 하면 될듯하다.
http://www.cs.brown.edu/pipermail/plt-scheme/2004-July/006230.html
요지는,
C:\Program Files\PLT\collects 디렉토리에서 컴파일한다고 가정하면, 다음과 같이...
..\mzc --auto-dir ++ldf c:\mysql\lib\opt\mysqlclient.lib ++ldl d:\mysql\lib\opt\mysqlclient.lib ++ldl WSock32.Lib ++ldl AdvAPI32.Lib ++ccf -Ic:\mysql\include ++ccf -D__LCC__  mysqlclient\mysqlclient.ss

MS SDK의 무료(express) 버전이 필요할지도 모른다. 언제 무료 버전이 생긴거지? ㅋ
http://msdn.microsoft.com/vstudio/express/downloads/
VC++를 설치하자.
VC++만 설치하면 될 줄 알았는데, "winsock.h"를 못 찾는다.
http://www.microsoft.com/downloads/details.aspx?FamilyID=a55b6b43-e24f-4ea3-a93e-40c0ec4f68e5&DisplayLang=en
Platform SDK를 설치하자.

다음과 같이 하면 잘 될것이다.

VC++ 사용시 - 거지 같지만, Visual Studio 2005 Command Prompt로 들어가서 하는 것이 정신건강에 좋다.
..\mzc -v --auto-dir ++ldf "c:\art\MySQL\MySQL Server 5.0\lib\opt\mysqlclient.lib" ++ldl "c:\art\MySQL\MySQL Server 5.0\lib\opt\mysqlclient.lib" ++ldl "C:\Program Files\Microsoft Platform SDK\Lib\WSock32.Lib" ++ldl "C:\Program Files\Microsoft Platform SDK\Lib\AdvAPI32.Lib" ++ldl "C:\Program Files\Microsoft Platform SDK\Lib\Uuid.Lib" ++ccf -I"c:\Program Files\Microsoft PlatformSDK\Include" ++ccf -I"c:\art\MySQL\MySQL Server 5.0\include" ++ccf -D__LCC__  mysqlclient\mysqlclient.ss

cygwin 사용시 - 이건 실패. 시간있을때 성공하게 만들어보자.
..\mzc -v --auto-dir ++ldf "c:\art\MySQL\MySQL Server 5.0\lib\opt\mysqlclient.lib" ++ldl "c:\art\MySQL\MySQL Server 5.0\lib\opt\mysqlclient.lib" ++ldl \art\cygwin\lib\w32api\libwsock32.a ++ldl \art\cygwin\lib\w32api\libadvapi32.a ++ccf -I"c:\art\cygwin\usr\include\w32api" ++ccf -I"c:\art\MySQL\MySQL Server 5.0\include" ++ccf -D__LCC__  mysqlclient\mysqlclient.ss


happy hackin'

PLT Scheme package 위치

함수형 언어/Scheme 2007.06.26 17:51 by manywaypark

윈도우에서 기본 설치를 했을 때 설치 디렉토리말고 다른 쪽에 모듈(패키지)들이 깔린다. 특히 planet를 이용해서 설치한 것들의 소스를 확인 할때 이 디렉토리를 찾아보시라.
C:\Documents and Settings\%USERNAME%\Application Data\PLT Scheme\


일상적 작업

잡담 2007.05.31 17:23 by manywaypark
cl-sql을 사용하여 약 5백만 건 정도의 레코드를 mysql DB에 입력했다.
오라클 DB dump로 추정되는 텍스트 파일을 cl-ppcre를 사용하여 살짝 조작한 후에 clsql:def-view-class로 정의한 클래스의 인스턴스를 생성 한 후 clsql:update-records-from-instance로 DB에 삽입했다.

결과:
Evaluation took:
  6941.389 seconds of real time
  4364.181 seconds of user run time
  98.73017 seconds of system run time
  [Run times include 327.356 seconds GC run time.]
  0 page faults and
  498,416,792,016 bytes consed.
빠른건가? 느린건가?
속도가 무슨 의미가 있겠는가? 간단히 아름답게 해결되었고, 기다려줄만한 시간인것을...

happy hackin'
TAG Lisp, MySQL

cl-sql 사용하기

함수형 언어/Lisp 2007.05.29 14:01 by manywaypark
cl-sql은 common lisp에서 여러 종류의 DB backend에 접근하는데 사용할 수 있는 package이다.
간단히 (asdf-install:install 'clsql)로 될줄 았았는데, 잘 안됐다. library 로딩에 실패하고 어쩌구...
혹시나 하는 마음에 ubuntu(debian) packaging system apt를 이용해보기로 했다.
$ apt-cache search clsql
cl-sql - SQL Interface for Common Lisp
cl-sql-aodbc - CLSQL database backend, AODBC
cl-sql-mysql - CLSQL database backend, MySQL
cl-sql-odbc - CLSQL database backend, ODBC
cl-sql-postgresql - CLSQL database backend, PostgreSQL
cl-sql-postgresql-socket - CLSQL database backend, PostgreSQL
cl-sql-sqlite - CLSQL database backend, SQLite
cl-sql-sqlite3 - CLSQL database backend, SQLite3
cl-sql-tests - Testing suite for CLSQL
cl-sql-uffi - Common UFFI functions for CLSQL database backends
cl-sql-oracle - CLSQL database backend, Oracle
오호라, 필요한건 다 있는 거같다.
$ sudo apt-get install cl-sql cl-sql-mysql
......
sbcl을 실행하고 테스트해봤다.
$ sbcl
......
* (require 'clsql)

; loading system definition from /home/USER/.sbcl/systems/uffi.asd into
; #<PACKAGE "ASDF1">
; registering #<SYSTEM UFFI {10028CA001}> as UFFI
NIL
* (require 'clsql-mysql)
......
Couldn't load foreign libraries "libmysqlclient", "libmysql". (searched CLSQL-SYS:*FOREIGN-LIBRARY-SEARCH-PATHS*)
......
엥? 에러 컨디션?
사실 (require 'clsql-mysql)은 직접 호출하지 않아도 connect류 등의 관련 함수를 부르면 자동으로 올라오는데 그것들도 다 실패했다. 시스템에는 libmysql*이 전부 설치되어있었다.
이 문제는 다음 두가지 방법 중 하나를 선택해서 해결할 수 있다.
해결책1: 직접 uffi를 이용해서 library를 로딩. (참고:http://common-lisp.net/pipermail/cl-debian/2006-May/001287.html)
CL-USER> (uffi:load-foreign-library "/usr/lib/libmysqlclient.so.15")
해결책2: symbolic link 생성.
$ sudo ln -s /usr/lib/libmysqlclient.so.15.0.0 /usr/lib/libmysqlclient.so
(library 버전 번호는 필요한 것으로 선택한다.)

테스트:
CL-USER> (require 'clsql)
......
;;; connect params: host, db, user, password.
CL-USER> (clsql:connect '("localhost" "mysql" "root" "") :database-type :mysql)
#<CLSQL-MYSQL:MYSQL-DATABASE localhost/mysql/root OPEN {1003707EF1}>
CL-USER> (clsql:status)
CLSQL STATUS: 2007-05-28 21:21:31,,0
-----------------------------------------
   DATABASE              TYPE   RECORDING 
-----------------------------------------
*  localhost/mysql/root  mysql  nil       
-----------------------------------------
; No value
CL-USER> (clsql:list-databases '("localhost" "mysql" "root" "") :database-type :mysql)
("information_schema" "mysql")
CL-USER> (clsql:query "select * from user")
......
CL-USER> (clsql:disconnect :database (clsql:find-database "localhost/mysql/root"))
T
CL-USER> (clsql:status)
CLSQL STATUS: 2007-05-28 21:48:23,,0
; No value

참고: apt를 이용해서 lisp 모듈을 설치하면, /usr/share/common-lisp/ 아래에 설치된다. 소스 참고시 유용하다.

2008-04-15 :
oracle을 backend로 쓰려면 instant client download 페이지에서 필요한 파일을 다운로드 받아 특정 디렉토리에 압축을 풀어놓고 그 디렉토리를 LD_LIBRARY_PATH 환경변수에 추가하면 된다. 물론 위의 해결책2에서 처럼 symbolic link를 걸어주는 작업(버전 번호를 떼주는...)이 필요하다.

happy hackin'

local-time 사용하기

함수형 언어/Lisp 2007.05.25 16:13 by manywaypark
시간/날짜 처리 관련한 package로 local-time이 있다.
설치(ASDF Brief 참조):
CL-USER> (require 'asdf)
NIL
CL-USER> (require 'asdf-install)
......
CL-USER> (asdf-install:install 'local-time)
......

예제:
;;; 현재 시간 얻기
CL-USER> (local-time:now)
@2007-05-25T16:02:30.000

좀더 실용적인 예제 (기념일 계산에 쓰면 될듯):
;;; adds days
;;; eg, (add-days "2007-01-01" 123)
(defun add-days (from days)
(local-time:make-local-time :day (+ (local-time:local-time-day (local-time:parse-timestring from)) days)))

;;; 오늘 만난 커플의 100일 되는 날은?
CL-USER> (add-days "2007-05-25" 100)
@2007-09-02T00:00:00.000
;;; 9월2일이군요.

happy hackin'

2013-12-30: 그간 local-time package에 변경이 있었던듯... 여튼 오늘 해보니 상기 예제는 다음과 같이 하면 해결된다.
;;; 오늘 만난 커플의 100일 되는 날은?
* (local-time:timestamp+ (local-time:parse-timestring "2013-12-30") 100 :day)
@2014-04-09T09:00:00.000000+09:00
;;; 내년 4월9일이군요.



TAG Lisp
그냥 막연히 make-string-input-stream으로 input stream을 만들어서 cxml:parse-stream에 걸면 될 줄로 생각했는데, binary stream을 만들어야한다.
;;; simple binary stream for string parsing with cxml (just a wrapper for string).
(defclass bin-stream (fundamental-binary-input-stream)
((string-input-stream
:initarg :string-input-stream
:accessor string-input-stream)))

(defmethod stream-read-byte ((s bin-stream))
(char-code (or (read-char (string-input-stream s) nil)
(return-from stream-read-byte :eof))))

;;; makes binary stream of a string for parsing with cxml.
(defun make-bin-stream (string)
(assert (stringp string))
(make-instance 'bin-stream :string-input-stream (make-string-input-stream string)))
다음과 같이 테스트
CL-USER> (make-bin-stream "<foo><bar/></foo>")
#<BIN-STREAM {1002C69051}>
CL-USER> (dom:node-name (dom:document-element (cxml:parse-stream * (cxml-dom:make-dom-builder))))
"foo"
CL-USER>
binary stream wrapper를 만드는데 시간이 좀 걸렸다.

참고:
http://www.mikemac.com/mikemac/clim/gray-streams.html (맨 밑에 보면 binary stream을 만들려면, fundamental-binary-*-stream를 상속하고 stream-read-byte 또는 stream-write-byte method를 구현하라고 나온다).
http://www.cs.queensu.ca/software_docs/gnudev/gcl-ansi/gcl_1178.html (read-char의 optional parameter에 eof-error-p를 주의. nil로 설정!! nil로 설정하지 않으면 end-of-file condition error가 뜬다.)

happy hackin'


TAG cxml, Lisp

/etc/motd 파일

tips & tricks/Linux/Unix 2007.05.02 19:33 by manywaypark
/etc/motd 파일은 "message of the day"의 줄임말로, 로그인하는 사용자에게 표시되는 메시지이다.
잘못 건드리면 커널 업데이트 등을 하고 나서 조금 이상하게 변경되는 경우가 있는 듯하다.
평소와 다른 형식으로 표시된다면, 루트 권한으로 편집하면 된다.

참고: http://uw714doc.sco.com/en/SM_startup/sstT.etcmotd.html

happy hackin'
TAG Linux, unix

sudo

tips & tricks/Linux/Unix 2007.04.23 15:00 by manywaypark
관리하는 서버 중에 나만 sudo가 되는 박스가 있었는데, 다른 사용자의 요청이 있어서 다른 아이디 하나를 admin group에 추가하려했다.
~ # adduser foobar admin
adduser: The group `admin' does not exist.
흠... 이게 뭐지? 이게 안된적이 있었던가?
/etc/group, /etc/passwd, /etc/sudoers 등의 파일을 확인했다.
이럴 수가 /etc/group에 admin group이 아예 없다. /etc/sudoers에는 admin group이 아니라 그냥 내 아이디를 root로 전환 할 수 있는 설정으로 되어있었다. 아마도, 오래전 admin group을 root로 전환하는 형태의 기본 설정이 나오기전의 배포판 설정이 그대로 대물림(?)된 거 같았다.

일단 새로 admin group을 만들고, 사용자를 admin group에 추가:
~ # addgroup admin
Adding group `admin' (1009)...
Done.
~ # adduser foobar admin
Adding user `foobar' to group `admin'...
Done.

admin group의 root 전환을 위해 /etc/sudoers 파일에 다음 내용을 추가했다.
# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL

happy hackin'
TAG Linux, unix, 서버

존중

잡담 2007.04.21 01:26 by manywaypark
존중받으려면 존중해야하는 것이다.  - manywaypark

초기화 파일을 응용하여 명령행에서 유닉스 스크립트처럼 lisp 파일을 실행하는 법에 대해 간단히 기술한다.

초기화 파일 위치:
  1. 시스템 수준: 기본값은 SBCL_HOME/sbclrc, 없으면, /etc/sbclrc이다. 명령행에서 --sysinit로 지정가능.
  2. 사용자 수준: 기본값은 HOME/.sbclrc이지만 명령행에서 --userinit로 지정가능.
상기 초기화 파일 중에 적절한 것을 선택해서 다음의 내용을 추가한다. 파일이 없으면 만든다.

shebang(#!) 형태의 lisp 프로그램 실행을 위한 초기화 파일 내용:
;;; If the first user-processable command-line argument is a filename,
;;; disable the debugger, load the file handling shebang-line and quit.
(let ((script (and (second *posix-argv*)
(probe-file (second *posix-argv*)))))
(when script
;; Handle shebang-line
(set-dispatch-macro-character #\# #\!
(lambda (stream char arg)
(declare (ignore char arg))
(read-line stream)))
;; Disable debugger
(setf *invoke-debugger-hook*
(lambda (condition hook)
(declare (ignore hook))
;; Uncomment to get backtraces on errors
;; (sb-debug:backtrace 20)
(format *error-output* "Error: ~A~%" condition)
(quit)))
(load script)
(quit)))

test program(hello.lisp):
#!/usr/bin/sbcl --noinform
(write-line "Hello, World!")

실행:
$ chmod +x hello.lisp
$ ./hello.lisp
Hello, World!
$ sbcl hello.lisp
This is SBCL 0.9.14, an implementation of ANSI Common Lisp.
More information about SBCL is available at <http://www.sbcl.org/>.

SBCL is free software, provided as is, with absolutely no warranty.
It is mostly in the public domain; some portions are provided under
BSD-style licenses. See the CREDITS and COPYING files in the
distribution for more information.
Hello, World!

참고: http://www.sbcl.org/manual/Initialization-Files.html

2007-10-24
cl-launch를 사용하면 sbcl을 포함한 다른 CL implementation에서도 쓸 수 있는 좀 더 일반적인 방법으로 common lisp 프로그램을 명령행에서 실행할 수 있다.

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