gtpai 를 이용하니 Multibyte 처리가 안되어 있는 함수를 이용하기 때문에 제대로 동작하지 않는다. 그거와 최대한 유사하게 가장 간단한 기능만을 옮겨봤다. 

 

(defvar gpt-base-url "https://api.openai.com/v1/completions")
(defvar gpt-chat-url "https://api.openai.com/v1/chat/completions")

(defcustom gpt-model ""
  "API Model for OpenAI."
  :type 'string
  :group 'crutil)
(defcustom gpt-api-key ""
  "API key for OpenAI."
  :type 'string
  :group 'crutil)



(defun send-query-to-gpt (text)
  "ask to gpt"
  (interactive
   (list (read-string "물어봐: ")))

  (when (null gpt-api-key)
    (error "OpenAI API key is not set"))

  (let* ((url-headers
	  `(("Content-Type" . "application/json")
	    ("Authorization" . ,(format "Bearer %s" gpt-api-key))))
	 (url-data
	  (json-encode `(("model" . ,gpt-model)
			 ("prompt" . ,text)
			 ("temperature" . 0.7)
			 ("max_tokens" . 1000)))))
    (request
      gpt-base-url
      :type "POST"
      :data url-data
      :headers url-headers
      :parser 'json-read
      :success (cl-function
		(lambda (&key data &allow-other-keys)
		  (insert (cdr (assoc 'text (elt (cdr (assoc 'choices data)) 0))))))))

  )

 

적당히 load 될 수 있는 곳에 이 함수를 만들어 두고 

 

(require 'cr-utils)
(setq gpt-model "text-davinci-003")
(setq gpt-api-key "<INSERT YOUR API KEY>")

(global-set-key (kbd "C-c o") 'send-query-to-gpt)

맨 위의 cr-utils 는 send-query-to-gpt 함수가 위치한 파일이다. 

 

이러면 편리하게 사용할 수 있다. GPT 는 상당한 구라쟁이지만 말이다. 

https://www.gnu.org/software/emacs/manual/html_node/eintr/


에 관련된 내용이 잘 정리되어 있습니다. 프로그램을 잘 모른다고 하는 사람을 대상으로 쓰여졌다고 하는데, 제 생각에는 '글쎄요' 입니다. 물론 이 걸 보고 고수가 된 비전공자가 존재한다는 것이 놀라울 따름입니다. 필리핀 인가 싱가폴에서 사는 처자인데 Emacs 의 org-mode 에 반해서 Emacs 를 배우고 Emacs Lisp 프로그래밍까지 잘하게 된 전설적인 케이스가 있습니다. 제대로 Emacs 를 쓰기 위해서는 한번 읽어볼 만은 하지만.. '글쎄요...' 


http://ergoemacs.org/emacs/elisp.html


차라리 실용적으로 배우실려면 위의 링크를 추천드립니다. 온갖 간단한 실용적인 예제로 도배되어 있기 때문에 오히려 더 쉽게 접근이 가능합니다. 



저는 안드로이드를 Emacs 로 개발하고 있는 중인데요. 외부 jar 가 추가 될 때 자동으로 classpath 에 추가 하고 자동으로 import 기능을 활성화 시키는 방안을 찾는 중인데, 없더군요.. 

물론 Eclipse 를 사용하면서 Google AdMob SDK 같은 외부 jar를 사용하기는 쉽습니다. 외부 라이브러리로 추가해 주면 끝이기 때문입니다. 다만 CLI (Command Line Interface) 에서 Ant 를 이용해서 빌드를 할 때는 마구 마구 귀찮아집니다. 하지만 쉽게 하는 방법이 생겼더군요. 

$(ANDROID_PROJECT_ROOT) 밑에 /libs 라는 디렉토리를 만들고 그 안에다가 GoogleAdMobAdsSdk-6.0.1.jar android-support-v4.jar 두개의 파일을 복사해줍니다. 


$(ANDROID_PROJECT_ROOT) 밑의 ant.properties 파일을 열고 다음과 같이 추가해 줍니다. 

  jar.libs.dir=libs


이제 

$ ant clean && ant debug 



해 주시면 성공적으로 바인딩 되는 것을 확인하실 수 있습니다. 

다만 위와 같이 따로 libs 를 추가해 주면 JDE 환경에서 자동으로 classpath 뒤져서 Import 해주는 기능이 libs 에 추가된 jar 에 대해서는 동작하지 않습니다. 이럴 때를 위해서 따로 함수를 만들어 뒀습니다. (100% 제가 만든것입니다 쿨럭..) 



(defun android-mode-my-hook () 
  (progn
    (and (file-exists-p 
          (concat (android-root) "/libs"))
         (setq jde-global-classpath 
               (append jde-global-classpath 
                       (directory-files
                        (concat (android-root) "/libs")
                        t "jar"))))
    ))
(add-hook 'android-mode-hook 'android-mode-my-hook)


다음과 같이 만들어 주면 됩니다. 저는 java 설정만 따로 모아놓고 쓰지만 그렇지 않으신 분들은 .emacs 파일 구석에 적어두시면 될 것입니다. 물론 jdee 와 android-mode 설정 뒤에 적어주셔야 할 것입니다. jde-global-classpath 는 jdee 를 추가 해줘야 생기는 변수고 android-root 는 안드로이드 프로젝트의 루트를 찾아주는 편리한 함수인데 android-mode 를 추가해줘야만 쓸 수가 있습니다. 

점점 lisp 으로 코딩하는게 재밌어 지기 시작합니다. ㅎㅎ 
 
ClojureScript 라고 들어 보셨는가요? 자바 스크립트 (Javascript) 는 대단히 편리한 언어이고 렉시칼 스코프 (Lexical Scope)를 지원해서 Anonymous Function 이나 Closure 를 지원하는 등, 고급 추상적인 언어가 지녀야할 몇가지 장점을 지니고 있습니다. 또한 문법도 쉽고 그래서 빠르게 전파되고 있습니다. 게다가 V8 엔진을 쓰는 Node.js 등 이제는 속도면에서도 자바(Java)에 필적하고 있습니다. (예전 제 포스트 참조) 

그러나 자바스크립트는 또한 약점이 존재합니다. 자바스크립트 지지자들도 여러번 지적하는 사항이라고 하는데요 (사실 저는 잘 모르겠습니다 -ㅅ- ). 지나치게 단순하고 어딘가 허술하며, 확장시키기 좋지 않으며 어떤 기능을 구현하기 위해서 불편하게 추가해야 하는 사항이 많다는 것입니다. 그런 이유로 커피스크립트 (CoffeeScript) 같은 것이 나와서 자바스크립트의 그러한 문제점들을 보완하고 있다는 것입니다. 

그래서 숨어있던 리습(Lisp)의 추종자들이 구글이 제공하는 Google Closure Compiler 의 힘을 바탕으로 해서 강력한 어둠의 Lispy Magic 을 이용해서 커피 스크립트 같은 것을 만들어 냈습니다. 그것이 바로 ClojureScript 입니다. 

예전에 폴 그레이엄이 말하길 '자신이 개발해야 하는 언어로 가장 생산성 있게 개발하고 싶다면, 그 언어를 이용해서 Lisp 해석기를 만들고 그 리습으로 코딩을 하고 나중에 원래 언어로 컴파일 하라.' 라는 이야기를 한 적이 있습니다. 바로 그렇게 만들어 버린 것입니다. 개발자들은 ClojureScript 로 개발을 하고 Google Closure Compiler 로 컴파일을 하면 자바스크립트 파일이 튀어 나옵니다. 이 파일을 이용해서 Client Side 의 작업과 심지어는 Server Side (Node.jsJavascript 로도 바꾸어 줍니다) 작업까지도 일원화 할 수가 있습니다. 

이름에서도 유추할 수 있듯이 사용하고 있는 Lisp 의 방언 (dialect) 은 바로 Clojure 입니다. 

개요만 찾아서 보시고 바로 튜토리얼로 넘어가면 좋을 것 같습니다. 

프로그래밍 세계의 어둠의 마법 (Dark Magic) 으로 불리우는 Lispy Macro 를 다시금 정복할려고 도전중입니다. 벌써 한 세번째 도전했나.. 좌절할 때마다 아니야 도저히 이럴 수는 없어!! 내가 이렇게 평범할 리는 없어!! 라며 눈물을 (?) 흘리게 만듭니다. 이제 다시 기초 지식을 쌓았으니 다시 도전할 시기입니다. 

예전포스트  
저번에 살짝 언급했던 일을 처리중입니다. ( 요기에서 언급함 ) 뭐 우리가 무슨 힘이 있겠습니까? 해달라면 해줄 뿐이지 ㅎㅎ 

바꾸면서 나도 무슨 테이블인지, 무슨 컬럼인지 자세히 봐야지만 알 수가 있는 네이밍 컨벤션이더군요.. 투덜 투덜..

아 이제 그만 투덜되고!! 그렇다고 많지도 않지만 또 어찌보면 많은 부분을 다 찾아주기가 귀찮더군요. 그래서 어떻게 하면 편하게 바꿀 수 있을까를 고민했습니다. 

'훌륭한 해커는 게을러 지기 위해서 프로그래밍을 한다!!' 라는 멋진 사상과 부합되간다면 저도 훌륭하지는 않지만 해커의 길로 나선 것이라고 볼 수가 있습니다.  더구나 제가 쓰는 텍스트 에디터가 바로 이맥스 아닙니까? 바로 개발 들어갔습니다. 



바껴야 될 쿼리 부분을 리젼으로 지전하고 change-table 함수를 호출해 주면 변환은 끝입니다.

 
아직도 외국 리스퍼들 이나 커뮤니티에 가보면 Windows 에서 Lisp 개발 환경 꾸미느라 고생한다는 글이 종종 보이곤 합니다. 

예전에 Weblock 프로젝트 개발 환경을 Windows 에서 구현하는 것이 의미 있다고 생각해서 정말 열심히 노력해서 8시간만에 세팅한 적이 있었습니다. 뭔가 모잘란 듯 하지만 잘 구성되서 만족하며 썼었습니다. 

그 후로 잠시 잊고 있다가 , 다시 같은 개발 환경을 Ubuntu 에서 할 경우가 있었습니다. (CentOS 가 아닌 Ubuntu 입니다). 3분 걸리더군요..

8시간대 3분 , 게다가 8시간짜리 환경은 완벽한 환경도 아니였습니다. SBCL 윈도우즈 버젼은 그 때 당시에는 쓰레드 지원이 안됐습니다.

제대로 되지도 않는 개발 환경을 세팅한다고 8시간을 허비해야 할 가치가 있는 것일까요?  차라리 그 시간에 버추얼 데스크탑을 설치하고 거기다 우분투를 설치하는 시간이 더 빠를듯합니다. 한시간 안쪽에 모든 개발 환경이 설정 될 것입니다. 

ps.
 물론 이렇게 이야기 하지만 Emacs 환경 설정에는 특별히 공을 들이곤 합니다. 없는 기능이면 친절하게 코딩까지 다 해가면서 ㅎㅎ  
재미로 만들어(만들었 다기 보다는 포팅- Porting) 본 스팸 필터 입니다. 

https://github.com/crazia/spam-filter

여기에 올려두었습니다. (''

 Practical Common Lisp 이라는 책에 보면 폴 그레이엄이 구상한 스팸 필터에 관한 간단한 예제가 있습니다.  그 알고리즘을 바탕으로 책에서는  CLisp 으로 구현한 예제가 있습니다. (Chapter 23 - Practical: A Spam Filter)

위 내용을 바탕으로 해서  Programming Clojure 라는 책을 쓴 Stuart Halloway 가 간단하게  PCL (Practical Common Lisp) 에 있는 예제들을 Clojure 로 옮긴 것들이 있습니다. (practical-cl-clojure)

그런데 몇몇의 내용을 살펴보면 Clojure 예전 버젼에 맞춰서 소스가 만들어져 있고 무엇보다도 클로져의 가장 중요한 기능인 병렬성에 맞게 코딩이 되어 있지 않더군요. 따라서 그 부분을 보강하고 Halloway 가 구현 하지 않고 끝을 낸 부분을 추가하는 중에 있습니다. (train 이나 score 같은 함수들) 

클로져를 따로 공부하시는 분들에게 도움이 될까 해서 github 에 공개를 해둡니다. 
폴 그레이엄은 리습에 관한 책 두권을 썼습니다. 한권은 Common Lisp 을 바닥부터 쉽게 배울 수 있는 책입니다. 그리고 또 한권이 "OnLisp" 입니다.

마스터 하기만 하면 초 상급 리습 프로그래머가 될 수 있는 지름길로도 알려졌지만 그 난이도가 장난이 아닙니다. 요즘 마스터를 시도하고 있는데 역시나 무지 어렵습니다.

너무나 어려워서인지 잘 팔리지도 않아서 폴 그레이엄 사이트에 가면 무료로 배포하고 있습니다. ㅎㅎ

여기 에서 받아가세요.

그나저나 Chapter 7 의 제목이 'Macros' 더군요. 왠지 머릿속에서 '두둥' 하는 효과음이 들리는 것 같은 느낌이였습니다. (매크로는 진정한 리습을 쓰는 이유라고 까지 불리웁니다)


"리습은 그것을 마침내 손에 넣게 되었을 때 경험하게 되는 심오한 깨달음을 위해서라도 배울 가치가 있다. 리습을 이용할 일이 그렇게 많지 않다고 할지라도 그 경험은 그 자체만으로도 당신을 훨씬 훌륭한 프로그래머로 만들어 줄 것이다." - 에릭 레이먼드 (Eric Raymond)


제가 아는 선배가 송재경 (바람의 나라, 리지니 만드신 분) 씨와 인터뷰를 할 일이 있었는 데 그 분이 하신 말씀 중에

"프로그램은 어떠한 언어로 짜는 것이 중요한 것이 아니다. 가장 중요한 것은 전산적인 마인드를 소유하는 것이다"

라는 이야기를 들었다고 합니다. 상당히 많은 시간이 지났지만 이 이야기가 가지고 있는 의미는 아직까지도 도움이 됩니다. 저 또한 후학들을 만나면 이와 같은 이야기를 많이 합니다.

왜 리습을 공부해야 하는가? 전산적인 마인드를 소유하는데 도움이 되는 연습을 가장 열심히 할 수 있는 언어였다고 자신할 수가 있습니다.

저는 예전에도 리습을 공부하였고, 지금도 공부중이고 앞으로도 공부할 것입니다. 조금만 떨어지면 멀어져 버리는 전산적인 마인드를 붙잡기 위해서 입니다. (요즘은 리습 방언인 클로져에 빠져 있습니다)


+ Recent posts