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

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

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함수로 카운트를 출력하는 것을 제외하고는 정해진 시간만큼 대기하는 기능은 잘 동작하는 것 같았다

 

실행 결과

 

끝!

반응형

엄청나게 오랜만에 우연히 생각나서 올리는 게시글...

 

Ping 테스트를 반복적으로 하는 프로그램 

가끔 전원 On/Off 테스트에 사용하거나 네트워크 체크할 때 사용했던 기억이 가물가물.... 

 

Ping테스트를 할 타겟 IP와 반복적으로 할 간격[초]을 인자로 받아서 실행하도록 하였다.

func main() {
	target := os.Args[1]
	t := os.Args[2]
	timeDelay, err := strconv.Atoi(t)
	if err != nil {
		log.Println("ERR : ", err)
	}
	log.Println("Start")
	for {
		if !pingCheck(target) {
			log.Println("Stop")
			break
		}
		time.Sleep(time.Second * time.Duration(timeDelay))
	}
}

 

Ping 테스트는 3번 시도하여 100%성공이 아니면 실패로 리턴하도록 하였다. 

func pingCheck(target string) bool {
	out, err := exec.Command("ping", target, "-c 3").Output()
	if err != nil {
		log.Println("ERR : ", err)
	}
	log.Println(string(out))
	if strings.Contains(string(out), "Destination Host Unreachable") || strings.Contains(string(out), "errors") {
		log.Println("Down")
		return false
	}
	if strings.Contains(string(out), "0% packet loss") {
		n := strings.Index(string(out), "0% packet loss")
		if string(out[n-1]) == "0" && string(out[n-2]) == "1" {
			log.Println("Down")
			return false
		}
	} else {
		log.Println("Down")
		return false
	}

	log.Println("Alive")
	return true
}

 

3번 중 2번만 성공해도 성공으로 할 경우, 패킷 성공률 비교하는 부분을 기호에 맞게 수정하면 된다.

 

실행 결과

끝!

반응형

+ Recent posts