suakii.egloos.com

suakii's log





투정부리기 일상

살면서 누군가에게 기대고 투정부리고 이런거 잘하는 스타일인지 아닌지 햇갈릴때가 많다. 그럴때도 있고 아닐때도 있고 이렇게 대답하면 안된다고 누군가 말했던것 같은데 말이야. 오늘 저녁을 먹으면서 교수님과 이런저런 이야기를 했다. 현재 연구하고 있는 주제에 대한 이야기들과 앞으로의 방향같은 것들. 다시금 생각해보면 아마도 교수님께 투정을 부리고 싶었나 보다. 어려운 주제이긴 하지만 막상 최선을 다해서 그리고 거기에 더해 좋은 결과를 보일 수 있는 그런 모습을 보여주지 못했던 것은 아닌가 싶기도 하고 어려울 것이라는 것을 알고 있었음에도 다시금 한번 더 그런 이야기들을 하고 결국 약한 소리에 자신없는 나 자신의 모습아닌가. 나약한 팀원이자 제자인 나의 볼멘 소리에도 당당히 당신의 길을 걸어가시려는 모습을 보여주시는 교수님의 모습은 본받아야할 점이다. 그냥 죄송스러운 마음이 든다. 더 잘하는 팀원이 들어왔으면 좋았을 텐데 하는 생각도 들고 암튼 답답한 마음 그저 몇글자에 풀어볼 뿐이다.~~

NS2 Lan Simulation


NS2는 기본적으로 LAN을 시뮬레이션 할 수 있는 기능을 가지고 있다. 수업시간에 사용하게 될 예제 파일이 저런 형태의 LAN인데 사실 FTP를 Application으로 붙여놓으니 볼 수 있는 그래프가 그렇게 많지가 않다. 아닌가?ㅠ.ㅠ. 만약 CBR이라며 조금 더 다양한 결과들을 볼 수 있을것 같은데 물론 위의 그림에서도 문제상황이 어떻게 주어지느냐에 따라 다른 결과를 보여줄 수 있을것도 같다. 암튼 n8-n0 사이의 특성 변화로 인한 그래프는 거의 변화가 없다. 물론 내가 보려고 한 것이 제대로 된 것이 아닐 수 있겠지만 그래서 전체의 큐 사이즈를 변화시켜보았다. 즉, 큐 사이즈에 따른 패킷의 Drop률을 본 것이다. 코드는 그렇고 결과 그래프만 첨부해본다. 이번엔 그래프를 gnuplot으로 그려보았다. 확실히 xgraph보다는 엣지 있는 그래프를 그릴 수 있다.^^

p.s 오늘 하루는 정말 NS2 만지다가 시간이 다 갔다. 그만해야지 하면서도 계속하게 되는 게임처럼 말이야... 휴~!
암튼 저 조합은 bash shell + ns2 + perl + gnuplot 콤보 정말 리눅스환경이 주는 매력이나고나 할까~

NS2 대역폭에 따른 패킷 Drop Rate 변화 공부

지난번부터 꼭 해보고 싶었던 작업이 하나 있었다. 그동안은 그것을 수행하기 위한 지식이 부족하여 마음속으로만 생각해오다가 오늘 간단하게 테스트를 할 수 있었다. 주제는 대역폭에 따른 노드에서의 패킷 Drop Rate을 보려고 하는 것이다. Topology는 아래와 같다. 패킷의 Drop에 관하여 다른 조건은 고려하지 않고 오직 node2 - node3사이의 대역폭의 변화가 미치는 영향만을 보았다.
작업의 진행순서는 tcl 코드 작성 후 노드2-3의 대역폭을 변수로 설정 한 후 shell script에서 대역폭값을 변화시키면서 ns2를 호출하였고 다시금 perl script가 작업을 하여서 결과를 보여주는 식으로 하였다.

1. Topology



2. Tcl Code
#Create a simulator object
set ns [new Simulator]

set bw    [lindex $argv 0]

#Define different colors for data flows
$ns color 1 Blue
$ns color 2 Red

#Open the nam trace file
set nf [open out.nam w]
$ns namtrace-all $nf

#Open the trace file
set tf [open out.tr w]
$ns trace-all $tf

#Define a 'finish' procedure
proc finish {} {
        global ns nf tf
        $ns flush-trace
    #Close the trace file
        close $nf
    close $tf
    #Execute nam on the trace file
        #exec nam out.nam &
        exit 0
}

#Create four nodes
set n0 [$ns node]
set n1 [$ns node]
set n2 [$ns node]
set n3 [$ns node]

#Create links between the nodes
$ns duplex-link $n0 $n2 1Mb 10ms DropTail
$ns duplex-link $n1 $n2 1Mb 10ms DropTail
$ns duplex-link $n3 $n2 $bw 10ms SFQ

$ns duplex-link-op $n0 $n2 orient right-down
$ns duplex-link-op $n1 $n2 orient right-up
$ns duplex-link-op $n2 $n3 orient right

#Monitor the queue for the link between node 2 and node 3
$ns duplex-link-op $n2 $n3 queuePos 0.5

#Create a UDP agent and attach it to node n0
set udp0 [new Agent/UDP]
$udp0 set class_ 1
$ns attach-agent $n0 $udp0

# Create a CBR traffic source and attach it to udp0
set cbr0 [new Application/Traffic/CBR]
$cbr0 set packetSize_ 500
$cbr0 set interval_ 0.005
$cbr0 attach-agent $udp0

#Create a UDP agent and attach it to node n1
set udp1 [new Agent/UDP]
$udp1 set class_ 2
$ns attach-agent $n1 $udp1

# Create a CBR traffic source and attach it to udp1
set cbr1 [new Application/Traffic/CBR]
$cbr1 set packetSize_ 500
$cbr1 set interval_ 0.005
$cbr1 attach-agent $udp1

#Create a Null agent (a traffic sink) and attach it to node n3
set null0 [new Agent/Null]
$ns attach-agent $n3 $null0

#Connect the traffic sources with the traffic sink
$ns connect $udp0 $null0 
$ns connect $udp1 $null0

#Schedule events for the CBR agents
$ns at 0.5 "$cbr0 start"
$ns at 1.0 "$cbr1 start"
$ns at 4.0 "$cbr1 stop"
$ns at 4.5 "$cbr0 stop"
#Call the finish procedure after 5 seconds of simulation time
$ns at 5.0 "finish"

#Run the simulation
$ns run


3. Shell Script(분명히 아래의 list를 증가시키는 방법이 있을텐데 몰라서 그냥 무식하게 다 썻다.ㅠ.ㅠ)
#!/bin/bash
bw_array='0.1Mb 0.2Mb 0.3Mb 0.4Mb 0.5Mb 0.6Mb 0.7Mb 0.8Mb 0.9Mb 1.0Mb 1.1Mb 1.2Mb 1.3Mb 1.4Mb 1.5Mb 1.6Mb 1.7Mb'
rm -rf *.txt
for bw_size in $bw_array
do
  
    echo "Working $bw_size.... "

    ns example2.tcl $bw_size
    perl drop_node.pl "drop_vs_bw_${bw_size}.txt"
done
xgraph *.txt &


4. Perl Script(Perl은 이번이 처음이다.ㅠ.ㅠ)
open TR2, ">>$ARGV[0]";
open TR, "out.tr";

$drop_count = 0;
@row = undef;

while(<TR>)
{
    @row = split;
    if ($row[0] eq "d")
    {
        if($row[2] eq "2")
        {
            if($row[3] eq "3")
            {
                $drop_count++;
                $drop_rate = $drop_count/$row[1];
                print TR2 "$row[1] $drop_rate\n";
            }
        }

    }
}
close TR;
close TR2;


5. xgraph 결과(대역폭이 1.6Mb 부터는 Drop이 발생하지 않음)

p.s 오류가 없는 코드들이라면 보여주는 결과는 어느정도 예상한것과 일치하고 있다. 사실 별다를것 없는 코드들이지만 파라미터 값을 변화시키면서 시뮬레이션을 하려면 shell script를 이용할 수 밖에 없다. 그것을 배웠다는것에 만족하고 이전의 awk 코드가 아닌 perl을 사용했다는 것에 또 만족해야 하는 정도랄까. 자 이제는 LAN Simulation에서의 각종 수치들을 볼 수 있는 작업을 하는 것이 다음 목표다. 사실 ns2의 진정한 사용은 프로토콜 설계에 있으리라는 생각이 드는데 거기까진 제반 환경이 허락하지를 않을 것 같다. 잘 된건지 안된건지 모르겠지만....

매트랩 GUI

FFT 때문에 나름대로 많은 시간을 투자하였고 당연히 매트랩에 대해서 다시금 보고 있는 지금이다. 임종수씨가 저자인 매트랩 관련책이 3권이나 있음에도 아직 매트랩을 잘 사용하지는 못하는 실정인것을 보면 정말 책을 보았다는것이 결코 해당 주제에 대한 이해의 필수적인 요소가 아님은 다시금 자명해지는 순간이다. 어찌하였든 예전부터 몇번씩 가보았지만 그 가치를 잘 몰랐던 사이트에서 요즘은 매트랩 관련 주제들을 하나씩 공부하고 있는데 단순히 책을 보는것이랑은 또 이렇게 다르게 다가온다. 그 사이트는

http://blinkdagger.com

근데 더이상 업데이트를 못할지 모른다는 글이 올라와 있어서 안타까울 따름이다. 매트랩뿐만 아니라 매트랩을 이용한 GUI에 대해서도 설명이 참 잘되어 있다. FFT에 대한 설명도 그렇고 말이야. 아무튼 다시금 GUI쪽을 보고 있는데 재미있다. 정말 공부는 재미가 있어야 한다. 그래야 동기가 유발되지.. ^^  위 사이트에 있는 GUI의 첫번째 예제인 간단한 덧셈기를 만들어보았다. 정말 초간단 예제..
윈도우 프로그래밍에 대한 경험이 조금만 있다면 사실상 코드는 그렇게 어렵지가 않다. 다만 낯설뿐.. MFC나 여타의 다른 프로그래밍툴을 가지고 아래 정도 만드는것이야 뭐 역시나 간단작업임은 말할 필요도 없지만 매트랩 GUI쪽은 매트랩이 만들어 주는 m 파일의 콜백함수 쪽만 잘 처리해주면 된다. 더 자세하고 좋은 내용들은 저 사이트에 정말 많이 있다. 그래서 좋다~~~



DTFT Discrete Time Fourier Transform 이산시간 푸리에 변환 공부

DTFT의 정의에  따라서 Matlab으로 표현된 결과식은 간단히 아래와 같이 표현할 수 있다.
계산되는 주파수는 0부터 pi 사이의 0~M 즉 M+1 개의 등간격 주파수들이다.

다음과 같은 신호의 주파수 성분과  위상 정보를 위의 DTFT 수식을 이용해서 나타내 보는 매트랩 코드는 다음과 같다. 아래 코드는 주파수 범위가 -pi 에서 pi까지로 조정되었다.
n = 0:100; x = cos(pi*n/2);
k = -100:100; w = (pi/100)*k; %frequency between -pi and pi
X = x * (exp(-1i*pi/100)).^(n'*k); %DTFT of x

subplot(2,2,1); plot(n,x);
subplot(2,2,3); plot(w/pi, abs(X)); grid; axis([-1, 1, 0, 60]);
xlabel('frequency in pi units'); ylabel('|X|');title('Magnitude of X');
subplot(2,2,4); plot(w/pi, angle(X)/pi); grid; axis([-1, 1, -1, 1]);
xlabel('frequency in pi units'); ylabel('radians/pi');title('Angle of X');

결과는 아래와 같다. 그래프 그릴 때 핵심은 결국 x축을 잘 맞추어 주어야 한다. 그래야지만 의미있는 데이터를 읽어낼 수 있는 것이다. 주어진 cos 파형의 주파수 영역은 0.5Hz 에서 음수 쪽과 양수 쪽으로 대칭되어서 나타남을 알 수 있다. 위상 영역은 양수쪽과 음수쪽으로 번갈아가면서 나타나고 있다. 

 p.s 위의 코드와 내용은 Matlab을 이용한 디지털 신호처리3장의 내용이다.

Newsweek는 어려워...

Whether it's planting a flag on the bottom of the sea to claim the North Pole or squeezing the Americans out of a base in Kyrgyzstan, Moscow still sees diplomacy as a zero-sum game where every international engagement - even supposedly friendly ones like Eurovision Song Contest - becomes a litmus test for Russian pride and power.

Indeed, modern Russia's quest for respect is so intense that it's ensured that it's warped the world view of citizens and policymakers alike, casting everything in 19th-century terms, with winners and losers and enemies in different uniforms.


위의 두 문단을 정확히 해석하시오.

Open API 논문검색 테스트 공부

이래저래 Open API가 요즘은 대세구나 라는 생각을 많이 해본다. 지금 읽고 있는 책인 "오픈 API를 활용한 매쉬업 가이드"라는 책은 그런면에 있어서 참 시기적절하게 나온 좋은 책이라는 생각이 든다. 물론 나 같은 초보에게는 그것도 어렵지만 말이야. 논문검색시 대부분 처음에는 한국교육학술정보원의 RISS를 이용하게 된다. 근데 RISS에서도 Open API를 제공한다. 키 발급은 오래전에 받아놓았는데 오늘 한번 테스트를 해보았다. 문제는 검색결과로 돌아오는 xml에 <riss.title>와 같이 .을 사용한 노드가 있어서 xml을 Json형태로 편리하게 사용할 수 있는 라이브러리를 못 사용한다는 것이다. 예전 방식처럼 그냥 구해와서 값을 찍어보았다.

renderImage : function (items, xml){
        var metadata = xml.getElementsByTagName("metadata");
        $E("resultList").setHTML("");

        for(var i=0; i < items.length; i++){
            var author = metadata[i].getElementsByTagName("riss.author")[0].childNodes[0].nodeValue;   
            var li = $new("li");
            var contents = $new("div");
            $E("resultList").addChild(li);
            li.addChild(contents);
            //contents.setHTML(items[i].url.text);
            contents.setHTML(author);
        }
    }
논문의 author값을 찍기 위해서 저렇게 긴 코드를 적어주어야 한다. 만약 riss에서 제공해주는 xml에 <riss.author>이 아닌 <author>이라고 명세 되어 있다면 결과는 (items[i].author)라고만 하면 끝인데 말이다. 정말 불편하지 않을 수가 없다.

암튼 테스트 삼아서 bic라는 title로 검색해보면 아래와 같은 저자들이 나온다. default로 10개만 본것...


p.s 위의 코드는 "오픈 API를 활용한 매쉬업 가이드"에 나오는 코드를 참조해서 작업한 것이다. 사실 100% 참조하고 내가 한 것은 없다고 봐도 된다.ㅠ.ㅠ

p.s2 분명 위 방식대로 코딩하지 않아도 결과를 가져올 수 있는 방법이 있을텐데 역시나 사람은 질문을 해야하고 모르는것은 배워야 한다. 책의 저자분이 운영하는 카페에 문의한 결과 이런 놀라울 수가.. 그냥 아래와 같이 하면 된다고 한다.
xml.record.metadata["riss.type"].text

헐..ㅠ.ㅠ 그렇다면 위에 저렇게 바보 같이 적어 놓은 코드는 사실 필요가 없어지는 것이 아닌가 그래서 나온 결과는 ~~
for문 내부에서 "riss.author" 값을 뽑아내기 위해서 그냥
contents.setHTML(items[i]["riss.author"].text);
이렇게 해주면 된다. 정말 바보 같지만 그래도 하나 또 배웠으니 이것이 어디 인가.^^


1 2 3 4 5 6 7 8 9 10 다음