Clojure – Using mysql

clojure + mysql 사용하기편입니다.

1. 의존성 라이브러리 다운받기

project.clj 파일 소스안에 jdbc 라이브러리 관련하여 추가해주세요.
[sourcecode language=”clojure”]
(defproject clojql "1.0.0-SNAPSHOT"
:description "FIXME: write description"
:dependencies [[org.clojure/clojure "1.2.1"]
[org.clojure/clojure-contrib "1.2.0"] ;; for clojure.contrib.sql
[org.clojure/java.jdbc "0.0.6"] ;; jdbc
[mysql/mysql-connector-java "5.1.6"]]) ;; mysql driver
[/sourcecode]

2. 의존성 라이브러리 다운받기

아래의 명령을 통해 의존성 라이브러를 다운받습니다.
[code]
# lein deps
[/code]

3. 커넥션을 위한 디비 설정 하기

[code]
user => (use ‘clojure.contrib.sql)
nil
user=> (def db {:classname "com.mysql.jdbc.Driver"
:subprotocol "mysql"
:subname "//localhost:3306/test"
:user "root"})
[/code]

실제 커넥션 맺기

[code]
user=> (with-connection db (with-query-results rs ["select * from mytable"] (count rs)))
[/code]

저는 테이블 정보가 없기때문에 카운터가 0으로 출력되는 것을 확인 할 수 있습니다.
Result : 0

Clojure – Build a Project

ref : http://stackoverflow.com/questions/6874338/standalone-clojure-app

To build a project that, when run, prints “Hello World!”, you’d do as follows (revision of your process above):

Setup


lein new my-project
cd my-project
lein deps

You should now have a basic structure in place and the Clojure jar in your lib folder.

Write a Function

Now edit src/my_project/core.clj with your editor of choice, adding the following below the (ns …) form:

[sourcecode language=”clojure”]
(defn -main []
(println "Hello World!"))
[/sourcecode]
This function is inside your my-project.core namespace. To ensure this gets run as your main, let’s add a gen-class parameter to your namespace definition at the top, so that it now looks like this at the top of core.clj:

[sourcecode language=”clojure”]
(ns my-project.core
(:gen-class :main true))
So all together, your core.clj file looks like this:

(ns my-project.core
(:gen-class :main true))

(defn -main []
(println "Hello World!"))
[/sourcecode]

Configure it as the Main Function

Once you’ve got src/my_project/core.clj edited as above, you need to tell Leiningen (the build tool) where the “main” function for your project lives. Here’s an example defproject form that does this:
[sourcecode language=”clojure”]
(defproject my-project "1.0.0-SNAPSHOT"
:description "My Project"
:dependencies [[org.clojure/clojure "1.2.1"]]
:main my-project.core)
[/sourcecode]
Now the -main function inside my-project.core becomes the entry-point for your program.

Run It

You can now have two options for running this project:

Use lein run at the command-line while at the root of your my-project project
Create a standalone jar file by running lein uberjar. You can then run the resultant jar file by running
[code]
java -jar my-project-1.0.0-SNAPSHOT-standalone.jar[/code]

Info – GAE Process (Google app engine)

간단하게 GAE sign up에 대한 프로세스 작성한다.

1. Gmail 계정이 필요. 로그인 링크

2. Create Application 버튼이 나오며, 바로 앱을 작성할 수 있다.
이 전에 인증 절차를 받아야 하며 인증은 핸드폰 번호로 날려준다.

3. 인증 절차가 끝나면 간단하게 앱 등록을 할 수 있으며, 등록 후에
*.appspot.com 도메인을 할당받는다.

– 이상 –

[Clojure] building clojure projects with leiningen

http://clojure.org/compilation

http://zef.me/2470/building-clojure-projects-with-leiningen

위 링크를 통하면 자세한 설명이 나와있습니다.
설명을 제외하고 예제 위주로 진행하다록 하겠습니다.

project name: hello
environment : os x

1. 프로젝트 생성.
[code]
lein new hello
[/code]

|____.gitignore
|____classes
| |____hello
| | |____core$_main.class
| | |____core$loading__4410__auto__.class
| | |____core.class
| | |____core__init.class
|____hello-1.0.0-SNAPSHOT.jar
|____hello.jar
|____lib
| |____clojure-1.2.0.jar
| |____clojure-contrib-1.2.0.jar
| |____dev
| | |____clojure-1.2.0.jar
| | |____swank-clj-0.1.1.jar
| | |____swank-clojure-1.2.0.jar
|____project.clj
|____README
|____src
| |____hello
| | |____core.clj
|____test
| |____hello
| | |____test
| | | |____core.clj

위는 완성본 트리 구조이다. 약간은 다를 수 있다.

2. 개발 편의성을 높이기 위해 swank를 사용.
project.clj를 아래와 같인 수정해준다.
[code]
(defproject hello "1.0.0-SNAPSHOT"
:description "FIXME: write"
:dependencies [[org.clojure/clojure "1.2.0"]
[org.clojure/clojure-contrib "1.2.0"]]

:dev-dependencies [[swank-clojure "1.2.0"]
[swank-clj "0.1.1"]
]
:main hello.core
)
[/code]

3. “hello world”를 찍기 위해 소스 수정.
이제 helloworld를 찍어줄 core.clj를 수정해보자.
[code]
(ns hello.core
(:gen-class))

(defn -main [& args]
(println "Hello world!"))
[/code]

4. 컴파일하기.
[code]
lein uberjar hello.jar
[/code]

5. 실행하기.
인자는 -k option을 이용하면 된다.
[code]
java -jar hello.jar
[/code]

out put
[code]
hello world!
[/code]

[Clojure] emacs+lein+swank

아래는 emacs에서 lein과 swank를 이용한 프로젝트 생성과 사용법을 설명 합니다.

– clojure는 lisp의 영향을 받은 자바 가상머신 위에서 동작하는 언어입니다.
– emacs는 하나의 에디터가 아닌 플렛폼이라고 불린 만큼 강력한 툴이라고 불리고 있습니다.
– lein은 자바 라이브러리 사용 할 수있도록 도와줍니다.
– swank는 emacs에서 인터리프리터 된 반환을 표시해주는 server역할을 합니다.

프로젝트 생성
[code]
lein new <project name>
[/code]

lein 의존성 라이브러리 추가하기
프로젝트 디렉토리 안 proejct.clj파일에 아래와 같이 변경합니다.
[code]
(defproject iGAS "1.0.0-SNAPSHOT"
:description "i-GAS Development"
:dependencies [[org.clojure/clojure "1.2.0-beta1"]
[org.clojure/clojure-contrib "1.2.0-beta1"]
[incanter "1.2.3"]
[swingrepl "1.0.0-SNAPSHOT"]]
:dev-dependencies [[lein-clojars "0.5.0-SNAPSHOT"]
[swank-clojure "1.2.1"]
[jline "0.9.94"]])
[/code]

lein 의존성 라이브러리 가져오기
[code]
lein deps
[/code]

repl모드로 시작하기 (emacs가 아닌 콘설창에서 개발하기)
[code]
lein repl
[/code]

emacs에서 개발하기
[code]
lein swank
[/code]
위와 같이 실행을 하며 로컬호스트에 4005포트가 열리게 되며 emacs에서 slime-connect로 접속하여 개발하시면 됩니다.

[개발 팁]
다른 라이브러리를 사용할려면 /lib폴더에 jar파일을 넣어주시면 됩니다.

//==== 번외편 ====//
slime을 설치하여 slime 커넥션으로 swank에 붙는다. 이상.

[Clojure] 재미난 암호화 놀이

Programming Clojure Page 50.
에 나오는 내용이다.
Strings are sequences of characters.
character의 연속은 문자열이다.

When you call clojure sequence functions on a string, you get a sequence of characters back.
문자열에 대해 시퀀스 함수를 호출하게 되면, 문자들의 시퀀스가 반환된다.

Imagine that you wanted to conceal a secret message by interleaving it with a second, innocuous message. You could use interleave to combine the two messages:
예를 들어 일반 메시지를 비밀메시지와 숨기고 싶다고 하자. 두 메시지를 조합하려면 interleave함수를 사용하면 된다.

[sourcecode langugage=”clojure”]
(interleave "Attack at midnight" "The purple elephant chortled")
[/sourcecode]

You can use (apply str ..) again to reveal the message:
(apply str ..)를 이용하여 메시지를 복구할 수 있다.
[sourcecode language=”clojure”]
(apply str (take-nth 2 "ATthtea cpku raptl em iedlneipghhatn"))
[/sourcecode]

[Clojure] 패키지 포함하기 & 문서 보기

Clojure code is packaged in libraries. Each Clojure library belongs to a namespace,
which is analogous to a Java package. You can load a Clojure library with require:
클로저는 라이브러리로 묶을 수 있다. 각각의 클로저 라이브러리는 자바패키지와 유사한 개념인 이름 공간에 속하게 된다.
require를 사용하여 클로저 라이브러리를 불러들일 수 잇다.
[sourcecode langugage=”clojure”]
(require quoted-namespace-symbol)
[/sourcecode]

You can refer a namespace, creating mappings for all its names in your current namespace:
refer을 이용하여 현재 이름공간에서의 이름들을 새롭게 정의하여 매핑할 수 있다.
[sourcecode language=”clojure”]
(refer quoted-namespace-symbol)
[/sourcecode]

For convenience, the use function will require and refer a library in a single step:
편의성을 위해 use함수는 require과 refer를 한번에 사용할 수 있다.
[sourcecode langauge=”clojure”]
(use quoted-namespace-symbol)
[/sourcecode]

[Clojure] introduction을 이용한 실무 유틸.

[sourcecode langugae=”clojure”]
(defn hello
"Writes hello message to *out*. Calls you by username.
Knows if you have been here before."
[username]
(dosync
(let [past-visitor (@visitors username)]
(if past-visitor
(str "Welcome back, " username)
(do
(alter visitors conj username)
(str "Hello, " username))))))
[/sourcecode]

Programming Clojure 저자 스튜어트 할로웨이라는 분이 지으신 책이다.

위 코드를 어디에 이용할 수 있을 지 생각해 봤다.

– 다른 사용자들과 싶게 공유할 수 있는 단어장? (중복 체크하고 쿼리를 날리는 구조에 사용할 수 있겠다.)
– 채팅프로그램에서도 사용할 수 있겠죠? (위 코드를 재사용하면 hello와 welcome으로 분기할수 있음).