$ vi ~/.vimrc
... 중간 생략 ...
" ------------------------------------------
" vim-go 설정
" -----------------------------------------
filetype plugin indent on
" vim-Plug Plugin List
call plug#begin('~/.vim/plugged')
" 자동완성을 해주는 Plugin.
" :CoCInstall coc-<lang> 으로 지원되는 Language 설치가 가능
" NOTE: 내 경우는 아래 neoclide/coc.nvim을 설치하지 않았다.
" 왜냐하면, 나는 node.js를 사용하지 않기 때문.
" Plug 'neoclide/coc.nvim', {'branch': 'release'}
" 많이 사용되는 plugin list
Plug 'majutsushi/tagbar'
Plug 'vim-airline/vim-airline'
Plug 'tpope/vim-fugitive'
" vim-go 사용을 위한 Plugin
Plug 'fatih/vim-go', { 'do': ':GoUpdateBinaries' }
" 자동 완성 Plugin 이다.
Plug 'SirVer/ultisnips'
Plug 'maralla/completor.vim'
" Misc utilities
Plug 'milkypostman/vim-togglelist'
Plug 'AndrewRadev/splitjoin.vim'
Plug 'mhinz/vim-startify'
" preview plugin
Plug 'junegunn/fzf', { 'dir': '~/.fzf', 'do': './install --all' } " fzf 사용시 꼭 설치; ~/.fzf 에서 ./install --all 실행해야 함.
Plug 'junegunn/fzf.vim'
" Initialize plugin system
call plug#end()
... 중간 생략 ...
${HOME}/.vimrc 파일을 저장하고, 아래와 vim 편집기를 실행 후 vim 내부 명령을 수행한다.
$ vim
... 중간 생략 ...
:PlugInstall
수십 초 정도 시간이 흐르면서 plugin을 설치할 것이다. (시간이 많이 걸리니까 다른 일을 하면서 신경을 끄는게 좋다)
vim-go 관련 설정 (개인 취향에 따라 설정 값 정하기)
아래 vim-go 관련 설정은 개인 취향에 따라 값을 정하면 된다.
$ vim ~/.vimrc
... 중간 생략 ...
" -------------------------------------------------------
" NOTE: *.go 파일을 저장할 때 Auto formatting하고,
" 관련 go package를 자동으로 .go 소스 코드 파일에 추가해준다.
let g:go_fmt_command = "goimports"
let g:go_list_type = "quickfix"
let g:go_addtags_transform = "camelcase"
let g:go_autodetect_gopath = 1
let g:go_highlight_types = 1
let g:go_highlight_fields = 1
let g:go_highlight_functions = 1
let g:go_highlight_function_calls = 1
let g:go_highlight_extra_types = 1
let g:go_highlight_generate_tags = 1
let g:go_highlight_operators = 1
let g:go_auto_type_info = 1
let g:go_auto_sameids = 1
" NOTE: 문서를 Popup window 형태로 보여주기 (:GoDoc 명령)
let g:go_doc_popup_window = 1
" NOTE: go source code 작성할 때, 실시간으로 자동 완성할 추천 문장을 보여줌.
let g:completor_filetype_map = {}
let g:completor_filetype_map.go = {'ft': 'lsp', 'cmd': 'gopls - remote=auto'}
" NOTE: quickfix 이동 및 open/close
nnoremap <C-n> :cnext<CR>
nnoremap <C-p> :cprevious<CR>
nnoremap <LocalLeader>q :call ToggleQuickfixList()<CR>
" NOTE: Coverage toggle
nnoremap <LocalLeader>c :GoCoverageToggle<CR>
" NOTE: Go 프로그램을 build, run, test하는 명령에 대한 설정
autocmd FileType go nnoremap <Tab>b :GoBuild<CR>
autocmd FileType go nnoremap <Tab>r :GoRun<CR>
autocmd FileType go nnoremap <Tab><Tab>r :GoRun %<CR>
autocmd FileType go nnoremap <Tab>t :GoTest<CR>
autocmd FileType go nnoremap <Tab><Tab>t :GoTestFunc<CR>
autocmd FileType go nnoremap <Tab>c :GoCoverageToggle<CR>
" -------------------------------------------------------
... 중간 생략 ...
Sendmail 서버가 설치된 Ubuntu OS 호스트에서 mail CLI 또는 mailx CLI를 통해서 mail 발송만 하는 경우
Sendmail 서버가 설치된 Ubuntu OS 호스트에서 내가 개발한 mail 전송 프로그램이 localhost address(127.0.0.1) 주소로 binding해서 보내는 경우
설정을 수정하지 않고, 기본 설정값으로 사용해도 다 잘 동작한다.
단, Sendmail 서버가 설치된 장비가 아닌 Remote 장비에서 email을 발송하도록 하거나
내가 설치한 Sendmail 서버를 수신용 서버로 사용하고자 한다면 아래와 같이 인터넷 Address(즉, 0.0.0.0)을 사용할 수 있도록 설정 항목을 수정해야 한다.
$ vi /etc/mail/sendmail.mc
... 중간 생략 ...
## NOTE: Addr 항목 값을 "0.0.0.0"으로 변경한다.
DAEMON_OPTIONS(`Family=inet, Name=MTA-v4, Port=smtp, Addr=0.0.0.0')dnl
DAEMON_OPTIONS(`Family=inet, Name=MSP-v4, Port=submission, M=Ea, Addr=0.0.0.0')dnl
... 중간 생략 ...
$ m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf
Sendmail 서버 프로그램을 설치한 장비의 domain name을 /etc/mail/local-host-names 파일에 설정한다.
$ vi /etc/mail/local-host-names
localhost
my-host.my-domain.kr
mail.my-domain.kr
수정했으니까, sendmail을 재기동하여 수정된 설정을 반영한다.
$ systemctl restart sendmail
Sendmail 서버를 이용하여 메일 발송하는 테스트하기
우선, 간단한 mail 에이전트 CLI 프로그램을 설치한다.
$ apt-get install mailutils
mail CLI를 이용하여 메일을 발송하는 스크립트를 작성한다.
$ vi send-mail.sh
#!/usr/bin/zsh
MY_DATE=$(date)
MY_SUBJ="This is test mail (${MY_DATE})"
echo "My hello world at ${MY_DATE}" | mail -s $MY_SUBJ sejong@naber-nara.kr
$ chmod +x send-mail.sh
$ ./send-mail.sh
별루 설정한거 없고, 작업한게 없지만
메일을 잘 갈 것이다 ^^
Python, Golang 같은 언어로 sendmail 서버 프로그램에 메일 전송 요청을 했는데, 별로 어려운 거 없이 잘 작동하는 것을 확인했다.
(기본 설치는 SMTP 서버 접근에 대한 인증이 따로 없어서 그냥 바로 테스트가 된다. 쫌~~~ 위험함 ㅠㅠ)
참고: Python은 아래 Web Docs의 Example code를 복붙(Copy & Paste)하면 잘 동작한다.
처음에는 한영 전환 설정하는 방법을 잘 몰라서 설정 화면에서 이것저것 다 해봐도 잘 안 되었다.
몇 가지 설정 메뉴를 왔다갔다하고, 시행 착오를 겪은 끝에 정확한 "한/영" 전환 설정 방법을 알았다 ^^
!!!한글 입력을 위해 설정해야 할 핵심은키보드가 "Korean -> Korean"이 아니라 "Korean ->Hangul" 이라는 것!!!
아래에 설명된 설정 순서를 따라해보면 한글 입력이 잘 될 것이다. ^^
화면 하나하나 캡쳐서 설명을 기록하다보니 내용이 길다.
어려운 내용은 없고, 그냥 화면을 보면서 따라하면 "한영 전환" 설정이 잘 될 것이다.
Step 1 : 한국어 언어 지원 추가
아래 Settings 화면을 이용하여 "Korean" 언어 지원 도구를 설치해야 한다.
.
.
.
Step 2 : Reboot (OS 재시작)
주의: 위와 같이 "한국어 언어 지원"을 설치하고 나서, 아래와 같이 Ubuntu 24.04를 Reboot해줘야 한다. 시간을 아껴보려고, ibus-setup 입력기 설정 프로그램을 바로 실행시켜보았는데 정상적으로 동작하지 않았다. 따라서 꼭! 꼭! OS Reboot 후에 다음 설정 절차를 진행하시길 ^^
OS Reboot이 완료된 후, 아래와 같이 IBus 설정 작성을 진행한다.
Step 3 : 한글(Hangul) 입력 방식 추가
Hangul(한글) 입력을 위해서 ibus 프로그램이 필요한다.
아래 화면과 같이 [ ibus-setup ] 명령을 실행하여, [ IBus Preferences ] 화면을 연다.
아래 설정 화면과 같이 [ Input Method ] 를 추가한다.
[ Input Method ]로써 "Korean"을 선택한다.
!!! 중요 !!!
꼭 "Hangul"을 선택해야 한다. Korean을 선택하면, 한영 전환이 안 된다.
대부분 Ubuntu 22.04 ~ 24.04를 사용하는 유저들이 이 설정 단계에서 Korean을 선택하기 때문에 한영 변환이 잘 안 되는 것이다.
(나도 이것 때문에 한영 전환이 안 되었음 ㅠㅠ)
!!! 중요 !!!
위와 같이 설정하고 나면 [ Input Method ] 화면에
"Korean - Hangul" 항목이 추가되어 있을 것이다. (아래 IBus Preferences 화면을 참고)
여기까지 한 작업은 "한글 입력기" 관련 소프트웨어를 설치하는 작업이다. 실제로 한영 전환 키 조합은 아래에서 설명한다.
Step 4 : 키보드 입력 소스 설정
!!! 중요 !!!
아래 설정 화면에서 꼭 "Korean Hangul"을 선택해야 한다. Korean을 선택하면, 한영 전환이 안 된다.
대부분 Ubuntu 22.04 ~ 24.04를 사용하는 유저들이 이 설정 단계에서 Korean을 선택하기 때문에 한영 변환이 잘 안 되는 것이다.
(나도 이것 때문에 한영 전환이 안 되었음 ㅠㅠ)
아래 설정 화면과 같이 "Korean (Hangul)" 항목이 [Input Sources]에 추가되어 있어야 한다.
아래 화면에서 "English (US)"를 삭제해야 한다.
꼭 "English (US)" 항목을 지워야 하는 건 아니지만, 이 입력 방식이 남아 있으면 한글 입력할 때 불편하다. 그냥 필요 없는 것은 지우고 편하게 살자 !!!
아래 화면처럼 깔끔하게 "Korean (Hangul)" 항목만 남으면, 설정이 잘 된 것이다.
Ubuntu 24.04 데스크탑 화면의 우측 상단에 [ EN ] 아이콘을 클릭해서
"Korean (Hangul)" 항목이 있는지 확인한다.
만약, "Korean (Hangul)" 항목이 없으면, 이 블로그 글의 처음으로 돌아가서 설정 절차를 꼼꼼히 보고, 빠뜨린 절차가 있는지 체크해본다.
한영 전환을 위한 키보드 설정 끝 !!!
한글 입력, 영어 입력 테스트 해보기.
참고:
기본 한영 전환 키조합은 [ Shift key ] + [ Space key ]이다
추가 설정 (옵션)
위 설정 작업까지 하면 "한/영" 전환이 잘 되는 것을 알 수 있다.
단, 한글 / 영어 사이의 기본 전환 키 조합이 [Shift key] + [Space key]이다.
따라서 다른 키 조합으로 "한/영" 전환하고 싶다면, 아래와 같이 추가로 옵션 설정을 해줘야 한다.
##
## 채용 관련 글
##
제가 일하고 있는 기업 부설연구소에서 저와 같이 연구/개발할 동료를 찾고 있습니다.
(이곳은 개인 블로그라서 기업 이름은 기재하지 않겠습니다. E-mail로 문의주시면 자세한 정보를 공유하겠습니다.)
근무지 위치:
서울시 서초구 서초동, 3호선 남부터미널역 근처 (전철역 출구에서 회사 입구까지 도보로 328m)
필요한 지식 (아래 내용 중에서 50% 정도를 미리 알고 있다면 빠르게 협업할 수 있음):
- 운영체제 (학부 3~4학년 때, 컴퓨터공학 운영체제 과목에서 배운 지식 수준):
예를 들어, Processor, Process 생성(Fork)/종료, Memory, 동시성, 병렬처리, OS kernel driver
- Algorithm(C언어, C++ 언어로 구현 가능해야 함)
예를 들어, Hashtable, Linked list 자료 구조 정도를 C 또는 C++로 구현할 수 있으면 Good!
- Network 패킷 처리 지식(Network layer 2 ~ 4)
예를 들어, DHCP Server/Client 기능(Discover, Offer 등) 구현할 정도의 능력이 있으면 됨.
- 우리 연구소에서는 Netfilter(iptables)를 잘 사용하면 업무를 수행함에 있어서 편함. (Netfilter를 모르면 동료가 잘 알려줄 것임)
- IETF RFC 문서를 잘 읽고 이해하는 능력 ^^
# 위에 열거한 내용 외에도 제가 여기 블로그에 적은 내용들이 대부분 업무하면서 관련이 있는 주제를 기록한 것이라서
# 이 블로그에 있는 내용들을 잘 알고 있다면, 저희 연구소에 와서 연구/개발 업무를 수행함에 있어서 어려움이 없을 겁니다.
# 위 내용을 잘 모르지만, 이 분야에 대해 공부하면서 일하고 싶다면 저에게 문의 메일을 주세요~
# 학습 잠재력이 높은 것이 보인다면, 협업할 동료로써 환영합니다 ^^
회사에서 사용하는 프로그래밍 언어:
- 프로그래밍 언어: C, C++, Go, Rust
(참고: 아직 연구소 동료들이 Rust를 사용하진 않습니다만, 새 언어로써 Rust를 사용하는 것을 고려하는 중)
근무 시간:
- 출근: 8~10시 사이에서 자유롭게 선택
- 퇴근: 8시간 근무 후 퇴근 (오후 5시 ~ 7시 사이)
- 야근 여부: 거의 없음 (내 경우, 올해 상반기 6개월간 7시 이후에 퇴근한 경우가 2회 있었음)
- 회식 여부: 자유 (1년에 2회 정도 회식하는데, 본인이 집에 가고 싶으면 회식에 안 감. 왜 참석 안 하는지 묻지도 않음)
외근 여부:
- 신규 프로젝트 멤버 -> 외근 전혀 하지 않음 (나는 신규 프로젝트만 참여해서 지난 1년 동안 한번도 외근 없었음)
- 상용 프로젝트 멤버 -> 1년에 5회 미만 정도로 외근
팀 워크샵 여부:
- 팀 워크샵 자체를 진행하지 않음. (워크샵 참석하는 거 싫어하는 개발자 환영 ^^)
연락처:
- "sejong.jeonjo@gmail.com" # 궁금한 점은 이 연락처로 문의주세요.
- 블로그 비밀 댓글 (제가 하루에 한번씩 댓글 확인하고 있음)
원하는 인재상:
- 우리 부설연구소는 "긴 호흡으로 프로젝트를 진행"하기 때문에 최소 2년간 한 가지 주제를 꾸준하게 연구/개발할 수 있는 개발자를 원함.
- 우리 부설연구소는 자주적으로 연구 주제를 찾아서 업무를 하기 때문에 능동적으로 생각하고 행동하는 동료를 원함.
- 차분하게 연구 주제에 몰입하고, 해법을 찾는 것을 즐기는 사람.
내가 느끼는 우리 연구소의 장점:
- 갑/을 관계가 없음. (제가 근무하고 있는 연구소는 SI업종이 아니라서 갑/을 회사 개념이 없음)
- 연구소 자체적으로 연구 주제를 발굴하고 시스템을 개발하기 때문에 개발 일정에 대한 스트레스가 적음
- 빌딩 전체를 우리 회사가 사용하므로 분위기가 산만하지 않음.
- 근처에 예술의전당, 우면산 둘레길이 있어서 점심 시간에 산책하기 좋음 ^^
- 연구소 동료들 매너가 Good (2년간 일하면서 한번도 감정에 스크레치 생기거나 얼굴 붉히며 싸운 적 없음 ^^)
## DNS Cache를 flush하기 전에는 CURL 같은 Application이
## 예전에 조회해서 얻었던 Old IP address를 사용한다.
$ curl -v my-example.kr:8080
Trying 12.15.20.38:8080...
... 중간 생략 ...
## DNS Cache를 flush
$ sudo dscacheutil -flushcache
$ sudo killall -HUP mDNSResponder
## DNS Cache를 flush한 후에는 CURL 같은 Application이
## 새 DNS Record를 조회하고, 새로 얻은 IP Address를 사용한다.
$ curl -v my-example.kr:8080
Trying 19.12.25.113:8080...
... 중간 생략 ...