Truly sad day. You are my hero. 

(Image from www.apple.com) 
저작자 표시 비영리 동일 조건 변경 허락
신고

'일상에 대한 메모' 카테고리의 다른 글

Rest In Peace, Steve Jobs  (0) 2011.10.06
박경철 님의 강연을 들었습니다.  (0) 2011.05.20
Posted by yunseong

정말 한 구절, 한 구절이 와 닿는 강연이었습니다.
잊어버리기 전에 짧게 짧게 정리하려고 합니다.

1. 어떤 것의 근본에 대한 답
   외과의사 : 외과의사에게 가장 어려운 교재 중 하나인 해부학 교재 Grey's Anatomy의 서문 첫 문장은
    - 인간은 존엄하다. --> 의사라는 직업의 존재에 대한 근본적인 이유
    경제학자 : 경제학 교재의 서문 첫 문장은
    - 인간의 자원은 부족하다.
        --> 이로 인해 인간은 한정된 자원을 최대한 활용하려 한다. Homo economicus. 경제의 인간

2. 과연 우리는 행복한가. 앞으로 어떻게 해야 행복해 질 수 있는가?
   행복 = 소유/욕망 으로 계산된다.
   - 과거에는 욕망을 줄임으로서 행복을 극대화하 하고자 했다. 왜냐하면 인간의 소유는 늘어나기가 매우 어려웠다. (극한의 욕망 자제 --> 무소유)
       --> 얼마나 소유를 늘리기 어려웠을까? 한 경제학의 대가에 의하면 (누구였는지 기억 안남) AD 0년에서 부터 약 1,700년간 약 20%의 경제적 향상이 있었다. 그러나 1,700년대에 산업혁명이 일어나면서부터 인류의 경제적 성장은 약 200년동안 약 6000%의 향상을 이루어낸다. 
   - 산업혁명을 겪으며 인간은 소유를 늘려서 행복을 늘릴 수 있다는 생각을 하게 되며, 이 욕망을 자극하면서 더욱 맹렬한 속도로 발전한다. --> 자본주의의 근본
   - 그러면 수십배의 향상이 있었으니 인간은 행복한가? 그렇지 않다. 여전히 인간은 과거에 비해 행복하지 않다.
     --> 왜냐하면, 자본주의에서 소유가 늘어난 다는 것은 욕망이 늘어나서 동기부여가 되어야 가능하기 때문에, 욕망이 늘어야 소유가 커질 수 있다. 따라서 인간의 행복지수는 커지지 않는다. 

   - 얼마나 빠른 속도로 세상이 변하는가? --> 우리나라를 예로 듦
     - 단군할아버지가 우리나라를 만든 이 후부터 수천년간 우리는 농경사회였다. 
     - 1950년 이 전까지는 모든 서민의 꿈은 천석꾼, 만석꾼이었다. 
     - 한국전쟁 이후, 미국의 주도로 산업화가 급속도로 진행하며, 엄청난 속도로 산업화가 진행된다.
--> 1950년에 살았다고 가정했을 때, 만약 당신에게 꽤나 큰 돈이 주어지면, 당신은 땅을 사서 만석꾼이 되겠는가, 아니면 세상을 바꾸겠다고 돈을 끌어다가 제조업을 하겠는가? 아마도 농사를 짓지 않겠는가. 왜냐하면, 그 때까지 수천년을 그렇게 살아왔기 때문이다. 그러나, 선견지명이 있는 건지, 아니면 본능적으로 알게 된 것인지 모르지만, 그 당시에 돈을 대출받고 산업화를 타고 일어난 대표적 2명 : 삼성의 이병철, 현대의 정주영
     - 그럼 그 만석꾼류의 사람들은 어떻게 되었나? --> 우루과이 라운드때를 생각해보라. 수천년 동안 이어지던 세상이 불과 50년 만에 완벽하게 뒤집혔다
     - 항상 귀를 열고 세상의 변화를 들으려 해야 한다. 변화의 속도는 더 빨라지고 있다. 
        - 변화가 어떻게 진행되고 있나?
           - 70년대에는 품질이라는 것에 대한 개념이 없었다. TV는 나오면 되고, 채널 손잡이가 1달만에 부러져도, 팬치로 잡고 돌리면 된다. 화면이 안나오면 손바닥으로 한대 때리면 된다. --> 절대적 빈곤. 있다는 것 만으로도 만족함
           - 그러나, 산업화가 고도화되면서, 절대적 빈곤이 없어짐
              --> 월급받는 노동자가 생기고, 그들이 저축을 하면서 경제력을 가지게 되면서 수준이 높아짐. 

           - 제조회사들은 이제, 절대적 빈곤이 해소되어 물건을 팔 수 없게 되자 상대적 빈곤을 강조함. 
              --> 공공장소에 3D LED TV를 설치하고, 광고를 함.
                  --> 소비자에게 끝없이 새로운 기술을 강조하여 상대적 빈곤감을 느끼게 함 -- 삼성이 Apple을 따라가지 못하는 이유가 됨.
              --> 샤넬, 루이비통 등의 수백만원의 가방
                  --> 아무기능 없는 가죽 가방임에도 브랜드가치를 이용하여 구매를 하게 함
              --> 원조 할머니 국밥집엔 국밥할머니가 없고, 조미료를 한 바가지 집어넣어도, 이 집 할머니가 전수해줬으니 맛있을꺼야 라며 먹음
                  --> 논리적이지 않고 사실이 아닐 수 있으나, 어떤 스토리를 이용하여 구매를 하게 함.
         
 - 다시 자본주의로 돌아가서
    - 1970 ~ 1980년 당시 세계에서 가장 빠른 속도로 발전한 나라는 미국이다.
    - 당시의 미국의 자신감은 대단했다.
       - 1980년대 미국의 저명한 경제학자 Francis Fukuyama의 저서 The End Of History --> 인류의 역사는 더 나은 체제와 이념을 만들고자 하는 노력의 연속이다. 그리고 이제 그 고민은 끝났다. 완전무결한 체제, 그것이 미국의 자본주의이고, 더 이상의 발전은 필요없다. 미국의 자본주의를 받아들이면 그 나라는 발전하고 국민들은 행복할 것이다. --> 과한 자신감이지만, 미국의 성장세가 워낙 강해서 다른 경제학자들이 반박하지 못했다.  미국의 자본주의의 성장방식은 성공하고자 하는 욕망을 끊임없이 자극하여 강력한 동기부여를 하는 방식이었다. --> The America dream!!!
그러나, 2008년 Francis Fukuyama는 The Fall of America라는 기고문에서 80년 당시 자신의 주장과 저서에 대해 사과한다. 그는 이런 성장방식으로는 인간은 행복해질 수 없다는 것을 깨달았다고 고백한다. 
      
- 그럼 어떻게 해야 행복한가
  - 행복 = 소유/욕망 이런 방식으로는 행복할 수 없다. 무엇인가를 가져서 행복해질 수 없다. 완전히 다른 방식을 찾아야 한다. 그에 대한 깊은 고민이 필요하다. 
  
    
저작자 표시 비영리 동일 조건 변경 허락
신고

'일상에 대한 메모' 카테고리의 다른 글

Rest In Peace, Steve Jobs  (0) 2011.10.06
박경철 님의 강연을 들었습니다.  (0) 2011.05.20
Posted by yunseong
특정 view에서는 default인 회색바가 아닌 검정색 bar나 투명한 검정색을 쓸 경우가 있다 (아이팟이나, Photo app처럼)

그럴 경우, UIView class에서 viewWillAppear를 override하고, 그 안에 아래의 code를 넣어주면 된다. 
한번 로드하고 안바꿀꺼라면 viewDidLoad에서 해도 되고...

[[UIApplication sharedApplicationsetStatusBarStyleUIStatusBarStyleBlackOpaque];

위의 코드는 검정색 bar로 만든다 (ipod처럼) 마지막 상수를 바꾸면 반투명 검정색 bar로 바꿀 수도 있다


저작자 표시 비영리 동일 조건 변경 허락
신고
Posted by yunseong

이미지 뒤집기를 할 때 UIImageView를 이용할 수 있다면, 매우 쉽게 해결할 수 있다. 

UIImage* artworkImage = [UIImage imageNamed:imageUrl];


[artworkReversedView setImage:artworkImage];

artworkReversedView.transform = CGAffineTransformMakeScale(1, -1);

위의 경우는 수평으로 뒤집기 (horizontal) 

CGAffineTransformMakeScale의 두 상수값을 조절하여 뒤집는 방향을 조절할 수 있다.
저작자 표시 비영리 동일 조건 변경 허락
신고
Posted by yunseong

Keyboard를 activate시키는 어떤 control이 firstResponder가 되면 keyboard는 자동으로 올라온다. 해당 control을 firstResponder가 아니게 만들면 keyboard는 사라진다. 

-(IBAction) editnigDone: (id)sender {
[sender resignFirstResponder];
}

예를 들면 UITextField는 Did End OnExit event를 위의 코드에 연결해주면 된다.

그런데 UITextView는 어떤 이벤트에 엮어야 하는거야 -_-;;


저작자 표시 비영리 동일 조건 변경 허락
신고
Posted by yunseong
This class is about defining class, memory management, and new feature, especially Property in Objective-C 2.0. 

define class is not familiar to C/C++ programmer, because its look is so different, We have to use '@interface' instead of 'class' and method cannot be in bracket, and method name and member variable's name can be equal. But it is not to hard to use. it is so easy!!. 

And memory management... it is really different from C/C++. There is global (This statement can be wrong) memory pool, called autorelease. It works by reference count (retain count) and it is not freed (dealloc) even though receive release message, if it's reference count (retain count) is not be 0. 

And property is also not familiar to me. i think is is similar with get {} / set {} in C#. it can reduce some boring code, and can be used by dot syntax. so convenient. 

Anyway, Here is my assignment 2-A

#import <Cocoa/Cocoa.h>



@interface PolygonShape : NSObject {

int numberOfSides;

int minimumNumberOfSides;

int maximumNumberOfSides;

float angleInDegrees;

float angleInRadians;

NSString* name;

}


- (void) dealloc;

- (id)init;

- (id)initWithNumberOfSides: (int)sides minimumNumberOfSides:(int)min maximumNumberOfSides:(int)max; 

- (void) description;


@property (readwrite) int numberOfSides;

@property (readwrite) int minimumNumberOfSides;

@property (readwrite) int maximumNumberOfSides;

@property (readonly) float angleInDegrees;

@property (readonly) float angleInRadians;

@property (readonly) NSString* name;

@end



#import "PolygonShape.h"


@implementation PolygonShape


@synthesize numberOfSides;

@synthesize minimumNumberOfSides;

@synthesize maximumNumberOfSides;


- (void)dealloc

{

NSLog(@"dealloc is called. This Polygon ivar is destroyed");

[super dealloc];

}


- (void) setNumberOfSides: (int) value

{

if (value < minimumNumberOfSides)

{

NSLog(@"Invalid number of sides: %d is less than the maximum of %d allowed", value, minimumNumberOfSides);

}

else if (value > maximumNumberOfSides)

{

NSLog(@"Invalid number of sides: %d is greater than the maximum of %d allowed", value, maximumNumberOfSides);

}

else

{

numberOfSides = value;

}

}


- (void) setMinimumNumberOfSides: (int) value

{

if (value > 2)

{

minimumNumberOfSides = value;

}

else

{

NSLog(@"Invalid minimum number of sides: %d is less than the minimum of 2 allowed", value);

}

}


- (void) setMaximumNumberOfSides: (int) value

{

if (value <= 12)

{

maximumNumberOfSides = value;

}

else

{

NSLog(@"Invalid maximum number of sides: %d is greater than the maximum of 12 allowed", value);

}

}


- (id)init

{

[self initWithNumberOfSides:5 minimumNumberOfSides:3 maximumNumberOfSides:10];

return self;

}


- (id)initWithNumberOfSides: (int)sides minimumNumberOfSides:(int)min maximumNumberOfSides:(int)max

{

[super init];

self.minimumNumberOfSides = min;

self.maximumNumberOfSides = max;

self.numberOfSides = sides;

return self;

}


- (float)angleInDegrees

{

return (180 * (numberOfSides - 2) / numberOfSides);

}


- (float)angleInRadians

{

return self.angleInDegrees * 2 * 3.14 / 360;

}


- (NSString*)name

{

NSMutableString* nameOfPolygon = [NSMutableString string];

switch (numberOfSides)

{

case 3 : nameOfPolygon = @"triangle"; break;

case 4 : nameOfPolygon = @"square"; break;

case 5 : nameOfPolygon = @"pentagon"; break;

case 6 : nameOfPolygon = @"hexagon"; break;

case 7 : nameOfPolygon = @"heptagon"; break;

case 8 : nameOfPolygon = @"octagon"; break;

case 9 : nameOfPolygon = @"enneagon"; break;

case 10 : nameOfPolygon = @"decagon"; break;

case 11 : nameOfPolygon = @"hendecagon"; break;

case 12 : nameOfPolygon = @"dodecagon"; break;

default : nameOfPolygon = @"";

}

return nameOfPolygon;

}


- (void)description

{

NSLog(@"Hello, I'm a %d-sided polygon (aka a %@) with angles of %f degrees (%f radians)", numberOfSides, self.name, self.angleInDegrees, self.angleInRadians);

}

@end



저작자 표시 비영리 동일 조건 변경 허락
신고
Posted by yunseong
I skipped first chapter, because it is just brief about iPhone programming (cocoa framework), and there are not much stuff to think. I can finish first assignment just followed given guide. Anyone can do it ;-)

Actually i already study about objective-c a few months back. but i cannot study with concentration, so i almost forgot everything. This class  reminds me, and i can remember what i studied ago.  And, i can use some unfamiliar class like NSEnumerator, NSURL, NSProcessInfo, so on. 

Here is assgnment 1-B.  Because these are my private, there is no comment ;-)

void PrintPathInfo()

{

NSString *path = @"~";

path = [path stringByExpandingTildeInPath];

NSLog(@"My home folder is %@", path);

NSArray *pathCompArray = [path pathComponents];

NSEnumerator *foreachEnum = [pathCompArray objectEnumerator];

NSString* item;

while (item = [foreachEnum nextObject])

{

NSLog(@"%@\n", item);

}

}


void PrintProcessInfo()

{

NSString *processName = [[NSProcessInfo processInfo] processName];

int processId = [[NSProcessInfo processInfo] processIdentifier];

NSString* outputStr = [NSString stringWithFormat: @"Process Name : %@, Process ID : '%d'",

  processName, processId];

NSLog(outputStr);

}


void PrintBookmarkInfo()

{

NSArray *keyArray = [NSArray arrayWithObjects: @"Stanford University"

@"Apple"

@"CS193P",

@"Stanford on iTunes U",

@"Stanford Mall", nil];

NSArray *strValueArray = [NSArray arrayWithObjects: @"http://www.stanford.edu",

  @"http://www.apple.com",

  @"http://cs193p.stanford.edu",

  @"http://itunes.stanford.edu",

  @"stanfordshop.com", nil];

NSMutableDictionary *bookMark = [NSMutableDictionary dictionaryWithCapacity: 5];

// c-style iteration

for (int nIdx = 0; nIdx < [keyArray count]; nIdx++)

{

[bookMark setValue: [NSURL URLWithString: [strValueArray objectAtIndex: nIdx]] forKey: [keyArray objectAtIndex: nIdx]]; 

}

NSEnumerator *keyEnum = [bookMark keyEnumerator];

NSString* key;

// Iteration with enumerator

while (key = [keyEnum nextObject])

{

NSURL *url = [bookMark objectForKey: key];

NSLog(@"Key : '%@' URL : '%@'\n", key, [url relativeString]);

}

}


void PrintIntrospectionInfo()

{

NSMutableArray *anyObjArray = [NSMutableArray arrayWithCapacity: 5];

NSString *string = [NSString stringWithFormat: @"Hello, Mac!!!!"];

NSURL *url = [NSURL URLWithString: @"http://www.apple.com"];

NSProcessInfo *processInfo = [NSProcessInfo processInfo];

NSDictionary *dic = [NSDictionary dictionary];

[anyObjArray addObject: string];

[anyObjArray addObject: url];

[anyObjArray addObject: processInfo];

[anyObjArray addObject: dic];

NSEnumerator *objEnum = [anyObjArray objectEnumerator];

NSObject *obj;

while (obj = [objEnum nextObject])

{

NSLog(@"Class Name : %@\n", [obj className]);

NSLog(@"Is member of NSString : %@", [obj isMemberOfClass: [NSString class]] ? @"YES" : @"NO");

NSLog(@"Is kind of NSString : %@", [obj isKindOfClass: [NSString class]] ? @"YES" : @"NO");

SEL sel = @selector(lowercaseString);

if ([obj respondsToSelector: sel] == YES)

{

NSLog(@"lowercaseString is '%@'", [obj performSelector: sel]);

}

else

{

NSLog(@"Responds to lowercaseString : NO");

}

NSLog(@"====================================");

}

[anyObjArray removeAllObjects];

[anyObjArray release];

}




저작자 표시 비영리 동일 조건 변경 허락
신고
Posted by yunseong
This section is about studying "iPhone application Programming" class which is established at Stanford University online class in iTunes U. I think this stuff is so good to study not only iPhone programming but also english. My english is not so good, so i always worry about it. This will be able to help me. Of course, i cannot understand what they say yet, but it becomes better. 

Actually, I already watch lesson 1 ~ 3, and i already finish assignments 2-1 from first one. I cannot make sure that my codes are all right, but i'll publish these code even though my codes can be wrong. 
 I hope, i can finish this class, not to be tedious. ;-). I think studying iphone programming is not press me. sometimes studying things can be burden. but i think i am really able to enjoy this ;-). it is the reason that i decide to study iPhone programming. 
저작자 표시 비영리 동일 조건 변경 허락
신고
Posted by yunseong
막상 글을 쓰려니 내용에 대한 확신이 없어서 쉽게 써지질 않네요 -_-;; 틀린 내용을 유포했다가 잡혀가는건 아닌지 -_-;;
원래 블로깅을 하면서의 목적 중 하나가 공부한 내용을 남기는 것이었는데, 혼자 책보고 공부하는 내용을 올리는 것이라 그닥 확신이 없네요. 
사실 어느분이 '이건 틀려요, 이게 맞지 않나요?' 라고 말을 해주시면 저도 더 안목이 넓어지고 좋겠지만, 아쉽게도 이 블로그는 그리 방문객이 많은 편이 아니라 그런 토론할 기회조차 없네요. 이 블로그의 내용은 개인이 공부해서 올리는 내용이기 때문에, 틀린 내용이 있을 수 있음을 미리 감안하고 보시는게 좋을 것 같습니다. 

저번 포스팅에서 '수학적인' orthogonal array를 만들어 보았습니다. 그런데 'Software testing'에서 OA를 사용하는 이유 중 하나는 coverage의 희생을 최소화 하면서 test case의 수를 효율적으로 줄이기 위해서 입니다. 어떻게 줄일 수 있을까요?
물론 parameter의 모든 조합의 경우의 수를 다 테스트하는 것 (Exhaustive testing) 이 coverage가 더 높긴 합니다만, software의 특성상(?) 모든 parameter의 조합과 2개의 (pair) parameter의 조합에 의한 coverage가 큰 차이가 없다는 것을 전제로 합니다. 정말 그래? 라고 말할 수도 있지만, 많은 자료에서 실제로 그런 결과가 나온다고 하네요. 

어쨌든, OA를 이용한 test case의 최적화를 알아보겠습니다. Exhaustive testing에서는  k개의 parameter가 있고, 각 parameter가 v개의 값을 가지고 있다면, v의 k승 만큼의 tuple (test case)을 가지게 됩니다. 그러나 OA를 이용한다면 v의 제곱 만큼의 tuple을 가지게 됩니다. k는 갯수에 영향을 미치지 않습니다. 직접 만들어 보죠 ^^;

5개의 parameter가 있고 (k = 5), 각 parameter는 3개의 값 (v = 3)을 가지고 있는 경우의 test case최적화를 해보겠습니다. 


위와 같이 있다면, Exhaustive testing의 경우에는 3 x 3 x 3 x 3 x 3 = 243개의 조합이 있어야 합니다. 

OA를 작성할 때, k개의 parameter가 있다면, k - 2개의 Orthogonal Latin Square가 있어야 합니다. (Latin Square는 지난번 포스팅을 참조하세요)


위와 같이 3개의 Orthogonal Latin Square를 만들었습니다. 그리고 위의 3개의 orthogonal latin square를 합치겠습니다 (Superimposing)


근데 왜 k개의 parameter의 조합을 할 때, k-2개의 Latin Square가 필요할까요? 2개의 pair orthogonal 조합은 쉽게 만들어 낼 수 있기 때문입니다. 그건 바로 table의 row, column의 index입니다. table의 row, column을 조합에 포함시켜 위의 table을 array로 표현하면


아래 테이블이 완성된 OA를 이용한 Pair-wise 조합입니다. Result의 5개의 숫자 조합은 각 Parameter내 값이 index를 나타냅니다. (오른쪽에 다 표현해놨습니다 ^^)


위의 표를 살펴보면, 2개의 Parameter를 선택해서 (2개의 Column) 조합을 살펴보면, 2개의 column단위로는 모든 조합을 이루고 있음을 알 수 있습니다. 예를 들면 Param3, Param4의 조합을 보면

{(G,J), (G, K), (G, L), (H, K), (H, L), (H, J), (I, L), (I, J), (I, K)} 

을 모두 가지고 있음을 알 수 있습니다. 즉, 만약에 이렇게 2개의 parameter의 조합으로도 Exhaustive testing와 비슷한 coverage를 이룰 수 있다면, testing의 효율이 엄청나게 올라가겠죠 (243개 --> 9개, 약 97%의 resource 절약).

다음 포스팅때에는 Pair-wise를 만드는 또 다른 방법인 IPO (In Parameter Order)를 알아보도록 하겠습니다 ^^

신고

'Software Testing > Knowledge Base' 카테고리의 다른 글

Combinational Analysis #3  (4) 2009.03.05
Combinational Analysis #2  (3) 2009.03.01
Combinational Analysis #1  (0) 2009.02.05
결함 정보는 Test case로 관리해라!!  (1) 2009.01.02
Issue Tracker (Bug Tracker)적용의 어려움  (1) 2009.01.02
Posted by yunseong
어느새 마지막 포스팅에서 한달 가까이 지났군요. 지난 마지막 포스팅때, Orthogonal Array (직교 배열) 에 대해서 알아보다가
멈췄네요 ㅎㅎ

저는 개인적으로는 수학을 잘 하지 못해서 그런지, 직교 배열은 관련 자료를 찾기도 쉽지가 않더군요. 사실 지난 한 달동안 직교 배열에 대해서 많이 찾아봤는데요, 워낙 여기저기 찾아보고 정리를 잘 못해서 출처도 딱히 적기가 어렵네요 -_-;; 어쨌든 근 한 달만의 포스팅이 허접하지 않게 적어보겠습니다 ^^;

직교 배열의 개론(?) 부터 말씀 드리면.
직교 배열은 Latin Square라는 수학적 행렬을 기반으로 합니다. Latin Square란, 정사각형 (row와 column의 갯수가 같은) 행렬 중, 특정 row나 column에 중복된 요소가 존재하지 않으면서 모든 요소가 한번씩 나타나는 행렬을 말합니다. 그림으로 설명하는 게 낫겠죠 ^^; 요소가 3인 (n=3) Latin Square는 아래와 같이 2개를 예로 들 수 있습니다.



위와 같은 모양을 하게 됩니다. M1, M2 두 행렬의 어느 row 혹은 column에도 요소가 중복되지 않습니다.

그럼 이제 위의 두 행렬을 합쳐보겠습니다. M1과 M2의 각 행과 열에 매치되는 요소들을 합합니다. 그러면


처럼 되겠죠. 이 행렬 L의 특징은, 행렬 내의 어떤 요소도 중복된 짝(pair)이 없다는 것입니다. 이런 경우를 우리는
두 행렬이 '직교한다', 'Mutual Orthogonal Latin Square(MOLS)'라고 합니다.
 2개의 배열을 합쳤고, 어떤 요소도 중복되지 않았다는 것은? 그렇죠,  pair-wise입니다. 단 여기서의 pair-wise는 커버리지를 
만족하는 최소의 pair-wise는 아닙니다. 단순히 수학적인 pair-wise (서로소) 입니다. 

요소가 3개인 Latin Square는 실제로 위의 2개 보다 더 많습니다. 정확히 계산하는 법은 모르곘으나, 얼추 해봐도 3개는 넘는군요.
그렇지만, Orthogonal하며, 요소가 3개인 Latin Square는 위의 행렬조합밖에 없습니다. 

그 이유는... (사실 여기부터는 찾아본 자료에 이러이러 하다고 하니까 그런 줄 알고 있는 내용입니다. 수학적으로 증명할 줄 모릅니다 -_-;;;)

수학적으로 orthogonal한 행렬은 요소가 n개 (단 여기서 n은 소수 (prime number) 혹은 소수의 제곱값 이어야 함) 일 때 
MOLS(n) = n - 1을 만족한다고 합니다. 즉 요소가 3이기 때문에 MOLS인 Latin Square는 3 - 1개 인 것입니다. 

자, 다음은 요소 갯수가 더 많은 latin square를 만드는 법을 알아보겠습니다. (사실 이거 찾는데 시간이 엄청 오래 걸렸습니다. 다 tool돌리면 나온다고 그런 설명만 있어서... 근데 또 알고 보니 별거 아니라는 -_-_

요소가 5개인 orthogonal array를 만들어보겠습니다. 


쉽죠? -_-;; 딱 보시면 규칙을 아실껍니다. 값이 1인 요소를 기준으로 보면, 1의 row내 index가 row가 내려갈수록 0 --> 4 --> 3--> 2--> 1로 바뀌는 것을 알 수 있습니다. 2, 3, 4, 5 모두 마찬가지 입니다. 

다음 행렬 보시겠습니다. 

이번에도 값이 1인 요소를 기준으로 살펴보면, 0 --> 3 --> 1 --> 4 --> 2 이렇게 2씩 줄어드는 것을 알 수 있습니다. (index 값이 0보다 작아지면 반대쪽 끝으로 간다고 (look around) 생각하세요)
아까는 1씩 줄어들고, 이번엔 2씩 줄어듭니다. 3번째는? 4번째는? 3씩, 4씩 줄이면 될 듯 합니다. 

역시 됩니다. 이 행렬 중 2개를 선택해서 합쳐보면, 그 조합된 값은 모두 pair-wise하게 됩니다. 

참고로, 5 역시 소수이기에 위의 방법이 가능합니다. 8이나 10개의 요소를 가진 행렬을 위의 방법으로 만들어보시면
Latin Square조차 성립할 수 없다는 것을 알게 되실겁니다. (한 column에 중복된 값이 나오게 됩니다). 다른 방법을 통해 Orthogonal array를 찾으셔야 합니다.
또 덧붙이면, 2보다 큰 요소를 갖는다면 모두 MOLS를 만들 수 있으나, '6'은 예외입니다. 6개의 요소를 가진 MOLS는 만들 수 없다는군요. 이는 Eulean Number와 연관이 있다고는 하나 제가 그거에 대해 아는 바가 없습니다. -_-;;

어쨌든 orthogonal Array의 개념은 이 정도로 정리하겠습니다. 다음 포스트는 이 orthogonal array를 어떻게 테스트 케이스에 적용하는 가를 적어보겠습니다. (이번엔 한 달씩이나 걸리진 않아요 ㅎㅎ)

참조 목록
- Foundation of Software Testing:: Chapter 4. Test Generation. Aditya P.Mathur. Purdue University.
- A Practical Strategy for Testing Pair-wise Coverage of Network Interfaces. Allan W.Williams et. al
- An Evaluation of Combination Strategies for Test Case Selection. Mats Grindal et.al

신고

'Software Testing > Knowledge Base' 카테고리의 다른 글

Combinational Analysis #3  (4) 2009.03.05
Combinational Analysis #2  (3) 2009.03.01
Combinational Analysis #1  (0) 2009.02.05
결함 정보는 Test case로 관리해라!!  (1) 2009.01.02
Issue Tracker (Bug Tracker)적용의 어려움  (1) 2009.01.02
Posted by yunseong
이전버튼 1 2 3 4 이전버튼