2010년 10월 31일 일요일

pep/8에 대한 고찰

수업시간에 조는건 정말로 멍청한 일이란걸 깨달았다. 특히나 6단원을 배울때 그런건 더 심했다는 생각이 든다. 과제하는데 정말 오랜시간이 흘렀다. 내가 일을 천천히 느리게 한 이유도 있지만 아무래도 학교에서 제대로 듣지를 않으니 더 걸린게 아닐까? 결론은 반성하자는거다.

거두절미하고 이번 과제를 파악하기 위해 생소한 assembly코드보다는 C로 구현화한다음에 다시 assembly코드로 구현화 하겠다.

C
#include<stdio.h>

void main(){
int a, b, c;
scanf("%d", &a);
scanf("%d", &b);
scanf("%d", &c);

if(a-b > 0 && a-c >0){
   if(b-c > 0)
        printf("a>b>c");
   else
        printf("a>c>b");}

else if(b-c > 0 && b-a>0){
   if(a-c > 0)
        printf("b>a>c");
   else
        printf("b>c>a");}

else if(c-a>0 && c-b>0){
   if(a-b>0)
        printf("c>a>b");
   else
        printf("c>b>a");}
}

이것을 이제 assembly코드로 옮겨야하는데 그러기 위해서 C의 함수들을 하나하나 assembly코드로 옮겨보겠다

우선

printf = CHARO
scanf = DECI
int = .BLOCK
if & else if = BR & BRLT

이제 앞의 C코드를 assembly코드로 바꿔보자

BR main

save : .WORD 0
a: .BLOCK 2
b: .BLOCK 2
c: .BLOCK 2

main : DECI a,d
DECI b,d
DECI c,d
BR caseab
caseab: LDA save,d; a>b면 a>c를 조사하고 b>a면 b>c를 조사한다
ADDA a,d
SUBA b,d
BRLT caseba
BR caseac
caseba: LDA save,d; b>a이므로 b>c와 a>c를 조사한다.
ADDA b,d
SUBA c,d
BRLT printcba
BR casebca
printcba : DECO c,d;cba인쇄
DECO b,d
DECO a,d
BR finish
casebca LDA save,d;b>a, b>c이므로 a>c를 조사한다.
ADDA a,d
SUBA c,d
BRLT printbca
BR printbac
printbca : DECO b,d;bca인쇄
DECO c,d
DECO a,d
BR finish
printbac : DECO b,d;bac인쇄
DECO a,d
DECO c,d
BR finish
caseac : LDA save,d;a>b이므로 a>c이면 b>c, c>a면 프린트한다.
ADDA a,d
SUBA c,d
BRLT printcab
BR caseacb
printcab : DECO c,d;cab인쇄
DECO a,d
DECO b,d
BR finish
caseacb : LDA save,d;a>b, a>c이므로 b>c를 알아본후 결과를 출력한다.
ADDA b,d
SUBA c,d
BRLT printacb
BR printabc
printacb : DECO a,d;acb인쇄
DECO c,d
DECO b,d
BR finish
printabc : DECO a,d;abc인쇄
DECO b,d
DECO c,d
BR finish
finish : .END

이정도로 짤 수 있겠다

이제 결과물을 보도록 하자 고고싕


..........................뭐지 저 오류는?.........













뭔가 했더니 띄어쓰기 오류였다

case~
print~

옆에 콜론(:) 이 한칸 떨어져서 씌여있었기 때문에 오류가 떳던 것이다... 수정을 해본 결과 두둥!















우와 성공!

뭐 자바처럼 대소문자 구분을 안한다는건 마음에 들지만 C처럼 아예 공백(enter제외)와 대소문자 둘다 구분 안한다면 편할거같긴 하지만... 그래도 나름 한가지의 컴퓨터 언어를 더 배웠다는게 즐거운 과제였다 ㅎㅎ

ps.

만약에 4개 이상의 수들을 내림차순으로 정렬하려면 어떻게 해야할까? 3개였을 경우에는

3!(factorial) = 3 *2 * 1 = 6

6개의 경우가 생겻으니까 n개의 수들을 나열하려면

n!(factorial) = n * (n-1) * (n-2) * ... * 1

의 경우의 수만큼을 분기해서 print구문을 써줘야 할것이다.

상상만해도 끔찍하다 이를 위해서 생각해본것이 C와 자바에서는 recursion과 loop를 사용하는건데 이번과제의 툴인 pep/8에서는 이러한 기능들이 없기 때문에 일일히 분기점을 써야만한다고 생각된다.

2010년 10월 24일 일요일

컴퓨터 견적내보기!!!

공부를 안하고 보는 시험은 역시 힘들었다. 흑흑 내 블로그에 있는 거라도 자세하게 읽고 갔더라면 허프만 코드는 맞출수 있었을 텐데 ㅠㅠ 아 진짜 폭풍 후회막급이다...

뭐 중간고사 망하면 기말고사 잘보면 된다는 금쪽같은 명언이 있으니까 이 우울함을 뒤로하고 절대 살수 없을 법한 슈퍼 컴퓨터를 혼자서 미친듯이 조립해보면서 쾌감을 느껴보아야겠다. 이 컴퓨터의 목적은 삭막한 내방을 풍요롭게 꾸며줄 복합기기로서 티비, 영화관람 및 라디오, 오디오 등등으로 사용할 수 있을 정도로 럭셔리한 가전제품인 것이다. 그렇기 때문에 일반 고사양 컴퓨터의 시가가 120~160만원 선인대 비해 내가 살 컴퓨터이면서 컴퓨터가 아닌 복합기기는 340만원에 이른다. 자 하나하나 깨알같은 부품들을 살펴보자.









우선 메인보드를 소개하겠다

인텔 DH55TC Media

이 메인보드를 택한 이유는 일단 내가 선택한 CPU가 I7인데 이 메인보드가 I7의 성능을 최대한으로 끌어올려줄 수 있기 때문이다. 물론 SATA3을 지원안하고 SATA2를 지원하는 점과 CPU의 오버클럭을 지원 안 한다는점은 아쉽기는 하나 다른 부품들의 스펙이 그것을 상쇄시키고도 남기 때문에 굳이 오버클럭을 지원하는 더 비싼 제품을 선택하지는 않았다. 물론 메모리도 DDR3이라는 것도 장점이라면 장점으로 생각할 수 있겠지만 요즘 대부분의 메인보드가 지원하는 점이므로 굳이 부각하지는 않겠다. 그리고 참고로 메인보드가 내 컴퓨터의 구성요소중 가장 스펙이 딸린다는 것을 언급하고 넘어가겠다.

두번쨰로 내가 고른 CPU는

인텔 코어 i7 950 (블룸필드)다

이 CPU는 현존 최강의 제품으로 봐도 무색하다 그 근거로 아래의 표를 들 수 있다.

아 물론...950위에도 제품들은 존재하나 이것들의 가격은 70만원을 넘어갈 뿐더러 이것보다 더 고퀄리티인 인텔 제온 시리즈들은 100만원을 웃돈다... 아무리 복합기기지만 무조건 럭셔리한것 만을 추구하기보다는 비교적 가격대실용비(이하 가실비)를 고려해서 제품들은 엄선했다. 굳이 I7을 선택한 이유를 대자면 하이퍼스레딩(스레드를 2배로 만드는 기술 간단하게 말하면 처리속도가 훨씬 빨라진다고 보면된다.), I7 650의 듀얼 채널을 능가하는 트리플채널과 보다 더 많은 L3캐시메모리를 꼽을 수 있겠다. 이정도 스펙의 CPU면 현존하는 모든 게임을 돌려도 무리없이 돌아갈 뿐만 아니라 각종 전문그래픽 작업등을 하는데도 무리가 없다.

세번째로 소개할 부품은 메모리카드다.

G.SKILL DDR3 4G PC3-16000 CL7 PIS (2Gx2)

굳이 4ghz를 지원하는 제품들의 일반적인 가격대가 10만원대인데 굳이 비싼 이 제품을 선택한 이유를 꼽자면 오버클럭메모리 때문이다. 오버클럭메모리는 기본적인 클럭을 높여줄 뿐만 아니라 레이턴시를 줄여주고 일반 메모리카드에 비해 발열량도 낮아 저온도를 유지 할 수 있을 뿐더러 호환성에도 무리가 없고 제품 보증기간도 1,2년이 아니라 라이프타임 워런티였기 때문에 이 제품을 선택했다.

네번째로 소개할 부품은 그래픽카드다.

EVGA 지포스 GTX480 SuperClocked+ 백플라이트 D5 1.5GB 이엠텍


...솔직히 일반적인 그래픽카드 GT시리즈와 라데온 시리즈에 비해 가격대가 높은건 알고있다. 하지만 게임을 할때, 동영상을 볼때... 내가 지금 컴퓨터를 이용해서 자주 하고 있는 작업들을 할때 가장 중요한게 무엇일까...바로 그래픽 카드다! 그래서 70만원대의 초 오버스펙의 그래픽 카드를 꼽았다. 다른 그래픽카드들과의 성능차이를 아래의 표를 보면 더욱 실감할 수 있을 것이다.
여기서는 GTX200시리즈 들만이 나왔기 때문에 라데온보다 스펙이 안좋아 보이는 것 같지만 GTX480대는 성능으로 따지면 GTX260과 클럭양만 비교해봐도 1.5배를 웃돈다... 이정도면 말이 필요가없다.

다섯번째로 소개할 부품은 하드디스크다.

Hitachi 2TB Deskstar 7K2000 (SATA2/7200/32M)

뭐 이쪽은 따로 설명할 필요없이 RPM과 용량만 보면 대강의 성능을 알수 있다. 용량은 2TB이고 RPM도 10000까지는 아니지만 7200정도로 무난하다. SATA3을 지원하는 것들은 RPM10000의 괴물급도 많았지만 내 메인보드가 지원할 수 없기 때문에 포기하고 용량은 동일스펙이면서 RPM이 조금 떨어지는 이 제품을 선택했다. 또한 전송률이 타제품에 비해서 212MB/S로 크다는 사실도 한 몫했다.

마지막으로 소개할 부품은 ODD이다.

삼성전자 블루레이 콤보 SH-B083L (정품박스)

뭐 사실 요즘 DVD를 굽는 일도 흔치않고(나한테는) CD게임들도 대부분 인터넷에서 받아서 하는터라 필요한 부품은 아니지만 유사시를 대비해 골랐다. 사실 동일스펙의 타 제품들이 8만원대인데 비해 이건 11만원으로 꽤 비싼데 그 이유는... LightScribe기능 때문이다. 이 기능이 뭐냐하면... 그냥 시디를 구울때 그 디자인을 사용자가 직접 만들어서 씌울수 있다는 것이다...그래 그냥 뽀대나 보여서 이 기능 있는걸 선택했다...

이외에도 게임을 위한 G1로지텍마우스와 밤에도 자판을 잘 볼수 있게 만들어주는 백라이트 기능을 가진 키보드 디지털티비기능과 30형이라는 어마어마한 스펙을 가진 모니터, 영화 및 애니메이션을 보다 생생하게 즐길 수 있게 만들어주는 5.1채널 스피커등등...사치품이 있으나 주요부품은 아니므로 패스하도록 하겠다.

2010년 10월 5일 화요일

Gates and Circuits 중 어려웠던 것 알아보기!

교수님계 죄송하긴 하지만 솔직히 이번단원은 들으면서 정말 수박 겉핥기 정도로 밖에 이해가 가지 않았다. 뭐 내가 머리가 좋은게 아니니까 굳이 죄송할 필요는 없을거 같다.(자기합리화) 잡소리는 생략하고 이번 단원을 공부하면서 특히 이해가 안갔던 것을 꼽으라면... 아 원래 이해가 안가는 것은 많았지만... 그래도 Adders 부분이 어려웠다. 시험도 2주밖에 안남았고 슬슬 공부도 해야되니 이번 단원은 나름 미리 시험공부할겸 모르는 것을 중점적으로 알아보아야겠다.

1. Adders

우선 Adder의 정의 부터 살펴보자면

2개 이상의 수를 입력으로 하여 이들의 합을 출력으로 하는 논리 회로 또는 장치. 덧셈기라고도 한다.

출처 - 네이버백과사전

이렇다고 한다. 나도 고등교육받아서 이런건 알거든요...? 시덥잔은 정의를 알아보았으니 교재에 나온 Adder의 두 종류중 첫번째인 half-adder에 대해서 알아보겠다.

우선 half-adder은 우리말로 반가산기로서 2개의 이진수 입력값과 1개의 이진수 출력값을 갖는 계산기이다. 다시말하자면 입력값으로 0 또는 1의 수 두개를 받아 그 수들의 합을 한개의 이진수로 나타낸다는 것이다. 이것은 AND(2가지 이상의 전기 신호를 입력받아 모든 입력값에 전기 신호가 들어오면 참(1), 만약 아니라면 거짓(0)을 출력하는 논리회로) ,  XOR(2가지 이상의 전기 신호를 입력받아 모든 입력값에 전기 신호가 들어오거나 들어오지 않는다면 거짓(0), 들어온다면 참(1)을 출력하는 논리회로)  두가지의 논리회로를 이욯해서 만들어진다. 우선 글로만 보면 이해하기가 힘드므로 교재에 있는 논리회로를 인터넷에서 찾아보았다.
(S와 연결된 회로가 XOR회로이고 C와 연결된 회로      는 AND회로이다.)

이 회로를 보자면 A, B는 각각 입력값을 의미하고 S, C는 출력값을 의미한다. 잠깐, 아까 반가산기는 출력값이 하나라고 했는데 왜 그림에서는 2개일까? 다음의 A,B값이 들어옴에 따라 회로들에 의해 출력값이 정해지는 모든 경우를 표로 표현한 것을 보면 그 이유를 알 수가 있다.
A + B = C, S (C는 이진수의 일제곱의 자리 S는 이진수의 영제곱의 자리를 의미한다)
0 +  0  = 0, 0
0 +  1  = 0, 1
1 +  0  = 0, 1
1 +  1  = 1, 0 

만약 논리회로를 조금만 봤더라도 충분히 이해할 수 있는 내용이다. 표를 보면 앞서 말한 것처럼 실재로 A, B의 덧셈의 결과가 C, S를 통해 하나의 출력값으로 표현되는 것을 알 수 있다. 하지만 입력값이 2개 이상이 되면 어떨까? 그런 경우에는 이런 입력값을 2개만 가지는 회로로는 계산을 할 수가 없을 것이다. 그 때문에 생긴 회로가 full-adder이다. 이 회로는 다수의 half-adder를 사용해서 만든 회로로서 입력값이 2개 이상인 경우에도 덧셈을 해서 결과값을 출력할 수 있다. 이번에도 보다 쉽게 이해하기 위해 그림을 찾아보았다. 하지만 반가산기처럼 논리회로를 따라가는게 쉽지 많은 않았다. 그 이유는 아래의 그림을 보면 된다.

아까처럼 만만하지 않다는걸 새삼 다시 느낄수가 있다. 하지만 논리회로 하나하나를 천천히 지나면 결과값을 구하는게 그렇게까지 어려운일은 아님을 알 수 있다. 이 회로 의 X, Y, Z 값은 각각 입력값을 의미하고 S, C는 출력값을 의미한다. 조사를 하면서 한가지 흥미로운 사실을 알게 됬는데, 난 교재에 있는 회로(위의 그림과 같다.)를 X, Y, Z의 입력값들이 다 더해져서 덧셈이 2번 계산되는 줄 알았다. 하지만 Z는 만약 십의 자리 수들의 덧셈일 경우 일의 자리에서 십의 자리에 관여할 수 가 있기 때문에 생기는 입력값이라는 것이다. 가령 예를들어 17 + 13의 경우 십의 자리 숫자끼리만 더한다면 20이지만 일의 자리가 10이 되어 십의 자리에 관여할 수 있다는 말이다. 요약하자면 Z는 X, Y보다 한자리 낮은 숫자에서 올라오는 값이 있는가 없는가에 대한얘기다. 있으면 Z의 입력값은 1, 없다면 0이 된다.  이를 이용해서 표를 만들어보면

X + Y + Z = S, C (S는 이진수의 2의 제곱의 자리 C는 2의 세제곱의 자리를 의미한다.)
0  + 0 + 0  = 0, 0
0  + 0 + 1  = 1, 0
0  + 1 + 0  = 1, 0
0  + 1 + 1  = 0, 1
1  + 0 + 0  = 1, 0
1  + 0 + 1  = 0, 1
1  + 1 + 0  = 0, 1
1  + 1 + 1  = 1, 1

후 시간을 투자해서 다시 보니 이해를 못할정도로 어렵지는 않았다. 이 기세를 몰아 뒷부분의 헷갈리는 부분도 다시 집고 넘어가야겠다.

2010년 10월 4일 월요일

인코딩(Encoding)이란 무엇일까?

인코딩... 왠지 생소하지많은 않은 단어다. 이번단원에서는 컴퓨터를 하면서 한 두 번 쯤은 들어보았던 지식들이지만 관심을 갖고 직접적으로 찾아보지 않고 그냥 호기심채로 묻어둔 것들에 대한 것이 많았다. 가령 매번 동영상재생프로그램을 사용할때 가끔씩 발생하는 코댁을 찾지 못했다는 오류를 보면서도 그냥 네x버 지식인을 대강 훑어 보면서 순간순간을 모면하는 그런 상황...? 모든 궁금한 것을 찾아보면 좋겠지만 그러자면 글이 너무 길어 질수도 있으니까...(사실 내가 귀찮아...) 그 중에서도 유난히 관심있던 인코딩에 대해서 알아보기로 하겠다.

일단 인코딩의 정의부터 알아보자면

인코딩(encoding)은 다음을 가리키는 말이다.
  • 문자 인코딩(文字-, 영어: character encoding)은 문자들의 집합을 부호화하는 방법이다.
  • 부호화(符號化, 영어: encoding)는 정보의 형태나 형식을 변환하는 처리나 처리 방식이다.
 출처 - http://ko.wikipedia.org/wiki/%EC%9D%B8%EC%BD%94%EB%94%A9

아... 인코딩이라는게 문자 인코딩 + 부호화인데 거두절미하면 문자들의 정보의 형태나 형식을 변환하는 처리나 처리방식 이라는 거구나. 근대 왜 항상 정의만 보면 머릿속으로 뭔가 와닿지를 않을까? 그런의미에서 예시를 살펴보면서 보다 정확하게 인코딩에 대해 알아보아야겠다.


Huffman Code

우선 Huffman Code(이하 HC)는 정보의 손실없이 전체 데이터의 양을 줄여서 정보처리의 효율성을 올리려는 방법이다. 개념은 가장 많이 사용되는 바이트를 적은비트에 할당하고, 가장 적게 사용되는 바이트를 더 많은 비트로 할당하는 것이라고한다. 그렇기 때문에 더 많은 바이트에서는 더 적은 비트를 사용하게 되고 더 적은 바이트에서는 더 적은 비트를 사용하게 된다. 무슨 말인지 잘 모르겠으므로 조금 더 세부적인 내용을 살펴보자면 지난 일정한 기간동안 사용된 데이터의 유형을 분석해서 데이터의 사용빈도를 자료로 사용해서

-사용하고있는 데이터 중 사용될 확률이 가장 낮은 두 데이터를 선택
-선택한 두 데이터의 끝 비트를 0과 1로 설정
-선택한 두 데이트를 하나의 복한적인 데이터로 하고 이 복한적인 데이터의 출현확률은 두 데이터의 확률의 합이다.
-위의 과정들을 반복해서 하나의 복합데이터가 만들어지면 종료한다.
-위 과정을 이진수로 구성하고 상위노드에서 하위노드로 부모노드의 코드를 자식노드에 상속한다.


여기까지는 찾아본 정보를 내 나름대로 재해석 한것이다. 하지만... 이 그림은 출처의 주인장님이 복사를 안돼게 하셨다... 그러므로 실제로 사용된 그림예시는 출처를 통해서 참조해 주기를 바란다. 출처 - http://blog.naver.com/nikismy?Redirect=Log&logNo=49171821

위의 출처의 정보로 끝내기에는 아직 실재로 문자열을 보고 HC로 바꾸기가 어려웠기 때문에 다른 자료를 찾아보기로 했다. 정의나 뭐 개념들도 중요하지만 실제 문제로 나오거나 실생활에서 스스로 적용할 수 없다면 헛수고 아닌가... 그래서 본인 스스로가 조금 더 이해하기 쉬운 난이도가 낮은 문제와 해설을 찾았다.

문제 : ABBAACD를 허프만 코드를 이용해 바꿔보자!

해설

앞어 얘기한 것처럼 허프만코드는 일단 문자가 쓰인 빈도를 통계자료로서 사용 해야 되기 때문에 각 문자가 쓰인 빈도를 알아보아야 한다.

빈도수

A
 B
 C
 D
 빈도수
 3
  2
 1
 1

우선 빈도수가 가장적은것끼리 묶는다.



그 다음 빈도수가 제일 적은것 끼리 또 묶어준다.



이 작업을 계속 반복해준다.


이렇게 허프만 트리를 만듦으로서 보다 이해하기 쉬운 허프만 테이블을 만들 수 있다.

 데이터
 코드
 길이
 A
 01
 2
 B
 001
 3
 C
 0001
 4
 D
 0010
 4

그래서 정답은 ? 01001001010100010010

와하하하하 이제이해가 조금간다...나중에 시험준비할때 이거보고 공부해야지ㅋㅋ