프로그래밍 Programming
하스켈 Yesod Echo.hs:6:48: error: parse error on input ‘{’
2018. 1. 19.하스켈 Yesod 페이지를 추가하는 튜토리얼을 진행하는 중 다음과 같이 Echo.hs:6:48: error: parse error on input ‘{’ 을 만나는 경우 다음과 같이 처리한다. src/Echo.hs 123456module Handler.Echo where import Import getEchoR :: String -> Handler HtmlgetEchoR theText = defaultLayout [whamlet|#{theText}|]cs 상기 소스를 rebuild 하면 다음과 같은 에러 발생1234567[11 of 12] Compiling Handler.Echo ( src/Handler/Echo.hs, .stack-work/dist/x86_64-linux/Cabal-1.24.2.0/bu..
하스켈 Starting out - (9) 타입 변수 Type variables
2017. 12. 5.head 함수의 타입이 무엇이라고 생각하는가? head 함수는 리스트를 받아 첫 번째 요소를 반환한다. 지금 확인해보자. Prelude> :t headhead :: [a] -> a여기서 a는 무엇인가? 타입을 뜻하는 것인가? 앞서 타입은 대문자로 쓴다고 말한바 있다. 그러므로 a는 타입이 아니다. 타입이 아니라 타입변수(type variable)이다.a는 어떤 타입이라도 될 수 있다는 의미이다. 다른 언어의 제너릭같은 개념이다. 타입 변수를 가지고 있는 함수는 다형함수(polymorphic functions) 라고 부른다. head 의 타입 선언은 어떤 타입의 리스트를 받아서 그 타입의 한 원소를 반환한다는 말이다. fst 함수를 기억하는가? 페어의 첫 번째 요소를 반환하는 함수이다. 타입을 확인해보자...
하스켈 Starting out - (8) 타입
2017. 12. 5.하스켈은 정적 타입 시스템이다. 모든 표현식의 타입이 컴파일 당시에 이미 알려져있다. 예를 들어 불린 타입을 어떤 숫자로 나눌려고 하면, 컴파일되지 않는다. 프로그램이 충돌하기 전에 컴파일 당시에 이런 오류가 발견되는 것이 좋다. 하스켈의 모든 것은 타입을 가지며, 따라서 컴파일러는 컴파일하기 전에 프로그램에 대해 어느 정도 판단을 할 수 있다. 자바나 파스칼과는 다르게 하스켈은 타입추론(type inference)을 가진다. 만약 숫자를 쓰면, 굳이 하스켈에게 그것이 숫자라고 말할 필요가 없다는 것이다. 하스켈에 있어 타입 시스템을 이해하는 것은 매우 중요하다.타입은 모든 표현식이 가지는 일종의 라벨이다. 표현식이 어떤 카테고리에 속하는지 말해주는 셈이다. 표현식이라는 것은 True 같은 불린이나 "h..
Error haskell: Variable not in scope
2017. 12. 4.다음과 같이 Variable not in scope 에러가 발생하는 경우Prelude> addThree :: Int -> Int -> Int -> Int :89:1: error: Variable not in scope: addThree :: Int -> Int -> Int -> Int 이 경우에는 다음과 같이 멀티플 라인 입력을 해야한다. 아니면 해당 코드를 파일로 저장하여 :load 을 이용하여 로딩할 수도 있다.Prelude> :{Prelude| addThree :: Int -> Int -> Int -> IntPrelude| addThree x y z = x + y + zPrelude| :}Prelude> addThree 3737 383839 393939393939393939781515Prelude>
하스켈 Starting out - (7) 튜플 Tuples
2017. 12. 2.하나의 값에 다수의 값을 저장한다는 측면에서 튜플은 리스트와 유사하다. 하지만 몇 가지 근본적인 차이점이 있다. 숫자의 리스트는 숫자의 리스트일 뿐이다. 그 자체가 타입이고 하나의 숫자만 갖느냐 아니면 무한개의 숫자를 갖느냐는 아무런 문제가 되지 않는다. 하지만 튜플은 결합시킬 값의 갯수를 정확히 알고 있을 때 사용할 수 있다. 얼마나 많은 요소를 포함하고 있고 그 요소의 타입이 무엇인지에 따라 타입 또한 결정된다. 튜플은 괄호로 표시되고 구성요소는 콤마로 구분된다.다른 주요한 차이점은 구성요소들이 동질(homogenous)의 것일 필요는 없다는 것이다. 리스트와 다르게 튜플은 다양한 타입의 요소를 포함할 수 있다.하스켈에서 2차원의 벡터를 어떻게 나타낼 수 있을지 생각해보자. 하나의 방법은 리스트를 사..
하스켈 Starting out - (6) list comprehension
2017. 12. 2.10보다 작은 자연수를 2배로 곱하는 리스트를 만들려면 take 10 [2,4..]와 같은 방식으로 작성할 수 있다. 이와는 달리 list comprehension 을 사용할 수 있는데, 이는 set comprehensions과 매우 유사하다. 아래에서 사용한 list comprehension 즉, [x*2 | x [x*2|x 그러면 위의 구문에 조건을 붙여보자. 이제 2배를 했을때 12보다 큰 원소만 골라내보자. 다음과 같다.Prelude> [x*2|x = 12][12,14,16,18,20]Prelude>그러면 50에서 100까지 모든 숫자에 대해서 7로 나누는 경우 나머지가 3인 원소만 골라내보자.Prelude> [x|x boomBangs xs = [ if x [ x | x [x*y | x [adje..
ghci, stack ghci 버전 확인하기
2017. 12. 2.다음과 같이 함수를 정의할 때 parse error 가 나는 것은 ghci 버전 차이에 따른 것이다. GHCi 가 7.x 또는 그 미만인 경우에는 let 을 통해 함수를 정의해야 한다. Prelude> boomBangs xs = [if x
하스켈 Starting out - (5) range, cycle, repeat, replicate 함수
2017. 12. 2.Range 함수는 숫자, 알파벳 등 셀수 있는 원소들을 산술적으로 나열할 때 유용하게 쓰인다. 예를 들어, 1에서 20까지 모든 자연수를 포함하는 리스트를 만들려면 [1..20]라고 작성하면 된다. 물론[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20] 와 같이 작성해도 똑같으나 이건 멍청한 방법이다. Prelude> [1..20][1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]Prelude> ['a'..'z']"abcdefghijklmnopqrstuvwxyz"Prelude> ['K'..'Z']"KLMNOPQRSTUVWXYZ"Prelude>그러면 1과 20 사이에 있는 짝수로 이루어진 리스트는 어떻게 만들 수 있는가?..
하스켈 Starting out - (4) 리스트 입문
2017. 12. 1.length는 리스트의 길이를 반환한다.Prelude> length [5,4,3,2,1]5null 은 리스트가 비어있는지 체크해서 True, False 를 반환한다. Prelude> null [1,2,3]FalsePrelude> null []Truereverse 함수는 리스트를 반전시킨다.Prelude> reverse [5,4,3,2,1][1,2,3,4,5]take 함수는 숫자와 리스트를 인수로 갖고, 리스트의 처음부터 원소를 일정 갯수 가져온다. Prelude> take 3 [5,4,3,2,1][5,4,3]Prelude> take 1 [3,9,3][3]Prelude> take 5 [1,2][1,2]Prelude> take 0 [6,6,6][]Prelude>해당 리스트에 포함된 원소의 갯수보다 많은 수를..
하스켈 Starting out - (3) 리스트 입문
2017. 12. 1.하스켈에서 리스트는 동질(homogenous)의 데이터 구조이다. 리스트는 같은 타입의 원소를 가진다. 이 말은 정수의 리스트 또는 문자 리스트 등은 가질 수 있지만, 정수 일부, 문자 일부로 구성되는 리스트는 존재하지 않는다는 의미이다. * let 키워드를 이용하여 GHCI 에서 이름을 정의할 수 있다. GHCI 에서 let a = 1 이라고 하는 것은 스크립트에 a = 1 이라고 쓰고 로딩하는 것과 동일하다. Prelude> let lostNumbers = [4,8,15,16,23,42]Prelude> lostNumbers[4,8,15,16,23,42]Prelude>리스트는 대괄호로 표현되고고, 리스트의 값들은 콤마로 구분되어진다. 문자에 관해서 이야기하면 문자열은 단지 문자의 리스트라고 보면 된다...
하스켈 Starting out - (2) 함수를 만들어보자
2017. 11. 30.이제 간단한 함수를 만들어보자.함수는 호출될 때와 유사한 방식으로 정의된다. 함수 이름에 이어 공백 다음에 파라메터가 나온다. 하지만 함수를 정의할 때는 = 다음에 해당 함수가 수행할 기능이 나온다. 아래와 같이 작성한 후 baby.hs 등으로 저장하자. 해당 파일이 저장된 경로로 이동하여, :l baby 라고 치면 해당 스크립트가 로딩된다. baby.hs 1doubleMe x = x + x cs 123456789(blackbriar) root@gcloudx:~/blackbriar/blackbriar/lab/miran# ghciGHCi, version 7.10.3: http://www.haskell.org/ghc/ :? for helpPrelude> :l baby.hs[1 of 1] Compiling M..
하스켈 Starting out - (1) 간단한 수학 연산
2017. 11. 30.주요 연산은 직관적으로 이해가 가능할 것이다. 하스켈의 경우 다음 몇 가지 사항만 유의하자.+ 는 숫자의 경우에만 작동하고, == 는 비교가능한 대상간에 작동하기 때문에 위의 경우에는 오류를 발생시킨다. Prelude> 5 + "llama" :5:3: No instance for (Num [Char]) arising from a use of ‘+’ In the expression: 5 + "llama" In an equation for ‘it’: it = 5 + "llama"Prelude> Prelude> 5 == True :3:1: No instance for (Num Bool) arising from the literal ‘5’ In the first argument of ‘(==)’, namely ..
하스켈 웹프레임워크 - Yesod 라우팅 구문 Routing Syntax
2017. 11. 30.하스켈 웹프레임워크 - Yesod라우팅 구문 Routing Syntax MVC(Model-View-Controller) 프레임워크 관점에서 Yesod를 보면, 라우팅과 핸들러는 이 중 컨트롤러에 해당한다. 다른 웹개발 환경과 비교해보면 다음과 같다.PHP, ASP와 같은 파일 이름 기반 처리방식Django나 Rails 처럼 정규표현식에 기반하여 파싱하는 방식Yesod는 원리상 후자에 가깝다. 그렇다고 하지만 몇 가지 차이점이 있다. Yesod는 정규표현식을 사용하는 대신에 루트의 부분에 매칭한다.단방향 라우트-핸들러 매핑이 아니라, Yesod는 route datatype 또는 type-safe URL 라고 불리는 데이터 타입을 사용하고 양방향 전환 기능을 만들어낸다. Route SyntaxYesod는 기..
Haskell 웹프레임워크 Yesod 퀵 스타트 가이드
2017. 11. 25.Haskell 웹프레임워크 Yesod 퀵 스타트 가이드Yesod 웹 프레임워크의 주요 특징은 다음과 같다.safety & security guaranteed at compile timedeveloper productivity: tools for all your basic web development needsraw performancefast, compiled codetechniques for constant-space memory consumptionasynchronous IOthis is built in to the Haskell programming language (like Erlang) 1. Stack build tool은 다음 포스팅을 참조하여 설치한다. 하스켈 설치 및 Hello World ..
하스켈 설치 및 Hello World 출력해보기 Quick steps to get up and running with Haskell on Ubuntu
2017. 11. 24.하스켈 설치 및 Hello World 출력해보기Quick steps to get up and running with Haskell on Ubuntu 하스켈을 설치하고 Hello World 를 출력하는 간단한 예제를 실행해보자.먼저 가상환경을 만든다.12345678root@gcloudx:~# virtualenv -p python3 venvhaskellRunning virtualenv with interpreter /usr/bin/python3Using base prefix '/usr'New python executable in /root/venvhaskell/bin/python3Also creating executable in /root/venvhaskell/bin/pythonInstalling setup..
우분투 호스트이름 바꾸기
2017. 11. 23.우분투 호스트네임은 다음과 같이 변경할 수 있다. 호스트네임 임시 변경 (재부팅시 원상복귀됨)12345root@gcloud-seoul-5d188bdade7:~# hostnamegcloud-seoul-5d188bdade7root@gcloud-seoul-5d188bdade7:~# hostname gcloudroot@gcloud-seoul-5d188bdade7:~# hostnamegcloudColored by Color Scriptercs 호스트네임 영구 변경1234567891011root@gcloud-seoul-5d188bdade7:~# hostnamectl set-hostname gcloudxroot@gcloud-seoul-5d188bdade7:~# hostnamectl Static hostname: gc..
우분투에 pgAdmin 설치하기 How To Install pgAdmin on Ubuntu 14.04
2017. 11. 18.우분투에 pgAdmin 설치하기How To Install pgAdmin on Ubuntu 14.04 시스템 패키지 업데이트 완료, 관련 패키지 설치완료, 그리고 가상환경 설치까지 마쳤다고 가정하고 진행합니다. Installing PGAdmin 4가상환경을 활성화하여 PgAdmin 파이썬 휠을 다운로드한다.12345678910111213141516171819 root@localhost:~# source venv/bin/activate(venv) root@localhost:~# wget https://ftp.postgresql.org/pub/pgadmin/pgadmin4/v1.6/pip/pgadmin4-1.6-py2.py3-none-any.whl--2017-11-18 15:35:29-- https://ftp..
우분투 14.04에 PostgreSQL 설치하기 How To Install and Use PostgreSQL on Ubuntu 14.04
2017. 11. 18.How To Install and Use PostgreSQL on Ubuntu 14.04 Installation우분투의 기본 저장소는 Postgres 패키지를 포함하고 있으므로, apt 패키징 시스템을 이용해서 설치할 수 있다. 로컬 apt 저장소를 업데이트하지 않았으므로, 먼저 apt 저장소를 업데이트한다. Postgres 패키지와 "contrib" 패키지를 가지고 와서 설치한다.123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596..
Username is not in the sudoers file. This incident will be reported
2017. 11. 18.test1 으로 접속시 다음과 같은 오류가 발생하는 경우 아래와 같이 처리한다. 해당 오류와 관련한 문답은 다음 링크에서 확인할 수 있다.https://unix.stackexchange.com/questions/179954/username-is-not-in-the-sudoers-file-this-incident-will-be-reported 1234 [sudo] password for test1:test1 is not in the sudoers file. This incident will be reported. Colored by Color Scriptercs 123456 test1@localhost:/$ su -암호:root@localhost:~# visudoroot@localhost:~# cs 라인 ..
리눅스 사용가능한 사용자 계정 조회 A command to list all users and how to add, delete, modify users
2017. 11. 11.리눅스 사용가능한 사용자 계정 조회 A command to list all users and how to add, delete, modify users 사용가능한 로컬 유저 목록 보기1234567891011 postgres@localhost:~$ cut -d: -f1 /etc/passwdrootdaemonbinsyssyncpostgrestest1postgres@localhost:~$ Colored by Color Scriptercsgetent를 이용해서도 사용자 목록을 볼 수 있다. 다만 getent가 /etc/passwd 또는 LDAP 등 사용자 db 백엔드에 구성된 모든 사용자를 반환한다는 점에서 위와 방식과 차이가 있다.1234567891011 postgres@localhost:~$ getent p..
Getting Started with CLISP (17) - 텍스트 출력 및 읽기 Printing and Reading Text
2017. 11. 4.Getting Started with CLISP (17) - 텍스트 출력 및 읽기 Printing and Reading Text 이번 포스팅에서는 사용자 인터페이스의 가장 기본인 command-line 인터페이스에 대해서 알아본다. Printing and Reading Text스크린에 프린트하기1234567 Break 83 [84]> (print "foo") "foo""foo"Break 83 [84]> cs"foo"가 2번 출력이 된다. 첫번째 "foo"는 실제 print 함수가 출력하는 부분이며, 두번째 "foo" 는 REPL이 입력된 표현식의 값을 그대로 출력해주기 때문이다. 숙련된 리스퍼들은 prin1 함수도 애용한다. print 와 prin1 의 차이점을 이해하기 위해 다음의 예를 살펴보자.123..
Getting Started with CLISP (16) - 텍스트 게임 엔진 만들기 Building a text game engine
2017. 11. 2.Getting Started with CLISP (16)텍스트 게임 엔진 만들기 Building a text game engine 텍스트 기반의 게임 엔진을 만들어보자. 본 프로그램에서는 다음의 몇 가지를 다룰 수 있어야 한다. 1. 둘러보기2. 다른 장소로 이동하기3. 물건 집기4. 집은 물체에 대한 행동 먼저 1. 주변을 둘러보는 것과 관련해서, 어떤 위치에서든 서로 다른 3가지를 "볼" 수 있어야 한다. 1. 기본 경관2. 다른 위치로 가는 하나 이상의 경로3. 집어서 조작할 수 있는 물건 Describing the Scenery with an Association List본 예제에서는 3개의 위치만 포함하고 있다. 먼저 위치를 나타내는 최상위 변수 nodes 를 선언해보자. 1234[32]> (d..
Getting Started with CLISP (15) - Comparing Stuff: eq, equal, and More
2017. 10. 26.먼저 심볼간의 비교에는 eq 를 사용한다.1234[12]> (defparameter *fruit* 'apple)*FRUIT*[12]> (cond ((eq *fruit* 'apple) 'its-an-apple))ITS-AN-APPLEColored by Color Scriptercs 2개의 심볼을 비교하는 게 아니라면 equal 을 사용해라. 이 명령어는 서로 동형인지를 판단해준다. 1) 심볼 및 리스트 비교1234[13]> (equal 'apple 'apple)T[13]> (equal (list 1 2 3) (list 1 2 3))TColored by Color Scriptercs2) 다른 방식으로 생성된 리스트 간 비교도 가능1234Break 26 [27]> (cons 1 (cons 2 (cons 3 (..
Getting Started with CLISP (14) - Cool Tricks with Conditions
2017. 10. 25.Cool Tricks with Conditions리스프의 몇 가지 반직관적인 트릭을 통해 우리는 좀 더 간결한 코드를 작성할 수 있게 해준다. 하나는 2개의 새로운 조건문 명령어이고, 다른 하나는 True와 False 에 대한 리스프만의 심플한 컨셉이다. Using the Stealth Conditionals and and orand와 or 조건은 간단한 수학 연산자로 Boolean 연산을 도와준다. 예를 들면 다음과 같이 3개의 숫자가 모두 홀수인 경우에 T를 반환하는 것처럼 말이다. 12[75]> (and (oddp 5)(oddp 7)(oddp 9))TColored by Color Scriptercsor 를 이용하면 아래와 같이 하나만 홀수라도 T 를 반환한다.12[76]> (or (oddp 4) (..
host 명령을 이용한 DNS 스캔
2017. 10. 23.host 명령을 이용한 DNS 스캔 모든 서브 도메인을 앞서의 방법으로 찾을 수는 없다. host 명령을 통해 이를 찾는 방법을 알아보자. 전체를 대상으로 검색하는 경우에는 -a 플래그를, 그리고 특정 타겟만 검색하는 경우에는 -t 플래그를 붙인다. 12345678910111213141516171819202122232425262728293031323334root@kali:~# host -a google.comTrying "google.com";; ->>HEADER
게스트 OS 와 VirtualBox 공유폴더 설정하기 Share Folders between Host and Guest OS in VirtualBox
2017. 10. 23.게스트 OS 와 VirtualBox 공유폴더 설정하기Share Folders between Host and Guest OS in VirtualBox Step 1: Update & Upgrade and Dist-UpgradeKali Linux 를 실행시킨 후 터미널창에서 다음의 명령을 실행한다. 1root@kali:~# apt update & apt -y dist-upgradecs VirtualBox 를 재부팅한다. 1root@kali:~# rebootcs Step 2: Double-checking version최신 버전을 실행 중인지 다음과 같이 확인한다.123456789101112131415161718root@kali:~# root@kali:~# root@kali:~# root@kali:~# uname..
VirtualBox 에 Kali Linux 설치하기 How To Install Kali Linux in VirtualBox
2017. 10. 21.VirtualBox 에 Kali Linux 설치하기 How To Install Kali Linux in VirtualBox 먼저 VirtualBox 를 설치한다. VirtualBox는 리눅스, OS X, 솔라리스, 윈도를 게스트 운영 체제로 가상화하는 x86 가상화 소프트웨어로, 하단 링크에서 다운로드 받을 수 있다.http://software.naver.com/software/evaluation.nhn?softwareId=MFS_103899&categoryId=B0300000 VirtualBox 설치가 완료되면 VirtualBox용 Kali Linux 이미지 파일을 아래에서 다운로드한다. https://www.offensive-security.com/kali-linux-vmware-virtualbox-..
NLTK (4) - 정규표현식을 사용한 문자 분해 Tokenizing sentences using regular expressions
2017. 9. 26.NLTK (4) - 정규표현식을 사용한 문자 분해 Tokenizing sentences using regular expressions RegexpTokenizer 인스턴스를 생성한 후, 매칭 토큰을 사용하기위해 정규표현식 문장에 적용시켜보자. from nltk.tokenize import RegexpTokenizer tokenizer = RegexpTokenizer("[\w']+") tokenizer.tokenize("Can't is a contraction.") Out[6]:["Can't", 'is', 'a', 'contraction']클래스를 생성하고 싶지 않다면 다음과 같은 헬퍼 함수를 이용할 수도 있다.from nltk.tokenize import regexp_tokenize regexp_toke..
NLTK (3) - 문장을 단어 단위로 분해하기 Tokenizing sentences into words
2017. 9. 25.NLTK (3) - 문장을 단어 단위로 분해하기 Tokenizing sentences into words 이제 문장을 단어 단위로 분해해보자. 텍스트 처리에 있어 단어 리스트를 생성하는 것은 기본적이고도 필수적인 작업니다. 기본적으로 아래와 같이 word_tokenize() 함수를 이용하여 처리가능하다.from nltk.tokenize import word_tokenize word_tokenize('Hello world.') Out[1]:['Hello', 'world', '.'] word_tokenize() 함수는 TreebankWordTokenizer 클래스의 인스턴스에 tokenize() 함수를 호출하는 래퍼 함수이다. 다음 코드와 같은 의미를 갖는다.from nltk.tokenize import T..
ImportError: cannot import name 'PunktWordTokenizer'
2017. 9. 25.ImportError: cannot import name PunktWordTokenizer 에서는 해결 방법으로 NLTK 버전업그레이드를 제시하고 있다. 현재 NLTK 버전은 3.2.4 이다.1234567(envalicia) root@localhost:~# pythonPython 3.5.2 |Anaconda custom (64-bit)| (default, Jul 2 2016, 17:53:06)[GCC 4.4.7 20120313 (Red Hat 4.4.7-1)] on linuxType "help", "copyright", "credits" or "license" for more information.>>> import nltk>>> nltk.__version__'3.2.4'Colored by Color S..