2016년 10월 31일 월요일

RPi에서 음성 인식하기

라즈베리 파이에서 USB 마이크와 PocketSphinx라는 소프트웨어를 이용하여 음성인식을 시험해보았다. 이 글에서는 마이크를 사용하여 소리를 녹음해보고, 음성인식에 필요한 소프트웨어를 설치한 다음, 음성을 인식하는지 테스트해보고, 그것을 이용해서 다른 명령을 실행시키는 과정을 다룬다.

USB 마이크


구입과 설치


USB 마이크의 구입과 설치에 대해서는 Raspberry Pi에서 소리 입력 및 녹음하기를 참조. 아래와 같은 명령으로 소리를 녹음하고 재생할 수 있으면, 다음으로 진행할 수 있다(이 글에서는 소리의 녹음을 위해 ALSA 프레임워크를 사용한다).

$ arecord -D plughw:1,0 -d 5 test.wav
$ aplay test.wav


USB 마이크를 기본 녹음 장치로 설정


USB 마이크를 기본 녹음 장치로 만들어두는 것이 편리할 것이다.

$ more ~/.asoundrc
pcm.!default {
    type asym
    playback.pcm {
        type plug
        slave.pcm "hw:0,0"
    }
    capture.pcm {
        type plug
        slave.pcm "hw:1,0"
    } 
}


홈 디렉터리에 위와 같이 .asoundrc를 작성한다. 이제 arecord를 실행할 때 -D 옵션을 생략해도 된다.

$ arecord -d 5 test.wav


음성인식


의존 패키지 설치


PocketSphinx를 설치하기에 앞서, 필요한 패키지들을 먼저 설치한다.

sudo apt install libasound2-dev autoconf libtool bison swig python-dev python-pyaudio
sudo pip install gevent grequests


SphinxBase와 PocketSphinx 설치


SphinxBase를 설치한다.

git clone git://github.com/cmusphinx/sphinxbase.git
cd sphinxbase
./autogen.sh
make
sudo make install
cd ..

PocketSphinx를 설치한다.

git clone git://github.com/cmusphinx/pocketsphinx.git
cd pocketsphinx
./autogen.sh
make
sudo make install
cd ..

ldconfig를 실행.

sudo ldconfig


사전 만들기


말뭉치(corpus)를 텍스트 파일로 작성한다. 아래의 말뭉치는 구글 캘린더를 조작하는 명령과 관련된 것이다.

$ more corpus.txt 
day
week
month
4
agenda
refresh
next
previous
today

언어 모델과 사전을 만들 차례이다. 위에서 만든 말뭉치 파일을 http://www.speech.cs.cmu.edu/tools/lmtool-new.html 페이지의 Upload a sentence corpus file:에서 선택한 다음, "COMPILE KNOWLEDGE BASE" 버튼을 누르면 잠시 후에 다운로드 페이지로 이동한다. .lm과 .dic 파일을 다운로드하거나, .tgz로 압축된 파일을 다운로드하여 압축을 푼다. 파일들을 적당한 위치로 옮기고, 필요하다면 이름도 바꾼다.

음성인식 테스트


다음과 같이 pocketsphinx_continuous 명령을 실행하여 음성을 인식하는지 테스트해본다. -lm과 -dict 옵션에는 .lm 파일과 .dic 파일을 각각 지정한다. USB 마이크가 디폴트 녹음 장치로 설정되지 않았다면, -adcdev plughw:1,0 옵션을 추가하여 실행한다.

$ pocketsphinx_continuous -hmm /usr/local/share/pocketsphinx/model/en-us/en-us -lm cal.lm -dict cal.dic -samprate 16000/8000/48000 -inmic yes
INFO: pocketsphinx.c(152): Parsed model-specific feature parameters from /usr/local/share/pocketsphinx/model/en-us/en-us/feat.params
Current configuration:
[NAME]   [DEFLT]  [VALUE]
-agc   none  none
-agcthresh  2.0  2.000000e+00
-allphone    
-allphone_ci  no  no
-alpha   0.97  9.700000e-01

...

INFO: ps_lattice.c(1441): Joint P(O,S) = -144424 P(S|O) = -24085
INFO: ngram_search.c(872): bestpath 0.00 CPU 0.000 xRT
INFO: ngram_search.c(875): bestpath 0.00 wall 0.001 xRT
NEXT
INFO: continuous.c(275): Ready....
^C

위에서는 음성을 NEXT라고 인식한 것을 볼 수 있다.

음성인식 결과를 이용하여 다른 명령 실행하기

pocketsphinx_continuous를 사용하여 구글 캘린더(이전 글 참조)를 조작하는 셸 스크립트를 다음과 같이 작성해보았다.

#!/bin/sh

cd /home/pi/calendar

pocketsphinx_continuous -hmm /usr/local/share/pocketsphinx/model/en-us/en-us \
    -lm cal.lm -dict cal.dic -samprate 16000/8000/48000 -inmic yes | \
    xargs -L1 sh -c 'echo "$*" | head -c1 | tr A-Z a-z | \
    xargs xdotool search -onlyvisible -class "chromium" windowactivate type' -

위에서 pocketsphinx_continuous는 마이크로 입력된 음성을 분석해서 그에 해당하는 단어를 출력하는 것을 반복한다. 그러면, 출력이 있을 때마다 파이프와 xargs를 통해 head, tr, xdotool이 실행된다. 'NEXT'를 인식하였다면, 첫 글자 'N'을 취해서, 소문자인 'n'으로 변환하고, Chromium 창에서 'n'을 타이핑하는 것이다. 구글 캘린더는 키보드 입력으로 'n'이 들어오면 다음(next)으로 이동한다.
자동 실행을 위해 다음과 같은 systemd unit 파일을 ~/.config/systemd/user/pocketsphinx.service에 작성했다.

[Unit]
Description=PocketSphinx
After=graphical.target

[Service]
ExecStart=/home/pi/calendar/start-pocketsphinx.sh
Environment=DISPLAY=:0
Restart=no

[Install]
WantedBy=default.target

참고





2016년 10월 20일 목요일

RPi 벽걸이 캘린더

라즈베리 파이와 구글 캘린더를 이용하여 벽걸이 캘린더를 만드는 프로젝트가 있다. 요즘 수요일마다 참석하는 스터디 모임에서 일차적인 목표로 삼은 과제이다.

얼마 전에 구입한 RPi 3 Model B를 이용하여 이를 구현해보았다. Raspbian의 새로운 데스크톱 환경인 PIXEL에 기본으로 포함되는 Chromium 웹 브라우저를 사용했다.

Chromium에서 구글 캘린더를 열면 모바일 페이지가 뜨는 버그가 있는데, URL을 https://calendar.google.com/calendar/render로 변경함으로써 데스크톱용 캘린더 페이지를 열 수 있다(스터디에서는 버그를 피하기 위해 Chromium 대신 iceweasel(Firefox ESR) 브라우저를 설치하는 방법을 택했다. 따라서 아래의 내용을 참고하되 iceweasel에 맞도록 수정이 필요하다). Chromium에서 키보드의 F11 키를 누르면 전체 화면으로 바뀐다. 캘린더 보기는 "월"을 선택한다.

명령행에서 다음의 명령을 실행하면, Chromium을 전체화면으로 실행시키면서 구글 캘린더를 "월" 보기로 보여준다.
chromium-browser --kiosk "https://calendar.google.com/calendar/render#main_7|month"

이제, RPi를 켤 때마다 캘린더가 뜨도록 할 차례이다. 스터디에서는 ~/.config/lxsession/LXDE/autostart 파일을 이용하려고 했지만, 원격 접속의 문제인지 아니면 PIXEL로 바뀐 것 때문인지는 몰라도 예상대로 잘 되지 않는 것 같았다. 집에 와서 검색을 통해 다음과 같은 방법을 찾았다.
  1. 위의 명령을 실행하는 start-kiosk.sh 파일을 pi 사용자의 홈(~) 디렉터리에 만든다.
  2. 다음과 같은 설정으로 ~/.config/systemd/user/kiosk.service 파일을 만든다.
    [Unit]
    Description=Kiosk
    After=graphical.target
    
    [Service]
    ExecStart=/bin/bash /home/pi/start-kiosk.sh
    Environment=DISPLAY=:0
    Restart=always
    
    [Install]
    WantedBy=default.target
  3. 다음의 명령을 실행한다.
    systemctl --user enable kiosk
    systemctl --user start kiosk
  4. sudo reboot 명령으로 테스트해본다. Chromium이 제대로 종료되지 않은 것에 대한 팝업이 뜨는데, 이것을 숨기려면 start-kiosk.sh 파일의 chromium-brower 명령에 옵션을 추가한다.
    chromium-browser --kiosk --disable-session-crashed-bubble --disable-infobars "https://calendar.google.com/calendar/render#main_7|month"
  5. 화면이 꺼지거나 화면보호기가 뜨지 않도록 하려면 start-kiosk.sh에서 Chromium 실행 전에 다음과 같은 명령을 실행하도록 해준다.
    xset -dpms; xset s off

참고





2016년 10월 18일 화요일

Raspberry Pi 잡설

Raspberry Pi 관련 몇 가지 소소한 발견.

RPi에 외장 HDD 연결

  • RPi 1 Model B에서는 USB 포트의 출력이 약해서 외장형 HDD 사용에 문제가 있고, 가능하다 하더라도 포트가 2개 밖에 없기 때문에 다른 USB 장치를 꽂을 여유가 없다. 외장 HDD를 사용하기 위해서는 별도의 전원을 가진 USB 허브가 필요하다.
  • RPi 3 Model B에 외장형 HDD를 직접 물려보았더니 잘 동작한다. 핫 플러깅을 했는데도 문제가 없었다. 전원은 2.5 A 어댑터로부터 RPi의 마이크로 USB에 공급.
  • RPi 1 Model B+에서도 가능할지 모른다.

OpenELEC


  • RPi에서 쓰던, OpenELEC을 설치한 마이크로 SD 카드를 그대로 RPi 3에 넣고 전원을 넣어보니 부팅이 되는 듯 메시지가 올라가다가 멈춘다. 업데이트를 해줘야 쓸 수 있다.
  • OpenELEC에서 TV를 볼 수 있다! 댓글의 채널 목록을 받아서 테스트해보니, 현재 안 나오는 채널도 많지만, 아직 나오는 채널도 많다.
    www.todayhumor.co.kr/board/view.php?table=jisik&no=201727
  • KODI 재시작 명령
    systemctl restart kodi

디스플레이

영상을 감상할 때 종횡비 4:3의 브라운관 TV에 연결하면 위아래가 남고, WFHD(21:9) 모니터에서는 좌우가 남는다. 영상을 감상하는 데에는 역시 16:9 모니터가 최적일 것 같다. 그런 용도가 아니라 하더라도, RPi를 사용할 때 이런저런 신경을 쓰지 않고 편하게 사용할 수 있는 디스플레이 장치는 HDMI 단자가 있고 스피커가 내장된, 종횡비 16:9의 모니터라는 결론.



2016년 10월 16일 일요일

짝퉁 블로그

구글 검색으로 자료를 찾다가, 내 블로그(sk8erchoi-tech.blogspot.com)가 다른 사이트에 거의 똑같이 복제된 것을 발견했다. 차이점이 있다면, 당연히 사이트의 URL 주소가 다르고, 모든 링크의 주소가 해당 사이트의 주소로 바뀌어 있다는 것이다. 그리고, 광고가 삭제되어 있다.

짝퉁 사이트 주소:

  • 에이치티티피://f44.654k.net/0/?url=L21vYy50b3BzZ29sYi5oY2V0LWlvaGNyZThrcy8vQTMlcHR0aA==
  • 에이치티티피://9k.9941.yi.org/0/?url=L21vYy50b3BzZ29sYi5oY2V0LWlvaGNyZThrcy8vQTMlcHR0aA==


내가 쓴 모든 글과 사진이 내가 알지 못하는 누군가에 의해 고스란히 수집되어 게시되고 있다는 사실이 섬뜩하다. 만약 내가 블로그를 그만두면, 이곳이 사실상 내 이름을 건 블로그가 된다. 물론 내 컨텐츠가 여러 검색 엔진이나 인터넷 아카이브(web.archive.org)에도 수집되기는 하지만, 그것과는 다른 문제다.

짝퉁의 존재로 인해 어떤 피해를 입었느냐고 하면 딱히 말할 것은 없다. 만약 어떤 피해를 입는다고 해도 하소연할 곳도 없다.

* 글을 다 써서 올리자마자, 짝퉁 사이트에도 똑같이 보인다. 일정 주기로 크롤링하는 것이 아니라, 요청시마다 가져가는 듯.


2016년 10월 14일 금요일

USB-TTL 케이블로 RPi에 연결

이번에 구입한 라즈베리파이 스타터 키트에는 USB to TTL 케이블이 포함되어 있다. 이것을 이용하면 네트워크가 되지 않는 상황에서도 직렬 연결을 통해 라즈베리 파이(RPi)와 통신할 수 있어 든든하다(명령행에서 WiFi를 설정할 수 있다).

디바이스마트에서 구입한 것과 동일한 것으로 보이는 제품이 Adafruit에도 있어서 좀 더 자세한 정보를 알 수 있었다. USB 쪽 몸체가 검정색으로 된 것은 PL2303HX 칩셋을 쓴 구형 제품이고, 2014년 이후 제품은 파란색 몸체에 PL2303TA 칩셋이 들어있다고 한다. Windows 8과 10까지 지원하는 최신 드라이버에 대한 링크도 있다.

검정, 흰색, 녹색 선을 각각 6, 8, 10번 핀에 꽂는다. 빨간 선을 2번 핀에 꽂으면 전원 공급도 가능한데, 그때에는 마이크로 USB에는 전원을 연결하지 말아야 한다.


그리고, RPi의 /boot/config.txt에 UART를 사용하겠다는 설정이 있어야 하고, raspi-config에는 직렬 연결을 통해 로그인할 수 있도록 설정되어 있어야 한다(여기에서 삽질을 했다).

/boot/config.txt
...
enable_uart=1






참고


2016년 10월 13일 목요일

RJ with PIXEL 설치 및 한글 설정

라즈베리 파이 3 모델 B를 구입했다(디바이스마트의 스타터 키트).

노트북에 Raspbian Jessie with PIXEL(2016-09-23) 이미지를 내려받아Win32DiskImager로 마이크로 SD 카드에 기록한 다음, 마이크로 SD 카드를 RPi에 꽂고, 모니터와 키보드・마우스도 연결하고서 RPi의 전원을 넣으니 금세 부팅이 되어 GUI 데스크탑으로 들어온다.

Raspberry Pi Configuration에서 몇 가지 설정을 하고, 리부트. 한 가지 주의할 점은, Localisation 탭에서 WiFi Country를 KR로 변경하면 안 된다.

라즈비안을 업그레이드하고,

$ sudo apt update
$ sudo apt upgrade


펌웨어를  업데이트하고,

$ sudo rpi-update


한글이 제대로 표시되도록 글꼴을 설치하고,

$ sudo apt install ttf-unfonts-core


한글 입력을 위해 fcitx-hangul도 설치했다.

$ sudo apt install fcitx-hangul

리부트.

$ sudo reboot


RPi에 직접 연결한 키보드를 사용할 때 영국식 키보드 배열이 되어서 기호 입력에 문제가 있었다(@와 #이 아닌 따옴표와 파운드 기호가 입력됨). Fcitx 설정에서 Input Method에 "키보드 - 영어(미국)"을 추가하고, Hangul 입력기의 Keyboard layout을 "한국어 - 한국어(101/104키 호환)"으로 설정하여 해결했다.

참고



2016년 10월 12일 수요일

RPi에 WN725N 드라이버 설치

라즈베리 파이 모델 B에서 패키지 업그레이드와 펌웨어 업데이트를 했다.

pi@raspberrypi ~ $ sudo apt-get update
pi@raspberrypi ~ $ sudo apt-get upgrade
pi@raspberrypi ~ $ sudo rpi-update
pi@raspberrypi ~ $ sudo reboot
pi@raspberrypi ~ $ uname -a
Linux raspberrypi 4.4.23+ #913 Tue Oct 4 13:56:56 BST 2016 armv6l GNU/Linux
pi@raspberrypi ~ $ sudo vcgencmd version
Oct 11 2016 12:23:39
Copyright (c) 2012 Broadcom
version c242c9606727d307232bde9c153938ab0b05c12d (clean) (release)

무선 랜 동글(WN725N)이 동작하지 않는다. ifconfig -a 명령을 실행해보니, 지금까지 사용하던 wlan0이 보이지 않는다.

아래의 방법으로 드라이버를 재설치하여 해결했다. 라즈베리 파이가 인터넷에 연결된 상태에서 가능한 방법이라, Wi-Fi를 통해 인터넷에 접속된 노트북에 랜 선으로 연결하여 작업했다.

pi@raspberrypi ~ $ wget https://dl.dropboxusercontent.com/u/80256631/install-wifi.tar.gz
--2016-10-12 20:36:22--  https://dl.dropboxusercontent.com/u/80256631/install-wifi.tar.gz
Resolving dl.dropboxusercontent.com (dl.dropboxusercontent.com)... 108.160.172.5
Connecting to dl.dropboxusercontent.com (dl.dropboxusercontent.com)|108.160.172.5|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 3674 (3.6K) [application/octet-stream]
Saving to: `install-wifi.tar.gz.1'

100%[=====================================================>] 3,674       --.-K/s   in 0s

2016-10-12 20:36:35 (7.95 MB/s) - `install-wifi.tar.gz.1' saved [3674/3674]

pi@raspberrypi ~ $ tar xzf install-wifi.tar.gz
pi@raspberrypi ~ $ ./install-wifi

Your current kernel revision = 4.4.23+
Your current kernel build    = #913

Checking for a wifi module to determine the driver to install.

Your wifi module is Bus 001 Device 004: ID 0bda:8179 Realtek Semiconductor Corp.

And it uses the 8188eu driver.

Checking for a new 8188eu wifi driver module for your current kernel.
There is a driver module available for this kernel revision.
Downloading the 8188eu driver.
Installing the 8188eu driver.

참고

2016년 10월 10일 월요일

남의 댓글을 캡처하는 것에 대해

이 글을 왜 쓰게 되었는지부터 얘기해야겠지만, 그랬다가는 자가당착에 빠지게 되므로 어쩔 수 없이 불친절할 수 밖에 없다.

남이 쓴 게시물, 댓글, 채팅 메시지를 이미지로 캡처해서 제3자에게 공유하는 것은 잘못된 행동이다.

  • 글쓴이가 의도하지 않은 독자에게, 원래의 맥락에서 벗어난 상태로 읽힌다.
  • 특정 시점의 스냅샷이 돌아다니므로, 그 이후에 수정이나 삭제를 해도 반영되지 않는다.
  • 신상이 노출되어 피해를 입을 수 있다.

그러나 이런 얘기를 해봤자 쇠 귀에 경 읽기일테니, 스스로 피해를 입지 않도록 입(키보드)조심하는 것이 상책.

2016년 10월 7일 금요일

윈도우10 로그인 화면 배경 삭제

Windows 10의 스토어에서 페이스북 앱을 설치해서 쓰다가 불편해서 지워버렸다. 그런데, 프로필 동기화를 통해서 설정되었던 로그인 화면은 원상복구가 되지 않았다. 한동안 내버려두었다가 뒤늦게 조치했다. 그 방법을 소개하기 전에, 이 글에서는 다음의 세 화면을 구분한다는 점을 밝힌다.
  • 잠금 화면(lock screen): <Ctrl> + <Alt> + <Del>을 누르고, "잠금"을 선택하면 나오는 화면
  • 로그온 화면(start screen): 사용자 로그인을 하기 위해 패스워드를 입력하는 화면
  • 로그인 전 화면: 컴퓨터를 켜서 Windows가 기동되면 처음 나오는 화면

페이스북 앱


페이스북 앱에서 프로필 동기화를 해제하는 방법이 있다길래 따라해보려 했지만, 다시 설치한 페이스북 앱에서는 프로필 동기화 관련 설정을 할 방법을 찾을 수 없었다.

로그온 화면 배경 이미지 삭제


처음에는 잠금 화면과 로그온 화면의 차이를 모르고, 잠금 화면의 배경 이미지를 삭제하는 글을 찾아서 삽질을 좀 했다.

  1. 윈도우 키 + <R>을 누르고 gpedit.msc 실행
  2. 컴퓨터 구성 - 관리 템플릿 - 제어판 - 개인 설정 클릭하여 나오는 항목들을 이것저것 만져봄

그러던 중에 로그온 화면의 이미지는 제거할 수 있었다. 아마도 특정 시작 화면 배경 적용 옵션에서 배경 ID를 변경했을 때 반영된 것 같다. 그렇지만, 로그인 전 화면에는 보기 싫은 배경이 여전히 남아있었다 .


로그인 전 화면의 배경 이미지 삭제


로그인 전 화면의 배경 이미지는 다음과 같은 방법으로 삭제할 수 있었다.

  1. 파일 탐색기의 폴더 옵션에서 숨김 파일, 폴더 및 드라이브 표시 설정
  2. C:\ProgramData\Microsoft\Windows로 이동
  3. SystemData 폴더를 오른쪽 클릭하고 속성 창의 보안 탭에서 고급 버튼 클릭. 소유자를 변경하고, 하위 컨테이너와 개체의 소유자 바꾸기 선택한 다음 확인 버튼 클릭
  4. SystemData\S...\ReadOnly 폴더의 LockScreen_... 폴더를 바탕화면으로 끄집어냄
  5. 윈도우 키를 누르고 프로필 이미지를 클릭한 뒤 로그아웃 클릭
  6. 잘 되는 것을 확인했으면 바탕화면으로 가져온 LockScreen_... 폴더를 오른쪽 클릭하고 속성 창의 보안 탭에서 사용권한을 부여한 후에 폴더를 삭제


참고




프로필 사진

페이스북 프로필 사진은 몇 달에 한번씩 바꾸는 편이지만, 구글이라든지, 그외의 다른 서비스에서는 별로 손을 대지 않는 편이다. 최근에 몇 군데의 사이트에서 프로필 사진을 바꾸면서 느낀 점.


  • 사이트마다 바꾸는 것이 귀찮다. 프로필 사진을 다르게 할 수 있다는 점이 한편으로는 좋은 점이지만. 모두 gravatar를 지원하면 좋으련만.
  • 구글 플러스에서 사진을 바꾸면 구글의 모든 서비스에 적용되는 걸로 알고 있는데, 그게 뭔가 이상하다. 유튜브에선 바뀌어 있는데 지메일에선 예전 사진이 그대로 남아있는 식이다. 캐시가 남아서 그럴 수도 있겠지만, 어쨌거나 이번에는 상당히 불편한 상황을 겪었다. 구글은 대단한 기술을 척척 만들어내는 반면에 허술한 구석도 많은 것 같다. 서비스가 워낙 방대해서 그럴 수도 있겠지만.

2016년 10월 2일 일요일

svchost.exe의 CPU 점유 해결

Windows Vista 시절에 구입한 HP Compaq 6715b는 거무튀튀하고 큼직한 노트북이다. 아기자기한 맛이 없고 성능도 떨어지지만, 넓은 화면과 키보드가 있어 문서 작성용으로는 제격인 외형을 갖췄다. 작년말에 Windows Vista를 재설치하여 사용 중인데, CPU가 늘 100%로 차 있고 전반적으로 매우 느려서, 사용하는 데에 아주 많은 인내심을 필요로 했다. 그렇지만, 단지 하드웨어의 사양이 낮아서 그런 것이 아니라, 뭔가 이상이 있었다.

여러 개의 svchost.exe 프로세스 중 한 개가 대부분(80% 가량)의 CPU를 점유한다는 것까지는 파악했지만, svchost의 정체가 무엇인지, 어떻게 해야 CPU 점유를 낮출 수 있는지 갈피를 잡지 못하고 있었다.

오늘에야 위키피디아의 도움을 받아 문제를 해결했다. 여러 개의 시스템 서비스를 위해 각각의 프로세스를 띄우는 대신, 한 개의 프로세스에 모아서 실행시키는 것이 바로 svchost.exe다. 특정 svchost.exe 프로세스가 어떤 서비스들을 돌리고 있는지 알고 싶으면, Windows 작업 관리자의 프로세스 목록에서 오른쪽 클릭하여 팝업 메뉴에서 '서비스로 이동'을 선택하면 된다. 내 경우에는 Windows Update 서비스가 문제를 일으키고 있다는 것을, 서비스를 하나씩 중지시켜보는 방법으로 알아냈다.

Windows Update 서비스를 중지하자마자 CPU 점유율이 확 떨어졌다

결정적인 도움을 준 문서를 읽게 된 계기는 sysinternals의 Process Explorer 도구에서 작은 편의 기능으로 제공한 키워드 검색이었다. 이전의 문제해결 시도에서는 왜 위키피디아를 찾지 못했을까? 그것은 내가 "svchost.exe CPU full"과 비슷한 문구로 구글링을 계속했기 때문이다. 당장의 불을 끄는 방법에만 관심이 있었을 뿐, 불에 대한 이해나 불을 다루는 방법에는 관심을 두지 않았기 때문일 것이다.