이 블로그 검색

2015년 11월 17일 화요일

한글로된 하스켈 꿀자료

제목 그대로 한글로된 하스켈 꿀자료 되겠다. 블로그를 가서보시면 알겠지만 책으로익히던 하스켈문법들을 어느정도 익혔다면 실전에서 어떻게 써야하는지 바세히알수있을 것이다. 이렇게 좋은자료를 공개해주신 분께 감사드릴 따름이다~ㅠㅜ

http://agbird.egloos.com/m/category/하스켈%20스프링노트

2015년 11월 12일 목요일

함수형 언어 하스켈 와이리 어렵노..

하스켈을 배워보고자 책을 사보고 인터넷으로 튜토리얼들을 찾아보고 한지 벌써 1년가량 된듯하다. 아.. 하지만 정말 정말 어렵다. 예전에 C언어를 공부할때에도 많은 사람들이 좌절한다는 포인터가 이렇게 어렵게 느껴지지는 않았는데 하스켈은 정말이지 어렵다.
하스켈을 마스터 한다고 해서 굳이 나에게 커다란 이익을 가져다 줄지는 사실 의문이다.
함수형 언어가 요즘의 핫한 이슈이기도 하고 많은 다중 패러다임 언어에서 함수형 언어의 개념들이 차용되어가는 추세이다. 람다, 클로저, 병렬성과 같은 것들이 그럴것이다.
그렇다면 함수형 언어의 장점과 객체지향언어가 적당히 버무려진 파이썬, Go언어, Swift, D언어 같은 것들을 마스터하는 편이 현실적으로 봤을때 좋다고 머리로는 생각하고 있지만 여전히 나는 하스켈책을 펼쳐들고 어떻게든 이해해보려고 골머리를 썩는 중이다.
사실 많은 사람들이 어렵다고 얘기하는 C언어의 포인터 개념은... 내가 배운지 오래되서일까? 어렵다고 느껴본적은 사실없는데 하스켈에서 많은 사람들을 좌절시키는 모나드.. 이 모나드라는 것이 의미를 모르고 사용한다면 그저 절차형 언어처럼 사용할 수 있는 신택틱 슈거정도 이지만 그 한줄에 하스켈의 모든철학이 들어 있다고 할 정도로 정말 오묘한 물건이고 그만큼 이해하기도 어려운것 같다. 순수한 함수형 언어 하스켈.. 글쎄 이렇게 인기가 없는걸 보면 실용적이지 않을수도 있다. 많은 사람들이 새로운  개념에 대해 신기해 하며 한번쯤 도전해보는 실험적 언어 일수도 있다. 스몰토크가 그러했고 리스프가 그렇다고 생각한다. 다른언어들에 엄청난 영향을 주었지만 정작 그 언어들은 인기가 바닥을 치고 그 언어에서 파생된 여러가지 개념들은 결국은 다른언어를 통해 적당히 버무려져 활용되고 있으니 말이다.
하지만 하스켈은 좀 다를것이라는 막연한 생각이든다. C/C++만 다루다 처음 파이썬을 접했을때의 신선함, 간결함등에 큰 영감을 받았었고 파이썬 프로그래밍이 너무나 재미있다고 느껴졌었다. 파이썬의 첫 느낌이 마치 신세계를 발견한 듯한 느낌이라면 하스켈을 처음 접했을 때의 느낌은 다른차원의 세상으로 온듯한 느낌이다. 내가 모르는 미지의 영역이 광활하게 펼쳐져있는 느낌이 정확하다. 왠만한 언어들은 굳이 배우지 않아도 그 의미를 알수 있고 알고리즘을 이해할수 있다.
하지만 하스켈은 다르다!! 아마도 컴퓨터 프로그래밍을 처음 접했을때의 느낌을 고스란히 느낄수 있을것이다. 내말이 맞는지 틀린지 궁금하신 분들은 도전해보라. 그리고 그 가치는 충분히 있을거라고 생각한다. 요즘 같은 멀티코어 시대에 걸맞는 언어는 함수형 언어라고 많이들 얘기하곤 한다.
하스켈이 가지고 있는 순수한 함수형 언어의 여러가지 문화들~ 람다, 커링, 패턴매칭, 타입클래스, 펑터, 모나드, 모노이드, 불변성, Software Transactional Memory등등.. 이 모든걸 이해했을때 아마도 나는 좀더 성장해 있을거라 믿어본다.

2015년 11월 5일 목요일

Linux 문서편집기 vi, vim 명령어 정리

[원문:http://hyeonstorage.tistory.com/274]

Linux 문서편집기 vi, vim 명령어 정리

Linux나 Unix에서 환경설정 파일 등을 수정해야 될때 vi 또는 vim을 사용한다.

하지만 윈도우의  단축키에 익숙해져 있는데다 자주 사용하지 않다보니 매번 명령어가 헷갈린다.

사용할때마다 찾아서 사용하기 보다 여기다 정리해놓고 참고해야겠다.



<vi 편집기로 실행한 php.ini 파일>

1. vi 실행하기

명령어 
동작 
vi file 
file을 연다 
vi file1 file2
file1 과 file2 를 차례로 연다 
view file 
file을 읽기 모드로 연다 
vi -R file 
file을 읽기 모드로 연다 
vi + file
file을 열때 커서가 file 본문의 마지막 행에 위치한다. 
vi +n file 
file을 열어 n행에 위치한다. 
vi -r file
손상된 파일 회복

2. 입력모드 전환 명령어

명령어 
동작 
i 
커서 있는데서 입력모드 전환 
I
커서 왼쪽, 행의 처음에 몬자 삽입 
커서 있는 줄 끝에서 입력모드 전환 
A
커서 오른쪽, 행의 끝에 문자 삽입 
커서 있는 줄 아래에 빈 줄 삽입 
커서 있는 줄 위에 빈 줄을 삽입 
덮어쓰기 모드로 전환 

3. 커서의 이동

명령어 
동작 
^, 0 
줄의 처음으로 이동 
줄의 끝으로 이동 
H 
화면 맨 위로 이동 
M
화면의 중간으로 이동 
L 
화면 맨 아래로 이동 
다음 단어 끝으로 커서 이동 
e
다음 단어 앞으로 커서 이동
b  
이전 단어로 이동 
shift + ↑ 
한 페이지 앞으로 이동 
shift + ↓
한 페이지 뒤로 이동 
3l , 3G
현재 커서 위치한 행에서 3번째 행으로 이동 
Ctrl + i
한 화면 위로 이동 
Ctrl + b
한 화면 아래로 이동 
Ctrl + d
반 화면 위로 이동 
Ctrl + u
반 화면 아래로 이동 
Ctrl + e
한 줄씩 위로 이동 
Ctrl + y
한 줄씩 아래로 이동 

4. 삭제

명령어 
동작 
x 
한 문자 삭제 
5x
커서가 있는 위치부터 5개의 문자를 삭제 
d + ↑ 
커서있는 줄, 윗줄 2줄 삭제 
d + ↓ 
커서잇는 줄, 아래줄 2줄 삭제 
dw 
한 단어 삭제 
dd 
한 줄 삭제 
5dd
커서가 있는 라인부터 5개의 라인 삭제 
db
커서의 위치에서 거꾸로 한 단어 삭제 
한줄 내에서 커서있는 뒤 모두 삭제 
u 
바로 전에 수행한 명령을 취소 
:5,10ㅇ
5~10번째 행 삭제 

5. 복사와 붙여넣기

명령어
동작
yy
현재 줄을 버퍼로 복사 
p 
버퍼에 있는 내용을 커서 뒤에 삽입 
P
버퍼에 있는 내용을 커서 앞에 삽입 
3y 
현재 줄에서부터 아래로 3줄 복사 
:5, 10y
5~10줄을 버퍼로 복사 
:30pu
30행에 버퍼 내용을 삽입 
d 
현재 커서가 위치해 있는 단어 복사 
3yy
현재 행을 기준으로 3번째 행까지 n행 복사 

6. 문자열 찾기

명령어
동작
/name
name 문자열 찾기 
n
다음 name으로 이동
N
n과 같으며 역방향으로 이동 

7. 문자열 대체

명령어 
동작 
:s/str/rep
현재 행의 str을 rep로 대체
:l,.s/str/rep/ 
1부터 현재 행의 str을 rep로 대체 
:%s/str/rep/g 
파일 전체 str을 rep로 전부 대체 
:.$/aaa/bbb
커서의 위치로부터 파일의 끝까지 있는 모든 aaa를 bbb로 대체 

8. 파일 저장 및 불러오기

명령어 
동작 
:w 
지정된 파일에 저장 
:wq, :x, ZZ 
지정된 파일에 저장하고 vi를 종료 
:w php.ini 
php.ini 파일에 저장 
 :q
저장하지 않고 종료 
:q!
저장하지 않고 강제 종료 
:wq php.ini 
php.ini에 저장하고 vi를 종료 
:r php.ini 
php.ini의 내용을 현재 커서가 있는데로 불러온다. 
:e php.ini 
현재의 화면을 지우고 새로운 파일 php.ini를 불러온다. 
:5,10 w php.ini 
5~10 줄까지의 내용을 php.ini에 저장

9. 기타

명령어 
동작 
:set nu
행 번호 보여주기 
:set nonu 
행 번호 보여주기 취소 
 .
바로 전에 실행한 명령어 재 실행 
 Ctrl + l
불필요한 화면 정리후 다시 표시 

Unicode With Python - 유니코드와 파이썬

Ascii code (American Standard Code for Information Interchange, 미국 정보 교환 표준 부호)

7비트 글자 인코딩으로, 000(0x00)부터 127(0x7F)까지 총 128개의 부호가 사용된다. 1바이트를 구성하는 8비트 중에서 7비트만 쓰도록 제정된 이유는, 나머지 1비트를 통신 에러 검출을 위해 사용하기 때문이었다.


Unicode

ascii 만으로는 전 세계의 모든 문자를 한번에 다룰수 없었기 때문에 등장한 방식으로 멀티바이트를 사용한다. 한글완성형(euc-kr) 인코딩은2바이트를 사용하지만 유니코드는 아니다. 

UCS, UTF-8, UTF-16 등은 인코딩 방식의 종류이며 유니코드를 처리하는 알고리즘을 일컫는다 (일종의 압축과 같은것). 인코딩에 따라 문자하나를 고정된 멀티바이트로 표현하거나 영어는 1바이트로 처리하고 나머지는 멀티바이트로 처리할수도 있고 유동적인 바이트를 사용해 표현할수도 있다. 또한 문자하나의 바이트순서에 따라 리틀엔디안(utf-16-le), 빅엔디안(utf-16-be)으로 구분되기도하며 utf-16 인코딩과는 다른것이다.

중요한 점은 UTF-8 문자열이 유니코드를 표현하는(압축) 한가지 방식일뿐 유니코드 자체는 아니라는 점은 헷갈리기 쉬우니 제대로 알아 두어야 한다.


encoding (인코딩) : 유니코드를 어떤방식으로 처리(압축)할지를 말한다. UTF-8, UTF-16, UTF-16-LE등등 인코딩 방식에 따라 다르게 저장된다.


decoding (디코딩) : UTF-8, UTF-16, UTF-16-LE 등과 같이 압축된 문자열을 유니코드로 압축을 푸는것을 뜻한다.


유니코드를 바이트로 출력

>>> [hex(ord(x)) for x in u"한글"]

['0xd55c', '0xae00']


인코딩된 유니코드를 바이트로 출력

>>> [hex(ord(x)) for x in u"한글".encode('utf-8')]

['0xed', '0x95', '0x9c', '0xea', '0xb8', '0x80']


>>> [hex(ord(x)) for x in u"한글".encode('utf-16')]

['0xff', '0xfe', '0x5c', '0xd5', '0x0', '0xae']


>>> [hex(ord(x)) for x in u"한글".encode('utf-16-le')]

['0x5c', '0xd5', '0x0', '0xae']


>>> [hex(ord(x)) for x in u"한글".encode('utf-16-be')]

['0xd5', '0x5c', '0xae', '0x0']


>>> [hex(ord(x)) for x in u"한글".encode('euc-kr')]

['0xc7', '0xd1', '0xb1', '0xdb']



Unicode With Python - 유니코드와 파이썬


* 유니코드로 변환하기

우리가 보통 사용하는 문자열은 str타입이다. 간단하게 문자열 앞에 u를 붙히거나 unicode 함수를 통해서 유니코드로 변화할수 있다. 즉 unicode 함수는 문자열이 유니코드로 decoding됨을 의미한다. 반대로 얘기하면 str은 인코딩이 되어있는 뜻이 되며 기본적으로는 ascii로 인코딩 되어있는 것이다.


>>> type("text") # string

<type 'str'>


>>> type(u"text") # convert string to unicode

<type 'unicode'>


>>> type(unicode("text")) # convert string to unicode

<type 'unicode'>



* 유니코드로 코딩하기

temp.py 파일을 하나 만들고  아래와 같이 저장한 후 실행해보자.


var =  "한글"


헉!! 그저 변수에 한글을 입력했을 뿐인데 아래와 같이 에러가 발생하고 만다.. 

왜일까? Python의 기본 인코딩은 ascii로 되어 있기 때문에 ascii코드 이외의 문자로 코딩을 하게 되면 파이썬 해석기가 코드를 해석하지 못하고 에러를 토해내게 된다.


SyntaxError: Non-ASCII character '\xed' in file temp.py on line 1, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details



한글등과 같이 유니코드를 프로그래밍에서 다루기 위해서 아래와 같은 주석문을 파일최상단에 추가해주자. 자주 사용되니 꼭 외워두자.


#_*_ coding:utf-8 _*_

var =  "한글"



*  시스템 기본 인코딩


앞서 말했듯이 Python의 시스템 기본인코딩은 ascii이다. 백문이 불여일견 확인해보자!


>>> import sys

>>> print sys.getdefaultencoding()

ascii


시스템 인코딩이 ascii이면 어떠한 문제가 발생하는지 한가지 테스트를 해보자.


#_*_ coding:utf-8 _*_

print unicode("한글")


문자열을 유니코드로 바꾸었더니 아래와 같은 에러를 출력하고 만다.

unicode(str) 함수는 인코딩된 문자열을 입력으로 받아서 디코딩을 거쳐 유니코드로 변환하는 작업을 한다. 시스템 인코딩이 ascii로 되어있기 떄문에 문자열이 7비트의 최대값인 127(0x7f)을 넘어가면 오류가 발생하게 된다. ( ascii로 표현된 문자열 '한글'은  ['0xed', '0x95', '0x9c', '0xea', '0xb8', '0x80'] 이다. )


Traceback (most recent call last):

  File "temp.py", line 2, in <module>

    print unicode("한글")

UnicodeDecodeError: 'ascii' codec can't decode byte 0xed in position 0: ordinal not in range(128)



아래와 같이 sys.setdefaultencoding함수로 시스템 인코딩을 UTF-8로 변경후 다시 시도해보자.

!! 주의 : reload(sys)를 실행하지 않으면 setdefaultencoding 함수를 실행할수 없다. 꼭 기억하자!


#_*_ coding:utf-8 _*_

import sys

reload(sys)

sys.setdefaultencoding('utf-8')

print unicode("한글")


에상대로 별다른 오류없이 유니코드로 변환되어 잘 출력되었다.


한글



sys.setdefaultencoding('utf-8') 함수의 장점은 일반 문자열을 유니코드로 디코딩시 unicode 함수를 사용할수 있다는 점이다. 수많은 문자열 앞에 u를 붙이는 것은 힘든일이 될수도 있기 때문이다.



* 인코딩된 유니코드 파일 열기


유니코드 파일을 인/디코딩 하기위한 io, codecs 모듈 두가지가 있으며 파일을 열고 닫는 함수나 사용법은 기본 라이브러리에 포함됨 open, write, writelines, read, close등 모두 같다.

!! unicode("한글")은 u"한글"로 대체해도 똑같다. 단, unicode함수안에 한글을 넣으려면 sys.setdefaultencoding에 utf-8과 같이 유니코드 인코딩이 설정되어 있어야만 한다.


#_*_ coding:utf-8 _*_

import sys

reload(sys)

sys.setdefaultencoding('utf-8')


# io 모듈

import io

# Encoding Unicode to UTF-8

with io.open("filename.txt", "w", encoding='utf-8') as f:

    f.writelines(unicode("한글"))


# Decoding UTF-8 to Unicode

with io.open("filename.txt", "r", encoding='utf-8') as f:

    print f.read()



# codecs 모듈

import codecs


# Encoding Unicode to UTF-16

with codecs.open("filename.txt", "w", encoding='utf-16') as f:

    f.writelines(unicode("한글"))


# Decoding UTF-16 to Unicode

with codecs.open("filename.txt", "r", encoding='utf-16') as f:

    print f.read()