프로그래밍 Programming
Luminus 를 이용한 Clojure 방명록 만들기 (1) - 프로젝트 생성 및 루미너스 어플리케이션 구조
2018. 8. 21.Luminus 를 이용한 Clojure 방명록 만들기 (1)Creating a new applicationLeiningen 은 이미 설치되어 있다면, 다음의 명령으로 어플리케이션을 초기화할 수 있다.설치 이전이라면 다음 링크를 참조 http://redhotkorea.tistory.com/1769123$ lein new luminus guestbook +h2Retrieving luminus/lein-template/3.0.1/lein-template-3.0.1.pom from clojars Colored by Color Scriptercs이를 통해 H2 임베디드 데이터베이스 엔진을 지원하는 새로운 템플릿 프로젝트가 생성된다. Anatomy of a Luminus application새롭게 생성한 어플리케이..
클로저 12. 제어문 - 기본적인 논리검사
2018. 8. 18.식과 형식식은 평가될 수 있는 코드, 형식은 평가될 수 있는 적법한 식 class 함수12345 user=> (class true)java.lang.Booleanuser=> cs true? false?함수불린 true 및 불린 false 값인지를 알려주는 함수클로저에서는 함수의 결과가 boolean 인 경우 함수 이름 끝에 ? 를 붙이는 것이 관례1234567 user=> (true? true)trueuser=> (true? false)falseuser=> cs nil? 함수값이 없음을 검사하는 함수1234567 user=> (nil? nil)trueuser=> (nil? 1)falseuser=> cs not 함수부정negation 표현인수가 논리적 거짓이면 true 반환, 그렇지 않으면 false 반환..
클로저 11. 함수 만들기 - 이름공간에서 심볼 관리 (2) require
2018. 8. 18.require 를 사용해서 자신의 이름공간에서 라이브러리를 사용할 수 있는 3가지 방법1) 이름공간을 인수로 받아 require 를 사용하는 것clojure.set 이름공간이 REPL이 시작될 때 로딩된다. 그렇지 않은 경우 require 를 사용해서 작업을 직접할 수 있다.123456789 user=> (clojure.set/union #{:r :b :w} #{:w :p :y})#{:y :r :w :b :p}user=> user=> (require 'clojure.set)niluser=> Colored by Color Scriptercs2) :as 를 사용해서 require 의 별칭 기능을 이용하는 것심볼 이름 앞에 원래의 이름공간 대신 별칭을 붙여서 심볼에 접근할 수 있다.12345678910 use..
클로저 10. 함수 만들기 - 이름공간에서 심볼 관리 (1)
2018. 8. 18.ns 를 이용하여 이름 공간을 새로 만들고 그 이름공간으로 전환할 수 있다.이제 디폴트 이름공간이 user 에서 alice.favfoods 로 바뀌었음을 알 수 있다. 현재 이름공간을 나타내는 *ns*라는 명령을 통해 이를 확인할 수 있다. 123456789 user=> (ns alice.favfoods)nilalice.favfoods=> alice.favfoods=> *ns*#object[clojure.lang.Namespace 0x44fdc648 "alice.favfoods"]alice.favfoods=> Colored by Color Scriptercs여기에서 var 를 정의하면, 그 var 는 직접 접근할 수 있다. 이름공간을 포함하는 완전한 이름인 alice.favfoods/fav-food 를 ..
클로저 09. 함수 만들기 - defn, fn, 그리고 무명함수
2018. 8. 18.'함수를 만들고 그것에 심볼을 할당하고 그 함수를 호출한다.' defn 은 def 와 비슷하지만, 함수를 위한 var 를 만든다. defn 은 함수이름, 함수 인수들의 벡터, 함수 본문을 인수로 받는다 (빈벡터를 사용하여 함수를 인수없이 호출할 수도 있다)함수를 호출하려면 함수를 괄호로 둘러싸서 사용하면 된다. 함수를 호출하면 클로져는 그 함수를 평가한 후 결과를 반환한다. 인수없이 정의한 예1234567 user=> (defn follow-the-rabbit [] "Off we go!")#'user/follow-the-rabbituser=> (follow-the-rabbit)"Off we go!"user=> Colored by Color Scriptercs인수로 2개의 잼을 받고 그 잼들을 포함하는 맵..
클로저 08. 심볼과 바인딩 - def, var, let
2018. 8. 17.def 는 값에 이름을 줘서 참조 가능하게 한다. 심볼에 직접 값을 바인딩하지 않고 var 를 통해서 한다.예를 통해 살펴보자. 12345 user=> (def developer "Alice")#'user/developeruser=> csdef 는 위에서 보는 바와 같이 이름공간 user 에 심볼인 developer 를 위한 var 객체를 만들었다.이제 REPL 에서 developer 을 평가하면 "Alice" 로 평가된다. 심볼 앞에 / 를 붙여서 이름공간을 지정할 수도 있다. 즉, var 의 완전한 이름은 이름공간/var의 이름인 셈이다.하지만 여기서는 현재의 이름공간이 var 의 이름공간과 같기 때문에 developer 만 사용한 것이다. 12345 user=> (def user/developer ..
클로저 07. 데이터 컬렉션 - 리스트가 핵심
2018. 8. 17.맨 앞에 붙은 ' 기호가 리스트를 만드는 역할을 한다. 이 인용기호가 필요한 이유는, LISP 에서는 식expression 의 첫 요소를 연산자나 함수로 인식하기 때문이다. 그 다음 요소들은 모두 연산자나 함수를 위한 인수로 인식된다.따라서 인용기호가 없으면, 아래에서 보듯이 문자열이 리스트의 첫 요소로 있어서 함수로 인식하여 호출하려고 하기 때문에, 에러를 발생시킨다. 문자열은 함수가 아니다. 12345678 user=> ("marmalade-jar" "empty-jar" "pickle-jam-jar")ClassCastException java.base/java.lang.String cannot be cast to clojure.lang.IFnuser/eval1302 (form-init689628077..
클로저 06. 데이터 컬렉션 - 집합
2018. 8. 17.집합은 유일한 값들의 컬렉션이다. 요소의 중복이 없는 컬렉션을 만들 때 유용하다. 집합은 #{} 로 둘러싼다.집합을 생성할 때는 당연히 중복은 허용되지 않는다.1234567 user=> #{:red :blue :white :pink}#{:white :red :blue :pink} user=> #{:red :blue :white :pink :pink}IllegalArgumentException Duplicate key: :pink clojure.lang.PersistentHashSet.createWithCheck (PersistentHashSet.java:68) Colored by Color Scriptercsunion, difference, intersection 과 집합연산이 가능하다. 집합연산을 하기..
클로저 05. 데이터 컬렉션 - 맵
2018. 8. 17.맵은 키-값 쌍으로 구조화된 데이터를 저장하는데 많이 사용된다. 맵은 중괄호 {} 로 둘러싸인다. 123user=> {:jam1 "strawberry" :jam2 "blackberry"}{:jam1 "strawberry", :jam2 "blackberry"} Colored by Color Scriptercsget 함수로 값을가져온다. 123user=> (get {:jam1 "strawberry" :jam2 "blackberry"} :jam2)"blackberry" Colored by Color Scriptercs키가 없을 경우 반환되는 값을 디폴트로 줄 수 있다. get 함수의 마지막 인수로 디폴트 값 주면 된다. 1234 user=> (get {:jam1 "strawberry" :jam2 "blackb..
클로저 04. 데이터 컬렉션 - 컬렉션의 공통점
2018. 8. 17.모든 컬렉션은 불변immutable이고 존속적persistent이다.cons 를 통해 컬렉션에 요소를 요청하게 되면, 원래의 컬렉션은 변하지 않고, 단지 그 요소가 추가된 새로운 버전의 컬렉션이 반환된다. 존속(persistent)이란 구조 공유(structual sharing)라는 기법으로 컬렉션의 신규 버전이 효율적으로 만들어진다는 것을 의미한다. 존속이라는 개념은 저장장치와 관련이 없고, 데이터가 갱신되었지만, 이전 버전의 값이 지워지지 않고 그대로 보존됨을 의미한다.컬렉션은 다음의 함수를 지원한다.시퀀스 함수 (first, rest, last) 를 지원한다.count 함수는 컬렉션의 크기를 반환한다.conj 함수는 컬렉션에 하나 이상의 요소를 추가한다. 그 컬렉션의 데이터 구조에 가장 효율적인 방..
클로저 03. 데이터 컬렉션 - 벡터
2018. 8. 17.벡터벡터는 중간에 있는 요소를 가져오고자 할 때 유용하다. 인덱스 접근이 필요할 때 유용한 셈이다. 벡터는 대괄호로 둘러싸서 만든다.벡터에도 first 와 rest 가 등장한다.123456789 user=> [:jar1 1 2 3 :jar2][:jar1 1 2 3 :jar2]user=> (first [:jar1 1 2 3 :jar2]):jar1user=> (rest [:jar1 1 2 3 :jar2])(1 2 3 :jar2)user=> Colored by Color Scriptercs 벡터는 인덱스를 통해 요소에 빠르게 접근가능하다.1234567891011121314151617 user=> (nth [:jar1 1 2 3 :jar2] 0):jar1user=> (nth [:jar1 1 2 3 :jar2] ..
리눅스 계정 및 홈디렉토리 삭제
2018. 8. 14.계정+홈디렉토리 삭제 삭제할 계정 확인1234 root@:~# cat /etc/passwd | grep kafkakafka:x:1001:1005::/home/kafka:/bin/sh Colored by Color Scriptercs 계정과 홈디렉토리 모두 삭제되었음을 알 수 있다.123root@:~# userdel -r kafkaroot@:~# cat /etc/passwd | grep kafkaroot@:~# ll /home | grep kafkacs
클로저 02. 데이터 컬렉션 - 리스트
2018. 8. 13.리스트리스트에는 순서가 있다.인용기호 ' 를 괄호 앞에 붙이고 그 안에 데이터를 넣으면 된다.문자열, 정수, 키워드 같은 여러 종류의 값을 혼합해 나열할 수 있다.요소들 사이에 쉼표가 없어도 무방하다. 쉼표는 공백문자처럼 취급되어 무시된다 (가급적 공백을 사용하는 것을 추천한다)1234 user=> '(1 2 "jam" :marmalade-jar)(1 2 "jam" :marmalade-jar) Colored by Color Scriptercs 리스트는 첫 요소와 나머지 요소로 구분된다. 첫번째 요소는 first 함수로 가져오고, rest 함수로 나머지 요소를 가져올 수 있다.1234567 user=> (first '(:rabbit :pocket-watch :marmalade :door)):rabbitus..
클로저 01. 클로져 식의 기본 구조 이해하기 (단순값)
2018. 8. 11.실행준비아나콘다 가상환경설정 + 자바 설치 + Leiningen 설치 + 새 프로젝트 생성123456789101112131415161718~# su - fukaerii~$ conda create --name marie python=3~$ . activate marie(marie) ~$ sudo apt-get update[sudo] password for fukaerii:(marie) ~$ sudo apt-get install git(marie) ~$ pwd/home/fukaerii(marie) ~$ java -versionopenjdk version "10.0.1" 2018-04-17OpenJDK Runtime Environment (build 10.0.1+10-Ubuntu-3ubuntu1)OpenJDK..
클로져 시작하기 Getting Started with Clojure
2018. 8. 9.클로져를 빨리 실행해보고자 한다면, 먼저 자바가 설치되어 있는지 확인해야 한다. 그리고 Leiningen 프로젝트 관리 도구를 설치해야 한다. OS 내의 패키지 관리자가 아니라, leiningen.org 에서도 권고하듯이 스크립트를 직접 다운로드하여 설치하기를 권고한다. Trying out the REPLlein 툴이 일단 설치되었다면, repl 을 다음과 같이 어디서든 실행할 수 있다.12345678910111213(dominika) ~$ lein replnREPL server started on port 33137 on host 127.0.0.1 - nrepl://127.0.0.1:33137REPL-y 0.3.7, nREPL 0.2.12Clojure 1.8.0OpenJDK 64-Bit Server V..
우분투 18.04에 클로져 웹 어플리케이션 배포하기 How To Deploy a Clojure Web Application on Ubuntu 18.04
2018. 8. 4.도입우분투 18.04 환경에서 클로저를 이용한 웹구현의 기본적인 모습을 살펴본다. 샘플 클로져 어플리케이션과 패키지를 생성하고, Supervisor 과 Nginx 를 이용한 서버상에 클로져 앱을 셋팅해본다. 이를 위해서 먼저, 아래 2가지가 선행되어야 한다. 우분투 18.04 환경과 sudo 권한을 가진 non-root 사용자 계정이 그것이다. 먼저 아나콘다를 이용해 가상환경을 만든다. 1fukaerii@***-***-***-**:~$ conda create --name dominika python=3cs 123456789$ conda env list# conda environments:#base * /home/fukaerii/anaconda3dominika /home/fukaerii/anaconda3/..
우분투에 클로져 설치하기 Installing clojure on ubuntu
2018. 8. 4.아래의 내용을 같이 실행하려면 일단 터미널이 설치되어 있어야 한다. 터미널 화면으로 진입하여 다음의 순서대로 따라해보자. 자바 설치 여부 확인터미널에 java -version이라고 입력한다. 자바가 설치되어 있지 않다면, 아래와 같이 보일 것이다. 12345678910$ java -version Command 'java' not found, but can be installed with: apt install default-jreapt install openjdk-11-jre-headlessapt install openjdk-8-jre-headlessapt install openjdk-9-jre-headless Ask your administrator to install one of them.cs위의 명..
우분투 사용자 패스워드 변경하기
2018. 6. 19.우분투 사용자 패스워드 변경하기adduser 를 통해 생성한 사용자의 패스워드 셋팅은 다음과 같이 할 수 있다. 사용자 본인의 패스워드는 아래와 같이 변경가능하다.12345678910111213root@server:~# su - fukaeriifukaerii@server:~$ passwdChanging password for fukaerii.(current) UNIX password:passwd: Authentication token manipulation errorpasswd: password unchanged fukaerii@server:~$ passwdChanging password for fukaerii.(current) UNIX password:Enter new UNIX password:Rety..
우분투 18.04 장고 설치하기 How to Install Django on Ubuntu 18.04 LTS
2018. 6. 16.아나콘다를 통해 설치되는 버전은 django 2.0.5 이다. 금일 기준 최신 공식버전은 2.0.6 이다 (https://www.djangoproject.com/download/).123456789101112131415161718192021222324252627282930313233343536(redsparrow) fukaerii@server:~$ conda install -c anaconda djangoSolving environment: done ## Package Plan ## environment location: /home/fukaerii/anaconda3/envs/redsparrow added / updated specs: - django The following packages will be..
아나콘다 환경설정 저장하기 Save the Environment with Anaconda
2018. 6. 14.Save the Environment with Anaconda앞선 포스팅에서 아나콘다 가상환경을 새롭게 생성하고, 활성화시켜 필요한 패키지들을 설치하였다. 작업에 들어가기 앞서, 먼저 환경 설정 파일을 프로젝트 폴더 내에 저장해놓을 필요가 있다.이렇게 파일로 환경 설정을 옮겨두면, 프로젝트의 이동성이나 재사용성이 향상되는 결과를 가져온다. yaml 설정 파일을 내보내기 위해 conda export 를 사용해, environment.yaml 라는 이름으로 저장하자.1234(redsparrow) fukaerii@server:/$ cd home/fukaerii(redsparrow) fukaerii@server:~$ conda env export > environment.yaml(redsparrow) fukae..
우분투 18.04 아나콘다 설치하기 How To Install the Anaconda Python Distribution on Ubuntu 18.04
2018. 6. 14.Anaconda 를 설치하는 가장 좋은 방법은 최신판 Anaconda 설치 배시 스크립트를 다운로드 받아 검증 후 구동하는 것이다. Download Anaconda Distribution 에서 파이썬 3 용 최신 버전을 찾을 수 있다. 현재 포스팅 작성 시점 기준에서는 5.30 발표된 5.2 버전이 최신이다. 임시(ephemeral) 아이템을 다운로드받을 /tmp 디렉토리로 변경하자. curl 을 이용하여 다음과 같이 최신판을 /tmp 디렉토리에 다운로드하자.1234:/tmp# curl -O https://repo.continuum.io/archive/Anaconda3-5.2.0-Linux-x86_64.sh % Total % Received % Xferd Average Speed Time Time Tim..
우분투 사용자 추가 - Add user to Ubuntu via command line
2018. 6. 14.커맨드라인에서 사용자를 추가해보자. 터미널을 열고 다음과 같이 사용자이름을 인수로 갖는 adduser 명령을 실행한다. 예를 들어 아래는 fukaerii 라는 사용자 이름을 가진 유저를 생성한다. 패스워드를 제외하고 모든 정보는 선택사항이다. 1234567891011121314151617:~# sudo adduser fukaeriiAdding user `fukaerii' ...Adding new group `fukaerii' (1004) ...Adding new user `fukaerii' (1000) with group `fukaerii' ...Creating home directory `/home/fukaerii' ...Copying files from `/etc/skel' ...Enter new U..
Rufus 를 이용해 윈도우 부팅 USB 만들기
2018. 5. 3.rufus 를 이용해 부팅 가능한 윈도우 USB 를 만들어보자. Rufus 최신버전은 아래 사이트에서 다운로드할 수 있다. 현재 최신 버전은 2.1.8 버전이다. https://rufus.akeo.ie/ 다운로드받은 rufus 를 실행한다. USB 를 꽂으면 아래와 같이 기본 셋팅이 된다. 아래와 같이 원하는 ISO 이미지를 불러온다.여기서는 Windows 7 Professional K SP1 64비트를 선택했다. 시작을 누르면 USB에 부팅 가능한 윈도우가 만들어진다. 해당 USB 내용을 살펴보면 다음과 같다.
선택한 디스크가 GPT 파티션 스타일입니다.
2018. 5. 3."이 디스크에 Windows를 설치할 수 없습니다. 선택한 디스크가 GPT 파티션 스타일이 아닙니다”라는 오류 메시지가 표시되는 것은 PC가 UEFI 모드에서 부팅되었지만 하드 드라이브가 UEFI 모드를 지원하도록 구성되지 않았기 때문이다. 이 경우 아래와 같이 처리할 수 있다. GPT 파티션 스타일로 변환(UEFI 모드)하거나, 기본 파티션 스타일인 MBR (레거시 BIOS 호환 모드)로 사용하는 2가지 방법이 있다. 먼저, GPT 파티션 변환은 다음과 같이 할 수 있다. 1) PC를 끄고 Windows 설치 DVD 또는 USB 키를 넣은 후 부팅한다. Esc, F2, F9, F12 등의 키를 눌러서 부팅 메뉴가 표시되면 UEFI 모드의 DVD 또는 USB 키로 부팅한다. 2) Windows 를 설치..
Functional Programming with Haskell - fromTo
2018. 4. 20.정수의 범위로 된 리스트를 생성하는 다음 함수를 보자.123456789 Prelude Data.Char> let fromTo first last = [first..last]fromTo :: Enum t => t -> t -> [t] Prelude Data.Char> fromTo 10 15[10,11,12,13,14,15]it :: (Enum t, Num t) => [t]Prelude Data.Char> Colored by Color Scriptercs cons 연산자를 사용하여 fromTo 의 재귀적 버전을 작성해보자.12fromTo first last | first > last = [] | otherwise = first : fromTo (first+1) lastcs 대체와 다시쓰기를 통해 fromTo..
Functional Programming with Haskell - "cons" lists
2018. 4. 20.대부분의 functional languages 와 마찬가지로, 하스켈의 리스트는 "cons" 리스트이다. "cons" 리스트는 2개의 부분으로 구성된다. head: a valuetail: a list of values (빈 리스트도 가능): ("cons") 연산은 값과 동일한 타입의 값으로 구성된 리스트(혹은 빈 리스트)로부터 새로운 리스트를 생성한다.12345678 Prelude> 5 : [10,20,30][5,10,20,30]it :: Num a => [a] Prelude> :type (:)(:) :: a -> [a] -> [a] cs cons (:) 연산은 값과 리스트로부터 새로운 리스트를 만든다.1234567891011121314151617181920212223242526272829 Prelude..
Functional Programming with Haskell - Strings are [Char]
2018. 4. 19.하스켈에서 문자열은 단순히 문자의 리스트이다. 1234567891011121314151617 Prelude> "testing""testing"it :: [Char] Prelude> ['a'..'z']"abcdefghijklmnopqrstuvwxyz"it :: [Char] Prelude> ["ust","a","test"]["ust","a","test"]it :: [[Char]] Prelude> ["just","a","test"]["just","a","test"]it :: [[Char]] cs 리스트에서 사용가능한 함수는 모두 문자열에서도 사용할 수 있다.123456789101112 Prelude> let asciiLets = ['A'..'Z'] ++ ['a'..'z']asciiLets :: [Char] P..
Functional Programming with Haskell - Comparing lists, Lists of Lists
2018. 4. 19.Comparing lists하스켈 리스트는 값이고, 값으로 비교가능하다. 아래를 보자.12345678910 Prelude> [3,4] == [1+2,2*2]True Prelude> [3] ++ [] ++ [4] == [3,4]True Prelude> tail (tail [3,4,5,6]) == [last [4,5]] ++ [6]True Colored by Color Scriptercs리스트의 비교는 사전 편찬상의 순서를 따른다. 대응되는 원소간의 비교는 서로 다른 것이 나타날 때까지 계속되고, 서로 다른 원소를 비교결과가 그 리스트의 비교 결과가 된다. 123 Prelude> [1,2,3] [1,2,3] [1,2,3] [1,2,3] > [1,2]True Prelude> [1..] let x = [[1],..
Functional Programming with Haskell - Lists basics
2018. 4. 17.하스켈에서 리스트는 같은 타입을 가진 연속된 값을 의미한다. 아래는 리스트는 만드는 간단한 방법으로, 각각의 타입에 주목해서 살펴보자.12345678910111213141516171819 *Main> [7,3,8][7,3,8]it :: Num t => [t] *Main> [1,3,10,4,9.7][1.0,3.0,10.0,4.0,9.7]it :: Fractional t => [t] *Main> ['x', 10] :79:7: No instance for (Num Char) arising from the literal ‘10’ In the expression: 10 In the expression: ['x', 10] In an equation for ‘it’: it = ['x', 10] Colored by C..
Functional Programming with Haskell - Recursion
2018. 4. 17.함수 자신을 직접 또는 간접적으로 호출하는 함수를 재귀함수라고 한다. 정수의 팩토리얼(N!) 을 계산하는 것이 전형적인 재귀의 예시이다. 그럼 이를 하스켈로 작성해보자. 그리고 그 타입이 무엇인지 알아보자. 12factorial n | n == 0 = 1 | otherwise = n * factorial (n-1)cs 1234567891011121314 *Main> :load factorial[1 of 1] Compiling Main ( factorial.hs, interpreted )Ok, modules loaded: Main. *Main> :type factorialfactorial :: (Eq a, Num a) => a -> a *Main> factorial 4081591528324789773434..