토익스피킹 공부한다고 한창 할 때... 생각나서 만들어본 타이머...

토익스피킹 처럼 준비시간/답변시간을 입력하면 카운트를 보여준다

beep음을 추가하면 더 좋았을 것 같지만 이미 더 좋은 타이머들이 많고

카운트 되는 숫자가 타이머와 일치하지 않은 버그도 있어서 

한 번 타이머를 써본 것에 의의를 둔 기억이..

 

먼저 main함수를 보면 준비시간과 답변시간을 입력 받아 순차적으로 timer를 동작시킨다. 

이때 timer를 카운트 하기 위해 TimerTick이란 함수를 사용하였다.

func main() {
	pTime := os.Args[1]
	sTime := os.Args[2]
	pt, _ := strconv.Atoi(pTime)
	st, _ := strconv.Atoi(sTime)
	pTimer = time.NewTimer(time.Second * time.Duration(pt))
	pState := 0
	log.Println("Prepare Time Start")
	go TimerTick(pt)
	for {
		select {
		case <-pTimer.C:
			log.Println("PreTime END")
			pState = 1

		}
		if pState == 1 {
			break
		}
	}
	aTimer = time.NewTimer(time.Second * time.Duration(st))
	aState := 0
	log.Println("Answer Time Start")
	go TimerTick(st)
	for {
		select {
		case <-aTimer.C:
			log.Println("AnswerTime END")
			aState = 1
		}
		if aState == 1 {
			break
		}
	}
}

 

1초마다 Cnt수를 콘솔에 출력하기 위해 만들었다. 

(지금보니 리턴은 왜 한지 모르겠지만...)

고루틴으로 실행하였기에 실제 준비시간 또는 답변시간의 타이머의 시작 시간과 차이가 있어 정확히 시간이 카운트 되지 않는 버그가 있지만.....

실제 시험에서는 긴장을 하고, 어떤 변수가 있을 지 모르기에

카운트가 조금 짧게 느껴지도록 연습하면 되지 않을까 위안을 삼았던 기억이 있다...ㅎ

func TimerTick(cnt int) bool {
	ticker := time.NewTicker(time.Second)
	for {
		select {
		case <-ticker.C:
			if cnt == 0 {
				break
			}
			log.Println("CNT : ", cnt)
			cnt--

		}
	}
	return true
}

아무튼 timerTick함수로 카운트를 출력하는 것을 제외하고는 정해진 시간만큼 대기하는 기능은 잘 동작하는 것 같았다

 

실행 결과

 

끝!

반응형

데이터들이 계속 들어올 때마다 평균을 갱신하는 AverageFilter 소스 

 

데이터의 수와 이전 평균만 전역 변수나 static 변수로 저장해도 되지만

구조체로 만들어보았다.

#include <stdio.h>

typedef struct 
{
    int dataCnt;
    float preAvg;
    float nowAvg;
}Avg;

float avgFilter(Avg *Avg,int data){
    if(Avg->dataCnt==0){
        Avg->dataCnt++;
        Avg->nowAvg=data;
        Avg->preAvg=data;
        return Avg->nowAvg;
    }
    Avg->preAvg=Avg->nowAvg;
    Avg->dataCnt++;
    Avg->nowAvg=(1 - (float)1/(Avg->dataCnt))*(Avg->preAvg)+((float)1/Avg->dataCnt)*data;
    return Avg->nowAvg;
}

int main(){
    Avg avg;
    avg.dataCnt = 0;
    avg.nowAvg = 0;
    avg.preAvg = 0;

    printf("%f\r\n", avgFilter(&avg,10));
    printf("%f\r\n", avgFilter(&avg,20));
    printf("%f\r\n", avgFilter(&avg,30));
    printf("%f\r\n", avgFilter(&avg,40));
    printf("%f\r\n", avgFilter(&avg,50));
    printf("%f\r\n", avgFilter(&avg,60));
    printf("%f %f\r\n",avg.preAvg,avg.nowAvg);
}

반응형

KISA에서 제공하는 ARIA 암호화 예제를 이용한 간단한 암호화를 해보았다. 

 

16바이트로 딱 떨어지지 않는 데이터라도 제로 패딩을 하고 암호화를 하도록 기존의 함수를 조합한 정도뿐이지만...

개인적으로 함수 하나만 넣으면 결과를 얻을 수 있어 사용하기 편하게 만들었다.

 

기존 EncKeySetup 함수와 DeckeySetup 함수를 그대로 이용하였고 단순히 128비트 암호화를 사용하기 쉽게 함수만 2개 추가하였다 

 

사용한 master_key는 단순히 16 바이트로 단순히 1~16까지 넣었다. 

추가한 함수는 EnCrypt와 DeCrypt 이다. 

EnCrypt는 다음과 같다. 

암호화할 데이터와 결과를 얻을 버퍼, 평문의 길이를 넣으면 암호화된 결과의 길이가 리턴된다. 

 

DeCrypt는 다음과 같다. 

복호화 할 데이터와 결과를 얻을 버퍼, 복호화할 데이터의 길이를 넣으면 복호화 된 길이가 리턴된다.

 

해당 두 함수를 이용하여 ARIA128_test 함수를 만들었다

실행결과는 다음과 같다.

암호화를 하고 복호화를 해도 원래 데이터가 잘 나오는 것을 확인하였지만... 

검색을 통해 알아낸 ARIA 암. 복호화 모듈로 검증을 해보았다. 

 

EnCrypt
Decrypt

암.복호화 모두 일치하는 것을 확인을 했다.

 

더 많은 테스트가 필요하겠지만.. 일단은 성공...?

반응형

+ Recent posts