반응형
jupyter_notebook_recover

jupyter notebook source recover

python 노트북 소스파일 복구

jupyter notebook 작업시 주의사항!!!
동일한 소스 코드 창을 여러 개 띄운 경우.
잘못하여 구 버전 창을 보고 저장을 했다면??? OverWrite!!!

신 버전 소스가 날아가는 경험을 하게 된다!!!
이제까지 작업한 것을 날리게 되는 것이다.
실수라고 생각할땐 이미 늦었다… 한숨이 나온다…

혹시나 하여 백업한게 없을까 찾아본다.

방금 작업한 디렉터리에 보니,

.ipynb_checkpoints 폴더가 있다. 
들어가서 동일한 소스코드명을 찾아보았다.
같은 이름의 파일이 있었다.
일단, 복사하여 사본을 만들어 놓고, 열어보았다.

오호… 럭키~~~
다행히도 수동 저장(덮어쓰기) 전에 자동 세이브된 파일이 남아 있었다.
알아두면 긴급시 이렇게 복구할 수 도 있습니다.
^^;

Author: crazyj7@gmail.com

'Python' 카테고리의 다른 글

Drawing Plot, 투명 이미지 datauri 생성  (0) 2023.03.20
set에 set 추가? frozenset  (1) 2021.02.24
Docker python venv 패키지 유지  (0) 2020.06.07
딕셔너리에서 키삭제  (0) 2019.12.07
파이썬 충돌해결 module conflict  (0) 2019.12.01
반응형
Docker_python3.7

Docker ubuntu16.04 + python3.7 venv 패키지유지 환경

ubuntu16.04 에 python 3.7 을 venv 로 가상 환경으로 만들어서 필요할 때 마다 pip 로 패키지를 추가하고 컨테이너 종료시에 사라지지 않고, 유지할 수 있는 도커 이미지를 만들어 보자.

도커 커맨드를 잘 이용하면 금방 만들 수 있을 것이라 생각했지만 쉽지 않았다. 특히 pip로 패키지를 설치한 것을 계속 유지하는 부분과 venv 환경으로 작동하게 하는 부분.
마지막으로 jupyter notebook을 필요한 경우 작동할 수 있도록 하였다.

결론부터

바로 이미지를 받아 실행하고자 한다면 다음을 참고한다.
아래 커맨드를 실행하면, 위 구성한 도커 이미지를 받아 컨테이너를 구동하게 된다. 현재 디렉터리에 py37 이라는 venv 폴더가 생성되고 패키지를 유지하도록 된다.

C:\hub\docker_ubuntu16.04-python3.7>type b.bat
docker run -it -v /c/hub/docker_ubuntu16.04-python3.7/py37:/root/py37 crazyj7/ubuntu16.04-python3.7

C:\hub\docker_ubuntu16.04-python3.7>type j.bat
docker run -it -v /c/hub/docker_ubuntu16.04-python3.7/py37:/root/py37 -p 8888:8888 crazyj7/ubuntu16.04-python3.7 jupyter notebook --ip=0.0.0.0 --port=8888 --allow-root --NotebookApp.token='' --NotebookApp.password=''
  • b.bat : python3.7 구성환경 구동하여 bash 쉘 구동. python을 실행할 수 있다.

image
위 쉘에서 pip로 패키지를 추가할 수 있다. 나중에 다시 컨테이너 구성시에도 패키지가 항상 유지(보관)된다.

생성된 py37 폴더에 소스코드를 작성하고 작업 디렉터리로 사용해도 되고, 별도 공유 폴더를 만들어 볼륨을 연결해서 사용해도 된다.
image
종료시에는 ^C를 두 번 입력하면 종료된다.

image

만드는 과정

아래 github에 내가 작성한 소스가 있다.
https://github.com/crazyj7/docker_ubuntu16.04-python3.7

먼저 나의 작업 디렉터리 구조이다.
c:\hub\docker_ubuntu16.04-python3.7

Dockerfile을 만들어 보자.

Dockerfile

FROM ubuntu:16.04
MAINTAINER crazyj7@gmail.com

RUN apt-get update -y
RUN apt-get upgrade -y
#RUN apt-get install -y build-essential binutils libtool make gcc g++ openjdk-8-jdk git dos2unix vim wget
RUN apt-get install -y build-essential wget vim dos2unix
RUN apt-get install -y zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev wget software-properties-common
RUN apt-get install -y ocl-icd-opencl-dev
RUN add-apt-repository -y ppa:deadsnakes/ppa
RUN apt-get update -y
RUN apt-get install -y python3.7
RUN apt-get install -y python3.7-venv

# env
WORKDIR /root
ENV HOME /root
SHELL ["/bin/bash", "-c"]

ENV PATH "/root/py37/bin:$PATH"
RUN echo "source /root/py37/bin/activate" >> .bashrc

COPY ./requirements.txt /root/requirements.txt
COPY ./initvenv.sh /root/initvenv.sh

ENTRYPOINT ["/bin/bash", "-c", "/root/initvenv.sh \"$@\"", "--"]
VOLUME /root/py37
CMD ["/bin/bash"]
  • 앞에 RUN은 기본 ubuntu 16.04를 베이스로 하여 시스템에 필요한 패키지를 설치한다. 그리고 python 3.7을 설치하였다.
  • 환경 설정 부분에서 작업 디렉터리를 /root로 하고, 기본 쉘을 bash로 변경. 환경 설정 파일들을 추가.
  • bash 구동 스크립트에 /root/py37의 venv를 활성화 시키도록 하였다.
  • 최초 구성할 기본 python 패키지들을 requirements.txt에 몰아 넣어 구축시 설치되도록 하였다.
  • 그리고 entry point로 initvenv.sh 스크립트를 추가하여 항상 구동하게 하였다. 뒤에 파라미터는 cmd로 별도로 파라미터로 줄 경우 쉘로 구동할 수 있도록 받게 하였다.
  • 볼륨은 /root/py37로 공유 연동 가능하도록 설정.

initvenv.sh

#!/bin/bash

ENVNAME=/root/py37
if [ "$(ls -A $ENVNAME)" ]; then
#	echo Env $ENVNAME exists. skip init.
	source $ENVNAME/bin/activate
else
	echo Env $ENVNAME not exists. init env.
	python3.7 -m venv $ENVNAME
	source $ENVNAME/bin/activate
	pip install --upgrade pip
	pip install -r requirements.txt
fi

if [ $# ]; then
	$*
else
	/bin/bash
fi

py37 폴더 존재여부에 따라 최초 초기화 여부를 수행한다. 별도 지정한 cmd가 있으면 cmd를 수행하도록 하였음. (jupyter notebook 등)

도커 빌드
build.bat

docker build -t crazyj7/ubuntu16.04-python3.7 .

Author: crazyj7@gmail.com

'Python' 카테고리의 다른 글

set에 set 추가? frozenset  (1) 2021.02.24
Jupyter Notebook 소스 복구  (0) 2020.06.16
딕셔너리에서 키삭제  (0) 2019.12.07
파이썬 충돌해결 module conflict  (0) 2019.12.01
파이썬 개발환경/가상환경구축  (0) 2019.12.01
반응형
git

Git simple guide


crazyj7@gmail.com

Start git repository download

git clone http://github.com/crazyj7/...git
git clone ssh://git@192.168…:2222/home/git/repos/…git

Work

make new branch and work

최신 master 브랜치를 받아서 작업 브랜치를 만들고 작업한다.

git pull
git branch alpha
[work to do…]

commit and push

변경된 파일들을 index표시를 하고 커밋한다. 그 후 원격 서버에 올린다.

git status .
git add -u
git add [files/dirs]
git commit -m “update message”
git push (or git push origin master)

merge to master

마스터 브랜치를 기준으로 새 작업 브랜치를 가져와 병합 한다.
병합후 변경내역을 원격 서버에 올린다.

git branch : 현재 브랜치 확인
git checkout master
현재 브랜치가 master로 변경됨
git merge alpha
현재 브랜치 기준으로 alpha 브랜치를 가져와 병합한다.
git push

rollback

작업한 파일을 원래대로 되돌리기(Warn!)

git checkout [file] or [. (current dir)]

마지막 커밋은 취소하고 수정했던 것도 전부 취소하기(Warn!)

cancel last commit
git reset --hard HEAD^ (HEAD~1 in Windows)
위 옵션에서 --hard 옵션을 빼면 커밋만 취소하고 수정 파일은 그대로 유지한다. (주의!!! 수정내역이 없어지므로 필요시 백업!)
git reset HEAD^

Cancel Merge (병합 취소)
merge후 conflict나고 처리가 복잡할 경우 바로 이전으로 돌아가기

git merge --abort


History

GUI로 히스토리를 확인할 수 있다.

gitk

한글이 깨질 경우 hangul encoding 변경 후, 다시 시작

git config --global gui.encoding utf-8


Errors

pull fail?

cancel all worked here. cancel commit.
변경 내역을 되돌리고, 다시 pull로 원격에서 업데이트한다.(Warn! 주의!!! 작업내용삭제됨!!! 일단 백업해 두는 것을 추천.)

git reset --hard HEAD^ (HEAD~1 in Windows) or HEAD
git pull

그래도 pull이 실패한다면 stash로 작업내역을 백업하고 다시 받는다.

git stash
git pull

참고

git reset --soft HEAD~ 는 HEAD를 한 커밋 이전으로 이동시킨다.
git reset HEAD~ 는 HEAD 이동 및 index도 이동한다.
git reset --hard HEAD~ 는 HEAD 이동, index 이동, working dir도 이전으로 돌린다.
git stash 는 reset을 하지만 변경내역은 백업을 해 둔다. 파일명 지정시 git stash save [file] , git stash list , git stash pop/apply 로 불러오기. 다른 브랜치에 잘못 작업한 것을 원래 브랜치로 이동시킬 때 사용가능

cancel git add?

git reset [file/dir]

conflict?

edit conflicted file and git add/ git commit
or choose one side

작업하고 commit을 하고 원격으로 push하는데 conflict가 발생할 수 있다. 이것은 원격에 이미 checkout받은 브랜치가 변경되었다는 것이다.

git push : 리모트에서 거부 발생!!!
git pull
conflict!!! 자동병합 충돌 발생!!! 충돌 파일 확인!!
git status : 충돌파일 정보
파일이 병합처리되어 >>>(원격) <<<(로컬) 등 문자 포함
이 때는 파일을 수정하고 다시 커밋하고 푸시하는 방식이 있고, 어느 한 쪽을 선택할 수도 있다.

충돌 발생시 충돌 파일을 수정하든지 어느 한 쪽을 골라야 한다.
현재 브랜치 기준으로 내것과 원격의 것을 잘 구분해야 한다.

git checkout --ours [file] : 로컬파일이 진짜다. 로컬 우선!!!
git checkout --theirs [file] : 서버에 있는 최신것을 따르겠다. (주의!!! 로컬 파일 내용은 없어짐!!! 로컬을 무시하겠다.)

or edit file (양쪽을 모두 반영하겠다. >>> <<< 파일 수정 )
git add -u
git commit -m “update”
git push

cancel delete local file

파일을 잘못 삭제했을 경우 복구하는 법

git status . ; check which file is deleted.
git checkout HEAD [file]

cancel work

git reset . ; reset all worked
git checkout . ; go before work


Ignore files

If you dont want to upload some files or dirs,
create .gitignore file in the current directory.
add files or dirs
ex)

build/
*.obj
dataset/
*.o


Branch merge

  • fast-forward
    only one branch is changed or it doesn’t exist same file changed.)
    a -> b(master) : no change
    b(newbranch) -> x ->y(bugfix)
    merge : a->b->x->y (master=bugfix)
    git push or git pull
    특별히 겹치는 부분이 없으면 자동으로 충돌없이 병합된다.
  • merge commit
    Both branches are changed. Update conflict files and commit
    git checkout master : 마스터를 가져와서 (항상 메인을 기준으로)
    git merge alpha : 알파를 불러와 현재(마스터)와 합친다.
    충돌이 나면 해당 파일을 수정하고 병합한다. 여러 브랜치가 하나의 브랜치(현재 브랜치)로 합쳐진다. 과거 히스토리 유지.
  • rebase
    a -> b -> c -> d (master)
    b -> x -> y (alpha(bugfix))
    위 버그 수정 브랜치를 마스터로 반영하고, 마스터만 유지하고 싶다. 그런데 버그패치동안에 마스터가 변경된 상태다.
    merge: a->b->c->d ->x->y (master=bugfix)
    git checkout alpha : 수정 브랜치를 가져와서
    git rebase master : 마스터에 연결시도
    update conflict files : 충돌발생 파일 수정(c,d,x,y)
    git add -u
    git rebase --continue : 리베이스 계속 진행
    git checkout master : 마스터를 가져와서
    git merge alpha : 알파를 현재로 불러와서 병합.
    베이스를 새로 지정한다. 위의 브랜치 트리가 한 줄로 만들어진다. 과거 히스토리 변경 주의.

Delete branch

브랜치 삭제 -d 옵션으로 안되면 -D 옵션으로 한다.

git branch -d [alpha]


Delete file

로컬 및 저장소에서 파일 삭제

  • Remove the file in both local and remote github
    git rm [file]

저장소에서만 삭제하고 로컬 파일은 보존

  • Remove remote file in github but remain it in local
    git rm --cache [file]

Delete all .git files

리눅스에서 모든 .git 폴더 제거하기(incude subdir)

check files…
find . -name ‘.git’
WATCHOUT!!!
find . -name ‘.git’ -prune -exec rm -rf {} +

윈도우에서 모든 .git 폴더 제거하기(incude subdir)

batch file create
FOR /r “c:\temp” %%f IN (.git) DO RD /s /q “%%f”

삭제하기 전에 목록 출력만(rd /s /q 대신 echo) 해서 확인을 하는 것이 좋다.

Repository mirror

저장소 복사

git clone --mirror [가져올 URL]
git push --mirror [가져욜 URL]

# git remote -v 
원격지 저장소 주소 확인

# git clone --mirror https://user@a.c.com/maypp/test.git
먼저 옮길 내용을 클론으로 받는다.

올릴 곳의 주소로 설정
# git remote set-url --push origin http://local.com/mobile/android.git
# git push --mirror
이제 로컬의 내용을 변경된 주소로 올린다.

Tag

태그는 버전명을 주거나 할 때 지정해 준다.

  • 먼저 checkout으로 받고, 그 안으로 들어가서 작업한다.
  • 현재 갖고 있는 태그 목록
git tag
  • 현재 받은 checkout에 tag를 만들어 걸기
git tag v1.0
git push origin v1.0
-- 이렇게 해서 서버로 올린다.
  • 태그로 받기
git checkout v1.0
  • 태그 삭제
git tag -d v1.0

-태그 v.1.0을 수정할 때는 1.1 브랜치를 만들어서 작업

태그로 가져와서
git checkout v1.0
브랜치를 만들고
git branch 1.1
해당 브랜치로 전환(이걸 안해주면 소스 날릴 수도)
git checkout 1.1
수정작업
git add -u
git commit -m "patch 1.1"
git push

-master로 위 브랜치 합치기

마스터로 가서
git checkout master
브랜치 1.1을 가져와 머지함
git merge 1.1
git status
충돌파일 편집 수정
git add -u
git commit -m "merge 1.1"
git push
태그를 추가
git tag v4.0
git push origin v4.0

Author : crazyj7@gmail.com

'Develop > Linux_Unix' 카테고리의 다른 글

[도커] tomcat, mariadb 환경 war hang/slow  (0) 2021.04.28
Bash Tip 작업속도를 빠르게  (0) 2021.03.03
리눅스 백그라운드 실행(터미널종료에도)  (1) 2021.02.23
Ubuntu18/tomcat8 setup  (0) 2019.11.08
VI 사용법  (0) 2015.06.02

+ Recent posts