2007년 12월 27일 목요일

ssh 접속 에러


$ ssh IP주소
..로 접속을 하려는데 접속이 되지 않는 경우가 있다.
바로 어제까지 접속이 잘 되었는데 말이다!!!!!

그리고 경고메세지로
WARNING: POSSIBLE DNS SPOOFING DETECTED!
WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!
.. 라는 메세지가 뜬다.

리눅스에서는 자기가 접속했던 곳의 서버를 list해서 저장해 가지고 있다.
그런데 server쪽의 설정이 바뀐다면 주소가 같더라도 위와 같은 경고메세지를 띄우며 server로의 접속을 막는다.

이 경우 그 list파일을 삭제해버리면 만사 OK이다.
그 list파일은 자신의 홈 디렉토리에 있다.

$ cd
$ ls .ssh
(확인차)
$ rm -rf .ssh

2007년 12월 21일 금요일

Θ, Ο, Ω notation


Θ - notation

Θ(g(n))은 어떤 프로그램의 수행시간 f(n)에 대하여 f(n)보다 같거나 작게 되는 C1*g(n)과, f(n)보다 크거나 같게 되는 C2*g(n)이 존재한다.
이것을 만족하는 C1, C2가 존재한다면 그 프로그램은 Θ(g(n))의 수행시간을 갖는다.
즉, Θ는 asymptotically tight bound를 의미한다.


Ο - notation

Ο(g(n))은 어떤 프로그램의 수행시간 f(n)에 대하여 f(n)보다 같거나 작은 C*g(n)이 성립하는 상수 C가 존재한다면, 그 프로그램은 Ο(g(n))의 수행시간을 갖는다.
즉, Ο는 upper bound를 의미한다.


Ω - notation

Ω(g(n))은 어떤 프로그램의 수행시간 f(n)에 대하여 f(n)보다 크거나 같은 C*g(n)이 성립하는 상수 C가 존재한다면, 그 프로그램은 Ω(g(n))의 수행시간을 갖는다.
즉, Ω는 lower bound를 의미한다.


2007년 12월 17일 월요일

나는 전설이다.

나는 전설이다. (I am Legend)

주연 : 윌스미스(로버트 역)


좀비영화, 액션영화, 2% 부족했던 영화.
미안하지만, 윌로는 채워지지 않았어-_ㅠ

인류가 발명한 치료제.
홍역 바이러스를 유전자 조작하여 만들어낸 암 치료제 이다.
임상실험 결과 100% 완치가 되었고 널리 사용되었다.
그러나 부작용으로 바이러스 감염자가 생겨났다.
이 바이러스에 감염된 사람은 머리카락이 빠지고 눈이 빨개졌으며, 잇몸이 까매지고, 동공이 수축되지 않아 빛을 보질 못하였으며 굉장히 폭력적으로 변했다.
게다가 이 바이러스는 전염되었으며, 공기중으로 퍼졌다.
처음 바이러스가 생성된 뉴욕시는 폐허가 되었고, 감염자를 격리시키려 뉴욕을 폐쇠하려했으나, 실패로 돌아갔다.
면역체가 있어 감염되지 않은 사람들은 감염된 자의 먹이가 되었다.
면역체가 있는 사람들 중 한명인 로버트 네빌은 3년여를 폐허가 된 뉴욕시에 혼자 머물며 매일같이 백신을 연구한다.
낮에는 애견인 샘과 함께 돌아다니며 도시를 관찰하고 면역체가 있는 생존자들을 찾기위해 라디오 방송을 한 후, 감염자들이 활동하는 밤이되면 집안에서 모든 빛을 차단하고 잠을잔다.
화합물을 우선은 동물에게 실험하고, 상태가 양호해지면 임상실험을 하는 형태로 백신을 만들어 보려 하지만 쉽지 않다.

스포일러 보기


굉장히 뭔가가 아쉬운 영화였다.
정말로 2%부족한 영화-_-
물론 윌스미스를 사랑해 마지 않지만, 약간 부족했다는 느낌은 지울 수 없었다.ㅠㅜ

나는 감염자들도 사회를 이루고 살아가며, 사랑하고, 인간같은 존재이다라는.. 뭔가가 나올 줄 알았는데-_-); 그런것도 하나도 없고;
'그'가 로버트가 잡아간 감염자를 구하려고 자신을 빛에 노출시키면서 까지 나오려고 했던 건 아닐까 하고 생각했다.
그리고 '그'가 우두머리급으로 행동하는 것과 로버트를 같은 방법으로 덫에 걸리게 한걸 보면 굉장히 지능적인 놈일 거라 생각했는데-_-; 그냥 아무 예기없고 별볼일 없더라;

그리고 왜 전설이라는거야-_-;
좀 껴맞춘 티도 나고.. -_-;
그냥 좀비영화에 초점을 맞췄으면 더 재밌었을거 같았다.ㅎ

끝이 좀 허무하긴 하지만, 나름 재밌게 보았던 영화. (초/중반엔..ㅋ)

2007년 12월 6일 목요일

세븐데이즈

세븐데이즈.

주연: 김윤진(유지연 역), 김미숙(한숙희 역), 박희순(김성열 역)


간만에 스릴만점 영화-_-)b
굉장히 흥미진진했고 재밌었다. 구성또한 굿.

유지연은 죄가 있는 자도 없게하는 유능한 변호사이다. 그녀에게는 세상과도 바꿀 수 없는 딸이 하나 있는데 딸이 납치되고, 납치법으로 부터 전화가 걸려온다.
납치범의 요구는 돈이 아니었다. 그의 요구는 형사재판을 받고 있는 한 흉악범을 무죄석방시키라는 것이었다.
그 흉악범은 강간 전과가 화려한 사람으로 살인사건으로 재판을 받고 있었다. 사형을 받아 마땅했지만, 유지연은 딸을 구하기 위해 그를 무죄로 만들기로 결심힌다.
하지만 사건을 조사하면 조사할 수록 범인은 바로 그 흉악범이었다.
그러다 피해자의 엄마인 한숙희를 만나게 되고 그녀는 자신의 딸을 죽인 흉악범을 변호하려하는 유지연에게 따가운 눈총을 보낸다.
유지연은 딸을 만나기 위해서라면 무슨짓이든 할 것을 결심하는데...


반전 또한 대박이었다.
왠지 예측하긴 했지만, 설마~했던 것이 실제로 돌아오니 기분이 묘했다.ㅎ

간만에 재밌는 스릴러 영화였다.
중간중간 잔인한 장면도 조금 있지만, 쏘우에 비하면야 새발의 피도 못된다-_-);

그리고 또하나.
김윤진이 완전 이쁘다-_-) 오... 최고..
김윤진이 날씬하다는 생각은 많이 해봤어도 이쁘다는 생각은 안해봤는데, 영화보니까 캡이쁘더라. ㅎㅎㅎ

아 맞다!! 여기 나오는 김윤진 딸 짱 귀엽다-_-)b
내스타일이야..-_-...

아무튼 이 영화의 주제는 그거다.
"모성애는 무섭다"

2007년 12월 5일 수요일

priority inheritance 주의할점



priority inheritance 를 확인하다가 priority가 바뀌지 않는 것을 보았다.
이것이 왜 바뀌지 않았나를 근 한달간 고민했던 것 같다.

그 이유는 아주 간단했다.

mutex가 밖으로 나오면 즉, unlock을 하고 나면 원래의 priority로 돌아가기 때문이었다-_-);
나는 unlock을 하고 나서 printf를 하였으므로 당연히 priority가 바뀌지 않을 수밖에... ㅠㅜ

꼭 lock안에서 priority를 확인을 해야한다는 것. 잊지말자!


eCos application 작성


eCos application을 작성해보자.

우선, c파일이든 cpp파일이든 하나 만든다.
코드작성법은 C와 유사하다.

C에 있는 stdio.h 라든가 하는 라이브러리를 사용할 수가 있고, eCos에서 제공하는 라이브러리들은 "cyg/kernel/"에 있다.

만약 thread에 관한 사항을 사용하고 싶으면 #include <cyg/kernel/kapi.h>를 포함시켜주면 된다. eCos thread에 관한 함수들이 있는 라이브러리이다.

C로 코딩을 할 경우 프로그램이 시작하는 곳은 main함수이다.
하지만 eCos의 경우에는 cyg_user_start함수이다.

간단한 hello world를 찍는 다음 예제를 보자.


=====================================================================================
#include <stdio.h>

void cyg_user_start(void)
{
  printf("Hello, world\n");
}
=====================================================================================

C프로그래밍과 별반 다를게 없어보이지 않는가?
main함수의 이름만 바뀌었다는 것을 제외하면 말이다.

thread를 생성하여 Hello world 프로그래밍을 해보자.

=====================================================================================
#include <stdio.h>
#include <stdlib.h>
#include <cyg/kernel/kapi.h>

#define STACK_SIZE 4096
#define nTHREAD      2

cyg_thread threads[nTHREAD]; //thread object
char stack[nTHREAD][STACK_SIZE]; //thread's stack
cyg_handle_t myThread1, myThread2; //thread handle
cyg_thread_entry_t printout; //thread function

void cyg_user_start(void)
{
//two threads create
  cyg_thread_create(
    4,                                                  //thread priority
    printout,                                         //thread function
    0,                                                  //message (function argument)
    "myThread1",                                  //thread name
    (void *) stack[0], STACK_SIZE,       //thread's stack
    &threads[0]);                                 //thread object

  cyg_thread_create(
    4,
    printout,
    1,
    "myThread2",
    (void *) stack[1], STACK_SIZE,
    &threads[1]);

//thread resume
  cyg_thread_resume(myThread1);
  cyg_thread_resume(myThread2);
}

void printout(cyg_addrword_t data)
{
  int message = (int) data;

  while(1)
  {
    printf("myThread %d print.....: Hello, world\n", message+1);
  }
}
=====================================================================================

이 프로그램은 두개의 thread가 돌아가면서 무한으로 hello world를 찍는 프로그램이다.
여기서 보듯이,
eCos에서는 thread를 생성할 때 priority를 줄 수가 있다.
현재는 두 thread 모두 priority를 4를 주었기 때문에 RR로 스케줄링 받아 동작하지만, 두 thread가 priority가 다르다면 높은 priority가 먼저 돌아가게 될 것이다.

또한 eCos의 특징을 볼 수 있는것이 바로 cyg_thread_resume이라는 함수이다.
보통 C프로그램에서는 thread를 create함과 동시에 thread가 수행되게 되는데, eCos에서는 그렇지 않다.
thread를 create하는 것은 단지 생성을 하는 것 뿐이고 thread를 수행시켜주기 위해서는 resume을 해주어야 한다.
때때로 필요없을 때 thread를 잠시 쉬게 할 수 있는데 그 함수는 suspend이다.
suspend를 해두었다가 다시 필요할 때 resume을 시켜 thread를 깨울 수 있다.


이러한 application을 만들었다면 컴파일을 해야한다.
Makefile을 만들어서 컴파일을 할 수가 있는데 Make file은 다음과 같다.

$ vi Makefile

=====================================================================================
INSTALL_DIR=/home/test/ecos/myThread/myThread_install
//eCos kernel configuration때 생성된 install파일의 경로를 잡아준다.

include $(INSTALL_DIR)/include/pkgconf/ecos.mak

XCC     = arm-elf-gcc
//i386용으로 컴파일하고 싶으면 i386-elf-gcc로 하면 된다.
XCXX   = $(XCC)
XLD     = $(XCC)

CFLAGS     = -I$(INSTALL_DIR)/include -I/opt/ecos/gnutools/arm-elf/arm-elf/include
CXXFLAGS = $(CFLAGS)
LDFLAGS   = -nostartfiles -L$(INSTALL_DIR)/lib -Ttarget.ld

#RULES
.PHONY: all clean
OBJECTS = myThread.o

all : $(OBJECTS)
    $(XCC) $(CFLAGS) $(LDFLAGS) $(ECOS_GLOBAL_LDFLAGS) -o myThread $(OBJECTS)

clean :
    -rm -f $(OBJECTS) myThread

myThread.o : myThread.c
    $(XCC) -c $(CFLAGS) myThread.c $(ECOS_GLOBAL_CFLAGS) $<
====================================================================================

그리고 나서 컴파일.
$ make


컴파일을 하면 실행파일이 만들어진다.
그러나 eCos에서 실행파일을 올릴 때는 .o 파일이나 .exe 파일을 올리지 않는다.
.srec파일을 올린다.
그러므로 object copy를 해주어야 한다.

$ objcopy -O srec myThread myThread.srec

하면 srec파일이 생긴다.

이것을 보드에 올리면 된다.