SICP)연습문제 1.7

2009년 6월 28일 at 4:10 am

Exercise 1.7. The good-enough? test used in computing square roots will not be very
effective for finding the square roots of very small numbers. Also, in real computers,
arithmetic operations are almost always performed with limited precision. This makes our
test inadequate for very large numbers. Explain these statements, with examples showing
how the test fails for small and large numbers. An alternative strategy for implementing
good-enough? is to watch how guess changes from one iteration to the next and to
stop when the change is a very small fraction of the guess. Design a square-root procedure
that uses this kind of end test. Does this work better for small and large numbers?

A)

해당 함수는 근사값만을 구하기 때문에 4.0 이나 16.0 과 같은 정수로 떨어지는 값을 넣어보면 정확한 값이 나오지 않는다는 것을 쉽게 알 수 있다. good-enough 에서 정밀도를 높이면 더 근사한 값이 나오지만 속도가 무척 느려진다.

SICP)연습문제 1.6

2009년 6월 28일 at 3:49 am

Exercise 1.6. Alyssa P. Hacker doesn’t see why if needs to be provided as a special
form. “Why can’t I just define it as an ordinary procedure in terms of cond?” she asks.
Alyssa’s friend Eva Lu Ator claims this can indeed be done, and she defines a new version
of if:
(define (new-if predicate then-clause else-clause)
(cond (predicate then-clause)
(else else-clause)))
Eva demonstrates the program for Alyssa:
(new-if (= 2 3) 0 5)
5
(new-if (= 1 1) 0 5)
0
Delighted, Alyssa uses new-if to rewrite the square-root program:
file:///G:/ebooks/MIT%20Press%20-%20Structure%20an…puter%20Programs,%202nd%20Edition/book-Z-H-10.html (19 of 27) [8/17/2008 4:40:23 PM]
Structure and Interpretation of Computer Programs
(define (sqrt-iter guess x)
(new-if (good-enough? guess x)
guess
(sqrt-iter (improve guess x)
x)))
What happens when Alyssa attempts to use this to compute square roots? Explain.

A)

위와 같이 식을 썼을 때 sqrt 을 실행하면 sqrt-iter 가 실행될 때 먼저 new-if 의 값을 구하려고 한다.

new-if의 값은 cond 를 사용하도록 정의되어 있기 때문에 인자들을 cond 에 다시 넣고 sqrt-iter 를 수행한다. sqrt-iter 에는 new-if 가 있기 때문에 인자들을 다시 cond 에 넣고 sqrt-iter 를 수행한다.. 무한반복이다. new-if 가 아닌 if 라면 기본형이기 때문에 다시 평가하지 않아 수행에 문제가 없다.

Script Language

2009년 6월 22일 at 3:25 pm

20세기의 어느 날.

스크립트 랭귀지에 대해 (약간의 PERL을 제외하고는) 아무것도 모르던 시절.

컴파일러나 PL 수업도 받아보지 못했던 코흘리개 시절.

게임 회사에 입사해서 얼마 지나지 않아 간단한 스크립트를 만든 적이 있다.

하루 사이에 뚝딱 만들었는데 문법은 무척 간단했다. (GC는 물론 없었다)

1) LET 연산 -> A = B * C

2) 간단한 함수 -> PRINT A

3) GOTO를 위한 LABEL -> D:

4) GOTO 문장 -> GOTO D

5) IF 문장 -> IF A < C THEN A = A + 1 ELSE GOTO D

무척이나 단순한 언어였지만 이걸로 나름 할 수 있는 것이 많았다.

A = 0

SUM = 0

HERE:

A = A + 1

SUM = SUM + 1

IF A < 10 THEN GOTO HERE

PRINT SUM

Run>> 55

그 후로 수많은 언어들을 접해보았지만 갈수록 복잡해지기만 했다.

AS.. LUA.. RUBY.. 그러던 와중에 그놈을 맞닥뜨렸다.

LISP………. TO BE CONTINUED………….

어깨가 아픔 ㅠㅠ

2009년 6월 19일 at 3:58 pm

요새 일이 바쁘다보니 오른쪽 어깨가 빠질 듯이 아파오게 되었다.

잠시 요양이라도 해야 할까 싶지만….

십오년을 넘게 컴퓨터를 다뤄오면서 어깨가 아팠던 적이 없었는데

어깨가 이렇게 아파오는 원인을 열심히 분석했다.

(집의) 의자를 비싸고 좋은 의자로 바꿔보기도 했지만 이건 목에만 효과가 있는 것 같고…

나름대로 파악한 원인은 키보드와 마우스가 너무도 넓게 분포해있다는 것이다.

106key의 넓은 키보드의 오른쪽 너머에 있는 마우스까지 다루려면

어깨가 자연스럽게 벌어져서는 되지 않는다.

오른쪽 어깨를 부자연스러운 각도로 오른쪽으로 꺽어서 마우스를 쥐어야 하는 것이다.

그래서 결국 몇 가지 대책을 세워놓고 상책을 찾게 되었다.

1. 유동화를 떠난다……………… 어디로 가건 지금보다는 업무가 적어지겠지.

2. 요양을 간다…………………… 6개월 휴직하고 놀다 온다….. 내 자리 남아있을라나?

3. 미니 키보드와 트랙볼을 사용한다.

그 중 3 번을 위한 후보군을 이렇게 골라놓았다.

1)

이놈이건 아니건 미니 키보드에 내장된 트랙볼은 내 어깨를 최소한으로 움직이게 하여 어깨의 짐을 덜어줄 것이다. 근데 과연 키감이 좋을까?

2)

이 녀석은 사실 몇 년 전에 거금 약 15만원을 들여 외국 사이트에서 구매한 녀석이다. 요새는 한글까지 각인된 제품이 훨씬 싸게 판매되고 있다고 한다. 이 녀석의 장점은 무엇보다도 빨콩과 터치패드를 골라 쓸 수 있는 편리함이다. 둘 다 편리한데 마음대로 골라쓸 수 있어 더욱 좋다.

문제는…….. 새로 사기는 아깝고 하여 몇 년 전 구입했던 키가 숭숭 빠진 물건을 ibm a/s 센터에 들고 갔더니 이 제품은 a/s 가 안 된다고 한다. 다시 사기는 억울하다!
3)

미니키보드인 해피해킹 키보드, 왼쪽엔 트랙볼을 두고 사용한다면 어깨도 편하고 작업하는 기분도 좋아질 것 같다. 특히 해피해킹 키보드의 키배열을 내가 지금 사용하고 있기 때문에 왼쪽 ctrl, capslock 의 위치로 인한 혼동도 없을 것이다. 가격은 꽤나 비싸지만 해피해킹프로보다는 훨씬 싸다. ㅡㅡ;

저런 방법들을 여러가지 사용해보고 결론을 내리련다.

마법 스크롤

2009년 6월 14일 at 7:11 am

2009년 어느 봄날.

민간유동화로 인해 금리정보가 수신되지 않는다.

금리정보를 수신하기 위해서는 민간유동화 대상 풀을 제외하여야 한다.

대사팀 박수진양이 전문에서 KHFCMB2009S-02, KHFCMB2009S-03 두 개 풀을 삭제해달란다.

ACROEDIT 에서 아래의 정규식(regular expression)을 가볍게 적어줬다.

^.*KHFCMB2009S-0(2|3).*

다음부터 저렇게 해서 풀을 제외하라고 하고 창을 닫으려 하자 “잠깐만!”을 외친다.

“저 그림(picture) 그려주세요.”

아하. 저게 그림이었구나. 정규식이 그림이 되었구나. 마법(magic)같은 그림이구나.

나는 저 마법의 주문(spell)을 A4에 그려주었다. A4는 마법의 스크롤(scroll)이 되었다.

“으악! 민간유동화다! 없애줘!!”

(매직 스크롤의 스펠을 캐스트(cast)한다)

“^.*KHFCMB2009S-0(2|3).*”

횡설수설하니 경험치가 5 오르며 갑자기 머드가 떙긴다.

ORACLE DBMS_EPG

2009년 6월 10일 at 1:29 pm

DAD : Database Access Descriptor

DAD 만들기 (create_dad)

BEGIN
DBMS_EPG.create_dad (
dad_name => ‘my_epg_dad’,
path     => ‘/my_epg_dad/*’);
END;
/

매핑 확인 (get_all_dad_mappings)
SET SERVEROUTPUT ON SIZE UNLIMITED
DECLARE
l_paths  DBMS_EPG.varchar2_table;
BEGIN
DBMS_EPG.get_all_dad_mappings (
dad_name => ‘my_epg_dad’,
paths    => l_paths);DBMS_OUTPUT.put_line(’Mappings’);
DBMS_OUTPUT.put_line(’========’);
FOR i IN 1 .. l_paths.count LOOP
DBMS_OUTPUT.put_line(l_paths(i));
END LOOP;
END;
/

매핑 변경하기 (unmap_dad, map_dad)
BEGIN
DBMS_EPG.unmap_dad (
dad_name => ‘my_epg_dad’,
path     => ‘/my_epg_dad/*’);DBMS_EPG.map_dad (
dad_name => ‘my_epg_dad’,
path     => ‘/my_epg_dad/*’);
END;
/

DAD의 속성 설정 (set_dad_attribute)
BEGIN
DBMS_EPG.set_dad_attribute (
dad_name   => ‘my_epg_dad’,
attr_name  => ‘database-username’,
attr_value => ‘SCOTT’);DBMS_EPG.set_dad_attribute (
dad_name   => ‘my_epg_dad’,
attr_name  => ‘default-page’,
attr_value => ‘home’);
END;
/

지정된 DAD 의 모든 속성 얻기 (get_all_dad_attributes)
SET SERVEROUTPUT ON SIZE UNLIMITED
DECLARE
l_attr_names   DBMS_EPG.varchar2_table;
l_attr_values  DBMS_EPG.varchar2_table;
BEGIN
DBMS_OUTPUT.put_line(’Attributes’);
DBMS_OUTPUT.put_line(’==========’);DBMS_EPG.get_all_dad_attributes (
dad_name    => ‘my_epg_dad’,
attr_names  => l_attr_names,
attr_values => l_attr_values);

FOR i IN 1 .. l_attr_names.count LOOP
DBMS_OUTPUT.put_line(l_attr_names(i) || ‘=’ || l_attr_values(i));
END LOOP;
END;
/

지정된 DAD의 지정된 속성 얻기 (get_dad_attribute)
SET SERVEROUTPUT ON SIZE UNLIMITED
DECLARE
l_attr_name   VARCHAR2(30);
l_attr_value  VARCHAR2(30);
BEGIN
DBMS_OUTPUT.put_line(’Attribute’);
DBMS_OUTPUT.put_line(’=========’);l_attr_name  := ‘database-username’;
l_attr_value := DBMS_EPG.get_dad_attribute (
dad_name  => ‘my_epg_dad’,
attr_name => l_attr_name);

DBMS_OUTPUT.put_line(l_attr_name || ‘=’ || l_attr_value);

l_attr_name  := ‘default-page’;
l_attr_value := DBMS_EPG.get_dad_attribute (
dad_name  => ‘my_epg_dad’,
attr_name => l_attr_name);

DBMS_OUTPUT.put_line(l_attr_name || ‘=’ || l_attr_value);
END;
/

DAD 속성 삭제 (delete_dad_attribute)

BEGIN
DBMS_EPG.delete_dad_attribute (
dad_name   => ‘my_epg_dad’,
attr_name  => ‘database-username’);
END;
/

DAD 유저 인증 (authorize_dad, deauthorize_dad)
BEGIN
DBMS_EPG.authorize_dad (
dad_name => ‘my_epg_dad’,
user     => ‘SCOTT’);
END;
/BEGIN
DBMS_EPG.deauthorize_dad (
dad_name => ‘my_epg_dad’,
user     => ‘SCOTT’);
END;
/

간단한 DAD 프로시져
CREATE OR REPLACE PROCEDURE scott.home IS
BEGIN
HTP.htmlopen;
HTP.headopen;
HTP.title(’This is a test page!’);
HTP.headclose;
HTP.bodyopen;
HTP.print(’This is a test page! DateTime: ‘ || TO_CHAR(SYSTIMESTAMP));
HTP.bodyclose;
HTP.htmlclose;
END home;
/

SICP)연습문제 1.5

2009년 6월 8일 at 3:39 am

Exercise 1.5. Ben Bitdiddle has invented a test to determine whether the interpreter he is
faced with is using applicative-order evaluation or normal-order evaluation. He defines
the following two procedures:
(define (p) (p))
(define (test x y)
(if (= x 0) 0 y))
Then he evaluates the expression
(test 0 (p))
What behavior will Ben observe with an interpreter that uses applicative-order
evaluation? What behavior will he observe with an interpreter that uses normal-order
evaluation? Explain your answer. (Assume that the evaluation rule for the special form
if is the same whether the interpreter is using normal or applicative order: The predicate
expression is evaluated first, and the result determines whether to evaluate the consequent
or the alternative expression.)

A)

normal-order-evaluation 이라면 위의 식은 일단

(if (= 0 0) 0 (p)) 와 같이 펼쳐질 것이다.

그런데 주어진 식은 (test 0 (p)) 이기 때문에

(p)의 값을 계산하기 전에 (= 0 0) 이라는 조건에 맞기 때문에

결과로 0 이 나온다.

applicative order evaluation 라면 위의 식은 일단

인자로 들어온 (p)부터 계산해야 한다.

그런데 (p)를 구하면 그 결과로 (p)가 나오고 다시 (p)를 구해야 하기 때문에

무한루프를 돌아 결과가 나올 수 없다.

cf)scheme 은 applicative order evaluation 을 사용하는데, normal order evaluation 을 사용하는 언어로는 함수형 언어 heskell 이 있다고 한다.

나는 오늘이 꿈이었으면 좋겠다.

2009년 5월 23일 at 3:49 pm

아침에 받은 문자부터 시작해서 일어나자마자 뉴스에서 들은 소식까지.

쉽지 않은 하루였다.

이 모든 것이 꿈이라서 잠이 들면 원복된 하루가 시작되었으면 좋겠다.

쿡TV(메가TV) 무선으로 시청하기

2009년 5월 9일 at 6:20 am

하나로와 달리 쿡TV는 라우터(공유기) 뒤편에서 사용할 수가 없다.

이는 외부에서 들어오는 IP를 라우터를 통해 직접 할당하더라도 마찬가지인데

아마도 쿡TV용 IP는 따로 받아오기 때문인 것 같다. (일반IP에서 쿡TV 시청이 가능할까?)

셋탑에서 확인하니 라우터에서 DHCP로 받아오는 IP와 다른 아이피를 하나 더 가져오고 있었다.

이 IP를 공유기에서 직접 할당하여 가져오는 것은 시도해보지 않아서 가능한지 모르겠다. (구차니즘)

그래서 두 개의 802.11g AP 를 준비했다.

AP 의 랜포트에 WAN 과 라우터를 각각 연결했다.

한 쪽 AP 에는 쿡TV를 연결했다.

그리고 그 두 개의 AP 를 Point to Point Bridge 모드로 서로 연결했다.

그 결과……………………

쿡TV 시청이 가능하다……………………………..

단 한 가지 우려했던 사건이 발생했는데.. 다소 끊긴다.

실시간HDTV는 정말 많이 끊긴다.

802.11g가 54mbps라고는 해도 실제 속도는 HD 동영상 시청을 위해 충분하지 않기 때문이리라.

그리고 또 하나는 실시간 TV를 HD화질로 시청시 라우터가 뻗어버린다는 것이다.

이건 KT에서 일부러 이렇게 한 것인지 다른 원인이 있는지 찾아봐야겠다.

이것만 해결되면 802.11n AP 로 연결하면 볼만하리라.

사랑하는 사람과의 매칭점 찾기

2009년 5월 2일 at 5:03 pm

프로 웹서퍼 친구꺼 따라가서 했는데..

이름 가지고 하는 것 같긴 한데..

진짜 결과 보고 깜짝 놀랐다.

아래 링크 눌러서 해보자.

http://www.lovecalculator.co.kr/quiz/ko/4766949/free

결과.. 난 문근영과 99%. 1%는 살아가면서 채우자.