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

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

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번만 성공해도 성공으로 할 경우, 패킷 성공률 비교하는 부분을 기호에 맞게 수정하면 된다.

 

실행 결과

끝!

반응형

언제 만들었는지는 잘 기억도 안나지만.....폴더 구석에서 찾은 Go를 이용한 크기가 동일한 2개 파일이 같은지 비교하는 프로그램

(평문을 암호화했다가 다시 복호화해서 원본과 같은지 잠깐 확인해보려고 했던가...?)

 

main은 간단히 보면 파일 2개를 읽어서 비교, 일치하면 OkCnt 증가 

var bufSize = 512

func main() {
	file1 := os.Args[1]
	file2 := os.Args[2]

	f1, idx1 := readFile(file1)
	f2, _ := readFile(file2)
	okCnt := 0
	match := 0
	for i := 0; i < idx1+1; i++ {
		match = 0
		for j := 0; j < len(f1[idx1]); j++ {
			if f1[idx1][j] != f2[idx1][j] {
				fmt.Println("not match")
				match = 1
			}
		}
		if match == 0 {
			okCnt++
		}
	}
	fmt.Println("okcnt : ", okCnt)
}

 

 

파일을 읽을 때 사용한 함수 

파일 전체 크기를 버퍼 크기 512바이트를 기준으로 나누고 [][]byte를 만들어 파일을 모두 읽음

해당 읽은 파일의 버퍼와 Index수를 반환하는 함수

func readFile(inputFile string) ([][]byte, int) {
	file, err := os.Open(inputFile)
	if err != nil {
		fmt.Println(err)
	}
	defer file.Close()

	testBufSize := bufSize
	fileStat, err := file.Stat()
	if err != nil {
		fmt.Println(err)
		return nil, -1
	}
	fb := bufio.NewReader(file)
	var fileData [][]byte
	fileSize := fileStat.Size()
	idx := int(fileSize) / testBufSize
	remain := int(fileSize) % testBufSize
	fmt.Println("filesize : ", fileSize, "idx :", idx, "remain", remain)
	if remain != 0 {
		idx = idx + 1
	}
	fileData = make([][]byte, idx)

	dataIdx := 0
	// filelen := 0

	for i := 0; i < idx; i++ {
		if remain != 0 {
			if i == idx-1 {
				fileData[i] = make([]byte, remain)
				// filelen += len(decryptDataBuf[i])
				io.ReadFull(fb, fileData[dataIdx])
				// fmt.Println("F Len ", filelen, "dlen :", len(fileData[dataIdx]))
				break
			}
		}
		fileData[i] = make([]byte, testBufSize)
		// filelen += len(decryptDataBuf[i])

		io.ReadFull(fb, fileData[dataIdx])
		// fmt.Println("F Len ", filelen, "dlen :", len(fileData[dataIdx]))
		dataIdx++
	}

	return fileData, dataIdx

}

 

실제 동일한 파일을 이름만 바꾸어 테스트한 결과와 크기가 다른 파일을 테스트한 결과 

크기가 다른 파일이면 버퍼의 index가 일치하지 않아서 바로 오류가 나버리는 급조한 프로그램... 

 

반응형

터미널 프로그램의 한 종류로 주로 사용하는 minicom

 

minicom에 출력되는 로그들을 아래와 같은 방법으로 저장할 수 있다.

 

1. minicom을 실행한다.

2. minicom 메뉴창을 연다.

 - CTRL + A 를 동시에 누르고, Z를 누른다.

 - CTRL + A 를 눌러도 화면이 변화하거나 바뀌는 것은 없지만 메뉴창을 열기 위한 과정이다.

3. Capture on/off를 선택하기 위해 'L'을 누른다. 

4. Capture 파일 이름을 적는다.

5. 엔터를 눌러 캡쳐를 시작한다.

 - Capture 파일은 터미널을 실행한 위치에 생성된다. 

6. 캡쳐를 멈추거나 종료하고 싶으면 다시 메뉴창을 열어 Capture on/off 항목을 선택한다.

7. Close를 누르면 Capture를 종료하고 Pause를 누르면 캡쳐를 잠시 멈춘다.

반응형

https://www.hackerrank.com/challenges/weather-observation-station-19/problem

 

Weather Observation Station 19 | HackerRank

Query the Euclidean Distance between two points and round to 4 decimal digits.

www.hackerrank.com

Euclidean 거리를 구하여 소수점 4자리까지 출력하는 문제

반응형

https://www.hackerrank.com/challenges/weather-observation-station-18/problem

 

Weather Observation Station 18 | HackerRank

Query the Manhattan Distance between two points, round or truncate to 4 decimal digits.

www.hackerrank.com

Manhattan Distance를 구하여 소수점 4자리까지 출력하는 문제 

Manhattan Distance = | x1 - x2 | + | y1 - y2 |

반응형

https://www.hackerrank.com/challenges/weather-observation-station-16/problem

 

Weather Observation Station 16 | HackerRank

Query the smallest of STATION's Northern Latitudes that is greater than 38.7780, and round to 4 decimal places

www.hackerrank.com

 

Query the smallest Northern Latitude (LAT_N) from STATION that is greater than 38.7880. Round your answer to  4 decimal places.

Input Format

The STATION table is described as follows:

38.7880보다 큰 LAT_N 중 가장 작은 LAT_N을 반올림하여 소수점 4자리까지 출력

 

https://www.hackerrank.com/challenges/weather-observation-station-17/problem

 

Weather Observation Station 17 | HackerRank

Query the Western Longitude for the smallest value of the Northern Latitudes greater than 38.7780 in STATION and round to 4 decimal places.

www.hackerrank.com

Query the Western Longitude (LONG_W)where the smallest Northern Latitude (LAT_N) in STATION is greater than 38.7880. Round your answer to 4 decimal places.

Input Format

The STATION table is described as follows:

38.7880보다 큰 LAT_N 중 가장 작은 LAT_N의 LONG_W를 반올림하여 소수점 4자리까지 출력 

 

반응형

https://www.hackerrank.com/challenges/weather-observation-station-15/problem

 

Weather Observation Station 15 | HackerRank

Query the Western Longitude for the largest Northern Latitude under 137.2345, rounded to 4 decimal places.

www.hackerrank.com

Query the Western Longitude (LONG_W) for the largest Northern Latitude (LAT_N) in STATION that is less than 137.2345. Round your answer to 4 decimal places.

Input Format

The STATION table is described as follows:

137.2345보다 작은 LAT_N 중 가장 큰 LAT_N을 가진 LONG_W를 소수점 4자리에서 반올림

반응형

+ Recent posts