간단 비교


Setq

Setf

더 적은 용도

더 넓은 용도

Setq를 사용한 모든 곳에 Setf를 사용할 수 있다. 하지만 반대는 안된다.

Low level

High level

Setf는 Setq를 사용하여 구현되어 있다.



결론


특별한 이유가 없으면 Setf를 쓰면 된다!!

,

위의 두 글을 참고하면 웹페이지의 특정 class에 해당하는 부분을 추출하여 텔레그램 채널로 보내는 것이 가능하다.


사전 준비사항

  1. app template을 사용하여 프로젝트를 생성한다.

    lein new app clj-test-02
    

  2. project.clj 파일의 dependencies 부분에 아래와 같이 필요한 모듈을 정의한다.

    (defproject clj-test-02 "0.1.0-SNAPSHOT"
      :description "FIXME: write description"
      :url "http://example.com/FIXME"
      :license {:name "Eclipse Public License"
                :url "http://www.eclipse.org/legal/epl-v10.html"}
      :dependencies [[org.clojure/clojure "1.8.0"][clj-http "2.2.0"] [enlive "1.1.6" :exclusions [org.clojure/clojure]]]
      :main ^:skip-aot clj-test-02.core
      :target-path "target/%s"
      :profiles {:uberjar {:aot :all}})
    
    

예제

(ns clj-test-02.core
 (:gen-class)
 (:require [net.cgrand.enlive-html :as html])
 (:require [clj-http.client :as client]))

(use 'clojure.pprint)

(defn html-data []
  ;; clj-html 모듈을 사용하여 웹페이지의 내용을 가져온다.

  (html/html-resource (java.io.StringReader.
      (:body (client/get "http://httpbin.org"))))
)

(defn -main [& args]
  
  (pprint (client/post "https://api.telegram.org//bot<텔레그램 봇 토큰>/sendMessage" 
    {:body (format "{\"chat_id\": \"@<채널 ID>\", \"text\": \"%s\"}"
             (first (:content (first (html/select (html-data) [:.bash])))))
     :headers {"Content-Type" "application/json"}}))
)


<테스트 환경>
- OS : Windows 7
- Leiningen 버전 : 1.0.0
,
  1. core.clj에 (:gen-class) 구문 추가
    (ns <프로젝트명>.core
     (:gen-class))
    
  2. core.clj에 main 함수 추가
    (defn -main
     [& args]
     (<시작 함수명> <시작 함수 파라미터>))
    
  3. project.clj에 다음 구문 추가
    :main ^:skip-aot <프로젝트명>.core
    :target-path "target/%s"
    :profiles {:uberjar {:aot :all}}
    


    <테스트 버전>
    Eclipse 버전 : Mars
    CCW 버전 : 0.35.0.STABLE001
    Leiningen 버전 : 1.0.0
    
,
  1. 다음 페이지에서 lein2-eclipse 플러그인 소스를 다운받는다.


  2. lein2-eclipse 소스 디렉토리로 이동한다.

  3. 소스를 빌드 후, 로컬 Repository에 설치한다.

    lein install
    

  4. Import할 프로젝트의 project.clj 파일에 다음 구문을 추가한다.

    :plugins [[lein2-eclipse "2.0.0"]]
    
    혹은
    
    :plugins [<기존 플러그인> [lein2-eclipse "2.0.0"]]
    

  5. Import할 프로젝트 디렉토리로 이동해서 다음과 같이 입력하면 .project 파일과 .classpath 파일이 생성된다.

    lein eclipse
    

  6. Eclipse에서 프로젝트를 Import한다.

  7. Configure -> Convert to Leiningen Project 메뉴를 실행하여 Leiningen 프로젝트로 변환한다.


<테스트 버전>
Eclipse 버전 : Mars
CCW 버전 : 0.35.0.STABLE001
Leiningen 버전 : 1.0.0


,

사전 준비 사항


clj-http 모듈 사용을 위해서 project.clj 파일의 dependencies 부분에 아래와 같이 추가해준다. (버전은 참고사이트에서 최신 버전을 확인하자)

(defproject projectname "0.1.0-SNAPSHOT"
  :description "FIXME: write description"
  :url "http://example.com/FIXME"
  :license {:name "Eclipse Public License"
            :url "http://www.eclipse.org/legal/epl-v10.html"}
  :dependencies [[org.clojure/clojure "1.6.0"]
                  [clj-http "2.2.0"]])


채널 포스팅


Clojure를 사용하여 텔레그램 채널에 메세지를 보내는 예제입니다.


<텔레그램 봇 토큰>과 <채널 ID> 부분은 아래 글에서 설명했던 값으로 바꿔줍니다.


–> 텔레그램 봇으로 채널 포스팅 - 1. 준비 작업

(require '[clj-http.client :as client])

(println (client/post "https://api.telegram.org//bot<텔레그램 봇 토큰>/sendMessage"
  {:body "{\"chat_id\": \"@<채널 ID>\", \"text\": \"test string\"}"
            :headers {"Content-Type" "application/json"}}))
(println "done")


참고 글


참고 사이트


<테스트 버전>

Eclipse 버전 : Mars
CCW 버전 : 0.35.0.STABLE001
Leiningen 버전 : 1.0.0


,

사전 준비사항

  1. 새로운 clojure 프로젝트를 생성한다.
  2. clj-http 모듈 사용을 위해서 project.clj 파일의 dependencies 부분에 아래와 같이 추가해준다. (버전은 참고사이트에서 최신 버전을 확인하자)
    (defproject projectname "0.1.0-SNAPSHOT"
      :description "FIXME: write description"
      :url "http://example.com/FIXME"
      :license {:name "Eclipse Public License"
                :url "http://www.eclipse.org/legal/epl-v10.html"}
      :dependencies [ [org.clojure/clojure "1.6.0"]
                      [clj-http "2.2.0"] ])
    

기본 HTTP 요청하기 예제

(require '[clj-http.client :as client])

(client/get "http://httpbin.org/ip")

(println "done")

POST 요청하기 예제

(require '[clj-http.client :as client])

(println (client/post "http://httpbin.org/post"
  {:body "{\"text\": \"test string\"}"
            :headers {"Content-Type" "application/json"}}))

(println "done")

응답

  • client/get 혹은 client/post를 호출했을 때, 응답은 다음과 같은 형식이 되며 실제 HTML은 :body ~ 부분에 오게된다.

    {:orig-content-encoding ..,
     :trace-redirects ..,
     :request-time ..,
     :status ..,
     :headers
     {"Server" ..,
      "Via" ..,
      .. },
     :body .. }
    

  • :body 부분만 추출하기 위해서는 아래와 같이 호출하면 된다.

    (:body (client/get "http://httpbin.org/ip"))
    

참고 사이트

<테스트 환경>
 - OS : Windows 7
 - Leiningen 버전 : 1.0.0
,

Eclipse를 사용하여 clojure 개발을 하는 것도 가능한데, 내부적으로 lein을 사용한다고 보면된다.


설치

  1. Eclipse를 실행한다.(물론 자바 버전으로..)

  2. Help -> Eclipse Marketplace 메뉴를 실행한다.

  3. clojure로 검색한다.

  4. Counterclockwise를 설치한다.


프로젝트 생성

  1. File -> New -> Project 메뉴를 선택한다.

  2. Clojure/Clojure Project 항목을 선택 후, 다음을 누른다.

  3. 프로젝트 명과 템플릿 명을 입력한다.

  4. 기본적으로 default, plugin, app 세개의 템플릿이 제공되며 각각의 용도는 아래와 같다. 여기서는 app을 입력한다.


    • default : 일반적인 라이브러리 작성을 위한 프로젝트를 생성한다.
    • plugin : leiningen 플러그인 작성을 위한 프로젝트를 생성한다.
    • app : 어플리케이션 작성을 위한 프로젝트를 생성한다.


  5. 기본적인 예제 코드를 포함하는 프로젝트가 생성되는 것을 확인할 수 있다.


lein 명령어 사용

  • Eclipse 환경에서도 프로젝트의 빌드/실행은 leiningen을 통해서 이루어지는데, 프로젝트 오른쪽 클릭 후, Leiningen -> Generic Leiningen Command Line 메뉴를 선택하면 lein 명령어를 실행할 수 있다.


프로젝트 빌드

  1. lein 명령어로 아래와 같이 입력하면 새로운 프로젝트를 빌드할 수 있다.

    lein jar
    
  2. 빌드한 결과로 jar 파일이 생성되는데, 이렇게 생성한 jar 파일에는 clojure 관련 라이브러리가 포함되어있지 않다.

  3. 아래와 같이 lein 명령어를 사용하여 실행할 수 있다. (app 템플릿을 사용하여 프로젝트를 생성했을 경우)

    lein run
    


프로젝트 빌드 (독립 실행 가능한)

  1. lein 명령어로 아래와 같이 입력하면 프로젝트를 빌드할 수 있다.

    lein uberjar
    
  2. 빌드한 결과로 기존의 jar 파일에 추가적으로 standalone이 붙은 jar 파일이 생성되는데, 이렇게 생성한 jar 파일에는 clojure 관련 라이브러리가 포함되어있어 java 명령으로도 실행이 가능하다.

    java -jar <standalone jar 파일명>


REPL(Read-Eval-Print Loop) 실행하기

  • 소스 파일이 열린 상태에서 상단의 Clojure -> Load File in REPL 메뉴를 선택하면, REPL 창에서 소스 코드가 로딩되면서, clojure 구문들을 테스트할 수 있다.


참고 사이트


<테스트 환경>

OS : Windows 7
Eclipse 버전 : Mars
CCW 버전 : 0.35.0.STABLE001


,

Clojure는 Lisp의 파생언어(Dialect)이고 JVM 엔진 상에서 구동된다. (CLR, Javascript 버전도 있지만 특별한 언급이 없으면 앞으로 여기서는 JVM 버전을 다루도록 하겠다)


Leiningen은 커맨드라인 방식의 clojure 개발 환경이다. lein 스크립트의 자동 설치 기능을 이용하거나 윈도우에서는 인스톨러도 사용가능하다.


자동 설치 기능 사용할 경우

  1. Leiningen 사이트에서 lein 스크립트(윈도우용의 경우 .bat)를 다운받는다.

  2. http://leiningen.org/

  3. 다운받은 lein 스크립트를 원하는 위치에 복사한다.(실제 실행시에도 사용되는 파일이므로 설치할 경로에 복사한다.)

  4. 다음과 같이 입력하여 자동 설치를 진행한다.

  5. lein self-install
    
  6. 위 lein 스크립트의 위치를 PATH 환경 변수에 추가한다.

  7. 참고: 자동 다운로드된 파일은 <사용자 폴더>/.lein/self-installs에 저장되니 언인스톨시 이 파일들도 지우도록 한다.


인스톨러를 사용할 경우

  1. 인스톨러를 사용하여 설치를 진행한다.

  2. PATH 환경 변수를 설정할 필요도 없다!


프로젝트 생성

  1. 커맨드 라인에서 아래와 같이 입력하면 새로운 프로젝트를 생성할 수 있다.
  2. lein new <템플릿 명> <프로젝트 명>
    
  3. 기본적으로 default, plugin, app 세개의 템플릿이 제공되며 각각의 용도는 아래와 같다. 여기서는 app을 입력한다.


    • default : 일반적인 라이브러리 작성을 위한 프로젝트를 생성한다.
    • plugin : leiningen 플러그인 작성을 위한 프로젝트를 생성한다.
    • app : 어플리케이션 작성을 위한 프로젝트를 생성한다.


  4. 위 명령어 실행시, 기본적인 예제 코드를 포함하는 프로젝트가 생성되는 것을 확인할 수 있다.


프로젝트 빌드

  1. 프로젝트 디렉토리에서 아래와 같이 입력하면 프로젝트를 빌드할 수 있다.
  2. lein jar
    
  3. 빌드한 결과로 jar 파일이 생성되는데, 이렇게 생성한 jar 파일에는 clojure 관련 라이브러리가 포함되어있지 않다.

  4. 아래와 같이 lein 명령어를 사용하여 실행하거나, java 명령으로 실행하려면 별도로 clojure 관련 라이브러리를 지정하여야 한다. (app 템플릿을 사용하여 프로젝트를 생성했을 경우)

  5. lein run
    


프로젝트 빌드 (독립 실행 가능한)

  1. 프로젝트 디렉토리에서 아래와 같이 입력하면 프로젝트를 빌드할 수 있다.
  2. lein uberjar
    
  3. 빌드한 결과로 기존의 jar 파일에 추가적으로 standalone이 붙은 jar 파일이 생성되는데, 이렇게 생성한 jar 파일에는 clojure 관련 라이브러리가 포함되어있어 java 명령으로도 실행이 가능하다.
  4. java -jar <standalone jar 파일명>
    


REPL(Read-Eval-Print Loop) 실행하기


아래와 같이 입력하면 REPL이 실행되면서, clojure 구문들을 테스트할 수 있다.

lein repl


참고 사이트


<테스트 환경>

OS : Windows 7
Leiningen 버전 : 1.0.0


,