Blog | Tag | Local | Guest | Login | Write |  RSS
분류 전체보기에 해당되는 글 110건
2008.11.04 :: 복권 긁는 효과 1
오실로스코프의 대역폭 오실로스코프기본

 

1. 오실로스코프 아날로그 대역폭(Analog Bandwidth)은 입력되는 정현파의 진폭이 -3dB

   (대략 30%) 저하되는 지점의 주파수로 정의 합니다. 

 

 

 

 

2. 오실로스코프의 대역폭별 50 MHz 구형파 신호의 재생

 


 

 

3. 구형파나 펄스파와 같이 빠른 상승 또는 하강 시간을 갖는 신호를 측정시 다량의 고주파

   성분을 포함하고 있어 신호의 반복 주기만을 감안한 스코프 대역폭 선택은 의미가 없을 수

   있습니다. 따라서, 신호의 주파수 보다 높은 대역폭을 갖는 스코프를 사용하여야 합니다.

 

    * 오실로스코프의 신호대비 낮은 대역폭으로 인한 영향

 

       - 신호의 상승/하강 시간이 길어진다.

       - 신호의 진폭을 감소 시킨다.

 

   * 오실로스코프의 대역폭 계산법

 

      - 신호의 대역폭 = 0.4 / 상승시간 (20% to 80% Thresholds)
      - 신호의 대역폭 = 0.5 / 상승시간 (10% to 90% Thresholds)
 
           생산회사마다 0.4나 0.5라는 수치가 차이가 있을 수 있습니다. 상기의 수치는
           애질런트에서 1 GHz 이상의 오실로스코프에 적용하고 있는 계산 방식입니다, 
     
      오실로스코프의 대역폭;
   
      - 스코프 대역폭 = 2 * 신호의 대역폭 (가우시안 주파수 응답 스코프의 경우 )
      - 스코프 대역폭  = 1.4 * 신호의 대역폭 (플랫 주파수 응답 스코프의 경우 )
     
      * 멀티플라이어 수치와 에러
 
            멀티플라이어        에러
 
                               1                 41.4%
                       3                   5.4%
                       5                   2.0%
                      10                  0.5%
 
      * 기타 1 GHz 미만의 Scope에서의 계산법
 
        -  대역폭  =  0.35/상승/하강 에지 속도
        -  오실로스코프의 대역폭 = 3 * 위의 계산된 대역폭
        -  오실로스코프의 샘플링 속도 = 4 * 오실로스코프의 대역폭 

 



안녕하세요. 수원멤버십 디자이너 채은석입니다. 그동안 사실 졸작이라는 핑꼐를 대고 블로깅에 손을 대지 못한점 무척 죄송스럽게 생각하고 있습니다. ㅠㅠ 무슨 졸작을 그렇게 빡씨게 하냐 라는 분도 더러 계시는데 저희는 포폴이 생명이니까요 '_'b

암튼 이번 블로깅의 주제는 제 졸작이구요. 한 2~3편에 걸쳐서 올려볼까 합니다. 디자인 전시회지만 나름 '디자인+소프트웨어+하드웨어' 가 하나된 대형 프로젝트라 ...누군가 그러더군요...;;; 이런저런것 많이 보시다 보면 분명 개발하시는데 아이디어 짜시는데도 많은 도움이 될꺼라 믿어 의심치 않습니다! 라는 생각에서 이러한 내용으로 블로깅을 해봅니다. 시그장님 괜찮죠?

그럼 들어갑니다!




free your mind #1


방식에서
차이점을 주고자 목표한 프로젝트이다.

 

방식은 간단하다. :) 사용자는 앞에놓인 버튼을 사운드에 맞춰 자신만의 느낌으로 눌러본다.

눈앞에는 다양한 영상이 펼쳐진다. 다시말해서 사용자는 음악을 양념삼아 버튼을 누르는것

만으로 영상을 제작한다. 일종의 '놀이' 개념으로 다가가고자 하였다.

 

다음은 작품 프리젠테이션...


 

초기에는 브랜딩을 배제하고 작품 그자체로 의미를 두려고 하였으나 교수님과의 면담을 통해서

MTV라는 브랜딩을 하기로 결정되었다. 대학생이라는 나름의 '타이틀' 걸고 아트와 디자인사이에서

줄타기를 시도하려 했었던 건방진(?) 생각은 결국 교수님과의 타협으로 끝나고 것이다.

 

하지만 작품의 순수의도는 절대 변하지 않는다. 다양한 음악을 다양한 시각으로 해석 있도록

것이며, 사용자가 작품을 통해 흥을 돋굴수 있다면 그것만으로도 충분히 승산이 있다고 생각한다





 이번시간에는 포인트 연산 중 두 프레임간의 산술연산에 대해 포스팅하겠습니다.
 많이 어려운 내용은 아니지만, 실제로 많이 사용되는 기본중 기본이라고 하니 자세히 알아두는게 좋겟습니다-
 
 구현된 결과는 파일로 첨부 해 봅니다.
(글을 수정하면 동영상도 올려보도록 하겠습니다.
 아직까지 만족할만한 예쁜동영상이 안나와서 ㄷㄷㄷ)

 픽셀단위의 산술연산을 할 경우는 상수에 의한 연산과 마찬가지로 ..
 기본 산술연산에 있는 네가지 + (덧셈) - (뺄셈) * (곱셈) / (나눗셈) 가 있습니다.

 간단하게 말하자면 산술연산시 상수값을 더하거나 빼는 것처럼
같은 위치의 픽셀의 밝기 값에 같은 위치의 픽셀의 밝기를 더하거나 빼서
새로운 영상을 만드는 처리방법입니다
.

서로다른 두 영상의 합(SUM)

원숭이와 동그라미 영상의 합


레나와 원 영상의 합


서로 다른 두 영상내에서 각각의 대응 픽셀의 밝기 값을 합해서 나온 결과 영상입니다.
물론 합한후의 픽셀의 밝기 값이 255를 초과하는 경우 255의 값을 가지게한 saturation기법을 사용하였습니다.
이를 통하여 원하는 부분의 그림만을 추출할 수 있도록 할 수 있어. 이미지 추출에 많이 사용된다고 합니다.



서로 다른 두 연산의 차 (SUB)

빼기연산을 이용한 불량검사

빼기연산을 이용한 불량검사2

빼기연산을 이용한 움직임 검출


 실제로 많이 사용한다고 하는 빼기연산의 예들입니다.
 처음과 두번째 그림처럼 어떠한 물체의 결함을 찾기 위해서 많이 사용된다고 합니다.
 또한 침입자 검출을 위하여 다음과 같은 연산을 하여도 침입자가 발생하엿다는 사실을 쉽게 알 수 있습니다.

 하지만, 이러한 빼기 연산을 통하여 결함을 찾거나, 침입자를 검출하기 위해서는, 촬영하는 카메라의 이동이 없어야 하는것!.
 만약 카메라 자체의 이동이 있다면 빼기연산을 하여도 결과가 무지 이상하게 나옵니다. -_-;;;
(적당한 이미지를 찾지못해서 이미지 첨부는.. 수정으로 미루겠습니다. ㅠ)

 곱하기, 나누기 연산-_-ㅋ

 물론 상수를 이용한 산술연산처럼 두 이미지에서도 곱하기 나누기 연산을 사용할 수 있습니다.
 위의 이미지를 사용하여 나온 결과는 이러합니다...

두 이미지 같의 곱셈연산

두 이미지 간의 나눗셈연산


 만..
 적당히,, 좋은 예의 이미지를 찾지 못하였기 때문에,, 구현결과는 다음과 같습니다..
 (사실 이 연산들을 어디에 사용해야할 지 잘 모르겠습니다.. ㅠㅠ)
 추후에 어디에 사용되는 연산인고-_-; 를 알게되면 이 내용을 초금 수정할 예정.....입니다..


 p.s 앗 한가지 신기한것


 두 프래임간의 덧셈 연산인데,
 이를 통하여 손을 거쳐서 뒷모습이 보이는 모습을 볼 수 있지 않은가요??ㅋ
 ... 저만 신기하다면 쿨럭..;;;


 구현된 내용의 소스는 이러합니다. 
 


 어렵지 않아서 쉽게 이해하 실 수 있으실 겁니다.
 

 
 


안녕하세요.

오늘은 바이너리서치(Binary Search) 의 코딩법에 대해서 알아보겠습니다.



숫자맞추기

참이슬을 까고나면 병뚜껑을 꼬은 다음에 손가락으로 쳐서 끊어지면 그 전사람이 벌주를 마시는 게임이 있죠?? 그리고 나서 벌주를 마신 사람은 병뚜껑에 있는 숫자를 보고 업&다운을 해서 그 숫자를 부른 사람이 또 벌주를 마십니다. (이거 우리 학교만 하나요?)
혹시나 모르시는 분이 있을까봐 부가 설명을 드리겠습니다.
참이슬 병뚜껑에는 [1, 50] 사이의 숫자가 찍혀있습니다. 한사람씩 숫자를 부르면 정답을 아는 사람이 정답에 지금 부른 숫자보다 큰지 작은지를 알려줍니다. 그 다음 사람은 좁혀진 범위 내에서 숫자를 다시 부릅니다. 그럼 범위가 점점 좁혀지고 누군가 숫자를 맞추게 되는데 그 사람이 벌주를 마시게 됩니다.

이 게임을 하고 있는 모든 사람이 화장실을 가고 싶어서 최대한 게임을 빨리 끝내기위해 최선을 다한다면 최대 몇 번째 사람까지 턴이 돌아갈까요??

그렇습니다. 정답은 6회입니다. 확인을 위해 검증을 해보도록 하겠습니다.

1회: [1, 50] - 25를 부름 [1, 24], [26, 50] 중 [26,50]이 숫자가 하나 더 많으므로 최악의 경우는 [26, 50]
2회: [26, 50] - 38을 부름 [26, 37], [39, 50] 모두 12개의 숫자가 남아있으므로 어떤 범위가 남아도 최소횟수는 같음
3회: [26, 37] - 31을 부름 [26, 30], [32, 37] 중 [32, 37]이 숫자가 하나 더 많으므로 최악의 경우는 [32, 37]
4회: [32, 37] - 35를 부름 [32, 34], [36, 37] 중 [32, 34]가 숫자가 하나 더 많으므로 최악의 경우는 [32, 34]
5회: [32, 34] - 33을 부름 [32, 32], [34, 34] 모두 하나만 남았음
6회: 하나만 남았습니다. 번호를 부르고 소주를 원샷하세요

모든 사람이 최선을 다 했을때 숫자가 하나가 남을때까지 게임이 지속된 예를 들었는데요. 이를 수식화 하여 풀 수 있습니다.
한 턴이 지날때 마다 숫자의 범위가 반씩 줄어들게 됩니다. n번째 턴에서 남은 숫자의 범위를 T(n)이라 하면,

T(n) =  ceiling[ 0.5 * T(n-1) ] , ceiling은 올림입니다.

이 되고 식을 마스터정리(Master theorem)을 이용하여 풀면
T(n) = O(lg n) 이 됩니다. (여기서 lg는 밑이 2인 로그입니다)

아까 소주게임에 적용해 보면 n이 50 이므로 ceiling[ lg 50 ] = 6 이 되는것을 확인할 수 있습니다.
이처럼 바이너리서치를 적용하면 한 턴이 지날때마나 남아있는 후보의 범위를 반으로 팍팍 줄여나가기 때문에 검색을 해야하는 경우 아주 강력한 도구가 될 수 있습니다.



생각보다 어려운 바이너리서치

Knuth는 <Sorting and Searching>에서 이진탐색이 처음 발표된 것은 1946년이고, 버그가 없는 최초의 이진탐색 코드는 1962년이 되어서야 나타났다고 지적했습니다. 버그프리한 바이너리서치루틴도 보면 정말 간단합니다. 왜 이렇게 간단한걸 작성하는데 20년이나 걸렸는지 생각해 보면 그 만큼 버그없는 프로그램을 만든다는 것이 어려운 일이고 tricky한 버그를 발견하기도 쉬운일이 아닌가 봅니다.

아래의 의사코드를 봅시다.

INT L = 0  // 하한
INT U = N // 상한
INT Solution = -1 // 원하는 결과가 있는 위치 (-1: 원하는 결과를 찾을 수 없음)

// 하한이 상한보다 같거나 작으면 반복
Repeat Until (L <= U)
Begin Repeat
// 하한과 상한의 중간값을 취함
INT T = (L + U) / 2

// 원하는 결과를 찾음
If (find solution at T) Then
Solution = T
Break
End If
// T에 대한 값이 원하는 값보다 큰 경우 -> 상한을 T보다 1 작은 값으로 변경
If (value at T is greator than solution) Then
U = T - 1
End If
// T에 대한 값이 원하는 값보다 작은 경우 -> 하한을 T보다 1 큰 값으로 변경
If (value at T is less than solution) Then
L = T + 1
End If
End Repeat

Return Solution



구현1 - 배열에서 원소 검색(반복적 방법)

원소가 비내림차순으로 정렬된 배열에서 바이너리서치 - 반복적 방법
  1. // 원소가 비내림차순으로 정렬이 되어 있는    
  2. // 크기 n의 배열 Array에서 key가 저장되어 있는 위치를    
  3. // 바이너리서치를 이용하여 리턴   
  4. // key가 없는 경우 -1을 리턴   
  5. int BinarySearchLoop(int Array[], int n, int key)   
  6. {   
  7.     int U = n-1;   
  8.     int L = 0;   
  9.     while (L <= U) {   
  10.         int T = (U + L) / 2;   
  11.         if (Array[T] == key) return T;   
  12.         if (Array[T] > key) U = T - 1;   
  13.         else L = T + 1;   
  14.     }   
  15.     return -1;   
  16. }  


구현 2 - 배열에서 원소 검색(재귀적 방법)

원소가 비내림차순으로 정렬된 배열에서 바이너리서치 - 재귀적 방법
  1. // 원소가 비내림차순으로 정렬이 되어 있는   
  2. // 배열 Array에서 key가 저장되어 있는 위치를    
  3. // 바이너리서치를 이용하여 리턴   
  4. // key가 없는 경우 -1을 리턴   
  5. int BinarySearchRecursive(int Array[], int L, int U, int key)   
  6. {   
  7.     if (L > U) return -1;   
  8.     int T = (U + L) / 2;   
  9.     if (Array[T] == key) return T;   
  10.     if (Array[T] < key) return BinarySearchRecursive(Array, L, T-1, key);   
  11.     else return BinarySearchRecursive(Array, T+1, H, key);   
  12. }  



실수범위에서의 바이너리서치

위에서 정수를 기준으로 바이너리 서치를 하는 방법을 반복적 방법과 재귀적 방법으로 살펴보았는데요 상황에 따라서는 실수범위에 대해서 바이너리서치를 해야할 경우도 발생합니다. 뉴턴메소드(Newton's Method)가 그 예인데요 실수 범위에서 바이너리서치를 하는 경우에는 대체로 오차범위가 주어지고 그 오차범위내에 탐색범위가 들어갈때까지 반복을 하게됩니다.
반복적 방법이든 재귀적 방법이든 바이너리서치를 진행하면서 한 이터레이션이 지날때마다 탐색범위가 반으로 줄어들는 것을 이용하는 겁니다.

예를 들어 오차범위 1e-9 이내에서 답을 구하고 싶으면 low bound와 upper bound의 차이가 1e-9 보다 작아질때까지 반복을 하면 됩니다. 제가 개인적으로 더 추천하는 방법은 그냥 충분히 많이 이터레이션을 하는 것입니다. 무슨말이냐 하면 한 100번 정도 무조건 반복을 하는 겁니다.
이게 지금 무슨말을 하는 거냐!! 라고 생각할 수도 있는데요.. 바이너리서치의 이터레이션을 100번을 반복하면 탑색범위가 1/(2^100)까지 좁혀지게 됩니다. 이 정도 탑색범위라면 1e-9 이내로 들어가지 않을까요?? 뭐 상황에 따라 적잘하게 이터레이션 횐수를 정해주면 됩니다만 제 생각엔 최악의 경우에도 1000번 정도면 충분할것이라 생각합니다.

그렇다면 오차범위 내에 들어갈때까지만 비교하면 될것을 왜 쓸데없이 반복을 하냐라고 물어볼수도 있는데요.. 제가 적당히 큰 횟수만큼 반복하는 것을 권장하는 이유는 오차범위 비교 방법은 실수연산의 특성상(precision error가 생기죠) 오차범위내로 수렴하지 못해 무한루프에 빠질 가능성이 있기 때문입니다.

아래에서 3차 방정식의 해를 바이너리서치를 이용하여 구하는 예를 보겠습니다.


구현 3 - ax^3 + bx^2 + cx + d = 0 의 해를 구함(허용 오차범위 1e-9) - 실수범위 바이너리서치(오차범위)
  1. // ax^3 + bx^2 + cx + d = 0 의 해를 구합니다.   
  2. // 해는 [-1000000000, 1000000000]에 존재한다고 가정함   
  3. double EPSILON = 1e-9;   
  4. double CubicFunction1(double a, double b, double c, double d)   
  5. {   
  6.     double L = -1000000000;   
  7.     double U = 1000000000;   
  8.     double T = (L + U) / 2;   
  9.     while (U - L >= EPSILON) {   
  10.         double y = a*T*T*T + b*T*T + c*T + d;   
  11.         if (y > 0) U = T;   
  12.         else L = T;    
  13.     T = (L + U) / 2;   
  14.     }   
  15.     return T;   
  16. }  


구현 4 - ax^3 + bx^2 + cx + d = 0 의 해를 구함(허용 오차범위 1e-9) - 실수범위 바이너리서치(적당히반복)
  1. // ax^3 + bx^2 + cx + d = 0 의 해를 구합니다.   
  2. // 해는 [-1000000000, 1000000000]에 존재한다고 가정함   
  3. double CubicFunction2(double a, double b, double c, double d)   
  4. {   
  5.     double L = -1000000000;   
  6.     double U = 1000000000;   
  7.     double T = (L + U) / 2;   
  8.     for (int i = 0; i < 100; i++) {   
  9.         double y = a*T*T*T + b*T*T + c*T + d;   
  10.         if (y > 0) U = T;   
  11.         else L = T;    
  12.     T = (L + U) / 2;   
  13.     }   
  14.     return T;   
  15. }  




문제를 풀어봅시다.

이론만 늘어서는 소용이 없겠죠?? 아는 것을 실전에 써 먹을 수 있는 준비가 되어있어야 진정 내것이라고 말할 수 있습니다.
우리같이 아래 문제를 풀어보아요

Equilibrium Point

직선상에 N개의 행성들이 위치해 있습니다. i 번째 행성은 x[i] 좌표에 있고, m[i] 만큼의 질량을 가지고 있으며, 각각의 행성들은 매우 강한 힘에 의하여 고정되어 있습니다. 모든 행성은 x좌표를 기준으로 비내림차순으로 정렬되어 주어집니다.

 질량이 m1, m2인 두 물체 사이의 거리가 d일 때, 두 물체는 서로 F = G * m1 * m2 / d^2 의 힘으로 서로 잡아당기는 만유인력이 작용합니다. (G는 양의 상수이다.)  어떤점 P를 기준으로 만유인력의 벡터합이 0이 되는 P의 위치를 equilibrium Point라고 부릅니다.

N개의 점이 있을 때, N-1개의 Equilibrium Point가 존재합니다. 이러한 Equilibrium Point들을 오름차순으로 정렬하여 소수점이하 9자리까지 출력하시오.

힌트: 각 Equilibrium Point는 이웃한 행성과 행성사이에 하나씩 존재합니다.

풀이보기


출처: TopCoder - Single Round Match 421


휴.. 이상으로 바이너리서치에 대해서 알아봤는데요.. 왠지 쓰고나니 마지막 문제가 좀 어려웠던게 아닌가 생각이 드네요 ^^;;

다음에는 주제를 약간 벗어나서 C++의 STL(Standard Template Library)에 대해서 포스팅을 해볼까 합니다.
뭐 제가 C++을 주로 사용하다 보니.. C++을 안쓰시는 분들한테는 전혀 도움이 되지 않겠지만 그래도 알아두면 좋겠지요 ㅎㅎ


이전글 [UNIX 보안 기초 -3-] 대표적인 해킹유형

벌써 한주가 지나갔습니다. 시간 참 빠르네요. 다들 중간고사도 끝났겠구..이제 새로운 시작을 해봅시다. 저는 매번 시작인것 같네요..ㅠ

이번부터는 몇가지 해킹 기법에 대해 약간 깊숙히 소개하려 합니다. 오늘은 BOF(Buffer Over Flow 공격) 인데요. 얼마전 구글폰 G1 과 구글 웹브라우저 크롬에서 버퍼 오버플로우 공격에 대한 취약성이 발견되었죠..
아무튼,, 이제 시작합니다.


C언어로 작성된 프로그램에서는 데이터에 지정된 버퍼의 크기보다 더 많은 양의 데이터가 입력이 되었을 시 프로그램이 비정상적으로 종료되었다. (매번 그 크기를 체크할 경우 수행 성능이 많이 떨어지기 때문이었죠.) 하지만 버퍼가 오버플로우 되는 순간에 사용자가 원하는 임의의 명령어를 수행시킬 수 있는 가능성이 알려지면서 문제가 되기 시작되었다.

우선 버퍼오버플로우 공격을 이해하려면 메모리와 스택의 구조에 대해 알아야 한다. 인텔(intel) x86계열 CPU를 사용하는 리눅스(Linux) OS를 기준으로 설명한다.


* Process memory organization
 - test/data/stack 영역
* stack 영역
 - LIFO (Last In First Out) 구조
 - PUSH/POP operation
 - procedure or function call (함수 호출 후 다음에 수행될 프로그램 주소저장)
 - SP(Stack Pointer), FP(Frame Pointer)(->베이스가 될 수 있는)
 - contents

paramemters, local variables, return address, previous stack frame, etc


다음의 예를 보자.     
void function(int a,int b) {

        char buffer1[5];

        char buffer2[5];

}

void main() {

        function(1,2);

}


char 형 배열을 5byte 공간으로 잡아도 실제 메모리에서는 CPU에 따라 4 or 8 or ...이렇게 잡힌다.

두번째 예를 보자.

 

결과값은 0
return address를 수정했기 때문에 x=1 이 수행되지 않고 바로 printf 문이 수행되었다.

요점 - SUID 걸린 프로그램에 BOF로 공격하여 return address를 shell 띄우는 곳으로 이동하게끔 하면 root 권한을 얻을 수 있다.




C에서는 스택 크기를 원래의 크기 보다 더 크게 공간을 잡는다. 남은 빈 공간에 우리가 직접 Shell 코드를 삽입한 뒤 return address를 쉘코드가 들어가 있는 주소로 이동하게끔 해주면 되겠다.




다음글에서 직접 Shell code를 작성하여 보겠습니다.

복권 긁는 효과

간단히 복권을 긁는 효과를 구현 해보도록 하겠습니다. 아래는 시연 동영상입니다.



아래는 소스코드입니다. XAML만으로 구현했기때문에 이해하시는데에 큰 문제는 없으실것 같습니다.

  1. <GRID Width="250" Height="250" Background="Red">  
  2.   
  3.     <IMG height=250 width=250 Source="PICTURE.JPG">  
  4.   
  5.     <WRAPPANEL>  
  6.         <WRAPPANEL.RESOURCES>  
  7.             <STYLE TargetType="Rectangle">  
  8.                 <Setter Property="Fill" Value="Black"/>  
  9.                 <Setter Property="Width" Value="25"/>  
  10.                 <Setter Property="Height" Value="25"/>  
  11.                 <Style.Triggers>  
  12.                     <EventTrigger RoutedEvent="Rectangle.MouseEnter">  
  13.                         <EventTrigger.Actions>  
  14.                             <BeginStoryboard>  
  15.                                 <Storyboard Storyboard.TargetProperty="(Rectangle.Opacity)">  
  16.                                     <DoubleAnimation To="0" Duration="0:0:0.5"/>  
  17.                                     <ColorAnimation To="White" Duration="0:0:0.5"  
  18.                                       Storyboard.TargetProperty="(Rectangle.Fill).(SolidColorBrush.Color)"/>  
  19.                                 </Storyboard>  
  20.                             </BeginStoryboard>  
  21.                         </EventTrigger.Actions>  
  22.                     </EventTrigger>  
  23.                 </Style.Triggers>  
  24.             </STYLE>  
  25.         </WRAPPANEL.RESOURCES>  
  26.   
  27.         <RECTANGLE />       <RECTANGLE />       <RECTANGLE />       <RECTANGLE />      <RECTANGLE />  
  28.         <RECTANGLE />       <RECTANGLE />       <RECTANGLE />       <RECTANGLE />      <RECTANGLE />  
  29.         <RECTANGLE />       <RECTANGLE />       <RECTANGLE />       <RECTANGLE />      <RECTANGLE />  
  30.         <RECTANGLE />       <RECTANGLE />       <RECTANGLE />       <RECTANGLE />      <RECTANGLE />  
  31.         <RECTANGLE />       <RECTANGLE />       <RECTANGLE />       <RECTANGLE />      <RECTANGLE />  
  32.         <RECTANGLE />       <RECTANGLE />       <RECTANGLE />       <RECTANGLE />      <RECTANGLE />  
  33.         <RECTANGLE />       <RECTANGLE />       <RECTANGLE />       <RECTANGLE />      <RECTANGLE />  
  34.         <RECTANGLE />       <RECTANGLE />       <RECTANGLE />       <RECTANGLE />      <RECTANGLE />  
  35.         <RECTANGLE />       <RECTANGLE />       <RECTANGLE />       <RECTANGLE />      <RECTANGLE />  
  36.         <RECTANGLE />       <RECTANGLE />       <RECTANGLE />       <RECTANGLE />      <RECTANGLE />  
  37.         <RECTANGLE />       <RECTANGLE />       <RECTANGLE />       <RECTANGLE />      <RECTANGLE />  
  38.         <RECTANGLE />       <RECTANGLE />       <RECTANGLE />       <RECTANGLE />      <RECTANGLE />  
  39.         <RECTANGLE />       <RECTANGLE />       <RECTANGLE />       <RECTANGLE />      <RECTANGLE />  
  40.         <RECTANGLE />       <RECTANGLE />       <RECTANGLE />       <RECTANGLE />      <RECTANGLE />  
  41.         <RECTANGLE />       <RECTANGLE />       <RECTANGLE />       <RECTANGLE />      <RECTANGLE />  
  42.         <RECTANGLE />       <RECTANGLE />       <RECTANGLE />       <RECTANGLE />      <RECTANGLE />  
  43.         <RECTANGLE />       <RECTANGLE />       <RECTANGLE />       <RECTANGLE />      <RECTANGLE />  
  44.         <RECTANGLE />       <RECTANGLE />       <RECTANGLE />       <RECTANGLE />      <RECTANGLE />  
  45.         <RECTANGLE />       <RECTANGLE />       <RECTANGLE />       <RECTANGLE />      <RECTANGLE />  
  46.         <RECTANGLE />       <RECTANGLE />       <RECTANGLE />       <RECTANGLE />      <RECTANGLE />  
  47.   
  48.     </WRAPPANEL>  
  49. </GRID>  


가장먼저 눈에 띄는 부분이 엄청난 분량의 Rectangle입니다. 활용 가능성을 보여드리기 위해 이렇게 많은 객체를 사용했지만 저렇게 사용하는 것이 최적화된 코드는 아니라는걸 알려드립니다! 위 코드에서 가장 중요한 부분은 Rectangle객체를 하나의 Style로 지정하여 마우스 오버가 될때 DoubleAnimation 과 ColorAnimation을 사용해서 뒷부분이 밝혀지는 효과를 주는데 있습니다.

기타 질문은 리플이나 메일로 보내주시면 답변해드리겠습니다.



저의 글을 열심히 읽어주신 분이 부탁하셔서, 이번주에는 GTK+ Widget 들을 보충하기 위한 class 계층 구조 트리를 올려드리겠습니다. 저도 widget이 많은 관계로 자주 사용하는것만 외우고 있을 뿐, 아래의 표를 참고하고 있습니다. GTK+를 정말 능숙하게 사용한다면, 전부 외우고 있겠죠? ㅋㅋㅋ 앞으로 그런 날이 올거라 믿고 열심히 포스팅 하겠습니다.ㅋ
사실은 공부를 하면서 widget을 올린 window를 하나씩 만들어 보려고했지만, 아래의 계층구조 트리를 보면서 하나씩 제작하는것도 괜찮다는 생각이 드네요 ^ ^;

GtkObject
   +GtkData
   | +GtkAdjustment
   | `GtkTooltips
   `GtkWidget
     +GtkContainer
     | +GtkBin
     | | +GtkAlignment
     | | +GtkEventBox
     | | +GtkFrame
     | | | `GtkAspectFrame
     | | +GtkHandleBox
     | | +GtkItem
     | | | +GtkListItem
     | | | +GtkMenuItem
     | | | | `GtkCheckMenuItem
     | | | |   `GtkRadioMenuItem
     | | | `GtkTreeItem
     | | +GtkViewport
     | | `GtkWindow
     | |   +GtkColorSelectionDialog
     | |   +GtkDialog
     | |   | `GtkInputDialog
     | |   `GtkFileSelection
     | +GtkBox
     | | +GtkButtonBox
     | | | +GtkHButtonBox
     | | | `GtkVButtonBox
     | | +GtkHBox
     | | | +GtkCombo
     | | | `GtkStatusbar
     | | `GtkVBox
     | |   +GtkColorSelection
     | |   `GtkGammaCurve
     | +GtkButton
     | | +GtkOptionMenu
     | | `GtkToggleButton
     | |   `GtkCheckButton
     | |     `GtkRadioButton
     | +GtkCList
     |  `GtkCTree
     | +GtkFixed
     | +GtkList
     | +GtkMenuShell
     | | +GtkMenuBar
     | | `GtkMenu
     | +GtkNotebook
     | +GtkPaned
     | | +GtkHPaned
     | | `GtkVPaned
     | +GtkScrolledWindow
     | +GtkTable
     | +GtkToolbar
     | `GtkTree
     +GtkDrawingArea
     | `GtkCurve
     +GtkEditable
     | +GtkEntry
     | | `GtkSpinButton
     | `GtkText
     +GtkMisc
     | +GtkArrow
     | +GtkImage
     | +GtkLabel
     | | `GtkTipsQuery
     | `GtkPixmap
     +GtkPreview
     +GtkProgressBar
     +GtkRange
     | +GtkScale
     | | +GtkHScale
     | | `GtkVScale
     | `GtkScrollbar
     |   +GtkHScrollbar
     |   `GtkVScrollbar
     +GtkRuler
     | +GtkHRuler
     | `GtkVRuler
     `GtkSeparator
       +GtkHSeparator
       `GtkVSeparator

계층구조 트리 부분중 굵은 글씨로 표기한 것은 제가 이전에 포스팅했던 내용입니다. 겨우 2개밖에 하지 못했네요,
앞으로 하나씩 하나씩 굵은 글씨로 만들어 볼 생각입니다. ^ ^ 아! 위의 계층구조는 window와 관련된 widget입니다.

GTK+를 하다보면 window가 없는 Event를 종종 사용해야 할 것입니다. window와 무관한 widget을 몇가지 설명할까합니다.EventBox widget은 전혀 쓸모없을 수도 있습니다. 이것은 스크린에 아무것도 그리지 않으며 이벤트에도 응답하지 않습니다. 하지만 이것은 자신의 child widget으로 X윈도를 제공하는 한 함수를 지원하게됩니다. 이것은 많은 GTK widget들이 관련된 X윈도를 가지지 않는다는 점이 중요합니다. X윈도를 가지지 않는 것은 메모리를 절약하고 퍼포먼스를 증대합니다. 완벽할 수 없기에몇가지 약점도 가지고 있습니다. X윈도가 없는 widget은 이벤트를 받을 수 없고, 그리고 그의 항목들에 대한 클리핑도 하지 않습니다. EventBox라는 이름은 이벤트를 다루는 함수라는 의미도 있지만, widget들이 클리핑될 수도 있다는 것을 의미하기도 합니다.

GtkAlignment
GtkArrow
GtkBin
GtkBox
GtkImage
GtkItem
GtkLabel
GtkPaned
GtkPixmap
GtkScrolledWindow
GtkSeparator
GtkTable
GtkViewport
GtkAspectFrame
GtkFrame
GtkVPaned
GtkHPaned
GtkVBox
GtkHBox
GtkVSeparator
GtkHSeparator

우리는 window에 무언가의 widget을 올릴때마다 위의 Event widget을 사용할 것입니다. 각각의 widget을 차례로 시험하고 보여줄 수 있는 간단한 함수를 만들어 GTK+에 관한 공부를 해볼 생각입니다. 하나의 Project를 할때마다 Event widget을 최대한 넣어서 보여줄 생각입니다.

다음주에는 window에 버튼을 올려볼까 합니다. 간단히 만들어 보는 GTK+ 버튼 Widget!!!!

위의 계층 구조는 앞으로 계속 사용할 듯 합니다. SIG가 끝나기 전에 위의 widget을 전부 사용해보는게 목표로 잡고 열심히 만들겠습니다. 이번 한주도 열심히 열심히 공부하세요 ^ ^*


2-3-2 디지탈 오실로스코프

디지탈 오실로스코프를 구성하는 시스템들은 대부분 아날로그 오실로스코프와 같지만, 데이타 처
리 시스템(Data Processing System)이 추가되어 있습니다(그림 8) 디지탈 오실로스코프는 이 DPS
에서 전체 파형의 데이타를 모아서 화면에 나타내 줍니다. 디지탈 오실 로스코프의 프로브를 회로
에 연결했을 때, 수직 시스템은 아날로그 오실로스코프에서 처럼 신호의 크기를 조절합니다. 그리
고 획득시스템에 있는 아날로그-디지탈 변환기(ADC)에서 이산적인 점들로 신호를 샘플한 후, 이
디지탈 값들을 전압으로 변환시키는 것입니다. 이 때 이런 디지탈 값들을 샘플점이라 하며. 수평시
스템에 있는 샘플 클럭은 ADC가 샘플을 취 하는 빈도를 나다냅니다. 그리고 클럭에 의해 발생하는
샘플비를 샘플율이라 하며 samples/second로 표시합니다.
 


ADC로부터 얻어진 샘플점들은 메모리에 파형점(waveform Font)으로 저장되고. 이 점은 한 개 이
상의 샘플점들로 구성됩니다. 또 이런 파형 점들이 모여서 한 개의 파형 레코드를 구성합니다. 일반
적으로 파형 레코드를 구성하는 파형점들의 수를 레코드 길이(Record Length)라고 합니다. 동기
시스템은 이 레코드의 시작과 끝의 점을 결정하는 것이며, 레코드 점들은 메모리에 저장된 후에 화
면에 나타나는 것입니다.
오실로스코프의 성능에 따라 샘플점의 추가적인 처리를 할 수 있으며, 이런 처리과정을 통해 화면
상의 파형을 더 선명히 볼 수 있습니다. 또한 프리 동기 기능을 이용하여 동기 점보다 앞서 일어난
현상을 볼 수도 있습니다.
기본적으로 디지탈 오실로스코프도 아날로그 오실로스코프에서와 같이 수직부, 수평부, 동기 세팅
부를 조정해야 합니다.
 
 
2-3-3 샘플링 방법

샘플링 방법이란 디지탈 오실로스코프에서 샘플점을 얻는 방법을 말합니다. 디지탈 오실 로스코프
에서 느리게 변화하는 신호는 정확하게 화면을 구성할 수 있을 만큼 충분한 샘플 점을 쉽게 잡을 수
 있지만, 빠른 신호들은(오실로스코프의 최대 샘플 레이트에 비해서 어 느 정도 빠른가 하는 정도)
그 만큼 충분한 샘플을 잡기가 불가능합니다. 그러므로 디지탈 오실로스코프는 두 가지의 샘플링
방법을 사용합니다.

■ 실시간 샘플링 모드 : 신호에서 한번에 몇 개의 샘플들을 잡은 후 보간법

(interpolation)을 사용하는 모드입니다. 이 때 보간법은 몇개의 점들을 연결해서 예

상되는 파형을 그려내는 처리 기술입니다.

■ 등가시간 샘플링 모드 : 신호가 계속 반복되고 있는 동안에 일정 시간 간격으로 샘

플들을 모아서 파형이 형성되는 모드입니다. 즉 반복되는 신호들에서 시간축의 값을

달리하면서 얻은 샘플점으로 한 주기의 파형을 합성하는 것입니다.

 

2-3-4 보간법을 사용한 실시간 샘플링(Real-Time sampling)

디지탈 오실로스코프는 표준 샘플링 방법으로서 실시간 샘플링을 사용합니다. 실시
간 샘플링에서는 신호가 발생할 때 가능한 많은 샘플을 추출합니다.(그림 9) 그러므
로 단발현상이나 과도신호가 들어올 때는 실시간 샘플링을 해야 합니다.

디지탈 오실로스코프는 신호가 빠를 경우, 한 번에 단지 몇개의 샘플만을 잡기 때문
에 보간법을 사용해서 파형을 완성해야 합니다. 보간법은 간단히 말해 점들을 연결
하는 방법입 니다. 선형 보간법(Linear interpolation)은 샘플점들을 직선으로 연결하
며, 정현 보간법 (Sine Interpolation)은 곡선으로 연결합니다. (그림 10 참조) (SIN
x)/x 보간법은 컴팩트 디스크 플레이어에 사용되는 오버샘플링(Oversampling)과 유
사한 수학처리 과정이며, 정현 보간법을 수행하면서, 실제 획득한 샘플들 사이에 계
산에 따라 점들을 추가하는 것입니다.
이러한 처리를 통해서 매 사이클마다 잡는 몇 개의 샘플로도 신호를 정확하게 화면에 나타 낼 수 있습니다.
 
2-3-5.등가 시간 샘플링(Equivalent-Time sampling)

디지탈 오실로스코프에서는 매우 빠르게 반복되는 신호를 잡을 경우에 등가시간 샘
플링 을 사용합니다. 등가 시간 샘플링은 파형이 반복될 때마다 몇 개의 샘플을 잡아
그것을 모아서 파형을 구성합니다. (그림 11) 파형은 불들이 하나 하나 순서대로 켜
지는 것처럼 느리게 형성되는 것을 볼 수 있습니다. 등가 시간 샘플링 중 순차
(sequential) 샘플링에서 는 점들이 좌에서 우로 연속적으로 나타나며, 램덤
(random) 샘플링에서는 점들이 파형을 따라 불규칙적으로 나타납니다.

[출처] 오실로스코프|작성자 처음처럼


오실로 스코프는 하드웨어 제작에 있어서 가장 중요한 장비중의 하나입니다.
요즘 나오는 하드웨어들은 JTAG을 이용해서 디버깅을 많이 할 수 있지만,
그래도 어느정도의 한계점이 있습니다.
소프트웨어의 경우 특별한 일이 없다면 특정 디버깅 툴을 통하여 디버깅을 할 수 있고,
마지막으로는 어셈코드를 직접 보면서 디버깅을 할 수 있습니다.

하지만 하드웨어의 경우에는 변수들의 범위가 코딩 뿐만 아니라 전선연결, 반도체의 문제 또는 모듈의 문제등
정말 다양한 버그들이 꼬옥~숨어있어서 오실로스코프가 없고, 디버깅 툴로 디버깅이 안된다면 속수무책입니다.^^

위에서 알려주는 정보는 그 오실로 스코프에서
샘플링 하는 방법. 핀 아웃에서 어떤 식으로 신호가 나오는데,
그 신호를 어떤 식으로 측정을 해서 사용자에게 알려줄텐데, 그 어떤 식에 대해서 알려주는 것 입니다.

이것이 중요한 이유는 핀에서 나오는 신호는 수백메가 헤르츠 이지만,
사람이 눈으로 확인 할 수 있는 정보는 아무리 빨라도 초당 100개 이하가 되니,,,
수백메가 헤르츠의 정보를 사람의 눈에 어떤 식으로 종합하여 보여주느냐 또한 그 수백메가의 정보를 어떻게 효율적으로
오실로스코프의 장바구니에 담는가가 포인트가 되겠습니다.


사진 링크가 제대로 안되어서,,,ㅡㅡ; 첨부파일로 올립니다.
고거 위치 변경은 할 줄을 몰라서.ㅠㅠ



1. 1999년에는

 

비 정기적이고 예상 할 수 없는 이벤트들은 풀기 어려운 과제를 남기곤 합니다. 저는 최근 저전력 데이터 수집 디바이스를 설계하면서 이러한 글리치를 마주치게됩니다. 이 무선 계측시스템은 주파수확산 라디오 송수신기(그림 1)로 주고받는 원격 센서의 그룹으로 구성되어 집니다. 시스템에 취합된 데이터는 컴퓨터에 연결된 네트워크 제어 유닛으로 재취합됩니다. 시스템은 매 60초 마다 파워업 상태를 트리거하기 위해 저전력 클럭칩에 인터럽트 핀을 사용합니다.



그림 1. 무선 계측시스템의 개념도. 스코프에서 하나의 아날로그 입력에서 MCU상의 power-up를 모니털링하고 또다른 하나는 송수신기를 피드하는 캐리어 감지 신호를 모니터링. - 첫번째 사진 입니다.

 

이벤트 사이에 클럭과 보조 로직은 전류(대략 50 μA)를 흐르게 하는 유일한 장치입니다. 클럭으로부터 트리거를 받으면 모토롤라 68HC11K1 마이크로 컨트롤러는 파워를 올리고 온도 데이터를 수집하고 무선 송수신기의 활성화를 기다립니다. 무선 송수신기에서 데이터 리쿼스트를 받으면 MCU는 온도 데이터를 전송합니다. 문제의 글리치는 60초 사이의 구간에서 시스템이 무변화의 상태로 간주하여 발생되곤 합니다. 이런 비정상을 찾아내고 분석하기위해서 저는 피크 검출 기능을 갖는 딥메모리(1 Mbyte)의 디지털오실로스코프를 사용했습니다. 글리치가 비정기적으로 발생하여 처음에는 스코프의 타임베이스를 60 초의 전체 시퀀스를 잡기위해 10s/div으로 맞추었습니다. 피크 검출 기능이 없었으면 가장 좁은 이벤트는 이 타임베이스 설정에서 검출이 불가능하였을 것입니다. 그러나 그림.2에서 처럼 시스템에서 글리치가 잘 잡히고 잘 보여집니다. 피크 검출은 클럭 이벤트 이후 대략 15초 후에 발생하는 이상한 뭔가를 보여줍니다.

 

시스템에서 비정상적인 것을 인지하고 딥메모리 스코프에서 쉽게 줌하여 글리치를 더 자세하게 분석 할 수 있었습니다. 1 MB의 스코프 파형 메모리 10 s/div의 타임베이스 설정으로 초기 파형포착은 이후 10 ms/div으로 확대(Figure 3)하여 볼때에도 파형을 자세하게 분석하기에 충분하였습니다.

그림 2. 10 s/div의 타임베이스 설정에 피크 검출 기능을 사용하는 최초 측정.

두번 째 사진 입니다.

그림 3. 글리치가 보이면 더 빠른 타임베이스로 확대하여 필요한 부분을 자세히 관측

 세번 째 사진 입니다.

2. 요즘

 

MegaZoom III 기술은 애질런트가 1996년에 처음 소개한 빠르면서도 긴 메모리 구조의 3세대 입니다. 고해상도의 디스플레이 시스템을 갖는 빠르고 긴 메모리를 조합하여 전보다 더 쉽게 파악하기 어려운 비정상의 신호를 잡습니다. 

 마지막 사진을 보시면 됩니다.^^;;;

긴 메모리는 높은 샘플링에서도 긴 시간을 볼 수 있도록합니다. 이는 앨리어싱없이도 변조 신호를 관측하고 긴 시스템 부트업 시퀀스를 분석하고 느리고/긴(혼재) 신호들을 더 깊이있게 줌하고 주파수 영역에서는 훌륭한 주파수 분해능을 제공합니다.

 



요즘 들어 엄청나게 빨라지는 학교진도와(벌써 작은 컴퓨터를 만들고 있어요 ㅠ_ㅠ) 그에 맞지 않게 늦어지는 포스팅을 보면서 걍  디지털 논리 회로를 건너 뛰고 갈까 하는 생각도 드는데 어떤것이 좋을지는 아직 판단이 서지 않는군요...ㅋㅋ 솔직히 매일 블로깅을 올린다면 충분히 커버할 수 있는 양이지만 맘처럼 쉽지 않군요...일요일에 글을 올리는것도 자꾸 잊어버리고 말이죠...평일에 예약해서 올려두 되는데...하하..참 사람맘이...이번까지 글을 올리고 생각해서 다음에는 논리회로를 건너뛸지 말지에 대해서 결말을 지어서 블로깅 하겠습니다. 일단 그럼 지난번에 이어서 맵에 간소화에 대해서 글을 올리고자 합니다.

.민텀(Minterm)
  진리표에서변수의각조합
  진리표는8 개의민텀을 갖습니다. 
  n개의변수가있다면2n개의민텀이존재
  진리표에서출력F가1 이되는민텀을선택. F(x,y,z)=Σ(1,4,5,7)=x'y'z+xy'z'+xy'z+xyz

.K-Map
 

 각사각형의구역은각각의민텀표시
 논리표현식의출력이1이될때해당민텀구역에1을넣습니다. 
 인접사각형은오직1 bit만차이나도록구성함
 인접구역의1을2의승수(2, 4, 8, …)로가능한크게묶음
 묶여진그룹의bit가변화하지않는부분만을남김
 각묶음의결과를OR 함

그럼 예를 들어서 보도록 하겠습니다.
 F(A,B,C)=Σ (3,4,6,7) 의간략화
 F(A,B,C)=Σ(3,4,6,7) = A’BC + AB’C’ + ABC’ + ABC
 간략화된식F=BC+AC'


또한 입력이 4개 즉 변수가 4이고 민텀이 16개인 F(A,B,C,D)=Σ( 0,1,2,6,8,9,10)의간소화에 대한 예를 들어 설명하겠습니다.
먼저 맵에 출력이 1이 되는 0,1,2,6,8,9,10에 1을 넣습니다. 여기서 주의할것은 모양은 정사각형이지만 양 끝부분이 붙어 있는 하나의 원이라고 생각하셔야 한다는 점입니다.

그럼 최대한 크게 크게 묶으면 위의 그림 같이 묶을 수 있습니다. 그럼 같은 묶음은 AND 묶음들의 집합은 OR로 표현한다면
함수 F=B'D'+B'C'+A'CD가 되는것을 확인할 수 있습니다.

그럼 더 나아가 논리합의 논리곱에 대해 알아보겠습니다.
논리합의논리곱
.곱의합표현(sum of products)
   .F = A + B + CD
   .맵을이용한간소화의결과
.합의곱표현(product of sums)
  .F = AB(C+D)
.F = (F’)’ 임을이용
   .함수가0이되는민텀구역에0을삽입
   .인접한0으로크게묶음
   .결과로F’을얻음
.De Morgan의법칙에의해
   .F = (F’)’을이용하여위의결과를보수화시킴
.Ex) F (A,B,C,D)=Σ(0,1,2,5,8,9,10)의간소화
   .F = B’D’ + B’C’ + A’C’D (A맵을이용한간소화)
   .F’=AB + CD + BD’
   .(F’)’ = F =(A'+B')(C'+D')(B'+D)

출력이 1인 경우가 복잡한 경우에 이용하면 좋은것 같습니다. ㅋ

NAND, NOR gate를이용한구현
   .NAND (Not AND), NOR (Not OR) gate
   .전자회로구성이쉽고, 부울함수구현이용이하여AND, OR gate보다많이쓰임
   .AND ÆNAND로OR Æinvert-OR 로바뀌면두회로는등가임
   .OR ÆNOR로AND Æinvert-AND 로바꾸면두회로는등가임

Don’t Care Condition
.진리표에의해정의되지않는항이발생하는경우
   .Ex) BCD code (10진수를나타내는4bit 2진코드)
.민텀이1이되거나0이되거나에관계없이같은함수의값을갖는경우
.맵에서는X를넣고1로혹은0으로간주하여묶습니다.
.예5)다음부울함수를간소화하라.
      .함수: F(A,B,C)=Σ(0,2,6)
      .Don’t care 조건d(A,B,C)=Σ(1,3,5)
      .F=A'+BC'
          . Cf) don’t care 를0으로보는경우:
       F=A’C’ + BC’ ( 항의변수가하나추가됨: C'가 추가 되었죠)


이제 회로직전까지 갔는데 지금까지는 그렇게 이해하기 힘든부분은 없는거 같습니다.
아무쪼록 일교차 큰 날씨에 시그원 모두들 감기 조심하세요