sudo apt-get install tofrodos
sudo ln -s /usr/bin/fromdos/usr/bin/dos2unix sudo ln -s /usr/bin/todos /usr/bin/unix2dos
apt-get install mtd-utils
sudo apt-get install tofrodos
sudo ln -s /usr/bin/fromdos/usr/bin/dos2unix sudo ln -s /usr/bin/todos /usr/bin/unix2dos
apt-get install mtd-utils

이번 포스팅에서는 로컬네트워크에서의 맥과 윈도간 속도측정 방법을 소개합니다.
네트워크 퍼포먼스를 쉽게 알 수 있는 방법으로는 iperf가 무료에다가 멀티플랫폼, 가볍다는 장점때문에 강력하게 추천합니다.
단, 아래 방법은 "로컬네트워크"간의 속도측정방법이며, 공유기 바깥에 있는 네트워크에서는 업로드 속도만 측정되니 주의해야 합니다.
이 포스팅은 클리앙(맥당)에도 같이 올라갑니다.
=================================
윈도용 실행파일 Download link
http://dl.dropbox.com/u/8336675/iperf.exe
맥용 소스파일 Download link
http://sourceforge.net/projects/iperf/files/iperf-2.0.5.tar.gz/download
맥용 바이너리(실행파일) 만드는 법
1. 받은 소스 파일의 압축해제
2. 디렉터리가 생성되면 터미널 실행 (유틸리티->터미널)
3. 아래 명령어를 입력하여 컴파일 및 설치
cd ~/Downloads/iperf-2.0.5 (압축해제한 디렉터리로 이동해야 합니다)
./configure
make
sudo make install (자기 계정의 패스워드 입력)
cd /usr/local/bin
sudo mv iperf /usr/bin (자기 계정의 패스워드 입력)
-- 이제 맥용 실행파일이 만들어졌으니 속도측정을 해봐야겠죠. ---
(맥 기준) 업로드 속도측정
윈도에서 iperf 서버모드 실행 (실행..창에서 다음 명령어 입력, 윈도에서의 실행방법은 http://linhost.info/2010/02/iperf-on-windows/ 에서 확인가능)
iperf -s
맥에서 iperf 클라이언트 모드 실행 (터미널에서 실행)
iperf -c 윈도IP -i 1 -t 20
!! 참고 !!
자신의 IP를 확인하는 법
맥: 터미널에서
ifconfig
-> 무선이면 en1, 유선이면 en0에 나오는 정보 중, inet에 나와있는 IP를 확인하면 됩니다.
윈도: 실행..에서
ipconfig
--- 속도측정 결과 ---
MacBookPro:Downloads$ iperf -c 192.168.1.3 -t 20 -i 1
------------------------------------------------------------
Client connecting to 192.168.1.3, TCP port 5001
TCP window size: 129 KByte (default)
------------------------------------------------------------
[ 3] local 192.168.1.2 port 53383 connected with 192.168.1.3 port 5001
[ ID] Interval Transfer Bandwidth
[ 3] 0.0- 1.0 sec 19.0 MBytes 159 Mbits/sec
[ 3] 1.0- 2.0 sec 20.0 MBytes 168 Mbits/sec
[ 3] 2.0- 3.0 sec 20.0 MBytes 168 Mbits/sec
[ 3] 3.0- 4.0 sec 20.0 MBytes 168 Mbits/sec
[ 3] 4.0- 5.0 sec 20.4 MBytes 171 Mbits/sec
[ 3] 5.0- 6.0 sec 19.9 MBytes 167 Mbits/sec
[ 3] 6.0- 7.0 sec 19.4 MBytes 163 Mbits/sec
[ 3] 7.0- 8.0 sec 20.0 MBytes 168 Mbits/sec
[ 3] 8.0- 9.0 sec 20.0 MBytes 168 Mbits/sec
[ 3] 9.0-10.0 sec 19.1 MBytes 160 Mbits/sec
[ 3] 10.0-11.0 sec 20.1 MBytes 169 Mbits/sec
[ 3] 11.0-12.0 sec 20.4 MBytes 171 Mbits/sec
[ 3] 12.0-13.0 sec 20.5 MBytes 172 Mbits/sec
[ 3] 13.0-14.0 sec 20.1 MBytes 169 Mbits/sec
[ 3] 14.0-15.0 sec 19.9 MBytes 167 Mbits/sec
[ 3] 15.0-16.0 sec 20.1 MBytes 169 Mbits/sec
[ 3] 16.0-17.0 sec 20.1 MBytes 169 Mbits/sec
[ 3] 17.0-18.0 sec 18.9 MBytes 158 Mbits/sec
[ 3] 18.0-19.0 sec 20.5 MBytes 172 Mbits/sec
[ 3] 19.0-20.0 sec 20.1 MBytes 169 Mbits/sec
[ 3] 0.0-20.0 sec 399 MBytes 167 Mbits/sec
반대의 경우(맥 기준 다운로드 측정시)에는 위의 서버/클라이언트 모드를 서로 바꿔주면 됩니다.
즉, 맥에서 iperf -s 를 실행하고 윈도에서 iperf -c 맥IP -i 1 -t 20 를 실행하면 되는것이죠.
------------------------------------------------------------
Client connecting to 10.1.10.101, TCP port 5001
TCP window size: 16.0 KByte (default)
------------------------------------------------------------
[ 3] local 10.1.10.86 port 41416 connected with 10.1.10.101 port 5001
[ ID] Interval Transfer Bandwidth
[ 3] 0.0- 1.0 sec 13.4 MBytes 112 Mbits/sec
[ 3] 1.0- 2.0 sec 15.8 MBytes 132 Mbits/sec
[ 3] 2.0- 3.0 sec 18.1 MBytes 152 Mbits/sec
[ 3] 3.0- 4.0 sec 19.0 MBytes 159 Mbits/sec
[ 3] 4.0- 5.0 sec 19.6 MBytes 165 Mbits/sec
[ 3] 5.0- 6.0 sec 20.0 MBytes 168 Mbits/sec
[ 3] 6.0- 7.0 sec 20.6 MBytes 173 Mbits/sec
[ 3] 7.0- 8.0 sec 21.4 MBytes 179 Mbits/sec
[ 3] 8.0- 9.0 sec 23.1 MBytes 194 Mbits/sec
[ 3] 9.0-10.0 sec 23.0 MBytes 193 Mbits/sec
[ 3] 10.0-11.0 sec 23.2 MBytes 195 Mbits/sec
[ 3] 11.0-12.0 sec 22.8 MBytes 191 Mbits/sec
[ 3] 12.0-13.0 sec 22.9 MBytes 192 Mbits/sec
[ 3] 13.0-14.0 sec 23.1 MBytes 194 Mbits/sec
[ 3] 14.0-15.0 sec 23.2 MBytes 195 Mbits/sec
[ 3] 15.0-16.0 sec 22.5 MBytes 189 Mbits/sec
[ 3] 16.0-17.0 sec 23.2 MBytes 195 Mbits/sec
[ 3] 17.0-18.0 sec 22.6 MBytes 190 Mbits/sec
[ 3] 18.0-19.0 sec 22.8 MBytes 191 Mbits/sec
[ 3] 19.0-20.0 sec 22.5 MBytes 189 Mbits/sec
[ 3] 0.0-20.0 sec 423 MBytes 177 Mbits/sec
무선랜의 특성을 많이 타서 위와같이 다운로드 속도가 좀더 높게 나왔네요. (DIR-825 공유기 사용)
아뭏든, 속도측정은 위와 같은 패킷 전송량으로 측정하는게 좀더 정확한 결과가 나옵니다.

이젠 블로거들한테도 언급되지 않는 해묵은 이슈.
애플이 삼성을 고소 -> 삼성도 애플 고소
간단하게 보자.
애플이 삼성을 고소한 내용 중에 몇가지는 누가 봐도 침해한 것이 맞는것도 있고, 의문스러운 것도 있다. 하지만 다시한번 돌려서 내용을 보다 보면, 삼성이 침해한것도 있고 안드로이드가 침해한 것도 있다는게 더 정확한 표현이다. 즉, 삼성은 어찌보면 안드로이드의 대표주자격으로 고소당한 것이다.
또한 이에 맞서 삼성이 애플을 고소한것..이것도 애플이 잘 피하지 못하면 특허침해로 걸릴만한 사항이다. 적어도 기술에 관련된것이니 잘 피해다닌다 쳐도 한두개는 걸려들것으로 예상.
결론은?
많은 사람들이 예상하다시피 내 생각도 "크로스 라이센싱->서로 손잡고 하하 웃으며 사진한방" 으로 끝날것이다.
하지만 왜 애플은 삼성을 고소했을까? 가만있으면 그냥 슬슬 흘러가는걸..?
애플의 목적은 다음 한 줄이다.
"안드로이드의 확산 방지"
삼성은 기술력(특허) 또는 최악의 경우 라이센스 비용을 내면 애플과의 특허전쟁은 끝난다. 하지만 중소업체에 시선을 돌려보면 그 이야기는 틀려진다.
애플이 고소한 내용 중, 안드로이드의 고유특성에 대한 특허침해가 인정되면 현재 안드로이드를 사용하고 있는 모든 업체는 애플과 계약을 맺어야 한다. 즉 삼성처럼 크로스 라이센싱을 하거나 특허사용료를 내거나 둘 중 하나라는 말이다.
그런데 안드로이드를 주 운영체제로 쓰고 있는 중소업체(KT tech나 팬텍 정도의 크기를 가진 업체) 중 애플과 크로스 라이센싱을 맺을만한 특허를 보유하고 있거나 막대한 특허료를 지불할 만한 여력이 있는 회사가 과연 얼마나 될까?
애플이 노리는것이 바로 이런거다. 메이저 업체를 제외한(삼성/LG(?)/모토로라 정도) 다른 중소업체들은 저 소송이 삼성의 패소로 이어진다면 그 순간부터 안드로이드를 운영체제로 삼는것을 피할 수 밖에 없다는 것. 지금처럼 아무나 안드로이드를 무료라는 이유만으로 자신의 폰에 올려서 장사를 못한다는 것. 결과적으로 안드로이드의 무차별적인 확산을 방지하는 것이 주 목적일거라 생각한다. 게다가 앞으로 생겨날 중소기업들은 고소가 무서워서 안드로이드를 운영체제로 택하지 못할것이다. 따라서 자연스럽게 안드로이드의 시장과 입지는 좁아질 것으로 예상된다.
그렇다면 현재 안드로이드를 사용하고 있는 중소 핸드폰 업체들은 어찌해야 하나?
중소기업에게 이런 위험부담을 피할 수 있는 방법은 두 가지다.
1) 안드로이드를 개발한 구글에서 애플특허를 회피한 새 버전을 배포하길 기다리는 것 (하지만 언제 될지는 구글 맘)
2) 현재 안드로이드폰에 대한 의존도를 당장 낮추고 (아직은 무의미한 점유율이지만) MS윈도폰의 라이센스를 받아서 빨리 OS를 전환하고 앞으로의 일을 준비할것
왜 윈도폰을 OS로 채택해야 하는가..에 대한 정당성은 다음과 같다.
1) 유료다. 이 점은 양날의 검이지만, 적어도 특허문제에 관해서는 단말 개발업체들이 신경을 안써도 된다. 즉 특허문제와 관련된 모든 사항은 MS가 담당한다 (돈받고 팔았으니깐). 반면 안드로이드는 무료이기 때문에 애플에서 구글을 고소하지 못하는것일뿐.
2) 윈도폰을 제대로 본 사람은 알겠지만, iOS를 따라한 흔적이 역력한(그만큼 하나하나 고민하지 않고 따라하기 바쁜 흔적이 역력한) 안드로이드와는 차원이 틀리다. 과연 S/W회사는 다르구나..라고 느껴질만큼 고심의 흔적이 역력한 UI며 독자적인 동작원리 등 안드로이드처럼 이것저것 소송걸릴 만한 구멍이 거의 없다.
3) 만일 소송이 걸린다 해도 MS가 소송의 주체가 되기 때문에, MS와 애플간에 또 크로스 라이센싱(손잡으며 사진 한방)으로 끝난다.
지금 국내 폰 기업들이 짧은 시야로 안드로이드에 주력하고 있지만, 이미 삼성은 바다OS도 내놓았고 윈도폰 개발도 하며 미래를 대비하고 있다. (하지만 요즘 윈도폰 개발인력을 대규모로 감축했다는 비보도 들린다. 그러지마 삼성…) LG는 뭐 윈도폰을 예전부터 쭉 준비해왔으니 윈도폰이 안정화될 것으로 예상되는 내년 중반부터는 좀 풀릴듯 싶다…(하지만 MS와 협약을 맺은 노키아때문에 또 피맛을 맛볼 수 있다. LG야…노키아와 대적할 만한 중저가 윈도폰을 노키아보다 더 빨리 내놓도록 준비해야 해 ㅠ.ㅠ 시장선점효과가 뭔지 알지?)
세 줄 요약
1) 애플-삼성간의 특허싸움은 크로스 라이센싱으로 끝난다.
2) 안드로이드를 주 운영체제로 쓰고 있는 중소기업은 더 늦기 전에 윈도폰 OS 개발 노하우를 쌓아라
3) LG 힘내 ㅠ.ㅠ
P.S 내멋대로 상상하고 끄적인 것이니 뭐 망글이 될 수도 있고, 성지글이 될 수도 있고..ㅎㅎ 근데 MS를 응원하기는 정말 처음이네그려..;;
//
// rectangle.h
// rectangle
//
// Created by 박영진 on 11. 6. 7..
// Copyright 2011 Home. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface Rectangle : NSObject {
//@private // 이걸로 설정되어 있으면 상속이 안됨. 자신만의 instance variable로 선언되어 자기 자신의 class에서만 사용가능
int width;
int height;
}
@property int width, height;
-(int) area;
-(int) perimeter;
@end
@interface Square : Rectangle {
@private
}
-(void) setSide: (int) s;
-(int) side;
@end
//
// main.m
// rectangle
//
// Created by 박영진 on 11. 6. 7..
// Copyright 2011 Home. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "rectangle.h"
@implementation Rectangle
@synthesize width, height;
-(int) area
{
return width * height;
}
-(int) perimeter
{
return width*2 + height*2;
}
-(void) setWidth:(int)w andHeight: (int) h
{
width = w;
height = h;
}
@end
@implementation Square:Rectangle
-(void) setSide:(int)s
{
[self setWidth:s andHeight:s];
}
-(int) side
{
return width;
}
@end
int main (int argc, const char * argv[])
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
// Rectangle *myRect = [Rectangle new];
Square *mySquare = [Square new];
[mySquare setSide:4];
NSLog(@"Square area is %i and side is %i", [mySquare area], [mySquare side]);
[mySquare release];
//
// [myRect setWidth:3 andHeight:4];
// NSLog(@"width = %i height = %i", myRect.width, myRect.height);
// NSLog(@"area = %i", [myRect area]);
// NSLog(@"perimeter = %i", [myRect perimeter]);
//
// [myRect release];
[pool drain];
return 0;
}
BOOL yesNo;
typedef signed char BOOL;
//
// main.m
// objective-c
//
// Created by 박영진 on 11. 6. 2..
// Copyright 2011 Home. All rights reserved.
//
#import <Foundation/Foundation.h>
// --- @interface section ---
@interface Fraction : NSObject {
@private
int numerator;
int denominator;
}
- (void) print;
// setter
- (void) setNumerator: (int) n;
- (void) setDenominator: (int) d;
// getter
- (int) numerator;
- (int) denominator;
@end
// --- @implementation section ---
@implementation Fraction
-(void) print
{
NSLog(@"%i/%i", numerator, denominator);
}
// setter
-(void) setNumerator:(int)n
{
numerator = n;
}
-(void) setDenominator:(int)d
{
denominator = d;
}
// getter
-(int) numerator
{
return numerator;
}
-(int) denominator
{
return denominator;
}
@end
// --- Program section ---
int main (int argc, const char * argv[])
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
// 일단 myFraction이라는 class instance를 Fraction이라는 class type으로 선언하되, 선언시에 메모리에 할당(alloc)하고 초기화(init)해준다.
Fraction *myFraction = [[Fraction alloc] init];
// myFraction의 method를 사용하기 위해서는 다음과 같은 양식을 사용한다.
// [receiving_object message:optional_parameter]
[myFraction setNumerator:1]; // myFraction의 setNumerator에게 1을 준다.
[myFraction setDenominator:3];
// 누가 그랬더라...메시지 전달이 obj-c의 주요 개념이라고. 흠..
// getter + setter + getter를 통한 값의 변화
// class instance에 직접 접근이 안된단다. 나같은 C프로그래머는 잘 이해가 안가는 특성. 객체지향의 주요 특징인 데이터 캡슐화
// 라고 하는데, 책에 나와있는 원문 설명을 그대로 옮기면.
// 이러한 캡슐화를 통해 클래스 설계자는 마음대로 클래스를 설계할 수 있고, 프로그래머는 클래스 내부의 변화에 대해 신경쓰지 않고
// 자기 마음대로 자신만의 클래스를 설계할 수 있다고 한다.
// ... 머릿속으로는 대충 그림이 그려지는데 이게 어떤 상황에서 이득인지 아직은 잘 모르니 그냥 그렇다..라고만 알고 넘어가자.
NSLog(@"first getter value: numerator - %i denominator = %i\n", [myFraction numerator], [myFraction denominator]); // 그냥 잡다한거 빼고 print method를 호출해도 된다. [myFraction Print];
NSLog(@"next, we set values");
[myFraction setNumerator:10];
[myFraction setDenominator:20];
NSLog(@"finally, check value using getter: numerator = %i denominator = %i", [myFraction numerator], [myFraction denominator]); // 그냥 잡다한거 빼고 print method를 호출해도 된다. [myFraction Print];
[myFraction release]; // 위의 alloc에서 메모리를 할당해준 만큼, 해당 메모리를 해제해줘야 한다.
[pool drain];
return 0;
}
세 가지로 구성
1. interface (선언)
2. implementation (구현)
3. 프로그램
선언하고->선언에 대한 상세한 내용을 구현하여->프로그램에서 써먹는다
---------- interface section --------
@interface NewClassName: ParentClassName
{
memberDeclarations; // Instance Variables
}
methodDeclarations; // Instance Method
@end
보통 class이름은 대문자로 시작하며, method이름은 소문자로 시작한다. 습관을 들이면 나중에 코드 가독성이 좋아진다.
// --- @interface section ---
@interface Fraction : NSObject {
@private
int numerator;
int denominator;
}
- (void) print;
- (void) setNumerator: (int) n;
- (void) setDenominator: (int) d;
@end
위에서 memberDeclarations 부에 선언된 numerator/denoinator가 바로 instance variables이다. 원서볼때마다 헷갈린 단어였는데 이제 개념좀 잡히네 -_-
마찬가지로 print, seNumerator, setDenominator는 method인데, 이걸 instance method라 칭한다.
앞의 (-) 는 instance method라고 컴파일러한테 알려준다. (+)는 class method인데, 이건 아직 잘 모르니 일단 이렇다는것만 알고 넘어가자. 나중에 설명 나오면 개념 잡히겠지…
원서에는 자동차 어쩌고 하는데 난 오히려 이런 추상적인 설명보다 코드 한 줄 예제로 보여주는게 더 이해가 빠르다. 뭐 워낙 OOP가 추상적인 개념부터 시작하는지라 그렇지만, C만 다뤄온 나한테는 객체지향이라는 장벽이 은근 높다.
- (void) setNumerator: (int) n;
-: method type
void: return type
setNumerator: methode Name
: :method takes arguement
int: argument type
n; argument name
----------- implementation section ----------
@ implementation NewClassName
methodDefinitions;
@end
@interface 에서 선언된 method 들의 구현을 바로 이곳에서 한다.
위의 예제를 시험삼아 보면..
// --- @implementation section ---
@implementation Fraction
-(void) print
{
NSLog(@"%i/%i", numerator, denominator);
}
-(void) setNumerator:(int)n
{
numerator = n;
}
-(void) setDenominator:(int)d
{
denominator = d;
}
@end
뭐..요딴식?
모든 method의 구현이 끝남. 오키.
numerator, denominator는 Fraction class의 속성을 상속받으니깐 바로 접근이 가능함. 호오..클래스 개념이 잡히는것 같기도 하고…C의 구조체 또는 union과 비슷한거 같기도 하고… 아직 많이 헷갈림.
이제 프로그램 부분을 보자.
// --- Program section ---
int main (int argc, const char * argv[])
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
// 일단 myFraction이라는 class instance를 Fraction이라는 class type으로 선언하되, 선언시에 메모리에 할당(alloc)하고 초기화(init)해준다.
Fraction *myFraction = [[Fraction alloc] init];
// myFraction의 method를 사용하기 위해서는 다음과 같은 양식을 사용한다.
// [receiving_object message:optional_parameter]
[myFraction setNumerator:1]; // myFraction의 setNumerator에게 1을 준다.
[myFraction setDenominator:3];
// 누가 그랬더라...메시지 전달이 obj-c의 주요 개념이라고. 흠..
[myFraction print]; // 웃샤..프린트해보자.
[myFraction release]; // 위의 alloc에서 메모리를 할당해준 만큼, 해당 메모리를 해제해줘야 한다.
[pool drain];
return 0;
}