1.사전 준비

1.1 우분투 업데이트 gcc 등 설치

최신 드라이버를 설치 할때 현재 우분투 페키지들이나 커널이 최신 상태여야 충돌이 발생하지 않는다. 따라서 업그레이드 필수

sudo apt update && sudo apt upgrade -y
sudo apt install build-eseential

1.2 Disabling Nouveau (uBuntu 기준)

Create a file at /etc/modprobe.d/blacklist-nouveau.conf with the following contents:

blacklist nouveau
options nouveau modeset=0

Regenerate the kernel initramfs:
sudo update-initramfs -u

다른 OS는 공식문서 참조

1.3 CLI 모드로 진입 (재부팅 후)

nouveau 드라이버를 disable하면 ubuntu GUI로 부팅이 안된다. 기본 드라이버는 성능이 떨어지고 nvidia cuda관련 라이브러리와 협력이 안되므로 딥러닝 작업시는 사용할 수없다. 따라서 재설치를 위해서는 CLI 모드로 진입이 필요하다. 진입키는 부팅 아래의 키를 입력 한다.
ctrl + Alt + F3 or F2

1.4 기존에 설치된 관련 드라이버 파일들 제거

sudo apt remove --autoremove nvidia-*

2. driver 설치 방법 3가지

2.1 PPA 등록후 설치

ubuntu-drivers devices의 리스트를 최신으로 갱신한다. nvidia에서 독접적으로 제공하는 리스트를 받아 올수 있도록한다.

sudo apt install software-properties-common -y
sudo add-apt-repository ppa:graphics-drivers/ppa -y
sudo apt update
ubuntu-drivers devices
sudo ubuntu-drivers autoinstall

#설치 확인
nvidia-settings 
nvidia-smi

recommended 버전을 설치하는 autoinstall을 안하고 sudo apt install nvidia-driver-515 형식으로 원하는 버전을 설치 할 수도 있으나, 무슨 차이인지 ubuntu 22.04에서는 autoinstall을 해야 문제없이 부팅이 잘 된다 (22.8.10일 기준).

2.2 run file로 설치 (공식홈페이지 다운로드)

공식홈페이지에서 *.run파일을 받아서 직접 설치하는 방법이다.

  • NVIDIA-Linux-x86_64-515.65.01.run
  • NVIDIA-Linux-x86_64-470.141.03.run

2080Ti, 20.04ubuntu에서는 잘 했었는데 현재로썬 설치가 정상적으로 되어도 GUI나 nvidia-smi 커맨드가 동작하지 않았다.

2.3 additional drivier (GUI 도구 이용)

GUI util인 additional drviers를 이용해서도 정상적으로 설치가 가능하다. 20.04 ubuntu에서 3090용 드라이버를 이렇게 설치 했었다 (이전 포스트 참조).
하지만 22.04에서는 무슨 이유에서인가 설치 후 network driver가 날아가 버렸고 드라이버를 재설치하려 했으나 생각보다 삽질이 많이 필요했다 (인터넷이 안되므로). 그래픽 드라이버는 정상적으로 설치가 가능하다.

  • Z690 칩셋 기준: product: Ethernet Controller I225-V
  • 네트워카드 확인 sudo lshw -C network

문제해결: 

secrue boot 이슈가 있을 경우 secure boot를 disable한다.

F2 또는 del 키로 boot 메뉴에 진입해서 Disable한다.

드라이버가 반드시 sign이 되어 있어야 로딩 되므로 nvidia driver 설치 이후에도 로딩이 되질 않아서 문제가 발생 할 수 있다. 

참고자료

SDCard 퓨징 방법 (DD command 기반)


퓨징 방법 정리

맥에서 하는 방법

diskutil list로 장치 번호 확인
언마운트 diskutil unmountDisk /dev/disk4

  • busy 오류 해결
sudo dd bs=1m if=./2020-08-20-raspios-buster-armhf-full.img of=/dev/disk3 status=progress; sync

sudo diskutil eject /dev/rdiskN

sync를 해야하는 이유

백업본 제작

비압축

$ sudo dd if=/dev/rdisk1 of=/Users/Yourname/Desktop/pi.img bs=1m

sudo diskutil eject [name]

압축

$ sudo dd if=/dev/rdisk1 bs=1m | gzip > /Users/Yourname/Desktop/pi.gz

sudo diskutil eject [name]

압충 경우 퓨징 방법

gzip -dc /User/Yourname/Desktop/pi.gz | sudo dd of=/dev/rdisk1 bs=1m

progress bar 보이는 버전

brew install coreutils

gzip -dc ultra96.gz | sudo gdd of=/dev/disk2 bs=1 status=progress; sync
8151041 bytes (8.2 MB, 7.8 MiB) copied, 16 s, 509 kB/s

참고
https://apple.stackexchange.com/questions/234167/how-can-i-track-progress-of-dd

중간 확인

중간 중간 progress확인은 ctrl+t (SIGINFO signal)을 이용해서 확인 한다.

Crtl + t

속도차이 Block size (BS)에 따른

# bs=1
gzip -dc ultra96.gz | sudo gdd of=/dev/disk2 bs=1 status=progress; sync
2384951222 bytes (2.4 GB, 2.2 GiB) copied, 4928 s, 484 kB/

# bs=64MB
gzip -dc ultra96.gz | sudo gdd of=/dev/disk2 bs=64M status=progress; sync
27315994624 bytes (27 GB, 25 GiB) copied, 1876 s, 14.6 MB/s

GPG sign off (서명 설정)


키 생성 및 export

#설치
apt install gpg2

# 생성 gpg 2.1 버전 이상부터 있는 옵션 full
gpg --full-gen-key # algorithm, bits, expire date, password를 순서대로 설정

# 생성 키 확인
gpg --list-secret-keys --keyid-format LONG <your_email>

sec   rsa4096/30F2B65B9246B6CA 2017-08-18 [SC]
      D5E4F29F3275DC0CDA8FFC8730F2B65B9246B6CA
uid                   [ultimate] Mr. Robot <your_email>
ssb   rsa4096/B7ABC0813E4028C0 2017-08-18 [E]

# 30F2B65B9246B6CA를 복사

# key export (ASCII-Armor 포멧의 gpg public key)
gpg --armor --export 30F2B65B9246B6CA

Gitlab과 Github 설정

Gitlab
export로 나온 --BEGIN부터 --END까지 전체를 복사한 후 gitlab -> preference -> GPG Kyes에 복사해서 붙여넣는다.

Github
SSH and GPG keys 설정에 삽입

Git 설정 (signed commit을 위한)

export때 사용했던 GPG Key ID를 입력 합니다. gpg --list-secret-keys --keyid-format LONG <your_email>명령어로 확인 가능

$ git config --global user.signingkey 30F2B65B9246B6CA

커밋 수행

git commit -S -s -m "commit message"
#-s는 단순 sign-off, 커밋 메시지에 sign-off 이력 삽입
#-S는 gpg sign-off

GPG 서명된 커밋 확인

git log --show-signature -1

세부 설정

매번 하기 귀찮으면 git config --global commit.gpgsign true 설정으로 -S 옵션 제거 가능.

비밀번호 입력 주기 재설정 (GPG 2.1 이상 버전)
~/.gnupg/gpg-agent.conf에 아래 내용 추가. 약 8시간 동안 키 입력을 받지 않음.

default-cache-ttl 28800
max-cache-ttl 28800

GPG 버전 설정
git config --global gpg.program gpg2

설정 확인
git config --global -l
스크린샷 2021-03-26 오전 11.21.40

Troubleshooting

error: gpg failed to sign the data

커밋시 아래 오류가 발생하면

error: gpg failed to sign the data
fatal: failed to write commit object

export GPG_TTY=$(tty)를 ~/.bashrc에 추가하고 source ~/.bashrc하여 적용

gpg: signing failed: Inappropriate ioctl for device오류도 동일하게 해결 가능.

스택오버플로우: https://stackoverflow.com/questions/39494631/gpg-failed-to-sign-the-data-fatal-failed-to-write-commit-object-git-2-10-0/42265848#42265848

key gen시 entropy 부분에서 넘어가지 않음

gpg --gen-key시 아래 메시지에서 더이상 넘어 가지 않을 경우. 유틸을 설치한다.
적절한 마우스 움직임이나 디스크 사용으로 entropy를 증가시켜 임의성을 증가시키면 원래는 난수 기반 키가 나와야 하지만 멈춤(hangs)도 자주 발생한다.

We need to generate a lot of random bytes. It is a good idea to perform some other action (type on the keyboard, move the mouse, utilize the disks) during the prime generation; this gives the random number generator a better chance to gain enough entropy.

apt install rng-tools
service rngd start

스택오버플로우: https://serverfault.com/questions/471412/gpg-gen-key-hangs-at-gaining-enough-entropy-on-centos-6

IntelliJ IDE 관련

https://blog.kshgroup.kr/intellij-signed-commit-gpg-error/

참고자료

Docker 사용법 및 Clion & PyCharm 연결


Clion에 Docker Plugin 설치

사용법: https://www.jetbrains.com/help/clion/docker.html#using-docker-compose

CLion에서는 Pycharm-pro와 다르게 Docker가 기본으로 서비스로 연결되어 있지 않다. 아래와 같이 Marketplace에서 Docker Plugin을 설치해 준다.
스크린샷 2021-03-03 오후 5.45.30

설치하면 아래와 같이 settings-> Build, Execution, Deployment->Docker를 통해서 Docker Daemon을 실행 가능하다. 이 부분은 root permission으로 실행해야 하기 때문에 uBuntu라면 sudo로 실행한다. Mac의 경우 권한을 적절한 시점에서 요청한다.
스크린샷 2021-03-03 오후 5.48.49

서비스를 이제 실행하면 아래와 같이 Docker의 이미지와 컨테이너들의 상태를 볼 수 있다.

  • 단축키: cmd+8 (Mac-OS), alt+8 (ubuntu)

스크린샷 2021-03-05 오전 8.10.33

Dockerfile 생성

아래 Docker파일은 필자가 사용하는 Glow compiler용이다. Pycharm에서와 다르게 Clion에서는 결국 remote toolchain을 설정해서 Docker와 연결하므로 ssh 설정이 필요하다. 아랫쪽 부분의 sshd 부분의 설정들이 root로 접속을 허용하며 비밀번호를 root로 설정하는 부분이다.

FROM ubuntu:20.04

ARG WORKDIR=/root/dev

# Create working folder
RUN mkdir -p $WORKDIR
WORKDIR $WORKDIR

# Update and install tools
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update && \
    apt-get install -y clang clang-8 cmake graphviz libpng-dev \
        libprotobuf-dev llvm-8 llvm-8-dev ninja-build protobuf-compiler wget \
        opencl-headers libgoogle-glog-dev libboost-all-dev \
        libdouble-conversion-dev libevent-dev libssl-dev libgflags-dev \
        libjemalloc-dev libpthread-stubs0-dev \
        # Additional dependencies
        git python python-numpy && \
    # Delete outdated llvm to avoid conflicts
    apt-get autoremove -y llvm-6.0 && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

# Point clang to llvm-8 version
RUN update-alternatives --install /usr/bin/clang clang \
        /usr/lib/llvm-8/bin/clang 50 && \
    update-alternatives --install /usr/bin/clang++ clang++ \
        /usr/lib/llvm-8/bin/clang++ 50

# Point default C/C++ compiler to clang
RUN update-alternatives --set cc /usr/bin/clang && \
    update-alternatives --set c++ /usr/bin/clang++

# Install fmt
RUN git clone https://github.com/fmtlib/fmt && \
    mkdir fmt/build && \
    cd fmt/build && \
    cmake .. && make -j32 && \
    make install

# Clean up
RUN rm -rf fmt

# install packages for CLion
RUN apt-get update \
  && apt-get install -y ssh \
      build-essential \
      gcc \
      g++ \
      gdb \
      clang \
      cmake \
      rsync \
      tar \
      python \
      ssh \
  && apt-get clean

# sshd
RUN ( \
    echo 'LogLevel DEBUG2'; \
    echo 'PermitRootLogin yes'; \
    echo 'PasswordAuthentication yes'; \
    echo 'Subsystem sftp /usr/lib/openssh/sftp-server'; \
  ) > /etc/ssh/sshd_config_test_clion \
  && mkdir /run/sshd

EXPOSE 22
CMD ["/usr/sbin/sshd", "-D", "-e", "-f", "/etc/ssh/sshd_config_test_clion"]

# change password
RUN echo 'root:root' | chpasswd

손으로 변경 할 떄는

  • vi /etc/ssh/sshd_config

Docker SSH 설정법

IP 확인 방법

docker 내부에 net-tools
ifconfig

or
jemin@jemin:~/development/tvm_colorado/tvm$ docker inspect abf4c955d17d[container-ID]

"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.2",

ssh 접속

CONTAINER ID   IMAGE                 COMMAND   CREATED       STATUS       PORTS                                                    NAMES
abf4c955d17d   tvm.demo_android_jm   "bash"    8 hours ago   Up 8 hours   9190/tcp, 0.0.0.0:9191->9191/tcp, 0.0.0.0:2020->22/tcp   tvm_android_ssh

port forwarding을 이용해서 처리 함.

Docker 이미지 빌드 및 실행

도커를 빌드하고 생성 할 때 IP와 volume, 공유 디렉토리, 포워딩을 포함해서 실행하면 된다.

터미널 명령어 이용

build && RUN
docker build -t nestc-ssh:201122-v1 .
&& docker run
-v /Users/jeminlee/glow_data:/root/glow_data
-v nest-compiler:/root/nestc
-p localhost:22:22
nestc-ssh:201122-v1

스크린샷 2020-11-22 오후 6.33.43

Docker Pull & Run

위에 설명한 DockerFile로 이미 이미지를 생성하여 DockerHub에 업로드 해두었다.
이렇게 이미지가 이미 있는 경우에는 간단하게 pull한 후에 run을 통해서 실행만 하면 된다.

# pull the image from DockerHub
docker pull leejaymin/nestc-ssh:latest

# Run
sudo docker run --name [container name] \
-d --rm \
-v [volume name]:/root/nestc \ # volume:docker disk
-v [path to host dir]:/root/hdd \ # host disk:docker disk
-p 127.0.0.1:20:22 \ # IP:host-port:docker-port
leejaymin/nestc-ssh:latest # image name

# -it, interactive mode and tty enable
# --rm, 컨테이너 삭제 종료 후
# --name container name
# -d detached, 즉 background로 docker를 실행함

Jetbrains IDE 이용

스크린샷 2021-03-04 오전 9.34.09

Docker 내부에서 sshd 데몬 실행

# 1
sudo docker exec nestc service ssh start

#open ssh  
sudo docker exec --it nestc /bash/bin
service ssh restart

Jetbrains IDE 이용
스크린샷 2021-03-04 오전 9.23.37

Docker Hub에 push

docker push 시 denied: requested access to the resource is denied 오류시

$ docker tag first-image (Docker Hub 계정)/docker-repo:first-image
$ docker push (Docker Hub 계정)/docker-repo:first-image

이미지 주소: https://hub.docker.com/repository/docker/leejaymin/nestc-ssh

$ docker pull <image name>:<tag>
docker pull leejaymin/nestc-ssh

ssh 설정 방법

1) Docker port binding
2) apt update && apt install openssh-server
3) vi /etc/ssh/sshd_config

1) LogLevel DEBUG2
2) PermitRootLogin yes
3) PasswordAuthentication yes
4) Subsystem sftp /usr/lib/openssh/sftp-server
5) port 22 -> 원하는 포트 넘버 (보통 22번은 localhost로 설정할 시 겹치니 다른 것으로 설정함)
4) change root password

  • echo 'root:root' | chpasswd

Jetbrains에 Docker remote 연결하기

이제 Docker 이미지 생성은 끝이고 결국 이제부터는 매번 Clion에서 사용 하듯이 Toolchains에 Remote Host를 하나 더 생성하고(이것이 Docker에 ssh로 접속하는 방식) Host file들을 Docker remote로 sync해서 사용하면된다. 이 후의 과정은 원격 개발환경 구축하는 방법과 동일하다.

스크린샷 2021-03-04 오전 7.29.58
스크린샷 2021-03-04 오전 7.30.29

Remote와 파일 싱크
Tools->Deployments->Configurations
생성한 Rmoete Host를 선택하고 Mapping tab에서 파일 경로 두개를 맞춰줌
스크린샷 2021-03-05 오전 8.16.32

Jetbrains PyCharm 연결 사용하기

아래와 같이 interpreter를 실행할 이미지와 python을 선택하면, Python코드가 docker를 이용해서 동작하게 된다.
스크린샷 2021-05-21 오전 9.59.54

Docker 실행 옵션 결정
스크린샷 2021-05-21 오후 2.27.36

Clion의 경우와 다르게 remote sync를 사용하지 않고 순간적으로 docker container를 생성하고 remove하는 형태로 실행한다.
다만, 실행시 자동으로 제거되지 않는 helper container는 고정적으로 생성되며 용량은 크지 않다.
스크린샷 2021-05-21 오전 10.15.44

Docker 명령어

컨네이너 접속

docker exec -it {container_id or name} /bin/bash

Docker Volume 생성

매번 nestc 코드를 업로드하는 것을 방지하고 작업 내용을 저장하기 위함

docker volume ls

docker volume create nest-compiler

Docker resource settings

CPUs

#CPU가 2개 있다고 가정하면 1.5라고 셋팅하면 host CPU에서 1.5개를 사용함.
docker run -it --cpus="1.5" ubuntu /bin/bash

추가 옵션: https://docs.docker.com/config/containers/resource_constraints/

Docker Commit

docker commit [CONTAINER] [IMAGE_NAME]

exit된 docker 지우기

sudo docker ps -a | grep Exit | cut -d ' ' -f 1 | xargs sudo docker rm

docker image 삭제

docker rmi [image-id]

자주 쓰는 Docker 명령어

docker run : 도커 시작 (creat + start)

ex) docker run --rm -d -p 8080:8080 {image명}

-d : detached mode 흔히 말하는 백그라운드 모드
-p : 호스트와 컨테이너의 디렉토리를 연결 (마운트) [호스트 : 컨테이너]
-e : 컨테이너 내에서 사용할 환경변수 설정
–name : 컨테이너 이름 설정
–rm : 프로세스 종료시 컨테이너 자동 제거
-it : -i와 -t를 동시에 사용한 것으로 터미널 입력을 위한 옵션
-w : working 디렉토리 변경
run : create + start
docker exec

-i : interactive 모드로 실행
-t : terminel 실행
docker exec -it {컨테이너명} {실행할 명령어}
ex) docker exec -it jira-container /bin/sh
docker images : docker 이미지 리스트 출력
docker rmi (docker remove image) : 도커 이미지 삭제

docker rmi {이미지ID}
docker rm : docker 컨테이너 삭제

ex) 중지된 컨테이너 ID를 가져와서 한번에 삭제
docker rm -v $(docker ps -a -q -f status=exited)
docker stop : 실행 중인 컨테이너 중지, 공백으로 구분하여 한번에 중지 가능
  • docker start : 도커 컨테이너 시작
    이미 생성된 컨이너를 실행

  • 재시작은 docker container restart

  • docker image history {이미지ID}

  • docker ps : 도커 프로세스 출력

  • a 모든 프로세스 출력

  • docker version : 도커 버전 확인

  • docker system info : 도커 실행 환경 확인

  • docker system df : 도커 디스크 상태 확인

  • docker container stats : 도커 컨테이너 상태 확인

  • docker logs : 도커 로그 수집

  • f : follow

  • -tail : docker logs --tail 10 : 마지막 10 줄만 출력
    도커는 stdout, stderr 를 자동 수집함, 따라서 파일로 만들면 수집하지 않음
    docker commit : 현재 상태는 저장

  • docker commit {container 이름} {이미지 이름}:{태그}

  • docker login : dockerhub 로그인

  • docker tag : tag 지정

  • docker tag {이미지 이름}:{태그}

  • docker push : 현재 이미지 dockerhub 에 올리기

  • docker push {이미지 이름}:{태그}
    태그 지정했다면 생략 가능

출처: https://dmowld.tistory.com/21 [FREEFLY의 아무거나 쓰는 블로그]

CLion 업데이트 21.2

Remote development in Docker without source synchronization

  • 핵심은 Depolyment settings에서 Type을 Local or mounted folder로 설정하는 것임.

스크린샷 2021-07-29 오전 11.40.40

Troubleshotting (문제해결)

is the docker daemon running

IDE (Clion or Pycharm)을 sudo로 실행하지 않았을 때 생기는 문제이다.

Remote Debug stdout 안되는 현상

printf 사용시에는 이후에 p fflush(stdout) 또는 p setbuf(stdout, 0) 설정.
llvm::outs()의 사용시에는 미해결
관련 자료

sudo permission 없이 docker process 실행

Cannot connect: io.netty.channel.AbstractChannel$AnnotatedConnectException: connect(..) failed: Permission denied: /var/run/docker.sock
caused by: java.net.ConnectException: connect(..) failed: Permission denied

IDE와 연동시 sudo를 이용해서 실행하면 여러 config문제나 multiple users 사용시 문제가 된다. 이경우 해결 방법은 다음과 같다.

sudo groupadd docker
sudo usermod -aG docker $USER
sudo chmod a+rwx /var/run/docker.sock
sudo chmod a+rwx /var/run/docker.pid

참고: https://stackoverflow.com/questions/51191094/pycharm-docker-unix-tcp-socket-with-unix-var-run-docker-sock-permission

PyTorch 사용시 메모리 문제 발생

--pic-host옵션 추가.
근거

NOTE: The SHMEM allocation limit is set to the default of 64MB.  This may be
   insufficient for PyTorch.  NVIDIA recommends the use of the following flags:
   nvidia-docker run --ipc=host ..

참고자료

Gitbook
Clion Dokcer 비밀번호 설정 및 디버깅
Jetbrains Clion 공식 예제 github
Jetbrain Clion Docker blog
Docker 기본 정보
Docker Volume 활용

맥(MAC-OS, 빅서)과 윈도우즈10(Windows10)에서 소리 포함 화면 녹화 설정법


MacOS (빅서)에서 영상 녹화법

Quick Time Player와 블랙홀 프로그램 이용(무료)한 방법이다.
기존 방법들이 빅서에서 동작하지 않으므로 빅서를 지원하는 오픈소스를 활용한 방법이다.

블랙홀 설치

오디오MIDI 설정

입력과 출력을 Blackhole용으로 생성한다. 이렇게 해야 영상과 소리를 동시에 녹화하면서도 스피커로 소리를 들을 수 있다.

새로운 입력 생성
스크린샷 2021-03-02 오후 2.47.00

다중 출력기기 생성
주의:반드시 기본 스피커가 블랙홀 채널보다 위에 위치 해야한다. 이렇게 해야 소리가 정상적으로 출력된다.
스크린샷 2021-03-02 오후 2.46.52

오디오 출력 설정

오디오 출력을 MIDI에서 생성한 다중 출력기기인 Screen Record W/ Audio로 설정한다.
추후에 영상 녹화가 끝나면 다시 원래대로 맥용 스피커로 설정을 돌려 놓아야 터치바로 소리를 제어하는 등의 작업을 정상적으로 사용할 수 있다.
스크린샷 2021-03-02 오후 2.47.42

Quick Time Player로 녹화

[파일]->[새로운 화면 기록]으로 화면과 소리를 녹화할 수 있다. 다만 아래와 같이 입력(마이크)를 이전에 MIDI에서 생성한QuickTime Player Input으로 설정한다.

스크린샷 2021-03-02 오후 2.49.11 1

이제 녹화를 하면 소리가 정상적으로 나오는 것을 알 수 있으며, Zoom과 같은 화상 회의도 녹화할 수 있다. 다만 문제점은 해당 기능은 따로 영상을 압축하지 않으므로 10분정도만 녹화해도 수백MB의 용량으 동영상이 저장된다. 이경우 다시 퀵타임 플레이어나 iMov를 이용해서 영상을 압축해야하는 번거로움이 있다.

윈도우즈 XBox 녹화 기본 프로그램 사용

윈도우키 + G 조합으로 쉽게 영상을 녹화할 수 있으며, 영상도 압축해서 기록하므로 맥보다 더 효율적이다.

참고자료

Youtube, How to Record Your Screen With INTERNAL AUDIO on Mac (FREE)


Auto Mount


1. HDD 확인

sudo fdisk -l

Device      Start        End    Sectors  Size Type
/dev/sdb1      34     262177     262144  128M Microsoft reserved
/dev/sdb2  264192 3907028991 3906764800  1.8T Linux filesystem

추가할 hdd는 sda2이다.
기본적으로 format과 파티션은 한 상태라서 딱히 메시지가 없다.
하지만 하지 않은 상태라면 몇 번 장치가 필요한지 메시지가 나온다.

아래와 같은 메시지이다.
Disk /dev/sdb doesn't contain a valid partition table

블럭 장치 목록으로 확인
lsblk

2. 파티션 생성

사용법

  • sudo fdisk [드라이브 명칭]
    • fdisk -l로 찾아서 적음
      sudo fdisk /dev/sdb
      

n은 새로운 파티션 생성, partition number 입력에서 남은 번호를 입력하고 사이즈를 직접 선택함.

3. 포멧

포멧을 ext4로 설정함

sudo mkfs.ext4 /dev/sdb1

4. 마운트

uuid 확인

sudo blkid
/dev/sdb2: LABEL="D" UUID="f906bf2b-aeb5-43f2-ad8b-96f3496918db" TYPE="ext4" PARTLABEL="Basic data partition"

fstab에 추가

> sudo vi /etc/fstab
UUID=f906bf2b-aeb5-43f2-ad8b-96f3496918db /sda2 ext4 defaults 0 0

마운트 및 확인

$ sudo mkdir /sda2
$ sudo mount -a
$ df -h

Filesystem      Size  Used Avail Use% Mounted on
udev             16G     0   16G   0% /dev
tmpfs           3.2G  9.5M  3.2G   1% /run
/dev/sda1       204G   36G  157G  19% /
tmpfs            16G  176K   16G   1% /dev/shm
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
tmpfs            16G     0   16G   0% /sys/fs/cgroup
tmpfs           3.2G   60K  3.2G   1% /run/user/1000
/dev/sdb2       1.8T   68M  1.7T   1% /sda2

위와 같이 정상적으로 1.7T 하드가 추가 되었다.

우분투 재설치시 기존 파티션 드라이브 마운트 하기

4번에서 sudo blkid명령어로 UUID를 알아낸 다음 자동 마운팅을 위해서 fstab에 추가만 해주면 된다. 그 후에 디렉토리를 설정한 이름에 맞춰서 생성한 다음 sudo mount -a하면 기존 데이터를 유지한 상태로 마운트 가능하다.

우분투가 문제가 생겨서 재설치한 경우 위와 같은 방법으로 데이터를 일부분 복구한다.

 

권한 설정

추가 HDD/SSD 디스크 권한 부여

exec sudo -i

mkdir /media/Elements

chown -R -v sarah:sarah /media/Elements

chmod -Rf 777 /media/Elements​

 

참고자료

http://reachlab-kr.github.io/linux/2015/10/03/Ubuntu-fstab.html
https://promobile.tistory.com/m/371

크롬 원격데스크탑 Ubuntu 20.04에서 설정


설치법 20.04 기준

  • chrome 브라우져 설치
  • headless 설치

  • 다시 (1)번으로 돌아가서 명령어를 ubuntu terminal에 복사 붙여넣기로 실행

    • PIN number 설정
  • 다른컴퓨터에서 연결 시도
    필자는 맥에서 chrome-remote deskptop 응용으로 접속 시도하면 아래와 같이 성공적으로 화면이 나온다.
    스크린샷 2021-03-02 오후 1.49.41

Trobuleshooting (문제해결)

연결시 검정화면으로 아무것도 보이지 않을 때

하위버전 ubuntu의 경우 desktop-environment가 remote-desktop을 지원하지 않아서 그럴 수 있다.
이경우 다른 라이트한 환경을 설치해 준다.

  • xfce 환경 설치
    터미널만 사용
    sudo apt install x-terminal-emulator
    sudo apt install xfce4-terminal
    
    GUI 사용
    sudo apt install xfce4
    sudo apt install dbus-x11
    

Color Profile 생성 권한 요청 문제 해결

sudo mkdir -p /etc/polkit-1/localauthority/50-local.d/

sudo vi /etc/polkit-1/localauthority/50-local.d/color.pkla

# 아래 내용 입력
[Allow colord for all users]
Identity=unix-user:*
Action=org.freedesktop.color-manager.create-device;org.freedesktop.color-manager.create-profile;org.freedesktop.color-manager.delete-device;org.freedesktop.color-manager.delete-profile;org.freedesktop.color-manager.modify-device;org.freedesktop.color-manager.modify-profile
ResultAny=yes
ResultInactive=yes
ResultActive=yes

참조


Ubuntu 설치 후 필수 작업 정리


VMware 가상 머신 경우

new vritual machine
typical (recommeded)
I will instal the operating system later

The virtual machine will be created with a blank hard disk.

Linux (ubuntu 16bit)
설정
하디드스크 설정, single disk 설정
불필요한 device들 제거 (ex., printer)

open-VM-Tools 설치

Legacy 방법이 인터넷에 많은데 그것을 쓰지말라고 한다.
우분투의 경우 쉽게 설치가 가능하다.

아래 명령어 한줄로 설치하고 재부팅 해주면된다.

sudo apt-get install open-vm-tools-desktop

clipboard 공유나 창 크기 조절이 정상적으로 이뤄진다.

기본 설정

네트워크 서비스 탐색 사용하지 않기

vi /etc/default/avahi-daemon

# 1 = Try to detect unicast dns servers that serve .local and disable avahi in
# that case, 0 = Don't try to detect .local unicast dns servers, can cause
# troubles on misconfigured networks
AVAHI_DAEMON_DETECT_LOCAL=1

0으로 변

오류 보고서 비활성화

오류가 나면 보고를 하는 기능이다.
오래걸리고 자주 나타나는 현상이므로 무시하도록 설정 한다.

$ sudo vi /etc/default/apport

enabled=0

장치 드라이버 업데이트

가끔 LTS 버전이 낮으면 추가 장치 드라이버를 자동으로 못 잡을 수도 있다.
Software Update창에서 추가 하드웨어를 눌러도 된다.

커맨드 방식

sudo ubuntu-drivers list
# Will show all the driver packages which apply to your current system. You can then

sudo ubuntu-drivers autoinstall
# To install all the packages you need, or you can do:

sudo ubuntu-drivers devices
# to show you which devices need drivers, and their corresponding package names.

Launch bar를 아래로 이동 시키기기

명령어를 이용

gsettings set com.canonical.Unity.Launcher launcher-position Bottom

gsettings set com.canonical.Unity.Launcher launcher-position Left

그래픽 유틸 사용
dconf edtior를 설치해서 변경 할 수도 있다.

come-> canonical->unity->launcher 이곳에서 launcher-postion을 변경해 준다.

필수 설치 파일

# JDK
sudo apt install default-jdk

# Git
sudo apt install git

# vim, ssh, build-eseential, zip, curl, etc
sudo apt install vim ssh build-essential zip curl gcc-multilib g++-multilib

SSH 설정

리스트 설정

vi ~/.ssh./config

Host XX
  HostName [IP]
  User [account]
  PubkeyAuthentication no

(선택)) 접속 포트 변경

sudo vi /etc/ssh/sshd_config
# Port 부분 변경

#서비스 재시작
sudo /etc/init.d/ssh restart

# 확인
sudo netstat -anp | grep LISTEN | grep sshd

ssh key verificiation failed 해결

#초기화
ssh-keygen -R <IP Address>

#직접 지우기
vi ~/.ssh/known_hosts # 어드레스를 직접 찾아서 지움

하드웨어 정보 알아내기

  • hardinfo 설치
  • lshw -html > mySepc.html
  • nvidia의 경우 드라이버 설치후 nvidia-settings

참고자료

Installing ubuntu 16.04

우분투 16.04 ToDo - 기본 설정


엔비디아(NVIDIA) 그래픽 드라이버 재설치 및 업그레이드


설치 정보 확인

inxi -Gx

제거

# 설정과 파일 까지 모두 제거
sudo apt-get --purge remove *nvidia*

설치: runfile 이용 방법

엔비디아 홈페이지에서 다운 받는다.

  • chmod +x 후 runfile을 sudo권한으로 설치한다.
  • gcc compiler 설정만 주의함.
  • 기존에 Driver가 설치 되어 있다면 자동으로 remove하고 설치한다.
chmod +x NVIDIA-Linux-x86_64-460.39.run
sudo NVIDIA-Linux-x86_64-460.39.run

NVIDIA-DRM이 로드 되었다는 오류 발생시

  • ctrl+alt+F2
  • systemctl isolate multi-user.target

설치: ubuntu-drivers 방법

### 현재 시스템에 설치 가능한 드라이버 확인
sudo ubuntu-drivers list

### 현재 하드웨어 설치 가능한 드라이버 리스트
sudo ubuntu-drivers devcies

### 추천으로 설치
sudo ubuntu-drivers install

설치: apt-get 방법

## 가능 드라이버 확인
sudo apt search nvidia-driver
# 특정 드라이버 설치  
sudo apt-get install nvidia-drvier-460

CUDA 관련 설치 확인

nvcc --version
find

dpkg - l | grep CUDA
dpkg - l | grep cuDNN

참고사이트

멀티부팅 우분투 설치 후 윈도우 (Install Windows10 alongside Ubuntu)


Windows10을 설치 후 우분투를 설치하는 방법은 자료가 많으며 비교적 쉽다. 이전 포스트를 참고한다.

하지만 우분투가 이미 설치된 환경에서 왼도우즈를 설치하는것은 약간 까다롭다. 왜냐하면, 윈도우즈 설치 후에 GRUB bootloader가 사라져 버리기 때문에 복구 과정이 필요하고 uBuntu에서 NTFS primary partition을 만들어줘야 하기 때문이다.
이것들을 모두 해결하여 정상적으로 우분투가 먼저 설치된 상황에서 윈도우즈를 설치해서 정상적으로 듀얼 부팅을 하는 방법을 다루겠다.

0. 사전 준비

1. 우분투에서 파티션 분할

gparted 유틸을 이용해서 primary partition NTFS 형식으로 생성해야한다.
드라이버가 물리적으로 1개 뿐이라면 uBuntu 사용중인 상태에서는 gparted로 파티션 생성이 불가능하다.
왜냐하면 마운트를 해제 해야는데 root가 마운트 되어 있기 때문에 해제 할 수가 없다. 따라서 uBuntu liveUSB mode를 이용한다.

순서

  • USB ubuntu로 부팅
  • USB로 부팅한 상태에서 Try ubuntu without installation.. 메뉴를 선택
  • 정상적으로 Live mode로 접속이 되면 sudo apt install gparted를 실행해서 디스크 유틸리티를 설치
  • 터미널에서 gparted를 실행한다.
  • 아래의 스크린샷 처럼 gparted를 이용해서 원래 파티션을 사이즈 조정하면 unalloacted 공간이 생긴다.
    20191120_105509_624
  • 그 다음 해당 파티션을 선택한다음 primary partition ntfs로 선택한 다음 포멧한다.
    20191120_105531_720
  • 위 두 엑션이 예약되고 체크 버튼을 누르면 해당 작업이 아래 스크린샷 처럼 수행된다.
    20191120_105807_319
  • 최종적으로 물리적으로 하나인 m.2 ssd ext4 ntfs로 각각 파티션이 나눠진것을 볼 수 있다.
    ext4에는 이전 우분투 부팅 파일과 기존 중요파일들이 잘 보존되고 있다.
    20191120_105959_629

2. Windows-10 설치

준비된 windows10 usb로 부팅하여 만들어둔 NTFS 파티션에 설치하면 된다.

3. GRUB bootloader 복구

Windows10 설치 이후에 uBuntu 설치와 다른 점이 이 부분이다. 기존 GRUB bootloader가 깨져버렸으므로 Windows10 설치 이후에는 uBuntu로 들어갈 수가 없다.

이 부분을 Ubuntu USB로 다시 한 번 Live mode로 접속하여 GRUB을 repair 한다.

Try ubuntu without..을 선택해서 들어간 다음 터미널에 아래의 커맨드를 실행해서 설치 후 실행 한다.

sudo add-apt-repository ppa:yannubuntu/boot-repair && sudo apt-get update
sudo apt-get install -y boot-repair && boot-repair

실행하면 아래 처럼 boot-repair가 실행되고 recommended repair를 선택하면 GRUB가 정상 복구 된다.
20191120_115613_480

4. Dual booting 성공

다시 재부팅 하면 정상적으로 아래와 같이 GRUB 부트로더가 보이고 Windows10과 ubuntu를 각각 선택 할 수 있다.
20191120_155007_283

참고자료


서체 변경


command + T

- 시스템서체에서 기본 폰트인 "산돌고딕네오"로 변경 



대용량 Git repo 연동시 zsh 쉘 속도 문제 해결
git config --add oh-my-zsh.hide-status 1
git config --add oh-my-zsh.hide-dirty 1


Loading [MathJax]/extensions/MathZoom.js

LLVM 8.0.0 소스코드를 빌드해서 설치하는 방법


설치 방법은 크게 세 가지로

  • apt로 설치 (ubuntu 기준)
  • pre-buit 버전으로 다운 받기
  • 소스코드 다운후 설치

위 방법중 세 번째 방법으로 직접 소스코드를 다운받아서 설치하는 방법을 다룬다.
추후에 LLVM-cookbook 책에서 나오는 예제들을 실행 하기위해서 여타 LLVM 코드들이 필요 할 수도 있기 때문이다.

소스코드 다운후 빌드해서 설치하는 방법

소스코드를 http://releases.llvm.org/download.html#8.0.0 에서 8.0.0을 기준으로 다운 받았다.

다운로드 파일 2개

  • LLVM source code
  • Clang source code

압축해제 및 이름변경 구조화

tar xf llvm-8.0.0.src.tar.xz
tar xf cfe.8.0.0.src.tar.xz
mv llvm-8.0.0.src llvm # 반드시 이름을 llvm으로 한다.

# move to llvm/tools directory
mv cfe-8.0.0.src clang
mv clang ./llvm/tools/

# llvm 디렉터리 밖에서 llvm-objects 디렉터리 생성
mkdir llvm-objects
cmake ../llvm && make -j4 # i7 기준으로 15분정도 빌드 시간을 소모한다.

cmake -DCMAKE_INSTALL_PREFIX=../llvm-install/ -P cmake_install.cmake # 1분 내외로 빌드 성공

환경변수 설정

export LLVM_BASE_DIR=/home/jemin/development/llvm/
export LLVM_DIR=${LLVM_BASE_DIR}
export LLVM_SRC=${LLVM_BASE_DIR}/llvm
export LLVM_SRC_ROOT=${LLVM_BASE_DIR}/llvm
export LLVM_ROOT=${LLVM_BASE_DIR}/llvm
export LLVM_OBJ=${LLVM_BASE_DIR}/llvm-objects
export LLVM_OBJ_DIR=${LLVM_BASE_DIR}/llvm-objects
export LLVM_OBJ_ROOT=${LLVM_BASE_DIR}/llvm-objects
export LLVM_INSTALL_DIR=${LLVM_BASE_DIR}/llvm-install
export PATH=$LLVM_INSTALL_DIR/bin:$PATH

8.0.0 기준으로 작성된 예제들

https://github.com/leejaymin/llvm8-tutorials-jemin

기타 정보

sudo apt install llvm-8 llvm-8-dev
위 명령어로 설치 할 때 경로

  • /usr/lib/llvm-8

'Computer Science > 고급 컴파일러' 카테고리의 다른 글

19) Loop Transformations  (0) 2014.12.10
18) Loops and Data Dependence  (0) 2014.12.10
Advanced Compilers Reuse Optimization  (0) 2014.12.03
Use-Def Analysis and SSA (Static Single Assignment)  (0) 2014.11.20
Dataflow Analysis  (0) 2014.11.13

Python과 C++ 함께 디버그 (혼합 디버깅)


이전 Ctypes 예제를 바탕으로 C코드로 작성된 부분을 Python을 실행 할 때 어떻게 Breakpoint를 잡아서 Debug하는지를 설명한다.

2019.7월 기준으로 필자가 아는한 Visual Stduio만이 IDE중에선 이러한 혼합 디버깅을 지원 한다 (참조).

본 포스팅에서는 Mac이나 Ubuntu환경에서 가능한 LLDB를 활용한 방식을 소개한다.

디버깅

C++ GCC로 컴파일 할 떄 당연히 -g 옵션을 넣어서 컴파일한다. 그래야 C++코드를 디버깅시 볼 수 있다. 그렇지 않으면 Assembly로 코드가 나오고 디버깅도 어쩌면 정상 동작하지 않는다.

아래와 같이 LLDB로 옵션을 주고 실행한다음 원하는 곳에 breakpoint를 걸고 run을 실행 한다.

$ lldb python3 callclib1.py

(lldb) target create "python3"
Current executable set to 'python3' (x86_64).
(lldb) settings set -- target.run-args  "callclib1.py"

breakpoint set --name simple_function

(lldb) run

최종적으로 아래와 같이 simple_function에 breakpoint가 걸리는 것을 알 수 있다.

Process 7816 launched: '/Users/jeminlee/anaconda3/bin/python3' (x86_64)
1 location added to breakpoint 1
Calling simple C counting function four times:
Process 7816 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
    frame #0: 0x0000000100550dc4 libclib1.so simple_function at clib1.c:7:12
   4
   5       int simple_function(void) {
   6           static int counter = 0;
-> 7           counter++;
   8           return counter;
   9       }
   10
Target 0: (python3) stopped.

실행 스크린샷
스크린샷 2019-07-05 오후 6.24.39

참고문헌


Ctypes를 이용한 Python과 C와의 연결


속도나 하드웨어 디바이스 드라이버 접근 등을 위해서 C와 연결해서 Python을 사용해야 할 일들은 생기기 마련이다.
두 언어를 이어 붙이기 위한 수단인 이종 언어간 인터페이스 (Foreign Function Interface, FFI)를 다룬다.

FFI를 지원하는 방법으로는 ctypes CFFI 방법이 있다.

  • ctypes방법은 파이썬 표준 라이브러리에 포함되어 있다.
    • C로 작성된 코드가 Shared object (*.so)형태로 컴파일 되어 있어야함.
    • 함수와 구초제 등을 ctypes에 맞는 방식으로 다시 정리해야된다.
    • OS에서 제공하는 symbol lookup 방식으로 찾을 수 있는 요소에 한해서만 접근이 가능함

C코드 스타일로 예제 작성

값을 카운트 하는 코드

int simple_function(void) {
    static int counter = 0;
    counter++;
    return counter;
}

문자열 하나 하나를 입력해서 string으로 변환함.

void add_one_to_string(char *input) {
    int ii = 0;
    for (; ii < strlen(input); ii++) {
        input[ii]++;
    }
}

두 개의 함수는 string을 C 컨텍스트 안에서 allocate 하고 free 하는 기능을 가진다.

char * alloc_C_string(void) {
    char* phrase = strdup("I was written in C");
    printf("C just allocated %p(%ld):  %s\n",
           phrase, (long int)phrase, phrase);
    return phrase;
}

void free_C_string(char* ptr) {
    printf("About to free %p(%ld):  %s\n",
           ptr, (long int)ptr, ptr);
    free(ptr);
}

Python에서 해당 ctypes 모듈을 loading하는 방법

기본적인 form은 아래와 같다.
그냥 같은 위치에 .so가 존재 한다면 아래와 같이 간단하게 읽어 올 수 있다.
다른 경로라면 다양한 방법으로 os package를 이용해서 path를 생성할 수 있다.

import ctypes

# Load the shared library into c types.
libc = ctypes.CDLL("./libclib1.so")

예를 들면 아래와 같이 처리 할 수 있다.

libname = os.path.abspath(
    os.path.join(os.path.dirname(__file__), "libclib1.so"))

libc = ctypes.CDLL(libname)

호출 방법 (기본)

파라메터 없이 호출하는건 간단하게 수행 된다.

import ctypes

# Load the shared library into c types.
libc = ctypes.CDLL("./libclib1.so")

# Call the C function from the library
counter = libc.simple_function()

여기서 int를 c에서 반환하고 이것은 ctypes에서 이러한 type부분을 python에 맞게 적절하게 변환해 준다.

Makefile 및 실행 결과

Makefile

all: test

clean:
  rm -f *.o *.so

clib1.so: clib1.o
  gcc -shared -o libclib1.so clib1.o

clib1.o: clib1.c
  gcc -c -Wall -Werror -fpic clib1.c

test clib1.so
  ./callclib1.py

실행 결과

./callclib1.py
Calling simple C counting function four times:
1
2
3
4

참고문헌


ssh 설정 모음


단순 ip 주소 기록

  • /etc/hosts

ssh config 저장

  • ~/.ssh/config

포트 변경

  • /etc/ssh/sshd_config

X11 forwarding

  • -X option

PyCharm에서 PYTHONPATH 설정하기



bashrc 또는 zshrc에 설정한 환경변수 PYTHONPATH의 설정을 pycharm에서 하는 방법이다.



You need to go to the Main PyCharm Preferences, which will open up a separate window. In the left pane, choose Project:... > Project Interpreter. Now, in the main pane on the right, click the settings symbol (gear symbol) next to the field for "Project Interpreter". Choose More in the menu that pops up. Now in the final step, pick the interpreter you are using for this project and click on the tree symbol at the bottom of the window (hovering over the symbol reveals it as "Show paths for the selected interpreter"). Add your path by click in the "plus" symbol.

It took me ages to find, so I hope the detailed instructions will help. Further details are available in the PyCharm docs.

https://www.jetbrains.com/help/pycharm/2016.1/installing-uninstalling-and-reloading-interpreter-paths.html?search=add%20folder%20to%20path

It is good practice to have __init__.py in each subfolder of the module you are looking to add, as well as making your project folder a 'Source Root'. Simply right-click on the folder in the path bar and choose 'Mark Directory as ...'


https://stackoverflow.com/questions/28326362/pycharm-and-pythonpath?rq=1



Configure a Python interpreter

https://www.jetbrains.com/help/pycharm/configuring-python-interpreter.html


PYTHONPATH는 아래와 같이 커스텀 라이브러리들을 추가 할 수 있다.




Python Console에도 추가 할 수 있다.



참고 미디엄 포스팅: https://medium.com/@erikhallstrm/work-remotely-with-pycharm-tensorflow-and-ssh-c60564be862d

parallels로 .ova 파일을 불러올려면 pvm파일이 필요하다.

변환은 Vmware ovftool을 이용하면 쉽게 된다. 

아래 링크에서 다운 받는다.

https://code.vmware.com/tool/ovf/4.1.0

실행 명령어

/Applications/VMware\ OVF\ Tool/ovftool --lax 대상.ova 피대상.vmx

생성된 vmdk와 vmx중 vmx를 실행한다.

OSX(MAC)에서 ubuntu 18.04 usb 부팅 이미지 생성


우분투 이미지 다운로드

공식 홈페이지에서 다운 받아도 가능하나 느리기 때문에 아래 카카오 미러링 서버에서 다운 받는다.
http://mirror.kakao.com/

iso to img 변경

hdiutil을 이용해서 확장자 변환

$ hdiutil chdiutil convert -format UDRW -o ./ubuntu-18.04.2-desktop-amd64.img ./ubuntu-18.04.2-desktop-amd64.iso
Driver Descriptor Map(DDM : 0) 읽는 중...
Ubuntu 18.04.2 LTS amd64        (Apple_ISO : 1) 읽는 중...
Apple(Apple_partition_map : 2) 읽는 중...
Ubuntu 18.04.2 LTS amd64        (Apple_ISO : 3) 읽는 중...
................................................................................................................................................................................................................
EFI(Apple_HFS : 4) 읽는 중...
................................................................................................................................................................................................................
Ubuntu 18.04.2 LTS amd64        (Apple_ISO : 5) 읽는 중...
...................................................................................................................................................................................................................
경과 시간:  2.228s
속도: 854.5Mbytes/초
저장: 0.0%
created: ubuntu-18.04.2-desktop-amd64.img.dmg

Finder로 해당 이미지로 가서 최종 확장자 .dmg를 제거한다.

윈도우에 한 경우

$ hdiutil convert -format UDRW -o ./Win_Ent_10_1903\(64bit\)_KR.img ./Win_Ent_10_1903\(64bit\)_KR.iso
CPBA_X64FRE_KO-KR_DV9           (Apple_UDF : 0) 읽는 중...
........................................................................................................................................................................................................
경과 시간:  8.372s
속도: 521.5Mbytes/초
저장: 0.0%
created: /Users/jeminlee/ETRI 유틸 대용량 데이터/Win_Ent_10_1903(64bit)_KR.img.dmg


디스크 굽기

식별자 확인
diskutil list

/dev/disk4 (external, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:                            Transcend              *31.6 GB    disk4

언마운트 (반드시 해야함)
diskutil unmountDisk /dev/disk4

자신의 번호에 맞춰서 진행 한다. 필자는 4번이다.

굽기
dd명령어를 이용해서 굽는다.
sudo dd if=./ubuntu-18.04.2-desktop-amd64.img of=/dev/disk4 bs=1m

진행 상태를 알기 위해서는 SIGINFO를 발생 시킴.
방법은 Ctrl+t를 누른다.

최종적으로 아래와 같은 사이즈가 fussing 되면 된다. (약1.9GB, 18.04.2 LTS 기준)

1996488704 bytes transferred in 129.890901 secs (15370505 bytes/sec)

USB 파일 시스템 복구

원래 USB처럼 사용하기 위한 복구 방법

USB 포멧

diskutil eraseDisk [file format] [wanted diskname] [/dev/disk#]

  • surpported format
    JHFS+ : Mac OS Extended Journaled (JHFS+)
    HFS+ : Mac OS Extended (HFS+)
    FAT32 : MS-DOS FAT32
    ExFAT : ExFAT

diskutil eraseDisk HFS+ SANDISK /dev/disk4



clone 방법

https://computers.tutsplus.com/articles/how-to-clone-raspberry-pi-sd-cards-using-the-command-line-in-os-x--mac-59911

MAC OS X 터미널 설정 방법들 정리


본 포스팅에서는 OS X에서 터미널을 사용하기 편하도록 설정하는 방법들에 대해서 다룬다.

최종적으로 설정한 터미널 모습은 아래와 같다.

  • iTerm2 설치 및 컬러테마 변경
  • zsh 설치
  • oh-my-zsh 설치 후 plugin 설치 (쉘 문법 하이라이팅)
  • zsh 테마를 agnoster로 변경 (쉘 프롬프트에 정보 표현)

Homebrew

ubuntu apt-get과 같이 자동 installer를 수행해주는 커멘드를 활성화 하기위한 유틸이다. 나중에 자동 삭제를 고려한다면 이것을 설치해서 사용하는것이 좋다.

공식 홈페이지: https://brew.sh/index_ko

install homebrew

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

할수 있는 것들
brew install wget

iTerm2

설치 방법 블로그
https://beomi.github.io/2017/07/07/Beautify-ZSH/

다양한 기능들을 제공하므로 기본 terminal 프로그램보다 좋다.
제공하는 기능들은 공식 사이트 참조: https://www.iterm2.com/features.html

zsh 쉘 및 oh-my-zsh 설치 및 설정

zsh 설치
brew install zsh

oh-my-zsh 설치
공식 사이트: https://ohmyz.sh/
$ sh -c "$(curl -fsSL https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"

설치 완료 메시지

쉘 변경
chsh -s /usr/local/bin/zsh

Agnoster Theme 설치

vi ~/.zshrc
ZSH_THEME="agnoster"

폰트가 깨지므로 Ubuntu Mono Derivative Powerline을 설치함.
https://beomi.github.io/others/Ubuntu_Mono_derivative_Powerline.ttf

terminal을 껏다가 다시 켜준다.

command + , -> profile ->text->change font

아래와 같이 선택한다.

다른 테마 관련 정보
https://github.com/robbyrussell/oh-my-zsh/wiki/themes

git 사용 했을 때 속도 저하 문제 해결

git config --add oh-my-zsh.hide-status 1
git config --add oh-my-zsh.hide-dirty 1

zsh-syntax-highlighting 설치하기

git clone https://github.com/zsh-users/zsh-syntax-highlighting.git
echo "source ${(q-)PWD}/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh" >> ${ZDOTDIR:-$HOME}/.zshrc

다른 plugin들도 많으니 그것들을 설치해도 된다.

iTerm2 컬러 Theme을 변경하기

다양한 컬러 schemes들은 https://iterm2colorschemes.com/ 다운 가능하다.
다운 받은 후 아래와 같이 import해서 사용할 수 있다.

command + ,를 눌러서 설정 창을 띄우고 profile-> colors로 이동 후 하단의 color presets을 클릭한다음 import를 선택한다.

필자는 가장 많이들 쓰는 solarized dark를 사용한다. 해당 theme은 구지 설치 안해도 기본으로 선택 가능하다.

SpaceVim

https://github.com/SpaceVim/SpaceVim
https://spacevim.org/quick-start-guide/#linux-and-macos


Android App Data save and restore


저장 경로

/data/data/<package_name>

  • databases/: here go the app's databases
  • lib/: libraries and helpers for the app
  • files/: other related files
  • shared_prefs/: preferences and settings
  • cache/: well, caches

저장 위치까지 모두 출력

  • adb shell pm list packages -f

backup 명령어

## backup nonsystem apk
adb backup -apk -shared -nosystem -all -f backup_apk.ab

### backup system and nonsystem apk
adb backup -apk -noshared -system -all -f backup_apk.ab

## backup individual apk
adb backup -apk com.example.testing -f testing.ab

## restore all
adb restore backup_apk.ab
  • apk – Backs up your apps.
  • noapk – Does not backup apps.
  • shared – Backs up data on the SD card.
  • noshared – Does not backup data on the SD card.

백업파일 tar로 변환하는 방법

Command 스타일

dd if=myAndroidBackup.ab bs=4K iflag=skip_bytes skip=24 | openssl zlib -d > myAndroidBackup.tar

dd if=data.ab bs=1 skip=24 | python -c "import zlib,sys;sys.stdout.write(zlib.decompress(sys.stdin.read()))" | tar -xvf

참고

정리잘된 블로그

AOSP 코드에 기반한 방법

깃허브 주소
https://github.com/nelenkov/android-backup-extractor

참고사이트

https://www.linkedin.com/pulse/backup-restore-your-android-phone-using-adb-ajibola-okubanjo/


VIM color-schemes 변경 putty 기반


많은 color schemes이 있고 필자가 선택한 것은 Solarized Dark이다. second rank이다.

What are the best VIM color-schemes?

설정 방법

putty를 사용하기 때문에 color-schmes설정된 파일을 받아서 register만 등록해주면 간단히 적용 된다.

Solarized Modern Putty Defaults Github

기존에 .vimrc에 다른 설정들이 있으면 컬러가 이상해지므로 필자는 모두 comment out 했다.

  • set background=dark
  • colorscheme evening

최종적으로 적용하면 아래와 같이 변한다.


구글 글래스 엔터프라이즈 에디션 (Google Glass Enterprise Edition) 리뷰


연구 과제를 위해서 2017.7월에 출시된 Google Glass Enterprise Eidition을 세 대 구매 했다.
온라인 상에 XE (Explore Eidition)에 대한 정보는 많은데 EE에 대한 정보는 별로 없는것 같아서 리뷰를 작성한다.

Imgur

구매 방법

구매를 위해서는 Google X와 파트너쉽을 해야한다.
Google X: https://www.x.company/glass/
위 사이트에 접속해서 Interested In Galss를 눌러서 메일을 보내면 된다.

그냥 학교에서 연구과제로 필요하다고 메일을 보내 보니 Streye라는 회사에서 직접 구매할 수 있다고 구글로 부터 답장을 받았다.

실제로 Glass partners를 누르면 많은 협렵 업체들이 이미 존재하기 때문에 새로 파트너쉽을 할 필요는 없는것 같다.

  • https://www.x.company/glass/partners/
    해당 파트너쉽 회사들을 눌러보면 AUGMEDIX와 같이 이미 의사와 환자와의 소셜 인터렉션 향상을 위한 제품을 출시하는 기업 등과 같이 많은 기업 제품들을 볼 수 있다.

Streye는 그리고 Vuzix의 M300과 같은 LED 디스플레이 형태 글라스도 판매하고 있다.
Streye는 자신들의 Platform으로 약간 Customized한다음 판매하고 있다. 필자는 Lite license로 구매 했다.

관세 감면 및 전파시험적합성 면제

필자 처럼 업체를 통하지 않고 Streye로 직접 여러대 구입하면 전파인증 문제가 발생 한다.

  • 국가 과제의 경우 90%까지 관세 감면 가능
  • 2.4Ghz대의 무선을 사용하므로 전파인증 대상 제품
  • 면제 사유로는 아래 두가지가 존재한다.
    • 개인 사용 목적으로 1대만 구매할 경우
    • 국가과제 사용 목적으로 구입한 경우 (최대100대)
    • 국립전파연구원에 접속하여 요건면제안내를 눌러서 지시사항을 보고 처리

제품 구성품

200만원 상당의 가격에 비해서 상당히 구성품이 없다.
아래 세개만 있고 심지어 설명서도 없다.
결국 Streye에 문의해서 개발 방법을 숙지하고 있다.

  • 글라스 본체
  • 렌즈를 끼울수 없는 단순 프레임
  • USB 충전선 (충전기 없음)

외형

2014년에 판매한 XE (Explore Edition)와 이번 EE (Enterprise Edition)과는 어느정도 차이가 있다.
XE는 다리가 접히지 않았지만 이번 EE버전은 다리가 접히게 된다.
개인적인 후기는 안경 착용자라 특수 프레임으로 렌즈를 맞추지 않으면 불편한 것 같다.
XE와 구조가 달라서 이전 프레임들은 사용 못하는 것 같아서 EE용 프레임을 찾아 봐야할 것 같다.

영상을 보기 위해서 눈을 위로 치켜들어야 하기 때문에 상당히 불편하다. 이런걸 200만원 주고 사는 사람은 아마 없을 것 같다.
학회가서 만난 교수님들이 좋다고 끼고 다니셨던 것이 진정성이 느껴지지 않았던 이유를 알겠다.

제품 스팩

스팩사항은 비공개 Teardown 정보를 참조 했다.

  • Display
    약간 더 넓어진 프리즘이다. 640x360사이즈와 거의 비슷 하다.
  • Audio
    단순 스피커이다.
  • Sensors
    XE: ambient light, digital compass, wink, blink sensors
    EE: XE sensors + barometer, a capacitive head sensor (in place of the proximity sensor), a hinge sensor (for determining whether the hinge is open or closed), assisted GPS & GLONASS
  • WiFi and Connectivity
    dual-band 2.4 + 5 Ghz 802.11a/b/g/n/ac
    Bluetooth LE and HID, supporting multiple Bluetooth connections at onece.
  • Camera
    5MP stills and 720p video.
    LED가 앞면에 있어서 recording 중인지 알 수 있게 한다.
  • AP
    Intel Atom, 커스텀 버전으로 다른 모델에서 사용된적은 없는것 같다.
    OS는 32bit이다.
  • Storage and Memory
    FLASH: 32GB
    RAM: 2GB
  • Battery and charger
    ditches microUSB: 5V and 1.5V
    780mAh (XE: 570mAh)

안경 사용자를 위한 구글 글래스

Streye홈페이지에서 안경착용자를 위하 Frames을 판매하기 시작했다.
RX EYEWEAR FRAMES FOR GLASS ENTERPISE

Explore Edition과 혼용이 안되기 때문에 새로운 EE 버전에 맞춰서 프레임이 필요 했다.
각격은 무려 330유로이다. 약 40만원돈이다. 홈페이지 외형은 너무나 조악 했지만 막상 받아보니 괜찮았다.
간단하게 분리한 후에 끼우면 된다.

Glass EE, Hello World 앱 개발

SDK Manager에서 Android 4.4에 해당 하는 부분에서 Glass Development Kit Preview를 다운 받는다.

Glass Enterpise->Setting->Device Options-> Device info-> Turn on debug를 선택한다.

아래와 같이 Glass 앱을 구동할 수 있다.

Ok Glass라고 말하면 아래와 같이 Quick launcher가 구동된다.
XML에 trigger 옵션을 넣으면 앱을 Show me a demo with [앱이름]으로 실행 가능 하다.

아래는 Ok glass camera로 실행해서 바라본 google glass EE에서의 화면 모습이다.
DDMS를 이용해서 Capture한 것이다.
실제로 찍히는 Video품질은 720p여서 상당히 고화질이다.


Jupyter 서버 설치 및 실행법


Data Science 분야와 과학분야에서 편하게 Python이 쓰이도록 개발된
Notebook에 대해서 살펴본다.

사용된 설치환경은 아래와 같다.

  • Ubuntu 18.04

실행 명령어 (개인 환경) -나의 경우 이대로 따라하면 된다-

source ~/tensorflow/bin/activate # virtualEnv 활성화를 통한 TensorFlow library 연동
#활성화 성공

#활성화 한다음 아래의 config 파일이 있는 디렉터리로 이동한다음 jupyter를 실행 해야 한다!!!
(tensorflow)root@jemin-virtual-machine:~/.jupyter# 
# jemin_config.py 환경으로 Jupyter 실행
# jemin_config.py는 SSL 설정을 Disable 한것이다.
jupyter notebook --config jemin_config.py

설치 및 실행

Ipython Notebook 보다 더 발전된 Interactive IDE이다.
Jupyter가 다중 kernel을 지원한다고 한다.
즉, python 2,3 모두를 지원 한다.

python2는 pip이고 python3은 pip3이다.

pip install jupyter

실행 방법

jupyter notebook

도움말 실행 방법

(tensorflow)root@jemin-virtual-machine:~/.jupyter# jupyter notebook --h
usage: jupyter-notebook [-h] [--certfile NOTEBOOKAPP.CERTFILE]
                        [--ip NOTEBOOKAPP.IP] [--pylab [NOTEBOOKAPP.PYLAB]]
                        [--log-level NOTEBOOKAPP.LOG_LEVEL]
                        [--port-retries NOTEBOOKAPP.PORT_RETRIES]
                        [--notebook-dir NOTEBOOKAPP.NOTEBOOK_DIR]
                        [--config NOTEBOOKAPP.CONFIG_FILE]
                        [--keyfile NOTEBOOKAPP.KEYFILE]
                        [--port NOTEBOOKAPP.PORT]
                        [--transport KERNELMANAGER.TRANSPORT]
                        [--browser NOTEBOOKAPP.BROWSER] [--script] [-y]
                        [--no-browser] [--debug] [--no-mathjax] [--no-script]
                        [--generate-config]

optional arguments:
  -h, --help            show this help message and exit
  --certfile NOTEBOOKAPP.CERTFILE
  --ip NOTEBOOKAPP.IP
  --pylab [NOTEBOOKAPP.PYLAB]
  --log-level NOTEBOOKAPP.LOG_LEVEL
  --port-retries NOTEBOOKAPP.PORT_RETRIES
  --notebook-dir NOTEBOOKAPP.NOTEBOOK_DIR
  --config NOTEBOOKAPP.CONFIG_FILE
  --keyfile NOTEBOOKAPP.KEYFILE
  --port NOTEBOOKAPP.PORT
  --transport KERNELMANAGER.TRANSPORT
  --browser NOTEBOOKAPP.BROWSER
  --script
  -y, --y
  --no-browser
  --debug
  --no-mathjax
  --no-script
  --generate-config

주피터의 다중 커널 개념 지원은 매우 간단하고, 강력하다. IPython이 실행되는 파이썬 실행기에 종속되지 않기 때문에, 다른 언어들의 커널을 지원할 뿐만 아니라, 환경만 갖춰져 있다면 같은 언어의 다양한 버전에 대해서도 별도의 커널을 만들어 사용할 수 있다. 나아가 파이썬의 virtualenv와 결합하면 환경별로도 커널을 분리해 사용할 수 있다. 이와 같이 다중 커널 개념은 Jupyter의 핵심 개념이며, 이를 통해서 좀 더 자유롭게 Notebook 생활이 가능해질 것이다.

참고사이트: http://jupyter-notebook.readthedocs.org/en/latest/public_server.html

설정 방법

실행방법

jupyter notebook

시작 디렉터리 위치 변경

  • Window
    아이콘 오른쪽버튼 -> 시작 경로 변경

  • Linux
    To launch Jupyter Notebook App:

    • Click on spotlight, type terminal to open a terminal window.
    • Enter the startup folder by typing cd /some_folder_name.
    • Type ipython notebook to launch the Jupyter Notebook App (it will appear in a new browser window or tab).

원격 서버로 설정

우분투환경

Securing a notebook server

jupyter notebook --generate-config

profile 생성없이 defalut내용을 바로 변경한다. 전체 Jupyter에 영향을 미친다.

Writing default config to: /root/.jupyter/jupyter_notebook_config.py

Preparing a hashed password

In [1]: from notebook.auth import passwd

In [2]: passwd()
Enter password: 
Verify password: 
Out[2]: 'sha1:f24baff49ac5:863dd2ae747212ede58125302d227f0ca7b12bb3'

jupyter_notebook_config.py를 열어서 아래의 내용을 입력한다.

# Password to use for web authentication
c = get_config()
c.NotebookApp.password ='sha1:f24baff49ac5:863dd2ae747212ede58125302d227f0ca7b12bb3'

패스워드를 사용할 때 SSL을 사용하는것은 좋은 생각이다.
SSL을 이용해서 브라우저에서 패스워드가 암호화되서 보내지기 때문이다.
이를 위해서 self-signed certificate를 생성 한다.

OpenSSL을 이용해서 certificate을 생성할 수 있다. 유효기간은 365일이다.

openssl req -x509 -nodes -days 365 -newkey rsa:1024 -keyout mycert.pem -out mycert.pem

jupyter_notebook_config.py를 열어서 아래의 내용을 입력한다.

c.NotebookApp.certfile ='/absolute/path/to/your/certificate/mycert.pem'

서버 설정 내용을 jupyter_notebook_config.py를 열어서 아래의 내용을 입력한다.

# The IP address the notebook server will listen on.
# c.NotebookApp.ip = 'localhost'
c.NotebookApp.ip = '192.168.174.131'
# c.NotebookApp.port_retries = 50
c.NotebookApp.port_retries = 8888

또는 아래의 명령어로 수작업으로 설정해 줄수도 있다.

jupyter notebook --ip=* --no-browser

특정 config 파일로 실행 하기

명렁어 --config jemin_config.py를 설정해 준다.

(tensorflow)root@jemin-virtual-machine:~/.jupyter# jupyter notebook --config jemin_config.py 
[I 00:46:15.432 NotebookApp] Serving notebooks from local directory: /root/DataScience/
[I 00:46:15.432 NotebookApp] 0 active kernels 
[I 00:46:15.432 NotebookApp] The IPython Notebook is running at: http://192.168.174.132:8888/
[I 00:46:15.432 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).

기타설정

#실행과 동시에 web-browser를 실행하지 않게 한다.
c.NotebookApp.open_browser = False
#시작 디렉터리를 변경한다.
c.NotebookApp.notebook_dir = u'/root/DataScience/'

c.NotebookApp.matplotlib='inline' 옵션은 사용하지 못하도록 변경되었다.
IPython shell에서 직접 magic 함수를 이용해야 한다.

%matplotlib inline

다중 Kernel 사용 하기

현재 설치된 커널 종류 확인
jupyter kernelspec list

(tensorflow_py2) jemin@jemin-desktop:~$ jupyter kernelspec list
Available kernels:
  python3    /home/jemin/.local/lib/python3.5/site-packages/ipykernel/resources

python2 커널 설치

python2 -m pip install ipykernel
python2 -m ipykernel install --user

커널 설치 확인

(tensorflow_py2) jemin@jemin-desktop:~$  jupyter kernelspec list
Available kernels:
  python3    /home/jemin/.local/lib/python3.5/site-packages/ipykernel/resources
  python2    /home/jemin/.local/share/jupyter/kernels/python2

추가 설정 자료
https://songyunseop.github.io/post/2016/09/Using-Jupyter-inside-virtualenv/

업데이트 방법

버전어 맞춰서 아래 명령어를 이용한다.
python 3.5는 pip3
python 2.7는 pip

pip install --upgrade pip # pip update

pip install jupyter

백그라운드에서 실행하기

terminal window를 유지하지 않아도 connection이 보장된다.

nohup명령어의 기능

  • 표준 출력을 nohup.out또는 다른곳으로 redirection하는 작업 수행
  • 프로세스가 백그라운드에서 지속적으로 실행하도록 함.

물론 그냥 &만 뒤에 붙여주면 shell에서 백그라운드로 동작하지만 terminal을 닫으면 프로세스가 terminate되기 때문에 보장되지 않는다.

nohup jupyter notebook &

이렇게 실행한 프로세스는 kill로 terminate해야 한다.

lsof nohup.out
kill -9 <PID>

좀 더 일반적인 확인 후 종료

1. “ps -ef | grep 쉘스크립트파일명” 명령으로 데몬형식으로 실행
2. "kill -9 PID번호“ 명령으로 해당 프로세스 종료

부팅시 자동 실행 (19.5.8 수정)

service 생성

sudo vim /etc/systemd/system/jupyter.service

아래의 내용을 입력한다.

[Unit]
Description=Jupyter Notebook Server

[Service]
Type=simple
PIDFile=/run/jupyter.pid
User=<username>
ExecStart=/home/<username>/.local/bin/jupyter-notebook
WorkingDirectory=/your/working/dir

[Install]
WantedBy=multi-user.target

ExecStart설정은 anaconda의 경우 /home/<username>/anaconda3/bin/jupyter-notebook으로 설정한다. 각자 상황에 맞춰서 설정해야 한다.

service 등록

systemctl daemon-reload
systemctl enable jupyter.service
systemctl start jupyter.service

service 상태 알애내기

sudo systemctl status jupyter.service

● jupyter.service - Jupyter Notebook
   Loaded: loaded (/etc/systemd/system/jupyter.service; enabled; vendor preset: enabled)
   Active: active (running) since Wed 2019-05-08 15:07:55 KST; 17min ago
 Main PID: 2057 (jupyter-noteboo)
    Tasks: 1 (limit: 4915)
   CGroup: /system.slice/jupyter.service
           └─2057 /home/jemin/anaconda3/bin/python /home/jemin/anaconda3/bin/jupyter-notebook

 5월 08 15:07:56 jemin jupyter-notebook[2057]: [I 15:07:56.357 NotebookApp] JupyterLab extension loaded from /home/jemin/anaconda3/lib/python3.7/s
 5월 08 15:07:56 jemin jupyter-notebook[2057]: [I 15:07:56.357 NotebookApp] JupyterLab application directory is /home/jemin/anaconda3/share/jupyte
 5월 08 15:07:56 jemin jupyter-notebook[2057]: [I 15:07:56.358 NotebookApp] Serving notebooks from local directory: /home/jemin/development
 5월 08 15:07:56 jemin jupyter-notebook[2057]: [I 15:07:56.358 NotebookApp] The Jupyter Notebook is running at:
 5월 08 15:07:56 jemin jupyter-notebook[2057]: [I 15:07:56.358 NotebookApp] http://192.168.0.4:8888/
 5월 08 15:07:56 jemin jupyter-notebook[2057]: [I 15:07:56.358 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to
 5월 08 15:07:56 jemin jupyter-notebook[2057]: [W 15:07:56.360 NotebookApp] No web browser found: could not locate runnable browser.
 5월 08 15:20:16 jemin jupyter-notebook[2057]: [I 15:20:16.468 NotebookApp] 302 GET / (192.168.0.2) 1.18ms
 5월 08 15:20:16 jemin jupyter-notebook[2057]: [I 15:20:16.470 NotebookApp] 302 GET /tree? (192.168.0.2) 0.28ms
 5월 08 15:20:18 jemin jupyter-notebook[2057]: [I 15:20:18.201 NotebookApp] 302 POST /login?next=%2Ftree%3F (192.168.0.2) 2.41ms

재시작: sudo systemctl restart jupyter.service
멈춤: sudo systemctl stop jupyter.service
해제: sudo systemctl disable jupyter.service

참고문서: https://wiki.ubuntu.com/SystemdForUpstartUsers

Trouble Shooting

1. IP 변경에 따른 에러

(tensorflow)root@jemin-virtual-machine:~/.jupyter# jupyter notebook --profile=jemin_config.py 
[W 20:34:44.745 NotebookApp] Unrecognized alias: '--profile=jemin_config.py', it will probably have no effect.

Traceback (most recent call last):
  File "/usr/local/bin/jupyter-notebook", line 11, in <module>
    sys.exit(main())
  File "/usr/local/lib/python2.7/dist-packages/jupyter_core/application.py", line 267, in launch_instance
    return super(JupyterApp, cls).launch_instance(argv=argv, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/traitlets/config/application.py", line 591, in launch_instance
    app.initialize(argv)
  File "<string>", line 2, in initialize
  File "/usr/local/lib/python2.7/dist-packages/traitlets/config/application.py", line 75, in catch_config_error
    return method(app, *args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/notebook/notebookapp.py", line 1007, in initialize
    self.init_webapp()
  File "/usr/local/lib/python2.7/dist-packages/notebook/notebookapp.py", line 873, in init_webapp
    self.http_server.listen(port, self.ip)
  File "/usr/local/lib/python2.7/dist-packages/tornado/tcpserver.py", line 126, in listen
    sockets = bind_sockets(port, address=address)
  File "/usr/local/lib/python2.7/dist-packages/tornado/netutil.py", line 196, in bind_sockets
    sock.bind(sockaddr)
  File "/usr/lib/python2.7/socket.py", line 224, in meth
    return getattr(self._sock,name)(*args)
socket.error: [Errno 99] Cannot assign requested address

2. SSL 사용 오류

config file에서 아래의 SSL 설정관련 코드들이 문제가 된다.
보안상 문제가 있지만 그냥 주석처리하고 실행 한다.

파일위치: /root/.jupyter

c.notebookApp.certfile = u'/root/.jupyter/mycert.crt'
c.notebookApp.certfile = u'/root/.jupyter/mycert.key'

아래는 에러 코드이다.

(tensorflow)root@jemin-virtual-machine:~/.jupyter# jupyter notebook --profile="jemin_config.py"
[W 22:43:24.515 NotebookApp] Unrecognized alias: '--profile=jemin_config.py', it will probably have no effect.
[W 22:43:24.520 NotebookApp] Error loading config file: jupyter_notebook_config
    Traceback (most recent call last):
      File "/usr/local/lib/python2.7/dist-packages/jupyter_core/application.py", line 202, in load_config_file
        path=path
      File "<string>", line 2, in load_config_file
      File "/usr/local/lib/python2.7/dist-packages/traitlets/config/application.py", line 75, in catch_config_error
        return method(app, *args, **kwargs)
      File "/usr/local/lib/python2.7/dist-packages/traitlets/config/application.py", line 564, in load_config_file
        collisions = loaded[0].collisions(loaded[1])
      File "/usr/local/lib/python2.7/dist-packages/traitlets/config/loader.py", line 212, in collisions
        for key in mine:
    TypeError: 'LazyConfigValue' object is not iterable
[I 22:43:24.545 NotebookApp] Serving notebooks from local directory: /root/DataScience/
[I 22:43:24.545 NotebookApp] 0 active kernels 
[I 22:43:24.545 NotebookApp] The IPython Notebook is running at: http://192.168.174.132:8888/
[I 22:43:24.545 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).

참고사이트

http://jdfreder-notebook.readthedocs.org/en/docs/examples/Notebook/Configuring%20the%20Notebook%20and%20Server.html

공식사이트

다중 커널 설치법 (공식)


Activity와 Service간의 통신


Local Broadcast Manager를 이용한 방법 (BR)

그냥 broadcast receiver를 등록해서 사용하는 방법은 다른앱에서도 해당 방송을 들을 수 있기 때문에 private data leak문제가 생긴다.

API 22 (android 5.1)부터 지원하는 Local Broadcast Manager방법으로 구현한다.

Main Activity

리시버 등록 코드

    @Override
    protected void onResume() {
        ...
        // action 이름이 "custom-event-name"으로 정의된 intent를 수신하게 된다.
        // observer의 이름은 mMessageReceiver이다.
        LocalBroadcastManager.getInstance(this).registerReceiver(
                mMessageReceiver, new IntentFilter("custom-event-name"));
    }

    @Override
    protected void onPause() {
         ...
        LocalBroadcastManager.getInstance(this).unregisterReceiver(
                mMessageReceiver);
    }

broadcast receiver 코드

// Our handler for received Intents. This will be called whenever an Intent
// with an action named "custom-event-name" is broadcasted.
private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub
        // Get extra data included in the Intent
        String message = intent.getStringExtra("message");
        Log.d("receiver", "Got message: " + message);
    }
};

Service 코드

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        sendMessage();
        return super.onStartCommand(intent, flags, startId);
    }

    private void sendMessage(){
        Log.d("messageService", "Broadcasting message");
        Intent intent = new Intent("custom-event-name");
        intent.putExtra("message", "This is my first message!");
        LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
    }

실행 결과

실행 결과는 아래와 같이 버튼을 누르면 service가 실행되고 해당 service에서 local broadcast manager를 통해서sendBroadcast를 하면 activity에 등록된 receiver에서 이것을 수신해서 처리하는 방식으로 동작한다.

04-06 16:16:34.110 18075-18075/com.example.user.examactivityservicecommnunication D/messageService: Broadcasting message
04-06 16:16:34.110 18075-18075/com.example.user.examactivityservicecommnunication D/receiver: Got message: This is my first message!

Github 전체코드

Local Bind Service를 이용한 양방향 통신

전통적인 방법인 Bind Service를 이용한 방법을 다룬다.
Started Service까지도 같이 구현하면 Music Player에서 종종 쓰이는 패턴이 된다.
왜냐하면 백그라운드에서 음악이 재생되고 해당 엑티비티가 다시 살아나면 현재 재생되고 있는 음악이 리스트업 되어야 한다. 따라서Bind service로 데이터 통신도 되어야 하기 때문이다.

아래 코드는 간단히 엑티비티에서 서비스의 특정 callback을 호출하고 해당 서비스내의 콜백 함수는 다시 엑티비티의 callback함수를 호출하는식으로 작성 되었다.

main acitivity

   public void onClick(View v) {
        switch (v.getId()){
            case R.id.button:
                Intent Service = new Intent(this, BindService.class);
                bindService(Service, mConnection, Context.BIND_AUTO_CREATE);
                break;
            case R.id.button2:
                mBindService.myServiceFunc();
        }
    }

    // service connection definition
    private ServiceConnection mConnection = new ServiceConnection() {

        // Called when the connection with the service is established
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            BindService.BindServiceBinder binder = (BindService.BindServiceBinder) service;
            mBindService = binder.getService(); // get service.
            mBindService.registerCallback(mCallback); // callback registration
        }
        // Called when the connection with the service disconnects unexpectedly
        @Override
        public void onServiceDisconnected(ComponentName name) {
            mBindService = null;
        }
    };

    // call below callback in service. it is running in Activity.
    private BindService.ICallback mCallback = new BindService.ICallback() {
        @Override
        public void remoteCall() {
            Log.d("MainActivity","called by service");
        }
    };

service

    private final IBinder mBinder = new BindServiceBinder();
    private ICallback mCallback;

    @Override
    public IBinder onBind(Intent intent) {
        return mBinder;
    }

    // declare callback function
    public interface ICallback {
        public void remoteCall();
    }

    // for registration in activity
    public void registerCallback(ICallback cb){
        mCallback = cb;
    }

    // service contents
    public void myServiceFunc(){
        Log.d("BindService","called by Activity");

        // call callback in Activity
        mCallback.remoteCall();
    }

    // Declare inner class
    public class BindServiceBinder extends Binder {
        BindService getService(){
            return BindService.this; // return current service
        }
    }

실행결과

04-09 21:26:18.351 26984-26984/com.example.user.localbindservice D/BindService: called by Activity
04-09 21:26:18.351 26984-26984/com.example.user.localbindservice D/MainActivity: called by service

Github 전체 코드

ResultReceiver로 단방향 메시지 전달

ResultReceiver란 결국 Binder의 wrapper 함수를 의미한다.
따라서 ResultReceiver를 전달 함으로써 Service Activity가 서로 통신할 수 있다.

Activity 쪽 코드

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        progressBar = (ProgressBar)findViewById(R.id.progressBar);
        syncMessage = (TextView)findViewById(R.id.textview);
        syncButton = (Button)findViewById(R.id.button);
        syncButton.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) { // (1)
        progressBar.setVisibility(View.VISIBLE);
        syncMessage.setText("sync start");

        Intent intent = new Intent(this, SyncService.class);
        intent.putExtra("RECEIVER", resultReceiver); //(2)
        startService(intent);
    }

    private Handler handler = new Handler();

    private ResultReceiver resultReceiver = new ResultReceiver(handler){ // (3)

        @Override
        protected void onReceiveResult(int resultCode, Bundle resultData) {
            super.onReceiveResult(resultCode, resultData);

            // SYNC_COMPLETED CODE = 1 
            if (resultCode == 1){  // (4)
                String msg = resultData.getString("msg");
                progressBar.setVisibility(View.GONE);
                syncMessage.setText("Done "+msg);
            }

        }
    };
  • (1): 동기화 버튼을 클릭 할 때를 가정 한다.
  • (3): ResultReceiver를 생성하고 onReceiveResult() 메서드를 오버라이드한다. ResultReceiver 생성자에는 handler 인스턴스를 넣을 수도, null로 할 수도 있다. Service의 백그라운드 스레드에서 ResultReceiver의 send()메시지를 호출하는데, 결과를 받는 쪽에서 UI를 업데이트 하기 때문에 Handler를 거쳐 메인 Looper의 MessageQueue에 Message를 넣은 것이다.
  • (4): SYNC_COMPLETED resultCode를 받으면 ProgressBar를 숨기고, 텍스트 메시지는 R.string.sync_ended로 변경한다.
  • (2): Intent Extra에 ResultReceiver 인스턴스를 전달한다.

서비스 쪽 코드

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        mIntent = intent;

        new Thread(new Runnable() {
            @Override
            public void run() {
                Log.d("SyncService","SyncService started");

                try {
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                Bundle bundle = new Bundle();
                final ResultReceiver receiver = mIntent.getParcelableExtra("RECEIVER"); // (1)
                bundle.putString("msg","Succeed !");
                receiver.send(1,bundle); // (2)
            }
        }).start();

        return START_NOT_STICKY;
    }
  • (1): Intent에서 ResultReceiver를 꺼내오고 작업을 마친후에
  • (2): send() 메서드로 SYNC_COMPLETED라는 결과를 보낸다.

실행 결과

아래의 실행결과는 network 싱크를 가정해서 service에서 5초 thread sleep한 후에 다시 그 결과를 bundle에 넣어서 반환해서 activity에서 그 결과를 표시하는 예제의 결과이다.

작성한 Github 코드

다른 예제 코드: ProAndroidDev: Using ResultReceiver to communicate with IntentService

참고자료

다양한 방법을 설명하고 있음

2012 05 31

말로만 간단히 설명

바인드된 서비스

Android pub, 2011.09.29

Android pub, 2011.10.05

AIDL을 이용한 Service <-> Activity간 Callback 통신

안드로이드 로컬서비스를 이용한 액티비티와 서비스간 통신

Local bind service를 이용한 방법


Android 6.0 이상에서의 백그라운드 서비스 생존 방법에 대한 고찰


개요

문제점

  • Android 6.0에서의 Doze 모드
  • 삼성 스마트 매니저

전략

  • Wakelock
  • Alarm Manager 방식
  • Google Cloud Message 방식
  • Screen ON

화면 항상 켜기

<RelativeLayout 
    ....
    android:keepScreenOn="true"
    ....
>
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

Wakelock

<uses-permission android:name="android.permission.WAKE_LOCK" />

Wakelock 생성 방법

PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
        "MyWakelockTag");
wakeLock.acquire();

Broadcast Receiver Wakelok 방법

 WakefulBroadcastReceiver,

https://developer.android.com/training/scheduling/wakelock.html#wakeful

Scheduling Repeating Alarms

삼성 스마트 매니저 극복 방법

http://gun0912.tistory.com/64
http://blog.soundl.ly/2016/04/blog-post_12.html


SQLite 탐색기 및 기초 쿼리


sqlite-browser는 쉽게 구할 수 있지만 생각보다 query 실행시 멈침 현상이 심하다.
검색 도중 python flask로 구현된 web-based 도구가 있어서 이것을 사용 한다.
sqlite-web이며 설치화 실행 모습은 아래와 같다.

sqlite-web tool

$ sudo apt-get install python-pip ## pip를 이미 설치하였다면 skip 합니다.
$ sudo pip install --upgrade pip  ## pip 업그레이드 합니다.
$ sudo apt install python-setuptools ## sqlite-web설치를 위해 필요
$ sudo pip install sqlite-web     ## sqlite-web 설치 합니다.
## 포트번호 3000(기본값은 8080)으로 현재 디렉토리의 test.db 파일을 웹으로 보고싶은 경우 아래 명령과 같이 입력합니다.
## 만약 test.db파일이 없으면 새로 생성하게 됩니다.
$ sqlite_web -p 3000 ./test.db ## 하이픈 아니고 언더바임에 주의하세요. 
 * Running on http://127.0.0.1:3000/ (Press CTRL+C to quit)
 127.0.0.1 - - [20/Sep/2016 16:25:24] "GET / HTTP/1.1" 200 -
 Created new window in existing browser session.

실행

select

select * from log oder by _id desc limit 20
SELECT Region, count(*)
FROM item
WHERE Region is not null
GROUP BY Region

실행 결과

Region, count
Denmark, 4
Sweden, 1
USA, 10

하위 20개 선택

SELECT *
FROM "log"
order by _id DESC limit 20



postman 크롬 앱

https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop?hl=en


사용법

https://stackoverflow.com/questions/16015548/tool-for-sending-multipart-form-data-request


- 멀티 파트 전송도 가능하다. 


  1. Powerpoint 2013을 실행합니다.
  2. [파일 - 옵션]을 클릭합니다.
  3. [언어 교정 – 자동 고침 옵션 – 자동 고침 – 자동으로 맞춤법 검사기의 추천 단어를 사용]체크를 해제합니다.


2018년에서 바라본 딥러닝의 비판적 평가


  • data hungry

    • 데이터가 매번 너무 많이 필요하다. 세상의 모든 문제를 무한한 데이터가 제공된다고 가정하고 풀 수는 없다.
  • shallow & limited capacity for transfer

    • deep은 아키텍쳐가 깊은거지 딥하게 이해 하는 것 아니다.
    • 너무 트레이닝에 오버핏 된다.
    • adversarial하게 학습 모델을 저격하는 데이터 예제를 쉽게 만들 수 있다.
  • no natural way to deal with hieracyhical strcture

    • 맨 마지막의 featrue는 너무 flatten 하다.
    • 지식은 계측정 관계가 있는 딥러닝은 그렇지 못하다
  • struggled with open-ended inference (개방향 문제에 약함)

    • VQA도 그냥 호랑이 어디, 호랑이는 몇마리? 이런건 잘함
    • open-ended inference란 이 호랑이들은 지금 이곳에 왜 있는가?와 같은 것들이다. 이러한 데이터 영역을 벗어난 오픈 문제들에는 너무나도 약하다.
  • not sufficiently transparent

    • dconv 등과 같은 기술이 있지만 여전히 충분히 이해할만큼 내부가 보이지 않는다.
  • not well intergrated with prior knowledge

    • 사전에 잘 정의된 지식으로 우리는 비행기도 만들고 우주산업도 발전 시켰다.
    • 하지만 딥러닝은 너무 data-driven이다. 이게 인간이 알 수 없었던 무언가를 보여주기도 하지만, 역설적으로 GAN으로 너무 밑 바닥 부터하면 너무 학습도 어렵고 나온 결과를 해석하기도 어렵다. 사전에 왜 잘 정의된 지식과 통합하지 못하는가?
    • GAN의 manipulation 하기도 쉽지 않다.
    • Physical world의 잘알려진 공식 f= ma를 만들자도 있지만, 그결과는
      • 영상으로 부터 가속도 등등을 약간 배운것이지 저 공식을 유도한 내용은 아니다.
  • not inherently distinguish causation from correlation

    • 상관 관계와 인과 관계를 구분 못한다.
      • 예: 알통이 굵으면 보수다.
  • presumes a largely stable world

    • 너무나도 불안정하다.
  • its answer often cannot be full trusted

    • 딥러닝이 낸 결과를 이해할 수 없기에 신뢰하기도 어렵다.
  • difficult to engineer with

    • 해본 사람은 알겠지만 디버깅도 어렵고 새로운 문제에 적용해서 쓸만하게 동작시키는 것도 쉽지 않다.

크게 나누면 두개

  • generalizability

    • 세상의 모든 문제를 infinite 데이터로만 학습 할 수는 없다.
  • Abstraction

    • 더 높은 지식으로 올라가지 못한다.

참고문헌


+ Recent posts