잊을까봐 기록한다아아

컴파일
    $ gcc -g <source_file> -o <exec_file>
gdb 실행
    $ gdb <source_file>
gdb 종료
    (gdb) quit
도움말
    (gdb) help

프로그램 실행
    (gdb) run <arg> "<arg>"…
프로그램 종료
    (gdb) kill

프로그램 중지
    CTRL+C
프로그램 속행 (재시작인가?)
    (gdb) continue
라인단위 트레이스
    (gdb) next
    (gdb) step
    (gdb) finish
변수 확인
    (gdb) print <var>
변수 변경
    (gdb) set <var> = <value>
    or (gdb) set var <var> = <value>
함수 호출 (실행 스레드가 있을텐데 어떻게?)
    (gdb) call <func_name>(<args>)

콜스택 보기
    (gdb) backtrace
콜스택에서 프레임 선택
    (gdb) frame <frame_num>
콜스택 정보, 변수, 인자 보기
    (gdb) info frame
    (gdb) info locals
    (gdb) info args

브레이크포인트 설정
    (gdb) break <line_num>
    or (gdb) break <source_file>:<line_num>
    or (gdb) break < func_name >
    or (gdb) break <class>::<func_proto>
임시 브레이크 (어떻게 쓰는 건지...)
    (gdb) tbreak
브레이크포인트 보기
    (gdb) info breakpoints
브레이크포인터 비활성화
    (gdb) disable <breakpnt_num>
브레이크포인터 일정 회수 건너뛰기
    (gdb) ignore <breakpnt_num> <number>

변수의 쓰기 Watchpoint 설정 (변수의 스코프에서 브레이크 중)
    (gdb) watch <var>
변수의 읽기 Watchpoint 설정 (변수의 스코프에서 브레이크 중)
    (gdb) rwatch <var>
변수의 읽기/쓰기 Watchpoint 설정 (변수의 스코프에서 브레이크 중)
    (gdb) awatch <var>
Watchpoint 비활성화
    (gdb) disable <watchpoint_num>
    (Watchpoint는 info breakpoints 명령어로 확인 가능)

메모리 확인
    (gdb) x/<FTM> [<address> or <symbol>]
    (<FTM> in s(string), c(character), 4c(4 characters), t(32bits binaries), 3x(24bytes in hex)
레지스터 확인
    (gdb) info registers
크래시 후, 코어 파일 디버그
    $ gdb <coredumped_file>
    (gdb) core core
명령어 단위 트레이스
    (gdb) nexti
    (gdb) stepi
함수 디스어셈블
    (gdb) disassemble [<address> or <symbol>]


참고자료: RMS's gdb Debugger Tutorial, http://www.unknownroad.com/rtfm/gdbtut/gdbtoc.html
Posted by 배트
,
RTS/CTS 없음

Average CW

15

blocks

SlotTime

20

us

SIFS

10

us

DIFS

50

us

Preamamble

144

bit

PLCPHeader

48

bit

PLCPRate

1000000

bps

FCSLen

32

bit

BasicRate

1000000

bps

DataRate

11000000

bps

TCPSegmentSize

1460

Bytes

TCPDataFrameSize

1520

Bytes

TCPAckFrameSize

68

Bytes

MacAckFrameSize

28

Bytes

PropagationDelay

2

us





 

TCP Data

DIFS

Backoff

Preamble

PLCP

Data

FCS

Delay

Total

time(us)

50.00

300.00

144.00

48.00

1105.45

2.91

2.00

1652.36

 

MAC Ack

SIFS

 

Preamble

PLCP

Data

FCS

Delay

Total

time(us)

10.00

 

144.00

48.00

20.36

2.91

2.00

227.27

 

TCP Ack(us)

DIFS

Backoff

Preamble

PLCP

Data

FCS

Delay

Total

time(us)

50.00

300.00

144.00

48.00

0.00

2.91

2.00

546.91



TCP 프레임 하나 전송에 걸리는 시간 = TCP_Data + TCP_Ack + 2 * MAC_Ack = 2644 us
별다른 지연이 없다고 할 때,TCP에서 측정한 Goodput = 4417549 bps = 539.25 KB/s

생각보다 적게 나온다. 계산 잘못했나?ㅋㅋ
Posted by 배트
,
IPC(Inter Process Communication)
    스레드 간에 데이터를 주고받기 위한 기술들.
    스레드는 다른 프로세스, 또는 다른 PC에 위치할 수 있다.

    분류: message Passing, Synchronization, Shared Memory, RPC(Remote Process Calls)
    목적: 자료 공유, 연산 속도 향상, 모듈성, 편의성

기법
    File
        달리 할 말이 없네
    Signal
        POSIX 시스템에서 주로 사용하는 IPC. 프로세스에 비동기 Notification을 날리는 방식.
        시그널 발생하면 OS는 프로세스의 동작을 멈추고 시그널 핸들러를 실행.
        디폴트 시그널 핸들러를 실행하거나 프로세스가 정의하고 등록한 핸들러를 실행할 수도 있음.
        문제점 정리는 귀찮아서 스킵.
        사용자 정의 시그널 핸들러 (다른 방식도 있는데...써본 적도 없고 귀찮기도 하고)
            void my_handler (int signum) { ... }
            void main() {
               ...
               signal( SIGBREAK, SIG_IGN );
               if( signal( SIGTERM, my_handler )== SIG_IGN )
                   signal( SIGTERM, SIG_IGN );
               ...
            }

    Socket
        TCP/UDP, IP를 위해 소켓을 쓰기도 하지만…소켓은 원래 IPC를 목적으로 만들어졌음.
        로컬 IPC로 쓰려면 socket() 함수의 첫 번째 인자(domain)를 PF_UNIX로.

    Message Queue
    Pipe
        POSIX 시스템 지원

    Named Pipe
        POSIX, Window 시스템 지원

    Semaphore
        POSIX 시스템 지원

    Shared Memory
        POSIX 시스템 지원

    Message Passing
        병렬프로세스, 분산컴퓨팅과 같은 분야에 주로 사용. 물론 직접 만져본 적이 없다.

    Memory-Mapped File


Windows IPC
    Clipboard
    COM
    Data Copy
    DDE
    File Mapping
    Mailslots
    Pipes
    RPC
    Windows Sockets


Threads Synchronization
    윈도우에서 제공하는 스레드 동기화를 방법으로는-
    이벤트, 크리티컬 섹션(단일프로세스), 뮤텍스(멀티프로세스), 세마포어가 있음.
Posted by 배트
,

키워드: PageRank, 페이지랭크, Search Engine, 검색엔진, Link Analysis, 링크분석, Random Surfer Model, 랜덤서퍼모델

 

페이지랭크

페이지랭크(PageRank)는 스탠포드 대학교의 래리 페이지와 세르게이 브린 개발하여 학계에 발표한 후에, 구글(Google) 검색 엔진에 사용된 링크 분석 알고리즘이다. 검색된 문서는, 이 페이지랭크를 이용해 정렬되어 사용자에게 보여진다. 이는 웹에 있는 모든 객체에 연결된 하이퍼링크, 참조 빈도, 중요도를 분석하여 각 객체에 가중치를 부여하는 방식으로, 검색어의 출현 빈도에 따라 문서에 중요도를 부여하는 기존의 알고리즘들과 구분된다. 여기서 각 객체는 E라고 표기하고, 객체에 부여된 가중치는 ‘E의 페이지랭크로 부르며, PR(E)로 표기한다. 페이지랭크는 보통 주기적으로 갱신되며, 저장되어있는 PR(E) 값이 사용자 쿼리 시간에 참조된다.

페이지랭크에서 링크를 분석하고 각 객체의 중요도를 평가하는 방법은 다른 객체에서의 참조를 기반으로 한다. 객체 B가 객체 A를 중요하다고 판단하고, 객체 A를 중요하다고 여기는 객체가 많을수록 전체 인터넷에서 객체 A의 중요도는 점점 커진다. 이 중요도는 객체간 하이퍼링크로 판단을 할 수 있다. , 유입 링크(Incoming Link)가 많은 객체일수록 더 중요한 객체인 것이다.

 

알고리즘

페이지랭크는 사용자가 특정 웹 페이지에 있는 하이퍼링크를 임의로 클릭하여 이동한다고 가정한다. 이를 랜덤 서퍼 모델(Random Surfer Model)이라고 한다. 다른 페이지로 이동하면 이동하기 전의 객체의 페이지랭크를 이동하는 다른 페이지로 분배하게 된다. 모든 E에 대해, PR(E)의 합은 1 , 이다. 이런 식으로 페이지를 이동하며 페이지랭크를 분배하는 과정을 무한히 반복한 후에 최종적으로 모든 객체에 부여된 페이지랭크는 일종의 확률 분산과 같다.

예를 들어, 객체 A, B, C가 있고, B, C A를 참조하고 있으며, B의 하이퍼링크 개수는 2, C 1개라고 하자. 그러면 A의 페이지랭크를 가장 단순히 다음과 같이 나타낼 수 있다.

이를 임의의 객체 u에 대해 일반화하면 다음과 같다.

Bu는 객체 u에 대한 유출 링크(Outgoing Link)가 있는 객체의 집합이며 L(v)는 객체 v의 모든 유출 링크 개수이다. 이 과정은 모든 객체에 대해 이루어져야 하며, 수렴치를 찾을 때까지 재귀적으로 반복되어야 한다. 최종적으로 위의 그림은 이동확률을 에지 값에, 페이지랭크를 버텍스 값으로 갖는 마코프 체인이 된다.

랜덤 서퍼 모델에서 사용자가 웹 페이지 검색을 멈추는 경우도 있다. 이를 위해 제동인자(Damping Factor)를 두고 아래와 같이 식을 확장한다. 제동인자의 적정 값은 약 0.85로 알려져 있다.

또한 링크를 타고 페이지를 이동하다 더 이상 유출 링크가 없는 페이지에 다다를 수도 있다. 이런 경우, 다른 어느 페이지로든 이동할 수 있는 것으로 간주하여 모든 유출 링크로의 확률을 동일하게 놓는다.

페이지랭크는 재귀적으로 반복하면서 값을 갱신해나가며, 수렴치로 다다른다. 이 과정을 간편히 하기 위해 아래와 같은 행렬식을 제안한다.

R(t)는 전체 페이지랭크의 벡터이다. l(pi,pj)pi에서 pj로 링크가 나갈 확률이며, 이는 단순히 1/(유출링크개수)일 수 있지만, 알고리즘이 고도화되면서 가중치를 부여해 계산할 수도 있다. 위와 같은 행렬식으로 재귀연산을 하여 최종적으로 구해진 페이지랭크 벡터를 검색 결과에서 순위를 매기는데 사용한다.

 

관련연구

l  HITS(Hyperlink-Induced Topic Search)
유입 링크의 가중치인 권위값(Authority Score)와 유출 랭크의 가중치인 허브값(Hub Score)를 이용해 문서의 중요도를 매긴다. 이는 미리 계산하는 것이 아니라 쿼리 시간에 계산되며, 일반 검색 엔진에는 사용되지 않고, 두 가지 다른 값을 이용한다는 특징이 있으며, 전체 웹 페이지가 아니라 일부에만 적용하여 사용한다. 고품질의 결과를 도출하지만 시간이 오래 걸린다는 단점이 있고, IBM의 웹 검색 프로젝트인 CLEVER에 사용되었다.

l  TrustRank
스팸페이지를 구분하기 위해 스탠프도 대학교와 Yahoo에 의해 개발된 반자동 기법이다. 이는 전문가에 의해 수동으로 구분된 웹 페이지를 기초로, 그 웹페이지와 관련된 페이지에 신뢰도를 높게 쳐주는 방식이다. 반자동이라는 단점이 있지만, 실제로 스팸 페이지의 구분에 우수한 성능을 보였다.

 

참고자료

The PageRank Citation Ranking: Bringing Order to the Web

http://ilpubs.stanford.edu:8090/422/1/1999-66.pdf

 

The Intelligent Surfer: Probabilistic Combination of Link and Content Information in PageRank

http://www.cs.washington.edu/homes/pedrod/papers/nips01b.pdf

 

Manipulability of PageRank under Sybil Strategies

http://www.cs.duke.edu/nicl/netecon06/papers/ne06-sybil.pdf

 

Our Search: Google Technology

http://www.google.com/corporate/tech.html

 

참고자료 전부 구라. 위키피디아 하나면 쫑.

수식은 나중에 정리...

Posted by 배트
,
Set node address in "Node/MobileNode instproc add-interface" in ns-mobilenode.tcl:
$mac node-addr [AddrParams addr2id [$self node-addr]]

Add to Mac class:
int node_addr_;
inline int node_addr() { return node_addr_; }

Read parameter in Mac::command()
if (strcmp(argv[1], "node-addr") == 0) {
     node_addr_= atoi(argv[2]);
     return TCL_OK;
}
(이거 잘 넣어야 함, 소스를 잘 봐가면서 첫번째 if에 넣어야 함-)

Get mobilenode instance:
MobileNode *mnode_ = (MobileNode *) Node::get_node_by_address(node_addr());


출처 :
FW: [ns] How to access MobileNode at Mac-802_11.cc ?
http://mailman.isi.edu/pipermail/ns-users/2005-May/049559.html
Posted by 배트
,






별이 되어 영원히 남다.
Posted by 배트
,
Snoop, however, has its own limitations. First, it requires a snoop proxy in the base station. Also, if the TCP sender is the mobile, the TCP code must be modified to respond to Explicit Loss Notification (ELN) packets from the base station.

Saverio Mascolo, Politecnico Di Bari, Claudio Casetti, Politecnico Di Torino, Mario Gerla, M. Y. Sanadidi, and Ren Wang
"TCP Westwood: Bandwidth Estimation for Enhanced Transport over Wireless Links"


TCP Westwood+, in contradiction to the initial version of Westwood, computes one sample of available bandwidth every RTT using all data acknowledged in the specific RTT, therefore obtaining more accurate estimates (Fig. 6a). However, from the perspective of real-time delivery, Westwood+’s efficiency is not evident, since it delivers a considerable amount of delayed packets (Fig. 6d). Inline with our analytical approach, reaching the downlink capacity (i.e. flows 30–50) maximizes transmission time T(n) and results in variable transmission periods which impact video delivery. The protocol responds inappropriately to the variation in the rate of arriving ACKs, since the disturbed inter-ACK spacing reflects the fluctuations in the receiving rate, due to congestion incidents.

Vassilis Tsaoussidis, Panagiotis Papadimitriou
"On TCP performance over asymmetric satellite links with real-time constraints"


TCPW나 TCPW+의 단점은 명확하지가 않네...
Posted by 배트
,

처음  책이나 iPhone SDK Reference를 접하면 범하기 쉬운 오류인 것 같다.

iPhone에서 한 문장 정도의 짧은 오디오 재생을 하려면,
처음으로 권장받는 것은 System Sound Service를 이용하는 것이다.
하지만 이는 짧은 간격으로 오디오를 반복적으로 재생하면 소리가 겹치고,
무엇보다 aiff, wav, caf만 재생이 되는 단점이 있다.
지금 프로젝트에서는 작은 오디오 파일을 3000개 가량 탑재하기 때문에, acc와 같은 압축포맷이 지원돼야 했다.

그래서 사용한게 AVFoundation이다.
앞선 방법에 만만치 않게 쉽고, 간단하다.
이 방법을 늦게 찾아낸 것은 전적으로 한글 책에 의존하고 영어로 된 Reference를 괄시했기 때문이다.
결정적인 순간에 영어가 태클은 건다. 영어 능력은 곧 정보 능력인게지...


NSArray *filenameArr = [filename componentsSeparatedByString:@"."];
NSString *path = [[NSBundle mainBundle] pathForResource:[filenameArr objectAtIndex:0] ofType:[filenameArr objectAtIndex:1]];

/*
// 1. System Sound Service를 이용한 재생
SystemSoundID soundID;
AudioServicesCreateSystemSoundID((CFURLRef)[NSURL fileURLWithPath:path],&soundID);
AudioServicesPlaySystemSound(soundID);
*/

// 2. AV Foundation Framwork를 이용한 재생
//// player는 property
NSURL *fileURL = [[NSURL alloc] initFileURLWithPath: path];
AVAudioPlayer *newPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL: fileURL error: nil];
[fileURL release];

self.player = newPlayer;
[newPlayer release];

[player prepareToPlay];
[player setDelegate: self];
[player play];

Posted by 배트
,
우분투는 다른 배포판 리눅스와는 달리 패키지를 통해 커널 설치가 가능하다.
컴파일 한 후 deb 패키지로 만든 커널 패키지는
  1. 커널의 설치/제거가 용이하고
  2. 배포가 가능하다.

아래는  http://ubuntu.or.kr/viewtopic.php?f=9&t=4543 에 나온 커널 컴파일 방법을
그대로 본인의 VM(VMware 6.x)에서 시연한 것으로, 2.6.28-14-generic에서 2.6.30.4로 업데이트 했다.


미리 해야 할 일
  1. 루트 계정의 패스워드 만들기
    우분투는 처음 설치하면 루트 계정의 패스워드가 없는 상태다.
    아래와 같이 명령을 넣어 루트 계정의 패스워드를 만들자.
    $ sudo passwd root
  2. 설치된 하드웨어와 리눅스 커널 버전 확인
    의례적으로 하는 작업이다.
    혹시나 하드웨어 설정이 잘못될 경우를 대비해 정보를 백업해놓자.
    $ uname -r
    $ lspci
  3. 커널 컴파일에 필요한 보조 패키지 설치
    개발용 리눅스라면 왠만한 패키지들을 설치되어 있을 것이다.
    "이 정도 패키지들은 다 설치되어 있어!"라고 자부하시는 분은
    커널 컴파일 진행 중에 패키지가 없다는 메시지가 나올 때 마다 설치해도 좋다.
    $ sudo apt-get install build-essential bin86 kernel-package wget libncurses5 libncurses5-dev


커널 다운로드
 (아래의 작업들 부터는 루트 권한으로 진행합시다.)

  1. 경로 설정
    $ cd /usr/src
  2. 커널 다운로드
    $ wget http://kernel.org/pub/linux/kernel/v2.6/linux-2.6.30.4.tar.bz2
  3. 커널 압축 풀기
    $ tar -xvjf linux-2.6.30.4.tar.bz2
  4. 심볼릭 링크
    $ ln -s linux-2.6.30.4 linux
    $ cd linux
  5. 커널 패치
    새 패치가 있을 때만 진행한다. *를 그대로 입력하는 사람은 없겠지.
    $ wget http://www.kernel.org/pub/linux/kernel/v2.6/patch-2.6.30.*.bz2
    $ bzcat patch-2.6.30.*.bz2 | patch -p1


커널 컴파일

  1. 커널의 예전 설정 가져오기
    일일이 설정을 해주지 않아도 되는 매우 편리한 작업.
    $ cp /boot/config-`uname -r` .config
    $ make oldconfig
    or
    기본 커널 설정 파일을 생성해 처음부터 일일이 설정해주는 방법도 있다. 물론 비추.
    $ make i386_defconfig or $ make x86_64_defconfig
  2. 커널 설정 조정
    가장 예민한 작업이면서도, 새 커널로 업데이트하는 가장 큰 이유이기도 하다.
    앞의 과정에서 커널의 예전 설정을 그대로 사용하고,
    아주 높은 버전으로 업데이트 하는게 아니라면 크게 손 대지 않아도 된다.
    단, 커널해킹의 커널디버깅을 없애면 커널 용량을 많이 줄일 수 있다.
    $ make menuconfig (터미널 상의 GUI)
    or
    $ make xconfig (GUI with X-Window, QT 패키지 필요)
  3. 컴파일 및 deb 패키지 생성
    필요하다면 컴파일 타겟에 kernel-headers와 linux_source도 추가한다.
    컴파일이 진행되는 화면이 보이면 가슴이 두근두근 할 것이다.
    시간이 매우 오래 걸리므로 수면을 취하거나, 독서를 하거나, 운동을 하고 오는게 바람직하다.
    $ make-kpkg  clean
    $ make-kpkg --initrd --revision=386 kernel_image kernel_headers linux_source modules_image
  4. 패키지 파일 확인
    생성이 안됐으면 담배 한대 피우고 나서 커널 컴파일을 다루는 다른 정보를 찾는게 좋다.
    usr/src/linux-image-2.6.30.4_394_i386.deb
  5. 대망의 새 커널 설치
    이 시점에서 VM을 백업해놓는게 좋다. 손가락 아파서 이 방법까지 적기는 싫다.
    $ cd /usr/src
    $ dpkg -i linux-image-2.6.30.4_394_i386.deb
    몇 가지 작업을 하더니 패키지처럼 간단히 설치가 되었다!
  6. 커널 버전 확인
    재부팅을 해보자.
    패키지로 설치하면 GRUB에 새 커널을 추가하는게 아니라 기존의 커널을 대체한다.
    그러므로 부팅 중에 손댈 작업은 없다.
    $ uname -r
    새로운 버전이 보이는가? 성공이다!
  7. 장치 드라이버 새로 설치
    새 커널에서는 몇몇 장치 드라이버를 새로 설치해야한다.
    패키지로 제공하는 드라이버를 사용할 수 없다고 하는데,
    VMware용 드라이버는 커널 소스에 내장되어 모듈로 컴파일이 되었는지,
    사운드카드 말고는 정상적으로 작동했다.
    새 드라이버가 필요하신 분은 제조사 사이트에서 다운받아 사용받기를 권장한다.


주위에 도움이 되길 바라며...

Posted by 배트
,
혹시 필요한 사림이 있을까봐.

Mac802_11 * mac = (void*)((BiConnector*)ifhead_.lh_first->uptarget())->uptarget();

How to access mac layer from mobile node object.
I'm not sure that it works with wired nodes.
Posted by 배트
,