Command Line Interface
dotfiles and materials available at @junhocho[1]
GUI보다 좋은 CUI,
CUI. Command Line Interface를 쓰시면 어디서든 쉽게, 인터넷만 있고, Terminal이나 Putty가 있으면 개발을 할 수 있다.
이런 팀뷰어 없이도 말이다.
CLI. 그래서 어떻게?
( Tmux + VIM ) 를 사용하자
CLI를 사용하는 이유.
- Portable (인터넷이 구리면 팀뷰어는 힘들지)
- Simple
- Automated (원하는 기능은 다 자동화 시킬 수 있다)
- and Cool (남들이 보면 해커인줄 알꺼야)
그리고 당신이
- server가 있고 (노트북과 인터넷만 있으면 어딜가도 괜찮아)
- mac이 있고 (iTerm2는 편하고 이쁘니까)
- blogger
- computer geek
답은 CLI.
드루와드루와
This presentation are inspired by @nicknisi and youtube link
Coverage
- Ubuntu and ZSH (The OS 그리고 Shell)
- Vim (The editor)
- Tmux (The workspace)
공유할 만한 zsh, tmux, vim 설정 파일들, 클릭
SSH: Secure Shell
Secure connection to server
Host(server) IP : 147.46.89.175
(for ex)
User ID : bctjv-[yourname]
password : bctjv
Login !
- Linux/macOS :
ssh bctjv-[yourname]@147.46.89.175
- Windows : use putty
OpenSSH 가 서버에 설치 되어 있어야 ssh 접속 가능
sudo apt-get install openssh-server
Ubuntu (Linux)
- One of Linux
- Commonly used in Deep Learning libraries
- link about Directories : tmp, root, var, usr, home, bin
Simple commands. 등등...
mv
, cp
, rm
, mkdir
, rmdir
ls -lh
, df -lh
, du -sh ./*
, whoami
cp *.py /path/to/dest/
rm -rf /다/지워/버리겠다/*.txt
sudo apt-get install tmux
이런 커맨드도 있음.
cowsay
cmatrix
funny commands
Some Signals
# ==== Ex1) ====, $은 터미널에 쳐볼 것.
$ yes yell!
<C-c> # Control - c. 돌아가고 있는 프로세스를 꺼버린다.
# ==== Ex2) ====
$ python -c '
c = 0
while True: print c; c= c+1'
<C-z> # Control - z. 터미널상에서 잠깐 멈추고 백그라운드로!
$ fg # 다시 아까 돌아가던 foreground로
# ==== Ex 3) ====
$ python
<C-d> # Control - d. 아예 꺼버리기
파일 권한과 소유권
- directory and file / permission, ownership
다음 상황에서
^Workspace
: drwxrwxr-x
: directory and has 775 permision
.zshrc
: -rw-r--r--
: file and has 644 permision
hello.py
: -rwxr-xr--
: file and has 754 permision
- change permssion :
$ chmod 755 hello.py
: 755는 이진법으로 111 101 101, 즉 rwxr-xr-x. 숫자 세개가 각 나, 그룹, 나머지를 뜻함. 그래서 나는 rwx (읽고 쓰고 실행 권한 있음), 그룸과 나머지는 r-x (읽고 실행 권한만 있음.) - change ownership :
$ chown userid hello.py
sudo 어떤커맨드
: borrow sudo privilege and command
추가로) 쉘 스크립트를 executable하게 바꾸기.
Write on top of shell script
#!bin/bash
if shell script,
#!bin/usr/python
if python script.
chmod +x script
then the script is executable as $ ./script
Do not abuse sudo 👎
^permission이 없는 것은 sudo 명령어로 해결가능.
하지만 함부로 사용 No
linux를 root 계정을 사용하는 것은 안전하지 않음.
보통 모든 유저에게 sudo 권한을 주진 않음.
Shell : 리눅스 터미널 소통 창구
- Default shell is
bash shell
그 유명한 배시쉘 bash shell
made in 1989 which is pretty uncomfortable. 불편해
그래서 zsh
을 써보자
- manage zsh with http://ohmyz.sh
Why ZSH?
- smart autocomplete
- highly customizable
- Bundled functions, helpers, plugin, themes : ex) git
Install zsh
# 지금은 안될 수도 있음! oh-my-zsh를 참고하자! http://ohmyz.sh
sudo apt-get install git # git 설치 ( 코드 개발 플랫폼 )
sudo apt-get install zsh # zsh 설치
cd # 홈폴도로 이동.
sh -c "$(curl -fsSL https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh)" # install
sudo chsh -s /usr/bin/zsh [your-id] # change your default shell into zsh
커스터마이즈를 해보자! git clone Junhosetting
first
cd # move to home folder
git clone https://github.com/junhocho/junhosetting #Star it
cd junhosetting
vi install.txt # peek vim
엥? vi?
특히 Vim : improved Vi. vi는 에디터. vi커맨드가 곧 vim임
Vim quit? [Alt F4] 가 아닌 다음처럼
:q # vim quit
:wq # save and quit. identical to <shift-ZZ>
1 # Zsh setup
2 zsh autojump - https://github.com/wting/autojump.git
3 zsh syntax highlighting - https://github.com/zsh-users/zsh-syntax-highlighting.git
4
5
6 #alias-tips
7 $ cd ${ZSH_CUSTOM1:-$ZSH/custom}/plugins # 커스텀 플러그인 폴더로 이동
8 $ git clone https://github.com/djui/alias-tips.git # 저장소를 로컬로 복사
9 $ $EDITOR ~/.zshrc # 에디터로 파일을 에디터로 불러들임
10 plugins=(git ... alias-tips) 추가
11 ...
더 해보자
ZSH syntax highlight : 맞는 커맨드면 초록색, 틀린 커맨드면 빨간색
cd
# get source of zsh-syntax-highlighting
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git
# put codes in .zshrc
echo "source ${(q-)PWD}/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh" >> ${ZDOTDIR:-$HOME}/.zshrc
# activate it now
source ./zsh-syntax-highlighting/zsh-syntax-highlighting.zsh
# this refreshes your .zshrc modofication to your current environment
source ~/.zshrc # dotfiles locate in home folder
It highlights if your command is valid
또 좋은 autojump : 내가 자주 가는 디렉토리로 j 커맨드로 빠르고 쉽게 이동.
some more useful commands
ls . | wc -l # how many files in this directory.
du -sh ./* # how big are folders and files in this directory
df -lh # list my Filesystem in human readable format
ln -s [target-folder] [make-link] # make symbolic link
grep -nr --color "keyword-to-find" * # locate "keyword-to-find"
unzip some.zip # unzip
tar -xvf some.tar.gz # untar
echo $CUDA_HOME # print some environment variable
wget https://goo.gl/ka7Yz5 # download file in web
wget http://www.ekn.kr/data/photos/20150938/art_1442387799.jpg # Download jpg image
python print-experiment-output.py 2>&1 | tee experiment.log # Store all print output in experiment.log
which python # useful to locate command
history # my command history
pstree # process tree
htop # system monitoring
nvidia-smi # gpu monitoring
who # which users are online?
Alias
- 커맨드 단축해버리기!
alias wn="watch nvidia-smi"
을 .zshrc에 넣어놓으면. 앞으로wn
으로watch nvidia-smi
를 빠르게 실행 가능.
You don't have time to type : grep -nr --color "keyword-to-find" *
- put your alias at the end of
.zshrc
cd
cat junhosetting/alias >> ~/.zshrc # Copy paste alias to end of .zshrc
tail ~/.zshrc # print some lines of the end of .zshrc
source ~/.zshrc # refresh this environment
grepn "key-word-to-find" * # Check the alias working
Port
Well know ports : 22 : SSH
/ 80 : HTTP
/ 3389 : Window rdp
...
Portforward from CLIENT to SERVER : ssh -L localhost:$2:localhost:$2 $1
# Ex) Do this at SERVER.
Jupyter notebook --no-browser --port 8888 # random ports 8888
# Do this at CLIENT
ssh -L localhost:8888:localhost:8888 junho@147.46.89.175
# Open web-browser in CLIENT and connect to `localhost:8888`
VNC (GUI) : Use GUI safely with SSH
SCP: Move file between client and Server
use it in CLIENT (unix) terminal.
because Client : 유동 ip / Server : 고정 ip
scp /client/A host:~/path/dest/B
# Client의 파일 A를 host의 경로 B로 옮긴다.
scp host:~/path/dest/A /client/B
# Host의 파일 A를 Client의 B로 옮긴다.
scp -r junho@147.46.89.175:~/Downloads/WordCount ~/Workspace/
# -r 은 재귀적으로. 서버의 WordCount 디렉토리와 안의
# 모든 파일을 내 client의 Workspace의 복사
Windows는 WinSCP
Killing Process
$ python -c '
c = 0
while True: print c; c= c+1'
<C-z> # go to sleep and background.
$ ps aux | grep python # print process that contains `python`
kill -9 [process-id]
: 356 in this case
process killed!
2. Vim
유명한 IDE들,
Visua Studio , Eclipse, Webstorm, Android studio, Pycharm, ZeroBaneStudio는 좋지만 client일때 좋음. server에서 사용하기는 힘들다.
SSH에서는 VIM만큼 편한게 없다!
Vim
- Vim : improved Vi.
- probably already installed in your system
- Highly customizable
- setting file : .vimrc
Modal editing
- Normal - navigate the structure of the file
<esc>
- Insert - editing the file
i, o, a, s, ...
- Visual - highlight portions of the file to manipulate at once
v, shift-v, ctrl-v
- Ex - command mode
:, /, ?
vim에서 마우스는 사용할 필요가 없다.
h j k l
⬅️ ⬇️ ⬆️ ➡️
12j
: move down 12 tiems, numbers affect
:29
: move to line 29:set number
: show line numbers:set nonumber
:no
usually the opposite of command
그외에
^e
- scroll the window down^y
- scroll the window up^f
- scroll down one page^b
- scroll up one pageH
- move cursor to the top of the windowM
- move cursor to the middle of the windowL
- move cursor to the bottom of the windowzz
: move window so that my cursor is at centeru
: undo^r
: redo:w
: save:q
: quit:wq
: save and quitgg
- go to top of fileG
- go to bottom of file
vim의 learning curve.... 입문부터 고수까지 빡셈... 하지만 익숙하면 너무 편하다.
다음의 중요한 3 요소
text objects
w
- wordss
- sentencesp
- paragraphs
Motions
a
- alli
- int
- 'tilf
- find forwardF
- find backward
Commands
d
- delete (also cut)c
- change (delete, then place in insert mode)y
- yank (copy)v
- visually select
이것들로
{command}{text object or motion}
조합으로 아주 편리하게 사용가능하다.
diw
: delete in word
caw
: change all word
yi)
: yank all text inside parentheses
va"
: visually select all inside doublequotes including doublequotes
방금 한 커맨드 또 하는 건 The DOT command .
로 된다.
Additional commands
dd
/yy
- delete/yank the current lineD
/C
- delete/change until end of line^
/$
- move to the beginning/end of lineI
/A
- move to the beginning/end of line and inserto
/O
- insert new line above/below current line and insertJ
- delete line break. pretty usefulp
- paste*
on word - find all this words.^a
on number - increment
근데 vim의 포텐에는 끝이 없다: Macro
A sequence of commands recorded to a register
Record a macro
q{register}
- (do the things)
q
Play a macro
@{register}
텍스트에서 지금 커서의 위치를 marking해놓고 돌아오는게 가능
mk
: mark position atk
`k : move cursor to position k
Ex mode에서 가능한 편리한 커맨드들
/someword
: findsomeword
:spl
/:vspl
: split (horizontal or vertical) vim pane^w + w/arrow
: move pane in vim:e.
: file tree:%s/foo/bar/g
: replace allfoo
tobar
: 로 시작하는 것들은 vimrc에서 초기 명령어로도 사용 가능.
:syntax on
: syntax on:set paste
: paste mode. Useful when using vimindent
option:set cursorline
: show cursor with underline
vimrc는 vim의 세팅 파일.
cp ~/junhosetting/vimrc ~/.vimrc
Plugins : install what you need. vim 편리의 끝판왕
- vundle - plugin manager
- nerdtree - file drawer
- ctrlp - fuzzy file finder
- fugitive - git tool
- syntastic - syntax checker / linter
Vim은 엄청나게 customizable하다.
Not an IDE. It's VIM
Install Vundle with plugins
cd
git clone https://github.com/gmarik/Vundle.vim.git ~/.vim/bundle/Vundle.vim
# clone in ~/.vim/bundle/ and setup your vimrc with plugins
vi # then do :PluginInstall
# Test :NERDTree with <F2> in vim
# Test if autocomplete works
ctags : Source code inspection
sudo apt-get install ctags
cd your-project
ctags -R . # will produce `tags` in the folder
vi code.cpp
< C - t > # to go inside declration
< C - ] > # to go back
3. Tmux : Terminal Multiplexer
vim + tmux
Why Tmux?
- Don't want to stop your SSH session.
- Experiment session
- Downloading big file
- web-server
- Extendable Workspace
- And Maintain your session
- Co-operation
tmux new -s [session-name] # create new session
tmux ls # list existing session
tmux attch -t [session-name] # attach existing session
tmux new -s py-practice
<C-b>
: Tmux binding-key.
- will change it to
<C-a>
unless you have flexible finger bone
<C-b> c
, bind c
: New window
bind d
: dettach from working session
Let's configure Tmux.
cp ~/junhosetting/tmux.conf ~/.tmux.conf # dotfile로 이름바꿔서 복붙
tmux source .tmux.conf # If you have working tmux session
# Now your Tmux looks better and <C-a> is the binding-key
tmux new -s [session-name]
bind c
: new window
bind n
: Next window
bind p
: Previous window
bind %
: vertical split pane
bind "
: horizontal split pane
bind h(jkl, arrow)
: move my cursor pane to pane
bind [
: copy-mode / q
: copy-mode exit
exit
/ <C-d>
: quit pane
Synchronize-panes
bind :setw synchronize-panes
화면 쪼개기!
bind %
and bind "
결론
답은 linux + GIT + tmux + vim
참고할만한 dotfiles들
dotfiles and materials available at @junhocho[1:1]