코로나19 사태로 인해 아이들이 집에 있는 시간이 늘어나고 있다. 하지만 우리 집에는 케이블 방송을 신청하지 않아 아이들이 볼 만한 방송은 EBS 밖에 없다.
큰 아이가 좋아하는 방송 중 "와글와글 미술관"이 있다. 2014년 2월부터 2015년 2월까지 1년 동안 26개의 이야기가 방영되었고, 예전 자료를 2020년에도 계속 방송해주고 있다.
와글와글 미술관이 좋은 점 중 하나가 방송 중에 아이들이 체험할 수 있는 자료와 방법을 제공하기 때문이다. 교육방송답다.
하지만, 위 사진에서 보이는 "EBS 클립뱅크" 접속되지 않는다. 그 이유는 EBS가 클립뱅크 서비스를 2020년 1월 31일까지만 제공하고 종료하였기 때문이다. 클립뱅크의 일부 자료들은 유튜브 채널을 통해 제공한다고 한다. 동영상은 유튜브에 올라가지만, 아이들이 실습할 수 있는 이미지 자료들은 따로 제공되는 곳이 없다.
EBS에 문의하였지만, 요즘 온라인 개학 때문에 바쁜지 연결이 쉽지 않았다. 어렵게 상담원과 연결되어 원하는 사항을 정말 어렵게 납득을 시키고, 원하는 자료를 정말 어렵게 받았다. 이게 뭐라고...
리눅스에서 jupyter notebook까지 실행했다면, 이제 마지막 단계를 남겨두고 있다. 드디어 Khaiii를 설치한다. Khaiii 설치는 다음의 단계를 따른다.
- 빌드 툴 설치
- Khaiii 빌드
- Khaiii 설치
오늘도 가슴 설레는 오류가 기다리고 있다.
▲ 위는 동영상
▼ 아래는 글
sudo pip3 install cmake
우선 cmake 3.10. 이상의 설치가 필요합니다.
CMake(Cross Platform Make)는 멀티플랫폼으로 사용할 수 있는 Make의 대용품을 만들기 위한 오픈소스 프로젝트이다[1]. 여기서 make는 소프트웨어 개발을 위해 유닉스 계열 운영 체제에서 주로 사용되는 프로그램 빌드 도구이다 [2].
무슨 말인지 모르겠다. 그냥 뭔가 설치하기 위한 도구인가 보다.
시작하자마자 오류를 출력합니다. 그렇지... 오류 없이 그냥 지나가면 허전하지...
"Module Not Found Error : No module named 'skbuild' "
Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-dpt1duvm/cmake/
일단 skbuild라는게 없어서 오류가 나는 것으로 보입니다.
"scikit-build / cmake-python-distributions" 라는 github에 유사한 증상에 관한 글이 있지만 이미 해결된 상태(closed)입니다.[3]
한참 동안 방법을 찾다가 앞서서 사용한 "apt-get"이 떠올랐습니다. 무작정 해봤습니다. 됩니다.
sudo apt-get install cmake
무작정 해본 거라, 소 뒷걸음질 치다 쥐 잡은 꼴입니다.
좀 찾아보니 "pip3 install"과 "apt-get"에는 어디서부터 패키지를 받아오는지에 대한 작은 차이가 있었습니다.
앞서 살펴본 바와 같이 pip는 package installer for python을 의미한다. 반면 apt는 Advanced Packaging Tool을 의미합니다. pip로 설치하면 파이썬과 관련된 곳에서 파일을 다운로드 받고, apt를 사용하면 우분투와 관련된 곳에서 파일을 다운받는 것으로 확인된다.
위에 오류난 그림에서 보면 "Downlonding https://files.pythonhosted.org/packages/....." 으로 나타나지만, apt-get으로 실행한 화면에서는 "Get: 1 http://archive.ubuntu.com/ubuntu bionic..."로 나타난다.
git clone https://github.com/kakao/khaiii.git
깃헙에서 khaiii 관련 파일을 복사한다.
# khaiii 폴더로 이동(cd = change directory)
cd khaiii
# khaiii 폴더 아래에 build 폴더 만들기(mkdir = make directiory)
mkdir build
# build 폴더로 이동
cd build
# 프로그램에 필요한 리소스 준비(끝에 점 2개 찍어야 함) - 약 10분 정도 걸림
sudo cmake ..
# 빌드 실행 - 약 5분 걸림
sudo make all
# 리소스 빌드(large와 base중 선택, 저장용량에 문제가 없다면 large 선택)
sudo make large_resource # large
sudo make resource # base
# khaiii 설치
sudo make install
# python과 바인딩
sudo make package_python
cd package_python
sudo pip3 install . # 마지막에 점 하나 찍어야 함, 약 5분 걸림
드디어 khaiii 설치를 완료하였습니다.
"Successfully installed khaiii"가 반갑습니다.
이제 khaiii를 설치했으니, 다음에는 khaiii를 활용한 간단한 분석 이야기를 해볼까 합니다.
윈도우에 리눅스(Ubuntu)를 성공적으로 설치하였다면, 카이를 사용하기 위한 몇 가지 세팅이 필요하다.
할 일은 다음과 같다.
- username과 password 입력
- 전체 패키지 업데이트
- 전체 패키지 업그레이드
- pip 설치
▲ 위는 동영상
▼ 아래는 글
리눅스 아이콘에 마우스 우클릭하여 관리자 권한으로 실행한다.
그럼, CMD창이나 예전 DOS창과 같은 검은색 화면이 하나 실행된다. 처음 구동하는 경우, 시간이 1~2분 정도 걸리니 여유롭게 기다려야 한다.
준비가 되면 username을 입력하라는 메시지가 나타난다. 자기 컴퓨터에서만 사용되는 이름이니 아무것이나 입력해도 된다.
username을 입력하면 password를 입력하라는 메시지가 나타난다. 비밀번호는 반드시 메모를 해둬야 한다. 비밀번호를 잊어버리면 리눅스를 다시 설치해야 하는 불상사가 생긴다. 비밀번호를 타이핑해도 입력 커서가 움직이지 않는다. ***로 입력되지도 않는다. 그래도 정상적으로 입력되는 것이니 오타 내지 않도록 잘 입력한다. 비밀번호를 확인하기 위해 한 번 더 입력하는 절차가 있다.
전체 패키지를 upgrade 하고 update 하기 위해 다음의 코드를 하나씩 실행한다.
sudo apt-get upgrade
sudo atp-get update
첫 번째 줄을 실행하면 비밀번호를 입력하라는 메시지가 나타난다. 위에서 입력한 비밀번호를 입력하고 엔터키를 누르면 된다. 그 이유는 리눅스의 "sudo" 명령어가 윈도우의 "관리자 권한으로 실행"과 유사한 개념으로 "Super User DO"를 의미한다. 관리자 권한으로 뭔가를 하려고 하니 관리자 비밀번호를 입력하라는 것이다.
upgrade와 update는 생각보다 시간이 꽤 걸린다. 둘 다 합쳐서 10분 정도 걸린 것으로 기억난다.
다음 단계는 파이썬 패키지 인스톨러인 pip 설치를 위해 다음의 코드를 실행한다.
sudo apt-get install python3-pip
pip는 package installer for python을 의미한다. 파이썬으로 작성된 패키지를 다운로드, 설치, 관리하기 위한 것이다.[1]
pip3는 python3 버전으로 설치하는 것이고, 그냥 pip는 python2 버전으로 설치하는 것이다.[2] pip 설치 중 오류가 발생하면 위에서 실시한 update를 될 때까지 계속해봐야 한다.
조금 어이가 없었던 점은, 새 메모리를 샀는데 위 사진처럼 메모리가 요리용 호일에 싸여서 왔다는 점이다. 내 실수로 중고제품을 구입한게 아닌지 혼란스러웠다. 나중에 안 사실이지만, 메모리(램)는 새제품도 별도의 포장없이 호일에 싸서 판매된다고 한다. 호일에 싸는 이유는 정전기를 방지하기 위함이라고 들었다.
위 사이트에서 구입했다. 네이버 페이가 가능해서 적립금을 사용하여 배송비(2,500원) 포함 32,000원 정도에 구입할 수 있었다. 배송은 하루 만에 받을 수 있었다.
이제 노트북을 뜯을 시간이다. 볼트를 풀어준 후 틈에 벌려 커버를 분리했다.
사용 중인 노트북에는 메모리를 꼽을 수 있는 공간이 2개 있다. 위 빨간색 상자에서 왼쪽은 기존에 꼽혀있던 하이닉스 메모리이고, 오른쪽은 확장 슬롯이다.
Khaiii 테스트까지 잘했는데, 본격적으로 해보려고 했는데, 윈도우10의 파일을 우분투로 어떻게 옮기는지에서 막혔다.
윈도우 탐색기에서 파일을 복사해서 우분투 파일에 옮긴 후 jupyter notebook에서 파일을 열려고 하니 permission error(권한 문제)가 발생했다.
csv로 바꿔서도 시도해봤고, "pd.read_excel('./data/Q3_sample.xlsx', engine='xlrd')" 이런 방법도 사용해봤는데 모두 권한 문제에서 자유롭지 못했다.
원도우 탐색기를 이용해서 파일을 우분투 폴더로 옮기면 권한 문제가 생긴다는 것을 알게 되었다.
또다시 끝을 모를 검색이 시작되었다. 시도했다가 실패한 방법은 다음과 같다.
1. WinSCP 설치
- 윈도우10에 WinSCP를 설치하고 우분투의 IP를 이용해서 접근하는 우분투로 접근한 후 파일을 전송하는 방법인데, 우분투 쪽에 방화벽 등과 관련된 설정이 필요한데, 잘 안돼서 실패했다.
2. 우분투에 크롬 설치 후 구글 드라이브로 직접 접근
- 크롬은 성공적으로 설치했으나 터미널에서 크롬창 띄우는 것을 실패해서 포기했다.
# 크롬 드라이버 다운로드
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
sudo dpkg -i google-chrome-stable_current_amd64.deb
# 이렇게 하면 오류 발생
# error processing package google-chrome-stable (--install):
# dependency problems - leaving unconfigured
sudo apt-get install libappindicator1
# 다른 오류 발생
# E: Unmet dependencies. Try 'apt --fix-broken install' with no packages (or specify a solution).
sudo apt-get -f install
# 우분투가 깡통이라 그런지 어마무시하게 설치함
# 0 upgraded, 158 newly installed, 0 to remove and 2 not upgraded.
sudo dpkg -i google-chrome-stable_current_amd64.deb
# 이제 됨
google-chrome
# 드디어!! 우분투에서 크롬을 띄울 수 있는것인가!!
# 에러발생... 그래 이렇게 쉬울리 없어...
# (google-chrome:3809): Gtk-WARNING **: 00:51:33.827: cannot open display:
xhost +si:localuser:root
xhost +si:localuser:userid
xhost +
# xhost: unable to open display ""
# 모두 같은 에러 발생
# 안해 안해!!!!
3. wget 으로 구글 드라이브 직접 접근
- 이건 제일 처음 시도했었는데 실패해서 다른 방법들 해보다가 다시 wget으로 돌아옴
# wget 시도
wget https://drive.google.com/open?id=1dhNvuN이하생략
# 오오오! 다운로드 받았데!!
2020-01-06 00:06:54 (1021 KB/s) - ‘open?id=1dhNvuN_oBiqeWJU_pQxqHojz77kCkGnc’ saved [184119]
# 근데 다운로드된 파일이름이 왜 이따구야. 난 엑셀파일을 받으라고 했다고.
ls
'open?id=1dhNvuN이하생략'
# 안해. 안해!!
- 그런데, 돌고 돌아 다른 방법을 찾았다.
# 100MB 이하 파일을 구글 드라이브에서 우분투로 다운로드하는 새로운 방법
wget --no-check-certificate 'https://docs.google.com/uc?export=download&id=공유ID' -O FILENAME
# 공유ID입력하고
# 마지막 FILENAME 자리에 우분투에 저장하고 싶은 파일 이름 입력
# 100BM 이상 파일인 경우(실제로 해보지는 않음)
wget --load-cookies /tmp/cookies.txt "https://docs.google.com/uc?export=download&confirm=$(wget --quiet --save-cookies /tmp/cookies.txt --keep-session-cookies --no-check-certificate 'https://docs.google.com/uc?export=download&id=FILEID' -O- | sed -rn 's/.*confirm=([0-9A-Za-z_]+).*/\1\n/p')&id=FILEID" -O FILENAME && rm -rf /tmp/cookies.txt
jupyter notebook DLL load failed 지정된 프로시저를 찾을 수 없습니다
파이썬을 3.6에서 3.7로 업그레이드하는 과정에서 seaborn import error가 발생하여 오랜 시간 동안 고생했다. 수많은 검색을 통해 아나콘다를 지우고 재설치하고를 반복하며 헤맸는데, 에러 메시지에 답이 있었다.
아나콘다 재설치를 통해 파이썬 업그레이드(3.6 -> 3.7)를 시도했다. 모든 것이 잘 흘러갔지만, seaborn을 import하는 단계에서 import error를 마주하게 되었다. 에러 메시지는 항상 설렌다.
위와 같은 오류 메시지는 사라져서 다른 패키지(numpy, matplotlib 등)들과 seaborn을 함께 import해서 오류난 메지지가 아래와 같다.
ImportError Traceback (most recent call last)
<ipython-input-2-d2e7a3f2c9b4> in <module>
2 import numpy as np
3 import matplotlib.pyplot as plt
----> 4 import seaborn as sns
5 get_ipython().run_line_magic('matplotlib', 'inline')
~\Anaconda3\lib\site-packages\seaborn\__init__.py in <module>
4
5 # Import seaborn objects
----> 6 from .rcmod import *
7 from .utils import *
8 from .palettes import *
~\Anaconda3\lib\site-packages\seaborn\rcmod.py in <module>
3 import functools
4 import matplotlib as mpl
----> 5 from . import palettes, _orig_rc_params
6
7
~\Anaconda3\lib\site-packages\seaborn\palettes.py in <module>
10 from .external.six.moves import range
11
---> 12 from .utils import desaturate, set_hls_values, get_color_cycle
13 from .colors import xkcd_rgb, crayons
14
~\Anaconda3\lib\site-packages\seaborn\utils.py in <module>
5
6 import numpy as np
----> 7 from scipy import stats
8 import pandas as pd
9 import matplotlib as mpl
~\Anaconda3\lib\site-packages\scipy\stats\__init__.py in <module>
377 from __future__ import division, print_function, absolute_import
378
--> 379 from .stats import *
380 from .distributions import *
381 from .morestats import *
~\Anaconda3\lib\site-packages\scipy\stats\stats.py in <module>
180 import scipy.special as special
181 from scipy import linalg
--> 182 from . import distributions
183 from . import mstats_basic
184 from ._stats_mstats_common import (_find_repeats, linregress, theilslopes,
~\Anaconda3\lib\site-packages\scipy\stats\distributions.py in <module>
8 from __future__ import division, print_function, absolute_import
9
---> 10 from ._distn_infrastructure import (entropy, rv_discrete, rv_continuous,
11 rv_frozen)
12
~\Anaconda3\lib\site-packages\scipy\stats\_distn_infrastructure.py in <module>
22
23 # for root finding for discrete distribution ppf, and max likelihood estimation
---> 24 from scipy import optimize
25
26 # for functions of continuous distributions (e.g. moments, entropy, cdf)
~\Anaconda3\lib\site-packages\scipy\optimize\__init__.py in <module>
389
390 from .optimize import *
--> 391 from ._minimize import *
392 from ._root import *
393 from ._root_scalar import *
~\Anaconda3\lib\site-packages\scipy\optimize\_minimize.py in <module>
28 from ._trustregion_krylov import _minimize_trust_krylov
29 from ._trustregion_exact import _minimize_trustregion_exact
---> 30 from ._trustregion_constr import _minimize_trustregion_constr
31
32 # constrained minimization
~\Anaconda3\lib\site-packages\scipy\optimize\_trustregion_constr\__init__.py in <module>
2
3
----> 4 from .minimize_trustregion_constr import _minimize_trustregion_constr
5
6 __all__ = ['_minimize_trustregion_constr']
~\Anaconda3\lib\site-packages\scipy\optimize\_trustregion_constr\minimize_trustregion_constr.py in <module>
2 import time
3 import numpy as np
----> 4 from scipy.sparse.linalg import LinearOperator
5 from .._differentiable_functions import VectorFunction
6 from .._constraints import (
~\Anaconda3\lib\site-packages\scipy\sparse\linalg\__init__.py in <module>
114 from .dsolve import *
115 from .interface import *
--> 116 from .eigen import *
117 from .matfuncs import *
118 from ._onenormest import *
~\Anaconda3\lib\site-packages\scipy\sparse\linalg\eigen\__init__.py in <module>
9 from __future__ import division, print_function, absolute_import
10
---> 11 from .arpack import *
12 from .lobpcg import *
13
~\Anaconda3\lib\site-packages\scipy\sparse\linalg\eigen\arpack\__init__.py in <module>
20 from __future__ import division, print_function, absolute_import
21
---> 22 from .arpack import *
~\Anaconda3\lib\site-packages\scipy\sparse\linalg\eigen\arpack\arpack.py in <module>
43 __all__ = ['eigs', 'eigsh', 'svds', 'ArpackError', 'ArpackNoConvergence']
44
---> 45 from . import _arpack
46 import numpy as np
47 import warnings
ImportError: DLL load failed: 지정된 프로시저를 찾을 수 없습니다.
구글과 stack overflow에 많은 검색을 해서 다음과 같은 솔루션을 발견했지만 모두 실패했다.
- 아나콘다 삭제 후 재설치
- 아나콘다 재설치 시 관리자 권한으로 실행
- 커맨드 창에서 seaborn 삭제 및 재설치 (conda로 하기, pip으로 하기)
- 환경변수에 path 추가하기
- 아나콘다 홈페이지에서 seaborn 검색해서 DLL 파일 다운로드 받아 내 컴에 복사하기
- 등등등
위 많은 방법들이 모두 실패했다.
한 가지 재미있는 이상한 현상은 내가 원하는 폴더에서 jupyter notebook을 실행하면 seaborn import error가 발생하는데, "시작 - Anaconda3 - Jupyter Notebook(Anaconda3)"를 관리자 권한으로 실행하면 seaborn import error가 나타나지 않았다. 그래서 권한 쪽 문제라고 생각하고 시간을 낭비했다.
해결방법은 numpy, scipy 삭제 후 재설치였다.
사실 위 import error 메시지를 잘 살펴보면 scipy에 뭔가 문제가 있음이 나타난다. 에러 메시지가 무슨 말인지 잘 모르겠지만 유난히 scipy 관련 내용이 많다.
---> 7 from scipy import stats
---> 24 from scipy import optimize
---> 4 from scipy.sparse.linalg import LinearOperator
scipy 재설치를 권장하는 솔루션을 제시한 사람이 numpy도 함께 해줄 것을 권장했다.
삭제할 때 --force 옵션의 역할은 다음과 같다. "Forces removal of a package without removing packages that depend on it.Using this option will usually leave your environment in a broken and inconsistent state"