[MacOSX] Wine

개발툴 2015. 11. 24. 22:05

요새에 어떻게 돌아가는 건지 관심있는 오픈 소스가 있어서, - 파이썬으로 게임 서버를 만들기도 하는군요 -

짬날때 집에서 파이썬 문서를 찾아가며 분석(구경)해가는 중입니다.


이 오픈소스에서 사용하는 모듈이 다채롭게 있는데 그 중에 신기하게도 이런게 있어서, 기록.


Wine 


일단 자세한건 요기서.

http://www.davidbaumgold.com/tutorials/wine-mac/


그러니까 요약하자면 ,

XCode 등 필요로하는 프로그램을 모두 설치한 후에 brew install wine 으로 설치하는 커맨드라인 툴인데 ,

윈도우 프로그램을 맥에서 돌릴수 있다라는게 그 주요 기능인 듯.


설치.

$ brew install wine


오.. 명령어를 입력하는 순간 나열되는 dependencies 들이.. 

설치도 꽤나 상당히 걸린다.

맥 용량도 얼마없는데 내가 뭘하고 있는 것인가 싶은.. 



내가 왜 이랬지...


Last login: Tue Nov 24 18:43:20 on ttys000 $ brew install wine ==> Installing dependencies for wine: xz, libpng, freetype, jpeg, pkg-config, libtool, libusb, libusb-compat, fontconfig, libtiff, gd, libgphoto2, little-cms2, jasper, libicns, makedepend, openssl, sane-b ==> Installing wine dependency: xz ==> Downloading https://homebrew.bintray.com/bottles/xz-5.2.2.el_capitan.bottle.tar.gz ######################################################################## 100.0% ==> Pouring xz-5.2.2.el_capitan.bottle.tar.gz 🍺 /usr/local/Cellar/xz/5.2.2: 59 files, 1.7M ==> Installing wine dependency: libpng


설치는, 넉넉히 1시간은 잡고 진행해야. 

용량은. 좀 먹었을 텐데 el captian [mac version] 에서 용량이 제대로 바로 반영이 안되는 문제가 있는거 같아서 정확히는 모르겠다. 




'개발툴' 카테고리의 다른 글

Mac 기본 세팅하기.  (0) 2015.09.15
[SVN] change list  (0) 2014.08.19
python 콘솔등에서 출력 텍스트 컬러  (0) 2014.07.25
Mac Os Terminal Color  (0) 2014.07.24
정규식 - 기본 구문  (0) 2014.07.03

2.5.3 Example: Symbolic Algebra

수학 대수식을 다루는 과정에서 큰 시스템을 디자인 할때 발생하는 많은 어려움들이 발생한다.

일반적으로 수학 대수식은 피연산자들에 적용 되는 연산자들의 트리 계층구조로 생각 할 수 있다. 


수학 대수식을 만들기위해 기본 객체의 집합으로부터(constants, variables, 더하기나 곱하기와 같은 대수 연산자를 활용하여 엮기) 시작해보자. 


다른 언어들에서처럼 추상화를 통해 결합 객체를 단순한 용어로 다룰 수가 있다. 심볼 대수학에서의 전형적인 추상화 아이디어는 linear comblination, polynomial, rational function, trigonometric function 등이 있다. 


typical abstractions in sybolic algebra

* linear combination (일차 결합)

* polynomial (다항식)

* rational function (유리함수)

* trigonometric function (삼각함수)


x2 sin(y2 + 1) + x cos 2y + cos(y3 ¡ 2y2)


식을 x 에 대해 계수를 가진 polynomial 하다고 얘기할 수 있으며 이 계수는 y 에 대해 trigonometric function 이라고 할 수 있다. 

여기에서 완벽한 대수 조작 시스템을 만들진 않을 것인데, 그러기 위해서는 대수에 대한, 우아한 알고리즘에 대한 깊지식을 요하기 때문이다. 우리가 여기서 보고 시도할 것은 단순하지만 중요한 부분이다: polynomial 의 산술 연산.

이런 시스템에 직면했을 때의 결정사항들, 어떻게 추상데이터의 아이디어들, 제네릭 연산들을 적용하는지를 살펴보면 되겠다.


Arithmetic on polynomials

다항식이 무엇인지 정하는 것으로부터 시작해보자. 

문제의 단순화를 위해 하나의 변수를 가진 식으로 이야기해보자. 

우리는 다항식을 term 들의 합으로 정의하여, 각각의 term 은 계수이다. 


5x^2 + 3x + 7 과 5y^2 + 3y + 7 은 수학적인 관점에만 보면 같은 식이지만, 문법적인 관점에서 보면 같은 식이 아니다.


(y^2 + 1) x^3 + (2y)x + 1

대수학 적으로 이 식은 x 에 대한 다항식을계수로 갖는 y 에 대한 다항식과 동일하다.

이를 시스템적으로 인지가 가능해야할까 ? 그렇지 않을까 ? 

게다가, 다항식을 표현하는 다른 방법들도 있다. factor 들의 곱이라거나, 루트의 집합으로 표현하는 것이나, 점들의 집합에 대한 특정 다항식들의 값들을 나열하는 방법 등. 

우리는 이런 질문들을 우리의 대수조작 시스템에 정의하여 수학적 의미만에 기반하지 않고, 특정 문법화하게 될 것이다.


단순한 식에서는 더하기와 곱하기만 생각하면 되지만, 더 나아가 두 다항식이 결합되어 같은 indeterminate 가 되어야한다. (?)

poly 라는 이름으로 데이터 구조를 표현하였다. poly 는 term 들의 집합과 변수로 구성되어 있다. 

우리는 variable 과  term-list 라는 셀렉터를 이 파트들을 구분하는 용도로 사용한다. 

생성자는 make-poly 인데, 주어진 variable 과 term-list 를 묶는다.

variable 은 단순한 symbol 이므로, same-variable? 함수를 동일하게 사용할 수 있다.


(define (add-poly p1 p2)

(if (same-variable? (variable p1) (variable p2))

(make-poly (variable p1)

(add-terms (term-list p1)

(term-list p2)))

(error "Polys not in same var: ADD-POLY"

(list p1 p2))))

(define (mul-poly p1 p2)

(if (same-variable? (variable p1) (variable p2))

(make-poly (variable p1)

(mul-terms (term-list p1)

(term-list p2)))

(error "Polys not in same var: MUL-POLY"

(list p1 p2))))


다항식을 우리의 제네릭 산술 연산 시스템에 추가하기 위해, 타입 태그를 제공할 필요가 있다. polynomial 을 사용하자.


(define (install-polynomial-package)

;; internal procedures

;; representation of poly

(define (make-poly variable term-list)

(cons variable term-list))

(define (variable p) (car p))

(define (term-list p) (cdr p))

;;<procedures same-variable?

;;and variable? from section 2.3.2>


;; representation of terms and termlists

;;<procedures adjoin-term ... coeff from text below>

(define (add-poly p1 p2) ...)

;;<procedures used by add-poly>

(define (mul-poly p1 p2) ...)

;;<procedures used by mul-poly>

;; interface to rest of the system

(define (tag p) (attach-tag ’polynomial p))

(put ’add ’(polynomial polynomial)

(lambda (p1 p2) (tag (add-poly p1 p2))))

(put ’mul ’(polynomial polynomial)

(lambda (p1 p2) (tag (mul-poly p1 p2))))

(put ’make ’polynomial

(lambda (var terms)

(tag (make-poly var terms))))

’done)


다항덧셈은 텀 단위로 이뤄진다. 같은 차수의 텀들은 묶여야한다. 

같은 차수의 term 이 없는 경우 더해진 다항식이 생성될때 뒤에 덧붙여진다.

conetruct 를 위해 비어있는 term 목록을 반환하는 term-list 가 있고,

adjoin-term 을 위해 term 을 추가할 수 있도록 한다.

term 을 다루기위해 make-term 이라는 생성자를 통해 order 와 coeff 를 전달하여 엮어내는 생성자가,

두 부분을 리턴하는 selector가 있다고 가정한다.


(define (add-terms L1 L2)

(cond ((empty-termlist? L1) L2)

  ((empty-termlist? L2) L1)

 (else

(let ((t1 (first-term L1))

(t2 (first-term L2)))

(cond ((> (order t1) (order t2))

(adjoin-term

t1 (add-terms (rest-terms L1) L2)))

((< (order t1) (order t2))

(adjoin-term

t2 (add-terms L1 (rest-terms L2))))

(else

(adjoin-term

(make-term (order t1)

(add (coeff t1) (coeff t2)))

(add-terms (rest-terms L1)

(rest-terms L2)))))))))


generic 프로시져 add 를 계수들을 합치는데 사용했음을 주목하자.

다음에 이것이 큰 강점을 보인다.


두 term 목록을 곱하기위해 첫번째 리스트의 가각의 term 을 다른 리스트의 모두에 곱하는데 

mul-term-by-all-terms 를 사용하도록 한다. 

결과 리스트는 sum 에 누적된다.

두 term 의 곱은 피연사자의 차수들의 합이 되며, 계수는 곱셈연산자의 계수들의 곱이 된다. (?)


(define (mul-terms L1 L2)

(if (empty-termlist? L1)

(the-empty-termlist)

(add-terms (mul-term-by-all-terms (first-term L1) L2)

(mul-terms (rest-terms L1) L2))))

(define (mul-term-by-all-terms t1 L)

(if (empty-termlist? L)

(the-empty-termlist)

(let ((t2 (first-term L)))

(adjoin-term

(make-term (+ (order t1) (order t2))

(mul (coeff t1) (coeff t2)))

(mul-term-by-all-terms t1 (rest-terms L))))))


이제 다항식의 덧셈과 곱셈을 할 수 있게되었다. 여기서 add 와 mul 을 generic 프로시져를 활용하였기 때문에, 

제네릭 산술패키지에서 제공하는 어떤 타입이든 다룰 수 있게 된다.

2.5.2 절에서 사용하였던 coercion 메커니즘을 사용하면 자동적으로 다른 계수 타입의 다항식을 다루룰 수 있게된다. 


계수를 결합하기 위해 시스템은 add 와 mul 에 대해 dispatch 를 수행한다. 

계수들 자체가 다항식(y에 대해) 이기 때문에, add-poly 와 mul-poly 로 결합되게 된다. 


데이터 기반 재귀가 이뤄지게 된 것이다. (mul-poly 를 호출하였는데 계수를 곱하기 위해 다시 mul-poly) 


'SICP > 2. Building Abstractions with Data' 카테고리의 다른 글

2.5 System with Generic Operations  (0) 2015.09.13
2.3.4 Huffman Encoding Trees  (3) 2015.08.05
2.1.3 데이터란 무엇인가 ?  (0) 2015.02.07