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

아주 오래전 멋진 모듈을 만들었다. cl-magick (MagickWand의 CL interface)을 이용해서, 원본 그림에 모종의 처리를 가한 후에 mod_lisp을 타고 apache2를 통해서 웹페이지에 그림이 보이는 아름다운 모듈이었다.

그런데, 오늘 IDC에 있는 서버에 모듈을 올리고 실행해보니 제대로 되지 않았다.

SB-KERNEL::UNDEFINED-ALIEN-FUNCTION-ERROR

처음 모듈을 개발할 때 봤던 놈인것같기는 한데, 어떻게 해결했는지 전혀 기억나지 않았다.
한번 컴파일되고 나면 다음부터는 그냥 .fasl을 올려버려서 메시지를 따라가서 보려면 서버에서는 좀 귀찮았다.
(끝내는 서버에 emacs, slime 등등을 깔아서 내 데스크탑과 비슷한 환경이 만들어져 버렸다.)

결론은 라이브러리 파일(/usr/lib/libWand.so)이 없어서 였다. 정확히는 파일이 없는 것이 아니라 그 파일에 대한 symbolic link가 없어서 였다.
(내 데스크탑에는 나보란듯이 생성되어있었다. 이쯤되면 기억이 나야하는데 전혀 기억이 안난다. Orz.)
여하튼,
sudo ln -s /usr/lib/libWand.so.9.0.0 /usr/lib/libWand.so
(이런건 데비안 패키지 깔릴 때 원래 되어야하는 거 아닌가? ㅠ.ㅠ)

happy hackin'
문제: 보통 M-x shell을 써서 실행시킨 emacs shell에서는 다음과 같은 메시지와 함께 screen을 실행할 수 없다.
"Clear screen capability required."

해결: 그냥 shell말고 ansi shell(terminal)을 실행시키면 된다.
M-x ansi-term RET /bin/bash RET screen

ansi-term에서는 키바인딩이 shell과 달리 원래 bash의 바인딩이다. 즉, M-을 썼던 곳에 C-를 써야한다는 말이다.

문제: emacs에서 ansi-term을 실행시킨 후 ssh 등으로 원격 접속 한 다음 기존에 실행시켜 두었던 screen에 붙으려(attach) 할때 다음과 같은 메시지가 나오면서 제대로 실행 되지 않는다.
"Cannot find terminfo entry for 'eterm-color'."

해결: default 위치에 eterm-color 파일을 생성해준다.
sudo mkdir /usr/share/terminfo/e
sudo cp /usr/share/terminfo/E/Eterm-color /usr/share/terminfo/e/eterm-color

(Ubuntu에서는 /usr/share/terminfo/에 다른 것들은 다 소문자 인데 이상하게 e만 대문자로 되어있다. 내 경우에는 local에서 실행할 때는 잘 되었지만, ansi-term내에서 다른 박스로 접속후에 screen을 쓰려고 했을 때 eterm-color를 못찾는다는 메시지가 나오면서 제대로 실행되지 않았다.)

보너스: 다음 내용을 ~/.screenrc에 추가해보자.
shell -${SHELL}
caption always "%{= kc}%H (system load: %l)%-21=%{= .m}%Y.%m.%d(%D) %0c"

line #1: screen이 실행될 때 기본 shell 설정(~/.bash_profile 등)을 읽어들인다.
line #2: screen 화면에서 유용한 정보들(호스트 이름, 시스템 부하상태, 시간)을 표시한다.

참고:
http://www.omgili.com/newsgroups/gnu/emacs/help/mailman5350118812963732220help-gnu-emacsgnuorg.html
http://www.emacswiki.org/cgi-bin/wiki/GnuScreen
http://www.softpanorama.org/Utilities/Screen/screenrc_examples.shtml

happy hackin'
tramp를 쓰면 간단히 해결된다.
TRAMP는 "Transparent Remote (file) Access, Multiple Protocol"의 줄임말이다.
.emacs에 다음 내용을 추가한다.

(require 'tramp)
(setq tramp-default-method "scp")


파일을 열때 (C-x C-f) 입력형식:
/host:path/to/file


원격 파일을 편집하는 도중에 M-x shell을 해보라. 원격지의 shell이 뜬다. 이게 아마도 file을 괄호친 이유일까?

언제봐도 emacs는 간결하고 아름답다.

2008-11-10 약간의 응용(로컬 파일을 루트 권한으로 다시 열기)
C-x C-f /sudo::/path/to/file RET
KLDP에 내가 답변으로 올렸던 글인데... 매번 까먹는다. 이놈의 건망증이란... Orz.

2017-03-22 포트번호 지정(default 22번이 아닐 때):
C-x C-f /ssh:test@host#2222:/tmp
ref: https://www.emacswiki.org/emacs/TrampMode#toc28


업무중 간단히 쓸 일이 있어 만든 것인데 기억을 위해 글을 남긴다.
파일을 찾고, 경로에서 문자열을 추출하고 여러줄을 한줄로 만드는 일을 하는 것인데, 나말고는 별로 쓸 사람이 없을 것같기도 하다.
  1. 숫자와 dash로 된 txt 파일들을 찾고(find) 경로 중의 임의의 문자(A or B)를 추출(grep)한다.
    $ find . -name '*.txt' | egrep -o 'A|B|[0-9-]*.txt$'
    (다 좋은데, 하나의 match가 한 줄에 표시되어서 여러줄로 나온다.)
  2. 한줄에 표시하고 싶다 (sed).
    $ find . -name '*.txt' | egrep -o 'A|B|[0-9-]*.txt$' | sed '{
    N
    s/\n//
    }'
난 아직 sed에는 익숙치 않은 듯하다. sed 때문에 검색 + 삽질했다.

sed 예제 많은 페이지: http://www.grymoire.com/Unix/Sed.html

happy hackin'

썩은 어금니

잡담 2008. 2. 28. 14:44 by manywaypark
예전에 읽은 일본 소설인지 만화에서 나온 일화이다 (아마 만화일 확률이 높다 소설과는 거리가 먼 인생을 살고 있으니...).

일본 전국시대의 일이라고 전해진다.
어금니가 썩어서 고생하던 한 장수가 적장의 얄팍한 도발에 격분한 나머지 자신의 모든 군사를 이끌고 적진으로 진격 중이었는데, 때마침 찾아온 극심한 치통을 참지 못하고 마상에서 손수 어금니를 뽑아버렸다.
치통이 없어지자 그 장수는 모든 상황을 냉철하게 판단하게 되었고, 적장의 함정임을 간파해 회군을 결정했다. 그때 진격을 멈추지 않았으면 아마도 전멸했을 것이다.

우리도 이런 썩은 이빨 한두 개쯤은 가지고 살아가고 있는 것은 아닐까?

happy hackin'

두번째 친구를 보내고...

잡담 2008. 2. 5. 02:51 by manywaypark
天地不仁 以萬物爲芻狗

만물을 풀강아지처럼 여김에...

그렇게 한 친구가 갔다.

빨리도 갔다.


번잡한 속세의 절차를 끝내고 이제 돌아 홀로 앉아

너를 그리며 잔을 기울이며 추억을 새김질한다.
emacs의 nxml-mode를 사용하면, emacs에서 xml 파일들을 쉽게 편집할 수 있다.
nxml은 내부적으로 validation에 relaxng라는 xml schema 표기 형식을 사용하는데, docbook이나 xhtml같은 널리 쓰이는 문서형식에 대해서는 /usr/share/emacs/site-lisp/nxml-mode/schema/ 디렉토리에 *.rnc 파일들이 준비되어 있어서 쓰는데 별 문제가 없다. 그런데, custom dtd나 schema를 쓰려면 어떻게 해야할까?
trang을 사용해서 변환하면 된다.
$ trang /path/to/custom.dtd /path/to/custom.rnc
emacs의 메뉴에서 XML > Set Schema > File... 선택후 /path/to/custom.rnc를 입력하면 즉시 편집중인 문서의 validation을 실행하고 결과를 상태표시줄에 표시한다.
에러 있는 부분은 빨간 밑줄이 쳐지며, <C-c C-n>으로 에러있는 곳으로 바로 움직일 수도 있다.
유용한 편집 팁을 하나만 더 소개하자면, 마크업 부분 입력(eg, <do) 후에 <C-return>을 눌러보자. schema 상에서 그곳에 삽입을 허용하는 do로 시작하는 tag들이 예쁘게 줄을 선다 (문맥감지 자동완성 기능이라 맘대로 명명했다).

James Clark에게 경의를...

happy hackin'

2012-12-15:
상기 자동 완성 기능(nxml-complete)은 M-TAB으로 변경 되었다.
http://lists.gnu.org/archive/html/bug-gnu-emacs/2012-03/msg00696.html
http://debbugs.gnu.org/cgi/bugreport.cgi?bug=6776

예전 스타일로 쓰고 싶다면 ~/.emacs에 다음과 같은 내용을 추가하자.
;; nxml mode key binding(old style): complete w/ C-return
(add-hook 'nxml-mode-hook
          '(lambda ()
             (define-key nxml-mode-map [C-return] 'nxml-complete)))


평소에 간편히 잘 사용하던 SQuirreL SQL Client에서 sqlite3 DB를 사용해보려 했는데 driver 목록에 sqlite3 용은 없었다. 대충 적당한 것을 찾아서 넣어 볼까 했는데 공식 driver가 아닌 것도 있었고, JNI등을 사용해서 복잡하게 컴파일을 해야되는 것들도 있었다. 나는 간단히 레코드 하나만 변경하면 되는데 일이 너무 복잡해지고 있는 느낌이었다. 그때 내 눈에 들어온 것은 driver 목록의 JDBC ODBC bridge!!

시스템 설치/설정
당연한 이야기지만 ODBC package가 안깔려있다면 깔아야한다(sudo apt-get install unixodbc).
SQLite3 ODBC Driver는 그냥 컴파일 하고 설치하면 되는 프로그램이었다 (./configure && makemake install).
컴파일/설치에 관한 자세한 것은 여기.
일단 컴파일/설치 후에는 dll(libsqlite3odbc.so)만 필요로한다.

이제 설정 파일 두개만 손보면 된다.

/etc/odbcinst.ini
[SQLite]
Description=SQLite ODBC Driver
Driver=/usr/local/lib/libsqlite3odbc.so
Setup=/usr/local/lib/libsqlite3odbc.so
Threading=2

~/.odbc.ini
[db1]
Description=test database 1
Driver=SQLite
Database=/tmp/db1.db
[db2]
Description=test database 2
Driver=SQLite
Database=/tmp/db2.db

SQuirreL SQL Client 설정
이제 SQuirreL SQL Client 설정(Aliases에 추가)시에,
Name: blahblah
Driver: JDBC ODBC Bridge
URL: jdbc:odbc:db1
으로 설정하고 연결하면 /tmp/db1.db sqlite3 파일을 사용할 수 있다.

happy hackin'

[TIP] putty가 갑자기 멈출 때...

tips & tricks 2007. 12. 3. 16:27 by manywaypark
putty를 이용하여 작업중에 연결이 끊긴 것도 아닌데 갑자기 멈추는 경우가 있을 수 있다.
ctrl-s를 누르면 XOFF 신호가 전송되는데 이때는 터미널에 입력되거나 출력되는 문자를 보여주지 않는다.
해법은 간단하다 ctrl-q 하면 XON 신호를 전송해서 그동안 안보여주던 입/출력들을 보여준다.

참고: Recovering from Ctrl-S in putty

2008-05-09: screen 세션에서는 XON은 ctrl-a q이다.

happy hackin'
Window > Preferences... 의 왼쪽 패널에서 Java > Editor > Templates를 선택하면 다양한 template을 자바 에디터에서 사용할 수 있다.
예를 들어 내가 자주 사용하는 logger 관련 선언 자동 삽입은 다음 순서로 하면 쓸 수 있다.
  1. "New..."를 선택한다.
  2. Name에 "_l"을, Description에 "insert logger", Pattern에 "protected final static Log log = LogFactory.getLog(${enclosing_type}.class);"을 넣고 "OK"를 누른다.
    사용자 삽입 이미지
  3. java 편집기에서 _l을 타이핑한 후에 Content Assist 명령을 입력하면, 현재 클래스의 logger를 자동으로 삽입할 수 있다.
    Content Assist 명령은 emacs 모드의 경우 Alt + /이고 default 모드의 경우 Ctrl + Space이다.
참고: "Insert Variable..." 버튼을 눌러보면 다양한 context 관련 변수(현재 클래스명 및 메서드 관련 등) 및 유용한 변수들(날짜, 시간관련 등)을 Pattern에 넣을 수 있다.

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

공지사항

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

03-29 16:00