집에 월광보합을 중고로 들여놓았습니다. 게임이 1500개나 들어있는데 테트리스가 어디에 있는지 찾을 수가…
게임목록이 들어 있는 엑셀파일을 구했지만, 그걸 매번 검색하기도 힘들고 해서 간단하게 검색기를 만들었습니다.
인간생활 질적향상
집에 월광보합을 중고로 들여놓았습니다. 게임이 1500개나 들어있는데 테트리스가 어디에 있는지 찾을 수가…
게임목록이 들어 있는 엑셀파일을 구했지만, 그걸 매번 검색하기도 힘들고 해서 간단하게 검색기를 만들었습니다.
1~2만원에 쉽게 구할 수 있는 전자식 테스터기를 사용해서 Live과 Neutral을 구분해보자. 단, 접지가 있어야 확실하게 확인이 되는데, 주위에 접지선등이 안보이면 멀티탭을 끌어와서 멀티탭의 접지단자를 활용하면 편리하다.
집이 좀 외진 곳에 있어서 밤에 거의 불빛이 없다.
퇴근해서 돌아왔을때 집 바깥의 불을 자동으로 켜지게 하려고 Wemo Light Switch를 구매했다. 110v 만 스펙에 나와있는데 220v에서 잘 작동한다는 사람이 많고, 러시아친구가 직접 실험한 영상도 있다.
현재 대문 개폐기 배선 상태는 이렇다.
개폐기는 1초~2초가량 전원을 인가했다가 빼야한다.
그래서 1~2초간 On이 되었다가 자동으로 Off가 되어야 한다.
집 인터폰에 연결된 대문개폐기를 제어하기 위해서 Aeotec Nano Switch를 구매했다.
스마트싱스를 처음 세팅하면 귀가모드, 외출모드, 취침모드라고 이름붙은 Routines가 있는데 이걸 이용해서 상황별로 자동실행을 시킬 수 있다.
그런데 각 Routine에는 자동실행조건이 있어서 이를 활용하면 State Machine(상태기계)처럼 세팅할 수 있다.
State Machine으로 설계하게 되면 모든 상태변화에 대해서 반응할 수 있게 된다.
while True:
name = input()
print("Hello "+ name)
이걸 실행하면 아래와 같은 에러메세지가 출력된다는 것은 알 것이다.
$ echo "KHS" | python3 hello_multi.py
Hello KHS
Traceback (most recent call last):
File "hello_multi.py", line 2, in <module>
name = input()
EOFError: EOF when reading a line
$
출력된 결과를 기념삼아 파일로 바로 저장을 해보자.
표준출력을 파일로 담기 위해서는 >
리디렉션을 이용한다.
$ echo "KHS" | python3 p.py > out.txt
Traceback (most recent call last):
File "hello_multi.py", line 2, in <module>
name = input()
EOFError: EOF when reading a line
$
어? 에러메세지는 그냥 출력된다.
그럼 out.txt에는 뭐가 들어있나?
$ cat out.txt
Hello KHS
$
이럴수가 저게 뭔지 알고 내가 print()한 것만 저장을 했을까?
여기서 >
의 효능을 알아봐야한다. >
는 STDOUT을 받아 다른 경로로 쓰는 명령이다.
에러메세지는 STDOUT이 아니라 STDERR로 출력되었기 때문에 화면으로 출력된 것이다.
|
의 효능도 STDOUT을 STDIN으로 넘기는 것이지 STDERR을 넘기지 않는다!
STDOUT과 STDERR은 둘다 콘솔로는 출력되지만, 실제로는 서로 다른 레이어라고 생각하면 될 것 같다.
왜 출력방법을 두개로 뒀을까? STDOUT은 프로그램이 입력값에 의해 생산하는 의미 있는 데이터를 출력하는 용도이고,
STDERR은 디버깅과 운영을 위해서 필요한 진행정보를 출력하는 용도이다.
파이프로만 프로그램을 연결해서 쓰다보면 다음 파이프로 넘기면 안되지만 사람은 봐야하는 정보가 있기 마련이다.
>
는 1>
의 약자이다. 1은 STDOUT을 의미하고 2는 STDERR을 의미한다.
$ echo KHS | python3 hello_multi.py 1>out.txt 2>err.txt
$ cat out.txt
Hello KHS
$ cat err.txt
Traceback (most recent call last):
File "hello_multi.py", line 2, in <module>
name = input()
EOFError: EOF when reading a line
$
위와 같이 하면 STDOUT은 out.txt에 STDERR은 err.txt에 저장된다.
1과 2의 순서가 바뀌면 안되니 조심.
$ echo KHS | python3 hello_multi.py 1>out.txt 2>&1
$ cat out.txt
Hello KHS
Traceback (most recent call last):
File "hello_multi.py", line 2, in <module>
name = input()
EOFError: EOF when reading a line
$
위와 같이하면 STDERR을 STDIN에다가 쓰는 거고 STDIN은 out.txt에 쓰는 것이 되어서,
첨에 생각했던대로 out.txt에 에러메세지까지 모두 저장된다.
0 * * * * /where/is/script/run.sh >/dev/null 2>&1
crontab은 출력결과를 관리자 메일로 발송하므로 메세지를 전부 /dev/null로 보내서 소각(?)하면 조용히~ 실행한다.
파이썬안에서 STDERR로 출력을 해보자.
print()와 sys.stderr 을 활용하는 방법 두가지가 있다.
import sys
print("Hello Error", file=sys.stderr)
import sys
sys.stderr.write("Hello Error\n")
확인 방법은 >
를 써서 실행해보자.
$ python3 hello_error.py 1>out.txt 2>err.txt
$ cat out.txt
$ cat err.txt
Hello Error
$
STDIN, STDOUT, STDERR, EOF, 1>, 2>, | 가 무엇인지 한번 더 떠올려보자.