TL; DR

일단 솔직히 원인을 잘 모릅니다. 다른 블로그 찾아보세요 :( ....

요기가 좋아 보이네요: https://www.tabida.pe.kr/58   
특히 검색 인덱싱 속도를 높이기 위해 "그룹 정책"에 들어가서 "PC를 사용 중이더라도 최고 속도 인덱싱" 옵션을 켜는 것이 인상적입니다. 저는 아직 못 써봤지만...

저의 경우는 PC 포맷 후 수많은 메일이 들어있는 메일 계정 로그인을 해 뒀을 때, 인덱싱이 매우 오래 걸릴 (이건 메일이 많으면 어쩔 수 없다네요.) 뿐더러 인덱싱 중인데 메일 검색을 시도했을 때 검색 결과로 최근 메일 일부만 뜨는 문제였습니다.

<Outlook 옵션 - 검색>에서 "가능한 경우 쿼리 입력시 결과 표시" 옵션꺼서, 인덱싱 결과를 쓰지 않고 검색하도록 하여(?) 문제를 우회했습니다.

아직 인덱싱 진행 중이라는 오류 메시지가 안 떴는데, 앞선 글처럼 비정상적인(?) 방법으로 계정 추가를 해서 그럴지 모르겠네요.

 

겪은 문제 증상

"인덱싱이 안 되었다"고 오류 메시지가 뜨지는 않으나, 결과 몇 개만 나오고 전체 결과는 안 나오는 상태였습니다. 인덱싱이 잘 안 되고 있는 상태였는데요.

  • 인덱싱 상태를 보면 수만 건 메일 항목이 인덱싱을 기다리고 있다고 나타났습니다. 어림짐작이지만 10초당 100건씩 줄어드는 것 같았어요.
* 인덱싱 상태 보기

아웃룩 프로그램에서 검색란을 클릭하면, 위의 리본 메뉴에 [검색] 탭이 생깁니다.
클릭한 뒤 [검색 도구] > [인덱싱 상태]를 차례로 누르면 현재 인덱싱 프로그램이 뭘 하고 있는지 나옵니다.

알아서 새로고침되지 않으니, 인덱싱이 되어서 갯수가 줄긴 하는지 보려면 조금 있다가 직접 인덱싱 상태 창을 다시 열어주어어 합니다...

[인덱싱 상태] 메뉴 위치
지금은 인덱싱이 끝났지만...

해결 아니고 우회 방법

파일 - 옵션 - 검색으로 들어가서 "가능한 경우 쿼리 입력시 결과 표시" 옵션껐습니다. 인덱싱 결과를 쓰지 않고 검색하도록 하는 것 같은데요, 요렇게 하니까 검색이 되기는 되더라구요.

다만 인덱싱 결과를 안 쓰니 검색 속도가 느려진다고는 하는데... 일단 검색 되는게 우선이죠.

 

실패한 도전

  • 메일함 파일 깨져서 색인이 안 되나 해서 MS오피스 프로그램 폴더에 있는 "ScanPST.exe" 프로그램을 돌려봤습니다. 항목 몇 개가 손상되었고 고쳤다고 했지만, 인덱싱 속도 개선에는 별 소용이 없더군요. 아니... 방금 로그인했는데 손상된 항목이 있다고요???

    "ScanPST.exe"는 "C:\Program Files\Microsoft Office\root\Office16\"에 있었습니다.
    64비트 OS, 32비트 오피스이면 "Program Files" 폴더 대신 "Program Files (x86)" 폴더에서 찾아주세요.
  • 아웃룩 검색 옵션에서 "표시되는 결과 수를 제한하여 검색 속도 높이기" 옵션을 먼저 꺼 봤지만 소용이 없었습니다.

 

 

 

가지 않은 길

  • 정 인덱싱이 안 되면 "인덱스 재생성", 또는 아예 윈도 인덱싱 서비스를 포기하라고도 하더군요. 아무리 그래도 그건...
  • 방금 찾아보니 PC 사용 중일 때 인덱싱 속도를 늦추지 않도록 하는 옵션이 있다고 하네요..

 

반응형
IMAP/SMTP 로그인할 때 메일 계정 전체 말고 메일 아이디만 써야 하는데,

2019 로그인 화면에서는 "로그인 아이디" 입력란이 없어졌어요 :(

Outlook 2019 로그인 화면 중 IMAP 상세 설정 화면... 로그인 계정 입력란 어디?

대신 이렇게 해 보세요.

# 아예 레지스트리 설정값을 고쳐서 예전 설정 창으로 되돌리는 방법이 있다고 합니다:

https://answers.microsoft.com/ko-kr/msoffice/forum/msoffice_outlook-mso_other-mso_2016/%ec%95%84%ec%9b%83%eb%a3%a9-2016/50a8a449-982b-42ad-814b-87b53d866bcb
https://support.microsoft.com/en-us/help/3189194/how-to-disable-simplified-account-creation-in-outlook

레지스트리 편집기에서 (시작 - 실행 - regedit),
* HKEY_CURRENT_USER\Software\Microsoft\Office\16.0\Outlook\Setup\ 경로로 찾아 들어가서,
* (트리 오른쪽 빈 창에) 오른쪽 클릭 - [새로 만들기 - DWORD(32비트) 값] 클릭하고
* 항목 이름은 "DisableOffice365SimplifiedAccountCreation"으로, 1로 설정!

편집기를 끄고 Outlook을 다시 실행하면 예전 창으로 계정 생성이 가능하다고 하네요. 정말 됩니다.
  • 제어판 (윈도 10 설정 말고) > 사용자 계정 > Mail 로 들어가서

 

 

  • [전자 메일 계정] 버튼을 눌러 아웃룩 계정 설정 창을 띄우고

  • [전자 메일] 탭에서 [새로 만들기...] 버튼을 누르고 계정을 추가하세요.

예전 아웃룩 2016까지 쓰던 창이 나타나고요. IMAP 계정 상세 설정 창까지 가면 "로그인 계정" 입력란이 있습니다.

 

Outlook 2016까지 보던 상세 설정창이 반겨줍니다. 로그인 계정 입력란도 있네요!

 

 

아웃룩 프로그램 실행 중에, 위 방법으로 새 계정을 추가했는데 새 계정에서 메일 발송이 안 되면

아웃룩 프로그램을 껐다 켜 보세요.

아웃룩 프로그램이 떠 있는 상태에서 위 방법으로 새 계정을 추가했다면, 동기화할 폴더 목록에 새 계정의 폴더가 들어있지 않을 수 있습니다. 이 경우 [보내기/받기]를 백날 눌러봐야 소용이 없습니다.

 

반응형

이런 글 있는 줄 알았으면 삽질 덜 했지...

알아두면 쓸데없는 배경 설명

Let's Encrypt (이하 LE)웹서버를 위한 무료 SSL 인증서 서비스입니다. 무료니까 3개월마다 갱신해야 하고 (자동 갱신 툴 이용하면 괜찮...) 사고 났을 때 어떤 보상도 못 받지만, 무료니까...

그런데 지난 2018년 초에 서버 인증 방식 중 하나인 TLS-SNI-01 방식이 보안 취약점으로 인해 폐기 수순에 돌입했고, 2019년 2월 부로 LE 서비스에서도 완전히 지원 중단되었습니다.

문제는 TLS-SNI-01 방식이 당시 HTTPS 포트만으로 인증이 가능한 유일한 방식이었다는 점입니다. 만약 HTTPS 포트만 열려있고, 1. DNS 서버를 건드릴 수 없는데다, 2. HTTP(80번) 포트도 열 수 없는 상황이라면 답이 없죠.

그 대신 TLS-ALPN-01이라는 HTTPS 포트만으로 인증받는 새 표준이 작년 하반기에 준비되고, 각종 자동 인증 도구 및 LE에서 지원을 시작한 모양입니다. 문제는 가장 널리 쓰이는 Certbot 도구는 아직 지원을 안 한다는 것...

대신 Dehydrated 및 Nginx 최신 버전을 이용해 TLS-ALPN-01 방식으로 인증서를 받아와 보겠습니다.

목표는,

  • Certbot에서 Dehydrated로 인증 도구 갈아타기
  • 무중단 인증서 갱신을 위해, Nginx의 load balancer 이용하기로 함 (Dehydrated의 TLS-ALPN-01 + Nginx 설명 따름)

Nginx 설정 변경

  1. Nginx 공식 저장소의 mainline 버전으로 갈아타기

우분투 18.04 저장소의 nginx는 지원을 안 하는 것 같아서...

  • 공식 저장소 추가
  • 저장소 인증키 추가
  • 설치!
  • 프록시 설정

nginx.conf 하단에 한 줄 붙이고,

include /etc/nginx/tls_alpn_proxy.conf;

tls_alpn_proxy.conf 파일을 만들고 내용으로 아래와 같이...

stream {
  map $ssl_preread_alpn_protocols $tls_port {
    ~\bacme-tls/1\b 127.0.0.1:10443;
    default 127.0.0.1:4433;
  }

  server {
    listen 443;
    listen [::]:443;

    proxy_pass $tls_port;
    ssl_preread on;
  }
}

(TODO 왜 127.0.0.1 붙여야 하지...)

  1. 원래 서버 설정 고치기

원래 443 포트로 서빙하던 것을 4433 포트로 고쳐두고

  1. 설정 파일 문법 검사 후 적용

nginx -t
systemctl reload nginx

Dehydrated 설치 및 설정

  1. Dehydrated 설치

사실 그냥 셸스크립트라 설치라고 할 것이 없고...

GitHub 저장소 clone!

그리고 저장소의 tls-alpn-01 지원 글 참고해서 응답기 역할하는 Python 스크립트도 준비!

  1. 설정 폴더 및 파일 생성

$ mkdir /etc/dehydrated
$ cp <path/to/tool>/docs/example/config /etc/dehydrated/config

복사한 설정 파일을 열어서

CA -- 일단 테스트용 staging 서버로 변경
CHALLENGETYPE -- tls-alpn-01로 설정

/etc/dehydrated/domains.txt 파일 만들고 그 안에 서버 도메인 주소 입력!

  1. Nginx 설정...은 아까 했고...

  2. 잘 돌아가는지 테스트!

등록키 받아오고

$ <path/to/tool>/dehydrated --register --accept-terms

응답기 역할을 할 Python 스크립트 실행시켜두고

$ python3 <path/to/responder>

인증서 생성!(-c 또는 --cron 하면 알아서 생성/관리 작업 수행)

$ <path/to/tool>/dehydrated -c

  1. 실제 인증서 받아오기

설정 파일을 다시 열어서 staging 서버에서 실제 서버 주소로 되돌려놓고,

$ <path/to/tool>/dehydrated --register --accept-terms
$ <path/to/tool>/dehydrated -c

한 번 더 해주면 /etc/dehydrated/certs/<domain>/에 인증서가 똭!

아까 띄워둔 Python 응답기는 이제 꺼도 되겠죠.

  1. Nginx 설정 고쳐서 새 인증서 쓰도록 변경

Certbot과 파일 이름은 같고, 경로가 /etc/letsencrypt/live/<site>/에서 /etc/dehydrated/certs/<site>/로 바뀌었습니다.

$ nginx -t
$ systemctl reload nginx

하면 마무리됩니다.

Cron 작업에 추가하기

아래와 같은 스크립트를 만드세요.

#!/bin/bash

python3 <path/to/responder> &
PID_RESP=$!

<path/to/tool>/dehydrated -c -k <path/to/hook> | logger -t dehydrated

kill $PID_RESP
  • 위 스크립트에서 | logger -t dehydrated는 데비안/우분투 기준으로 시스템 로그에 메시지 남기려고 두었고, /etc/rsyslog.d/etc/logrotate.d/ 안의 파일을 수정해서 syslog 대신 별도 로그 파일에 기록되게 만들 수 있겠습니다.

위에 "hook" 이야기가 있는데, 인증서 갱신될 때 Nginx가 설정을 (=인증서를) 다시 가져오게 (reload) 해야 합니다.
그러니 아래와 같은 hook 스크립트를 만드세요. 공식 샘플 참고.

#!/usr/bin/env bash

deploy_cert() {
    local DOMAIN="${1}" TOKEN_FILENAME="${2}" TOKEN_VALUE="${3}"

    echo "* Hook: reloading Nginx settings..."
    systemctl reload nginx
}

HANDLER="$1"; shift
if [[ "${HANDLER}" =~ ^(deploy_cert)$ ]]; then
  "$HANDLER" "$@"
fi

(사실 hook 스크립트에 startup_hook, exit_hook 이용해서 응답기 켜고 끄면 되긴 하겠네요...)

마지막으로 Certbot에 대해 했듯이 Cron 작업으로 만들면 되겠습니다.

$ crontab -e

0 4 * * 1 <path/to/cron_script> >/dev/null

끝!

곧 Certbot이 지원하게 되면 다 헛짓거리 되겠지만, 어쨌든 끝!

Apache는 다른 멋진 방법으로 잘 하실 수 있겠죠.

반응형

리눅스 컴퓨터에 로그 메일 설정했더니 아래와 같은 메시지가 날아온다면...

/etc/cron.daily/logrotate:
gzip: stdin: file size changed while zipping

요기를 참조해서 logrotate 설정에 delaycompress 옵션을 넣어둡시다.

(링크한 글에 안내된 절차, 아래 설명 및 경로는 데비안/우분투 기준)

  1. /var/lib/logrotate/status 파일을 열어서, 위 그림과 같은 메시지가 날아온 로그 발신자를 추적합니다. 내 경우는 apache2, sambad, rspamd.
  2. /etc/logrotate.d/에 있는 설정 중 위에서 찾은 발신자의 설정을 열어봅니다.
  3. 이 중 compress만 있고 delaycompress가 없는 설정 그룹을 찾아 delaycompress를 넣어줍니다. 끝.

delaycompress를 넣어주면 로그 파일을 먼저 보관 처리한 후에 압축을 진행하나 봅니다. 아래 설명에 따르면 보관 처리 중인 파일임에도 거기다 계속 쓰려는 대몬이 있다네요.

Postpone compression of the previous log file to the next rotation cycle. This only has effect when used in combination with compress. It can be used when some program cannot be told to close its logfile and thus might continue writing to the previous log file for some time.

반응형

MS 파워포인트 슬라이드쇼 화면에서,

  • 터치 되는 노트북을 갖고 계시면

    • 좌우로 스와이프해서 슬라이드를 넘길 수 있고 (살짝만 밀어도 넘어갑니다!)
  • 디지타이저 펜 (서피스 펜, 와콤 펜 (삼성 S펜 등)) 지원 노트북을 갖고 계시면

    • 슬라이드에 바로 펜 필기를 할 수 있습니다!

스와이프로 넘기기, 슬라이드에 바로 펜 필기하기 기능 각각은 참 좋은 기능인데요,

N-Trig 펜을 탑재한 서피스 프로 시리즈에서는 두 기능이 함께 쓰일 때 끔찍한 재앙이 됩니다.

서피스 프로 >= 3 문제

서피스 펜은 무슨 이유에서인지 호버링 거리(= 화면에서 얼마나 멀어질 때 펜 인식을 멈출 지)가 매우 짧습니다. (TODO 정확한 거리는 모르겠네요.)

펜이 멀어지면 그 때부터 화면 터치를 인식하여 처리하는데요, 문제는 펜 인식 거리가 워낙 짧은데 화면을 살짝만 밀어도 슬라이드를 넘길 수 있다 보니...

필기 중 펜 위치를 옮길 때 의도치 않은 슬라이드 넘김 동작이 일어나는 일이 심심치 않게 벌어집니다!!

의도치 않은 필기 획이 그려지는 문제는 거의 없는 듯 합니다. 팜 리젝션 (= 펜 필기 중 화면에 닿은 손을 터치 동작으로 인식하는 문제) 기능은 그럭저럭 잘 되는 듯 합니다. 대부분의 윈도 펜 필기 앱이 화면 터치로 필기 기능을 비활성화하고 있는 것도 한 가지 이유인 것 같습니다.

서피스로 멋진 발표 -- 절망 편

웹 검색을 해 보시면, MS 지원 포럼 및 각종 커뮤니티에서 위 동작으로 고통받는 사람들을 쉬이 찾아보실 수 있습니다. 다만 MS에서는 해결해 줄 생각이 없는 듯 하네요.

서피스 펜 호버링 길이를 조절할 수 있게 되거나 (서피스 프로 6에서는 나아지겠죠?),

파워포인트 슬라이드쇼 설정에서,

  • 스와이프로 슬라이드 넘김 동작 비활성화
  • 스와이프 인식 길이 사용자 지정 이 가능해야 할 것 같으나, 서피스 프로 3가 팔리던 2015년에도, 현재 2018년에도 변화는 없습니다.. 피드백 허브에 글을 한 번 써 보면... 안 들어주겠죠?

이 중 어떤 기능도 없습니다.

고심 끝에 터치 스크린을 해체...

현 상황에서 무식하지만 가장 완벽한 해결책은 바로 터치 스크린을 아예 꺼버리는 것이겠습니다.
How to disable the touch screen on your Windows 8.1 laptop

위 링크를 참조하셔서, 장치 관리자를 여신 뒤 휴먼 인터페이스 장치 범주 밑의 HID 규격 터치 스크린비활성화해주면 되겠습니다. (지우면 다음 재부팅 때 다시 살아납니다.) 나중에 다시 활성화하면 터치 기능이 돌아오겠고요.

펜으로 마우스 클릭/터치 입력을 대신할 수 있기 때문에 터치 스크린을 비활성화해도 노트북 사용은 여전히 가능합니다. 터치 기능 얻기 위해 들인 돈이 아까울 뿐.

반응형

Jupyter 노트북 파일은 무식하게 요약하면,

  • 소스 코드
  • 마크다운 문서
  • 실행 결과
    들이 각각 셀 단위로 묶인 XML 문법 파일이라고 할 수 있습니다.

이에 따라 버전관리 툴의 일반적인 비교, 병합 툴로는 노트북 파일을 어떻게 효율적으로 저장할 지 알 길이 없습니다.
예를 들어, 소스코드 변경사항만 저장하고 싶은데, 비교 툴은 어디가 소스이고 어디가 실행결과인지 모르니 그렇게 안 된다는 거죠.

이를 해결하기 위해 nbdime 플러그인을 사용해볼 수 있습니다. 노트북 문서를 소스코드 (및 문서 셀) 위주로 비교, 병합하는 기능을 제공하는 플러그인인데요. 문제가 있습니다...

  • 개발 진척도가 그리 빠르지는 않은 것 같고...
  • 비교, 병합 속도가 느으으리며...
  • 출력 셀 비교, 병합은 개발 목표가 아니라고 하며...
  • JupyterLab이라고 해서 다음 세대 버전 나온다는데, 걔는 이 플러그인이 지원하지 않겠지...딱히 상관 없는 것 같네요.

따라서, 프로덕션 수준은 아닌 것 같으니 각자 목적에 맞는지 시험 사용을 해 본 후 본격적으로 써 보시기 바랍니다.

GitHub 저장소
공식 문서

설치

설명서에 나와 있는 대로 pip install nbdime, 또는 Anaconda 환경이라면 conda install -c conda-forge nbdime하면 됩니다.

Git 연동

nbdime를 쓰려는 Git 저장소 디렉토리에서 nbdime config-git --enable 하면 됩니다.
.gitattributes 파일 및 git config -l 명령 결과에서 정상 적용 여부를 확인할 수 있다고 하네요.

반응형

2017년 8월자 Insider Preview 버전부터 (RS3; 2017 Fall Creator Update) Xilinx Vivado (2017.x) 실행이 안 되는 문제가 발생했다.

공식 포럼 등에서도 비슷한 문의가 나왔으나 해결책 답변은 없었던 상황에서...

몇 주 전 공식 지원 페이지에 임시 해결책이 업로드된 것을 뒤늦게 발견했다.

2017.3 - Vivado does not launch with Windows 10 Fall Creators Update

여기 안내된 해결 방법은,

  1. Navigate to (Vivado Installed Directory)\2017.3\bin\unwrapped\win64.o
  2. Backup 'vivado.exe' by renaming it to 'vivado.exe.backup'
  3. Copy 'vivado-vg.exe' and paste it into the same folder.
  4. Rename 'vivado-vg - Copy.exe' to 'vivado.exe'

그렇다. 실행 파일 하나 지우고, 다른 파일로 대체하는 것. Windows 최신 버전에서 틀어막은 기능을 Xilinx 개발자들이 쓰고 있었나 보다.

반응형

Caffe-TensorFlow 사용법

요새는 TF도 Model Zoo가 잘 갖춰져 있어서 의미는 없지만, Caffe의 (주로 CNN) Model을 TF로 변환해 주는 좋은 도구이다.
물론 모든 모델을 변환할 수는 없는 노릇이다. 코드 업데이트가 멈춘 지 조금 되었기에 최신 레이어는 지원이 안 되고, 오래 된 레이어라고 다 되는 것도 아닌 것 같다. 따라서 사용 전에 README, GitHub issue란을 잘 살펴보아야 의미 없는 노력을 피할 수 있겠다.
GitHub 저장소

그러나, 변환된 모델이 원래 모델의 정확도를 달성하지 못해서 아직까지는 헛짓거리가 되었다...

설치

  • 깃 저장소에서 소스코드 받아오고..
  • PyCaffe 설치하면 좋지만 건너뛰어도 돌아는 가고..
  • TensorFlow 환경을 갖춰준다: Anaconda 사용자라면 TF가 깔린 환경을 activate해 준다

사용 전 코드 수정

Py2, TF 1.0, protocol buffer 예전 버전 (?) 환경에서 작성된 것으로 보인다. Py3, TF 1.2+, protocol buffer 1.2+에서 사용하려면 몇 가지 수정이 필요하다. 주먹구구로 수정한 코드는 아래와 같다.

(TODO link to patch file)
$ git apply {patch file}

사용법

먼저 Caffemodel, model description 파일을 준비한다.
그 다음, 본 프로젝트 루트에서 아래 명령을 실행하면 된다.

$ ./convert.py --caffemodel <path/to/caffemodel> --data-output-path <path/to/output/model.npy> --code-output-path <path/to/otuput/model.py> <path/to/model/description/file>

요렇게 하면 model parameter를 담는 numpy data 파일과 layer 구조를 정의하는 python code 파일이 생성된다.
프로젝트에 함께 들어있는 TF 코드를 통해 (./kaffe/tensorflow/) 돌려볼 수 있으나, 요걸 쓰는 대신 직접... 모델 코드를 작성했다.

ImageNet / AlexNet

ILSVRC '12 training/test 데이터

올바르게 불러오는 방법은 대체 무엇일지...
요전에 TF 공식 저장소의 Inception network 예제에서 가져온 ImageNet data reader는 Caffe에서의 데이터 가공법과 많이 다른지 모델 정확도가 올라오질 않았다. 내가 코드를 잘못 다뤘겠지만!

대신 DoReFa-Net 코드 찾다가 겸사겸사 본 TensorPack의 data reader를 사용했다. 문제는 Caffe 모델, caffe-tensorflow 코드 저자의 시험 결과보다 모델 성능이 1% 적게 나와서 고민. 편의상 TensorPack data source가 가져온 데이터를 placeholder에 feed dict로 넣는 원시적이고 성능 낮은 방법을 써서 또 고민.

그냥 feeddict에 넣는 대신 Tensorpack과 Multigpu를 활용한 빠른 트레이닝 코드 작성하기 글을 참조해서 TF Queue를 씁시다..

  • tensorpack 설치

  • imagenet dataset 다운로드

  • tensorpack 문서에 따라 dataset 재가공

    • 아래와 같은 코드로 이미지들을 lmdb 포맷으로 (또는 TensorPack가 지원하는 다른 포맷) 압축

      class BinaryILSVRC12(ILSVRC12Files):
      def get_data(self):
      for fname, label in super(BinaryILSVRC12, self).get_data():
          with open(fname, 'rb') as f:
              jpeg = f.read()
          jpeg = np.asarray(bytearray(jpeg), dtype='uint8')
          yield [jpeg, label]
      ds0 = BinaryILSVRC12('/home/dataset/imagenet/', 'val')
      ds1 = PrefetchDataZMQ(ds0, nr_proc=1)
      dftools.dump_dataflow_to_lmdb(ds1, '/home/dataset/imagenet/lmdb/orig/ILSVRC-val.lmdb')
      
    • 요 코드를 실행하면 수 시간 후에 lmdb 파일 생성해 줌.

  • data source 코드 작성 -- 입력 파이프라인 연결 : 읽어서 > 순서 섞고 > 필요한 이미지 가공 (주변부 자르기, 평준화 등) > 준비!

다른 AlexNet 모델 실패기

  • 구글에서 alexnet tensorflow 치면 나오는 모델도 있는데... 위의 예전 data reader 문제와 맞물려 정확도가 안 나와서 실패...

그러나...

얻은 Top-5 정확도

(오른쪽은 Caffe-TF README.md에 언급되어 있는, 제작자가 달성한 정확도)

  • CaffeNet: 78% < 79.93%
  • VGG-16: 88% < 89.88%

왜... 낮지...

반응형

설치 환경

  • Intel i7-7700K, DDR4 32G, ASUS Prime Z270-A, Nvidia GTX1080Ti, 960Evo, 4TB HDD

배포판, 데스크톱 환경, 에디션 결정

Arch / Manjaro -- 자유도 극강, 무조건 최신 버전! / 꼬이면 답 없음
Ubuntu / Debian -- 편리, 문제해결도 편리 / 공식 저장소 패키지는 좀 된 버전

GNOME2 MATE -- 가볍다 / 옛날 거다
LXDE, XFCE -- 가볍다 / 기본 상태는 안 예쁘다
Ubuntu Unity -- 버려졌다

Server edition -- 가볍다 / X11, DE 직접 설치해야 한다 -- 망하기 딱 좋다
Desktop edition -- 뭐가 이것저것 많다, Ubuntu는 쓸데없는 Avahi 네트워크 공유 도구가 기본 활성화인 등

이 중, Ubuntu MATE 16.04.3 64-bit Desktop edition을 골랐다. 이유는 데스크탑 환경이 가벼워서.

OS 설치

Debian / Ubuntu, 심지어 Manjaro도 설치는 어렵지 않다. 설치 이미지를 Rufus 같은 툴로 USB에 굽고 (멀티부팅하려면 YUMI가 좋았었다)
UEFI 설정 잡은 후 부팅해서 하라는 대로 마우스 클릭하면 끝.

파티션 결정하기

  • UEFI 기준으로 EFI (FAT32), boot (EXT4), root(/) (EXT4, btrfs), swap 파티션이 필요하다.
  • 홈은 (/home) 따로 떼어내면 좋고

근본 없는 적정 크기

  • EFI <256M; grub 또는 Windows 부트로더 정도, 사실 Clover 같은 것 깔지 않으면 100M도 사치이다
  • boot >512M; 재시작, 청소 없이 커널 업데이트가 여러 번 이어지면 부트 파티션이 가득찬다...
  • swap (마음대로) 요새는 없어도 된다 하지만, SSD 낭비이지만 물리 RAM과 같은 크기로 잡아줬다. RAM 용량이 그리 많지는 않아서...

btrfs vs. EXT4

  • HDD에서 btrfs는 재앙인 것 같다. 특히 스냅샷을 적극 활용한다면.
  • 그렇지만 SSD에서는 이제는 안정된 최신 파일 시스템인 btrfs를 써야 하지 않나.
  • 하지만 나만 쓰는 환경이 아니니 EXT4로...

백업 문제

  • btrfs + snapper를 통한 스냅샷 이용 백업본 관리는 저번에 HDD에 했을 때 끔찍하게 실패했었다. 뭘 잘못했을까?

TODO Ubuntu 16.04.3 LTS Skylake / Kabylake 호환성 문제 회피

  • Ubuntu Live USB조차 부팅이 안 되는 상황
  • grub에서 부팅 명령 편집 화면으로 들어가서 ''nomodeset pci=nomsi pcie_aspm=off'' 옵션을 주어서 부팅시켰다
  • 추후 ''/etc/default/grub'' 옵션 설정하여 플래그 고정해 둠. 혹시 커널 업데이트하면 옵션 없어도 괜찮은 것 아닐까

첫 부팅

  • 우선 ''sudo apt update; sudo apt upgrade'' 한 번 더.

드라이버 설치

Nvidia 공식 드라이버 설치를 위해 저장소를 추가해서 nvidia-387 (설치 당시 최신) 패키지를 설치했다. ''intel-microcode''도 설치했다.

GRUB 설정

''/etc/default/grub'' 파일을 열어서 ''OPTION''에다 ''nomodeset pci=nomsi pcie_aspm=off acpi_enforce_resources=lax panic=60'' 문구를 추가했다.

  • ''nomodeset'': 부팅 시 메시지 보기 위해 quiet splash 대체
  • ''pci=nomsi pcie_aspm=off acpi_enforce_resources=lax'': 카비레이크 호환성 문제 회피, 마지막 항목은 온도 센서 인식 위해
  • ''panic=60'': 프로그램의 리소스 과다 소모, CPU 과열 등으로 인해 커널 패닉 발생 시, 60초 후 재시작 이후 ''sudo update-grub'' 해서 새로운 설정 적용.

swappiness 설정 조정

여유 메모리 용량 비율이 어느 값 이하일 때 스왑 메모리 공간을 사용할 지 지정하는 값이다. 기본 swappiness가 10이면 좋겠지만, 가끔 또는 예전 OS에서는 60으로 잡혀있다. 이 대신 10, 아니 1로 잡아본다.

  • ''/etc/sysctl.conf'' 파일을 열고, 마지막 줄에 ''vm.swappiness = 1''이라고 적어 준다.

SSH 접속 포트 추가하기

원래는 iptables 통해 해야 하지만, 정 귀찮으면 보안을 포기하고 ''/etc/ssh/sshd_config''에 추가 포트를 지정해줄 수 있다.
이후 ''sudo systemctl reload sshd'' 해 준다.

고정 IP 설정

데스크탑 환경을 설치했으니 GUI 상에서 설정해도 되지만, ''/etc/network/interfaces'' 파일에 직접 설정해 본다. 예전엔 이더넷 장치 이름이 항상 eth0이었는데, 요새는 ''enp3s0''이니 무슨 이상한 이름으로 잡힌다. 유의할 것.

보안 업데이트 자동화

모든 업데이트를 자동화하면 툴끼리 버전이 안 맞아서 손이 많이 갈 수 있다. 보안 업데이트 정도만 자동화하는 걸로.

  • ''sudo update-alternatives --config unattended-upgrade''한 뒤 ''/etc/apt/apt.conf.d/'' 경로의 파일을 입맛에 맞게 조정해 줄 수 있다.

계정 기본 환경 파일

  • ''/etc/profile.d/'' ''profile'' 이름이 익숙한데, 로그인 시 전역 레벨에서 호출되는 스크립트 모음이다.
  • ''/etc/skel/'' ''adduser'' 명령으로 계정을 만들면서 홈 디렉토리도 만들게 하면, 이 경로의 파일로 내용을 채워준다.

로그인 메시지 변경

''/etc/update-motd.d/'' 디렉토리에 가면, 로그인 시 보이는 메시지를 만들어주는 스크립트가 있다. 지겨운 우분투 홈페이지 URL 주소나 새 소식 홍보를 여기서 삭제할 수 있다.

Postfix ''Satellite'' 모드로 설정하기

같은 서브넷 상에 메일 서버가 있는 경우, 해당 메일로 관리 메시지를 전송하려면 복잡한 메일 서버 설정 없이 ''satellite'' 모드로 설정해 주면 보내려는 메일을 곧장 릴레이해 준다. 스팸 메일 차단을 위해 릴레이는 외부 전송이 안 되니 유의.

Avahi 데몬 죽이기

괜히 데스크톱 버전으로 설치해서 로컬 네트워크 주위의 컴퓨터의 공유 자원을 검색하는 Avahi 서비스가 작동한다.

sudo service avahi stop
sudo systemctl disable avahi-daemon.service
sudo systemctl disable avahi-daemon.socket
꺼지는 것 맞겠지?

툴 설치

EDA 툴

Synopsys 툴

  • 함께 제공되는 설치 프로그램을 어디다가 잘 풀어둔 다음에
  • 설치하려는 툴의 패키지가 들어있는 경로를 ''installer'' 실행 후 입력, 또는 ''batch_installer''에 매개 변수로 주어 실행
  • 레드햇 리눅스 환경에 맞춰져 있어서, 그냥 실행하면 오류가 발생한다.

    • ''libxss1 libsm6 libice6 libxft2 libjpeg62 libtiff5 libmng2 libpng12-0 csh'' 패키지를 설치한 후 아래 명령을 수행해준다.

      sudo ln -s /usr/lib/x86_64-linux-gnu/libtiff.so.5 /usr/lib/x86_64-linux-gnu/libtiff.so.3
      sudo ln -s /usr/lib/x86_64-linux-gnu/libmng.so.2 /usr/lib/x86_64-linux-gnu/libmng.so.1
      sudo update-alternatives –install /bin/sh sh /bin/bash 20

    • 세 번째 줄을 실행해 주면 실행 스크립트 돌릴 때 셸 문법 호환성 오류가 발생하지 않는다

Cadence 툴

  • 설치를 수행하기 위해, ''libxtst6:i386 libxext6:i386 libxi6:i386 ksh'' 패키지가 필요하다.
  • 또한, 루트 계정으로 실행하는 경우 루트 계정에 ''export XAUTHRITY=~/.Xauthority'' 명령을 주어서 설치 프로그램 GUI가 잘 뜨게 한다.

개발 도구: Bazel

  • Google TensorFlow를 사용중인 CPU에 맞게 빌드하려고..
  • Java JDK 설치 후 (''openjdk-9-jdk''), Bazel 저장소 추가하고 설치해 준다.

Nvidia CUDA: 각종 딥러닝 패키지에서 이용

  • Nvidia 주가 상승의 일등공신이라 할 수 있다.
  • cuDNN은 Nvidia 계정을 파서 직접 다운받아야 한다.
    • cuDNN 버전, CUDA 버전, 운영체제 버전, 설치 방식(데비안 패키지, 직접 설치)에 따라 구별되어 있다.
  • 전체 다운로드 대신 저장소 추가를 단행한 뒤, 다음이 중요하다.
  • 그냥 ''cuda''를 설치하면, 의존 패키지에 GPU 드라이버가 있어서 설치한 드라이버는 삭제되고 이전 버전이 설치되는 경우가 있다.
    • 대신 ''cuda-toolkit-8''과 같이 버전 지정해서 설치해 주면 OK.

Intel MKL

인텔 CPU도 있고 하니 빠른 수학 연산을 위해 설치해 본다. 나중에 TensorFlow 빌드할 때 쓴다

  • 데비안 저장소가 있는지는 모르겠고, 인텔 홈페이지에서 계정 만든 후 다운로드 가능하다.

Anaconda3

Ubuntu에 준비되는 기본 환경 대신 사용하려는 툴에 따른 (TensorFlow, PyCaffe, PyTorch 등등) 환경을 만들기 위해 ''virtualenv''를 쓸 수도 있지만, 보다 편리한 Anaconda를 사용해 본다. 이 동네 사람들은 뱀을 참 좋아한다.

  • Anaconda 홈페이지에서 다운로드하여 설치해 준다.
    • 공용 경로에 설치했기 때문에, source해야 할 경로를 ''/etc/profile.d/''에 설정해 주어 모든 사용자에게 적용되도록 한다.

Jupyter + JupyterHub

요새 인터넷에 보면 통계, 빅데이터, 그리고 머신러닝 코드를 보여주는데 Jupyter (또는 IPython, ...) 노트북을 사용하는 것을 자주 볼 수 있다.

  • Anaconda root 환경을 활성화한 후 ''conda install jupyter'' 해 주면 Jupyter Notebook은 잘 설치된다.

Jupyter만 설치하면 각 사용자가 직접 Jupyter Notebook 서버를 띄우고, 포트를 안 겹치게 잡아주고, HTTPS 연결을 이용하려면 또 이것저것 해 주고 해야 하는 문제가 있다. JupyterHub(+SudoSpawner)는 사용자별로 Jupyter Notebook 서버를 띄워주고 관리해 주는 역할을 한다.

  • 설치 자체는 역시나 Anaconda root 환경에서 ''conda install jupyterhub'' 하면 된다.
  • 문제는 기본 설정, 사용자 환경을 만들어주는 방법 결정 (SudoSpawner로 시스템 계정을 그대로 이용, ...), 웹 서버와 연동, HTTPS 설정이다. 요건 생략.

X2Go

Nvidia 드라이버와의 문제로 GPU 가속이 안 되는 점, X11을 대신할 Wayland(가 뭐지?)를 지원하지 않는 점 등등 아쉬운 점이 많으나, VNC, RDP 아니면 제일 나은 가상 데스크탑 접속 환경인 것 같다.

  • 공식 저장소를 추가한 뒤, ''x2goserver'', ''x2goserver-xsession'' 패키지를 설치해 준다.
  • 내 PC에서 클라이언트 프로그램을 설치해 접속하면 된다.
    • 소리 기능은 끄는 게 반응 속도 면에서 좋은 것 같다. 내가 설정을 잘못했던가.

TensorFlow (소스 빌드)

의미는 크게 없지만 더 빠른 성능을 위해 직접 빌드해 본다.

  • 공식 Git 저장소에서 ''clone'', ''checkout v1.3.1'' (당시 최신) 하고나서
  • Anaconda 환경을 하나 파 준다.
    • 파이썬 패키지 ''numpy scipy matplotlib pandas pillow wheel six protobuf markdown html5lib bleach werkzeug'' 중 취향에 따라 뺄 건 빼고 설치해 준다.
  • v1.3.1과 Bazel>=0.6.0은 호환되지 않는다. Bazel 0.5.4를 받아와서 컴파일할 계정에만 설치해 둔다. PATH 설정이 필요하니 유의.
  • ''./configure'' 해서 아까 설치한 Intel MKL 사용하고, CUDA 사용하고.
    • cuDNN을 여러 버전 설치한 경우, ''sudo update-alternatives --config libcudnn'' 명령으로 현재 TF 버전에 맞는 cuDNN을 선택한다.
    • CUDA 설정 끝에 CUDA compute 버전을 물어보는데, 내가 사용하는 GPU에 맞는 것으로 고르면 컴파일 시간이 줄고 연산 성능도 좋다.
  • ''bazel build --config=opt --config=cuda //tensorflow/tools/pip_package:build_pip_package''하면 한 30분 간 열심히 빌드해 준다.
  • ''bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg'' -> ''pip install /tmp/tensorflow_pkg/<패키지 파일 이름>''
  • ''tensorflow'' 디렉토리에서 나가서, 한 번 잘 되나 테스트해 보라.

커널 패닉 기록, 반응성 향상을 위해

  • ''memlockd'' 패키지는 SSH 동작에 필요한 중요 파일을 메모리에 상주시켜준다고 한다. CPU 또는 디스크에 높은 부하를 주어 시스템이 크게 느려졌을 때 SSH 로그인 성공 가능성을 높여준다.
  • ''linux-crashdump'' 커널 패닉 또는 프로그램 크래시 발생 시, 로그를 ''/var/crash''에 남겨 준다. 디스크에 못 쓰고 죽는 극한 상황에서는 무용지물. Debian에서는 이름이 다른 것 같다.

Let's Encrypt SSL 인증서 & Certbot

비록 3개월마다 (자동) 갱신해야 하지만, 사고 시 보상금 하나 없지만, 믿-음직한 무료 SSL 인증서이다. Certbot 도구를 통해 발급·갱신이 가능하다.

  • 웹서버 무관 공용 Webroot 방식 또는 웹서버별 플러그인 방식 (Apache, Nginx 등 지원) 선택이 가능하다.
  • Nginx 플러그인은 현재 사이트 설정 파일이 한 개인 경우에만 올바로 동작하는 것 같다. 언제 개선될런지.

설치했지만 언급 않은 패키지

  • 기본 유틸리티
    intel-microcode ssh byobu csh ksh zsh fish curl vim-nox emacs unar rdiff-backup python-software-properties postfix figlet lftp chromium-browser jekyll doxygen evince zathura feh markdown fonts-nanum x2goserver x2goserver-xsession
  • 시스템 상태 감시
    iotop htop iftop dstat smartmontools lm-sensors linux-crashdump munin munin-node stress memlockd
  • 개발 도구
    build-essential git subversion bazel cmake gdb cscope ccache colorgcc colormake colordiff
  • 컴파일러
    libgfortran-4.9-dev openjdk-8-jdk
  • 라이브러리
    libboost-all-dev libatlas-dev libatlas-base-dev libopenblas-dev liblapack-dev protobuf-compiler libprotobuf-dev
  • 딥러닝 툴 드라이버/라이브러리
    nvidia-387 cuda-toolkit-8 cuda-toolkit-9 libcupti-dev libgflags-dev libgoogle-glog-dev libleveldb-dev liblmdb-dev libsnappy-dev
  • 웹 서버/메일 릴레이
    postfix nginx-full nodejs-dev npm w3m-el python-certbot-nginx
  • LaTeX 패키지 + 그래프/차트
    texlive-xetex texlive-lang-cjk ko.tex-base ko.tex-extra texlive-publishers texlive-fonts-extra libcgraph6 graphviz graphviz-dev
  • 그리고, 한글 폰트
반응형

Windows Subsystem for Linux a.k.a Bash on Ubuntu on Windows

16년 7월 배포된 윈도 10 레드스톤 버전에는 같은 해 4월에 MS Build 컨퍼런스에서 뜬금포 공개된 WSL이 들어있다.

그동안 CygWin이니 MinGW니 최근의 Babun이니 해서 Windows 내에서 Linux 전체 또는 일부를 사용할 수 있게 하는 프로젝트가 여럿 있었고, 각자 제 성과를 거두어온 바 있었다. 문제는 갖가지 방식 모두 Linux에서 쓰던 바이너리를 그대로 쓰진 못하고, Windows용으로 새롭게 포팅(맞나?)해야 하는 한계? 귀찮음? 이 있었다.

새로 탑재된 WSL이 위의 기존 방식들과 다른 점은, Linux 바이너리를 그대로 쓰면서 바이너리의 시스템 콜을 "커널" 단에서 에뮬레이션(틀렸지만 넘어갈게요. 이 글 누가 본다고..)해준다는 점이다. 그 덕분에, 우분투의 리눅스 시스템용 기존 소프트웨어 저장소를 그대로 쓸 수 있다!

아직 256색조차 제대로 지원이 안 되고, 한글 입력이 뭔가 어설프고 해서 여러 가지로 갈 길이 멀다. 그러나, Unix-like BSD 시스템을 바탕으로 해서 리눅스와 잘 어울리는 macOS의 자리를 뺐을 시도를 할 수 있게 된 점에서 큰 의의가 있다. 네이티브 Linux 지원이라니, 이전 스티브 발머 CEO 시절이라면 상상도 할 수 없는 일일 것이다.

안 되는 점

  • 256색 이상 지원 (X11로 별도의 터미널 에뮬레이터 창을 띄우면 해결)
  • Loop 장치 마운트 -- EXT4 파티션 이미지 같은 것들 마운트가 안 된다
  • Chromium 기반 프로그램들 (?) -- 잘 모르겠지만 어쨌든 실행이 안 되고 죽는다
  • GPU 지원 -- CUDA, TensorFlow 등등이 안 돌아간다.
  • 시작 시 자동 실행 -- 몇몇 꼼수가 있으나 그리 좋아 보이진 않는다.
  • SSH 데몬, 웹 서버 등 구동하기 -- 자동 시작이 안 되서 불편하고, 보안 취약점이 왕왕 존재할 수 있다.
  • 등등

Synopsys, Cadence 등 업체의 반도체 설계를 위한 EDA 툴 설치/실행

갖가지 안 되는 것들을 빼면 사실상 우분투 리눅스이기 때문에, 실 PC 또는 가상머신에서 돌아가는 프로그램이면 윈도 Bash에서도 돌아는 간다. 연산 결과가 죄다 틀린다던지, 어떤 오류가 있을지는 모르지만...

그래서, Synopsys Design Compiler를 윈도 Bash에서 돌려보았다.

  • Synopsys Solvnet 홈페이지에서 Installer 및 Design Compiler 설치 프로그램을 받아서, 안내대로 설치한다...
  • 라이선스 (나는 학교 것으로...), PATH 등 환경 변수를 설정해준다.

$ vim ~/.bashrc

export LM_LICENSE_FILE=blahblah

export PATH=/usr/synopsys/blah:$PATH

  • 실행해보면 동적 라이브러리가 없다고 오류가 발생한다. 정식 지원 환경인 Redhat이 아니기 때문일 텐데...

$ dc_shell

/usr/synopsys/blahblah/common_shell_exec: error while loading shared libraries: libblah.so.?: cannot open shared object file: No such file or directory

  • ldd 명령을 쓰면 바이너리 실행에 필요한 어떤 라이브러리가 없는지 알 수 있다.
  • 예로 든 dc_shell은 스크립트이고, 스크립트 내에서 common_shell_exec 바이너리를 실행한다. 그러니<

$ ldd /usr/synopsys/path/to/binary/common_shell_exec

  • 이제 없는 라이브러리 파일이 어떤 패키지에 들어있는지 알아낸 후 apt 명령으로 열심히 설치하면 된다.<
    • 구글에서 바이너리 이름으로 검색하거나
    • "apt-cache search " 명령으로 검색할 수 있다.
  • 아래 라이브러리를 설치했다. 그 전에 이것저것 더 깔았기 때문에, 실제로 설치가 필요한 패키지는 이보다 더 많을 수 있다.<

    $ sudo apt-get install libxss1 libsm6 libice6 libxft2 libjpeg62 libtiff5 libmng2

  • 문제는 최신 버전에 없는 구형 라이브러리를 요구하는 경우가 있는데...
    • 안타깝게도 libtiff3, libmng1이 libtiff5, libmng2으로 업그레이드되었다.
    • 대충 최신 라이브러리 파일을 예전 라이브러리 파일 이름으로 심볼릭 링크를 걸어본다.

      $ sudo ln -s /usr/lib/x86_64-linux-gnu/libtiff.so.5 /usr/lib/x86_64-linux-gnu/libtiff.so.3

      $ sudo ln -s /usr/lib/x86_64-linux-gnu/libmng.so.2 /usr/lib/x86_64-linux-gnu/libmng.so.1

  • 이제 실행해보면 잘 돌아간다. 그런데 정말 잘 돌아가는걸까?
반응형

+ Recent posts