Managing Vim plugins using Vundle

Vim 에디터는 정말 강력한 개발도구이다. 처음 Vim을 사용하는 사람들에게는 어떻게 사용해야하는지 난감한 툴이지만 조금만 손에 익으면 다른 텍스트 에디터에서는 사용할 수 없는 고급 기능들을 사용해서 빠르게 코드를 작성할 수 있게 된다.

이렇게 Vim 이 강력한 이유는 무엇보다도 커스터마이징이 자유롭고 다양한 plugin 들을 사용할 수 있기 때문일 것이다. 물론 최근에 sublime text나 github의 atom 같은 텍스트 에디터가 멋진 plugin 들을 많이 제공하고 있지만 GUI(Graphic User Interface) 환경이 아닌 CLI(Command Line Interface)에서는 사용할 수 없다는 단점이 있다.

최근 Vim의 plugin을 관리해주는 다양한 툴들이 많이 개발되고 있다. 나는 이 중에서 Vundle을 자주 이용하는 편이다. 이 포스팅에서는 Vundle을 이용하는 법에 대해서 예제와 함께 간단히 작성해보려고 한다.


Install Vundle

  • 먼저 git clone 명령으로 ~/.vim/bundle 경로에 Vundle repository를 복사해놓는다. (물론 git이 설치되어 있어야 한다.)
$ git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim
  • 그 다음에는 vimrc 파일을 수정해줄 차례다. vim ~./vimrc 커맨드로 vimrc 파일을 vim으로 열어준다.
  • 아래는 vundle git repository 에 올라와있는 튜토리얼이다. 일단은 먼저 아래 내용을 살펴보자.

set nocompatible " be iMproved, required
filetype off " required

" set the runtime path to include Vundle and initialize
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()
" alternatively, pass a path where Vundle should install plugins
"call vundle#begin('~/some/path/here')

" let Vundle manage Vundle, required
Plugin 'VundleVim/Vundle.vim'

" The following are examples of different formats supported.
" Keep Plugin commands between vundle#begin/end.
" plugin on GitHub repo
Plugin 'tpope/vim-fugitive'
" plugin from http://vim-scripts.org/vim/scripts.html
Plugin 'L9'
" Git plugin not hosted on GitHub
Plugin 'git://git.wincent.com/command-t.git'
" git repos on your local machine (i.e. when working on your own plugin)
Plugin 'file:///home/gmarik/path/to/plugin'
" The sparkup vim script is in a subdirectory of this repo called vim.
" Pass the path to set the runtimepath properly.
Plugin 'rstacruz/sparkup', {'rtp': 'vim/'}
" Avoid a name conflict with L9
Plugin 'user/L9', {'name': 'newL9'}

" All of your Plugins must be added before the following line
call vundle#end() " required
filetype plugin indent on " required
" To ignore plugin indent changes, instead use:
"filetype plugin on
"
" Brief help
" :PluginList – lists configured plugins
" :PluginInstall – installs plugins; append `!` to update or just :PluginUpdate
" :PluginSearch foo – searches for foo; append `!` to refresh local cache
" :PluginClean – confirms removal of unused plugins; append `!` to auto-approve removal
"
" see :h vundle for more details or wiki for FAQ
" Put your non-Plugin stuff after this line

먼저 Vundle을 잡아주고 그 밑에 Vundle로 설치할 Plugin들을 리스팅 해주고 있다. 번들도 Plugin의 일종이기 때문에 맨 처음에 Plugin 'VundleVim/Vundle.vim' 로 Vundle을 기입해준다. 이 예제에서는 그 밑에 Fugitive, L9 등의 Plugin을 리스팅하고 있는 것을 볼 수 있다.

우선은 Vundle만 먼저 설치해주자.

set nocompatible " be iMproved, required
filetype off " required

" set the runtime path to include Vundle and initialize
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()
" alternatively, pass a path where Vundle should install plugins
"call vundle#begin('~/some/path/here')

" let Vundle manage Vundle, required
Plugin 'VundleVim/Vundle.vim'

" All of your Plugins must be added before the following line
call vundle#end() " required
filetype plugin indent on " required
" To ignore plugin indent changes, instead use:
"filetype plugin on
"
" Brief help
" :PluginList – lists configured plugins
" :PluginInstall – installs plugins; append `!` to update or just :PluginUpdate
" :PluginSearch foo – searches for foo; append `!` to refresh local cache
" :PluginClean – confirms removal of unused plugins; append `!` to auto-approve removal
"
" see :h vundle for more details or wiki for FAQ
" Put your non-Plugin stuff after this line

  • vimrc 파일을 저장하고 나서 vim 커맨드 모드에서 :PluginInstall을 입력한다.

image1

  • Vundle Plugin이 설치되면 Done! 이라고 표시된다. (시간이 조금 걸릴 수도 있다.)

Plugin Install

  • 이제 본격적으로 Plugin들을 설치해보자. 앞에서 얼추 살펴보았듯이 설치할 Plugin들을 vimrc 파일에 리스팅 해주고 (그리고 나서 당연히 수정한 vimrc 파일을 :w 커맨드로 저장해주어야 한다. 위에서 처럼 :PluginInstall 를 입력해주면 Vundle이 알아서 Plugin들을 설치해준다. (참 편리하다!)

  • 설치할 Plugin들은 Vim Awesome 과 같은 웹에서 찾을 수 있다.

image2

  • 필자의 vimrc 파일은 다음과 같다.

set nocompatible " be iMproved,
filetype off " required

" set the runtime path to include Vundle and
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()
" alternatively, pass a path where Vundle should
"call vundle#begin('~/some/path/here')

" let Vundle manage Vundle, required
Plugin 'VundleVim/Vundle.vim'

" The following are examples of different formats
" Keep Plugin commands between vundle#begin/end.
" plugin on GitHub repo
Plugin 'functiontracker.vim'
Plugin 'The-NERD-Tree'
Plugin 'the-lambda-church/merlin'
Plugin 'bling/vim-airline'
Plugin 'OCamlPro/ocp-indent'
Plugin 'zhaocai/GoldenView.Vim'
Plugin 'airblade/vim-gitgutter'

" color scheme
Plugin 'tomasr/molokai'
" All of your Plugins must be added before the
call vundle#end() " required
filetype plugin indent on " required
" To ignore plugin indent changes, instead use:
"filetype plugin on
"
" Brief help
" :PluginList – lists configured plugins
" :PluginInstall – installs plugins; append `!`
e
" :PluginSearch foo – searches for foo; append `!`
" :PluginClean – confirms removal of unused
ove removal
"
" see :h vundle for more details or wiki for FAQ
" Put your non-Plugin stuff after this line

set autoindent
set smartindent
set cindent
set number
set shiftwidth=4
set tabstop=4
set laststatus=2
set hlsearch
set showcmd
set clipboard=unnamedplus

set t_Co=256

syntax on

if has("autocmd")
" When editing a file, always jump to the last
autocmd BufReadPost *
\ if line("'\"") > 0 && line
\ exe "normal g'\"" |
\ endif
endif

autocmd VimEnter * NERDTree
autocmd VimEnter * wincmd p

colorscheme molokai

Function Tracker, Nerd Tree, vim-airline, goldenvie, gitgutter 등의 Plugin과 Molokai 테마를 설치하여 사용하고 있다.

  • 설치할 Plugin들을 리스팅 한 다음에는 vimrc 파일을 저장하고 나서 vim 커맨드 모드에서 :PluginInstall 을 입력한다.

  • 설치가 완료되었다. 이제 설치되었는지 확인하기 위해서 vim을 열고 Plugin을 활성화 하는 커맨드를 입력한다. 예를 들어서 NERDTree의 경우에는 :NERDTreeToggle 을 입력해주어야 한다. 다음과 같이 나타나면 NERDTree 플러그인이 활성화 된 것이다.

image3

  • 팁으로 만약 NERD Tree를 이용할 때 항상 vim을 열었을때 기본으로 NERD Tree가 뜨도록 만들고 싶으면 필자의 vimrc에서 처럼 맨 밑에 아래 코드를 추가해준다.

if has("autocmd")
" When editing a file, always jump to the last
autocmd BufReadPost *
\ if line("'\"") > 0 && line
\ exe "normal g'\"" |
\ endif
endif

autocmd VimEnter * NERDTree
autocmd VimEnter * wincmd p

Advertisements

min() / max() problems in C++

항상 C++로 코딩을 하면서 min()이나 max() 함수(최소값/최대값을 리턴하는 함수)를 쓸때 이상한 에러를 맞닥뜨리곤 한다.

나중에 안 사실이지만 이 것은 min()/max() 라는 이름으로 선언된 함수들끼리 서로 충돌을 일으키기 때문이다. 즉 include 한 header 파일 내에 동일한 이름으로 다른 함수들이 선언되어 있는 것이다.

몇가지 해결책을 이 블로그에서 찾았다. 해결책은 아래와 같다.


I always confronted something weird errors when I use min() or max() function in C++.

Actually, it because of conflicts between the functions with same name.

I found several solutions for this problems from this blog post.

And solutions suggested are following. (prioritized with best approach first):


이하 내용은 블로그에서 인용.

Following suggestions are cited from the blog.

  • Convert your source code to use the Standard C++ std::min() and std::max() and ensure that you #include . Use
#include <algorithm> 
using namespace std;

// use min() instead of std::min()
// use max() instead of std::max()
  • Define the NOMINMAX macro to instruct WinDef.h not to define the min/max macros. E.g. you can update your Visual C++ compiler options with /D NOMINMAX or you can insert #define NOMINMAX.

  • Redefine min/max in the specific problematic files. Especially this may be needed in you include gdiplus Windows headers files, because these uses the Windows min/max macros.

#include <algorithm> 

#ifndef max
#define max(a,b) (((a) > (b)) ? (a) : (b))
#endif
#ifndef min
#define min(a,b) (((a) < (b)) ? (a) : (b))
#endif

#include <gdiplus.h>
#undef max
#undef min

using namespace std;
  • Alternatively redefine min/max to use use the Visual C++ non-standard __min()/__max(). But min/max are still defined as macros and will likely lead to problems. Not a good solution.
#ifndef max
#define max __max
#endif
#ifndef min
#define min __min
#endif
  • Alternatively use Visual C++ compiler options /Dmin=__min / Dmax=__max. This will tell compiler and WinDef.h not to define min/max macros and use __min() and __max() functions instead as defined in (or ) so ensure this is included. But min/max are still defined as macros and will likely lead to problems. Not a good solution.

Thanks to Michael Suodenjoki !

OpenCV CPP MarkerDetection – OpenCV를 이용한 마커 인식

OpenCV 라이브러리들을 이용하여 마커의 오리엔테이션과 거리를 측정하는 코드이다. 해당 코드의 핵심부분은 OpenRobotics 블로그를 운영하시는 양광웅 님께서 작성하신 것을 썼다.
원래 프로젝트의 자세한 내용은 이 포스트를 참조하길 바란다.

양광웅 연구원님께서는 내 학부논문 프로젝트를 진행하는데 많은 도움을 주셨다. 이 포스팅을 통해 감사하다고 말씀드리고 싶다. 학부논문 프로젝트에 대해선 조만간 포스팅 할 기회가 있을 것이다.


A code for Marker Detection using OpenCV. The core parts is written by Mr.Yang – OpenRobotics (Korean).
Please refer to Document (Korean) for the original project.

Mr.Yang helped me a lot for my vision project for Undergraduate Thesis. Thank you so much. I’m gonna post about this project later.

Screenshot


Prerequisite

  • Linux / Windows
  • OpenCV 2.4.9 (Test is required for higher version of OpenCV.)

Source Code

소스코드와 자세한 내용은 GitHub 저장소를 참조바란다.

Please refer to GitHub repository

APM Quadcopter Autonomous Flight – APM 쿼드콥터 자율비행

지난 8월 6일 오픈소스 멀티콥터 플랫폼인 APM을 이용하여 만든 쿼드콥터 두대를 가지고 저고도에서 GPS 자율 비행을 테스트 하였다.

한대는 APM 2.6 보드를 이용하여 제작했고 한대는 Pixhawk 보드를 이용하여 제작하였다. 자율비행은 launch site에서 이륙 – waypoint로 이동 – 2분간 호버링 – launch site로 귀환하는 미션이다. Mission Planner를 이용해서 미션을 설정하였는데 자세한 방법은 이 문서를 참조바란다. 아래는 비행영상이다.


I and my friend Jaeyoung tested GPS Autonomous flight mode of APM with two quadcopters which embed APM boards.

One embeds APM 2.6 board and another embeds Pixhawk board. Both use ArduCopter firmware. A mission of Auto-flight is taking off from launch site – moving to waypoint – hovering for 2 minutes – returning to launch site. We set mission up with Mission Planner which is a planner for APM platform. Refer to this doc for details.


오른쪽의 쿼드콥터가 APM 2.6 보드를 탑재한 쿼드콥터인데 비행성능이 Pixhawk에 비해서 크게 떨어진다. 특히 바람 등의 외란을 효과적으로 상쇄하지 못하는 것을 확인 할 수 있었다.

비행을 시키다가 배터리 용량을 다 소진하여 fail safe 모드로 진입, 자동으로 착륙하는 것도 확인하였다.

GPS 오차 때문인지 두번째 비행에서는 서로 다르게 설정된 고정 waypoint가 겹쳐져서 충돌하는 사고가 있었다. GPS 데이터가 그리 신뢰롭지 않으니 항상 GPS 자율비행을 할 때에는 넓은 공터에서 주변 사람들에게 위험을 미리 알리고 만약의 상황에 대비할 수 있도록 할 것을 강력히 권고한다.


The right one is the quad which embeds APM 2.6. Its flight performance is worse than the one embeds Pixhawk. Especially it is vulnerable to disturbances like wind.

Since the battery ran out, it went to fail safe mode, landed automatically.

In the second flight, two quads crashed because of the GPS error. It seems GPS data is not accurate enough, so I recommend to be very careful when you try an autonomous flight with GPS.

Build My Own Quadcopter (Slide)

내부 세미나 자료로 만든 나의 쿼드콥터 제작기 슬라이드이다.

(영어 포스팅은 404warehouse 블로그서 읽을 수 있다.)

좀더 높은 화질의 슬라이드를 보고 싶다면 여기에서 볼 수 있다.


This is very brief slides for “Build My Own Quadcopter”

(You can read the post in English at 404warehouse blog.)

If you want to view it via web browser in high resolution, go to here – keynote player


iOS App Development : LinkScrap – iOS 앱 개발 : 링크스크랩

LinkScrap은 내가 개발에 참여했던 iOS 애플리케이션이다. 처음으로 개발에서부터 배포까지 전 과정을 담당했었던 앱이다. 간단히 소개하자면 모바일로 웹서핑을 하는 사람들이 쉽게 URL 링크들을 수집하고 공유할 수 있도록 도와주는 앱이다.

디자인과 기획은 디자이너 박종찬 님이 맡아주셨다. 처음 앱의 아이디어도 박종찬님이 제안하신 것으로부터 시작된 것이다. 개발은 2013년 9월부터 시작하여 2014년 1월 22일에 1.0 버젼을 배포하기 시작했다. 현재 버젼은 1.0.2 이다.

더 자세한 내용은 아래 내용과 AppStore – LinkScrap를 참조바란다.

현재는 다른 프로젝트 준비로 개발이 멈춰있는 상태이다. 가능하다면 추후에 좀 더 발전시켜보면 좋을 것 같다.


Description

Description

LinkScrap automatically save links in background.
It detects URL from clipboard and save it neatly in local list.
You can export links to PDF or Clipboard.

Features

  • Auto-save : Automatically save links in background. (3min.)
  • Clipboard Detection : If you already have an URL on your clipboard when you open Linkscrap, It automatically detect URL and ask you whether save it or dismiss it.
  • Extractor : When LinkScrap detects URL, it extract a thumbnail and a title from the webpage.
  • PDF Export : You can export link(s) as PDF file.
  • Clipboard Export : You can export link(s) to clipboard.

*LinkScrap displays Ads as default, you can get rid of it by In-App Purchasing Ad-free for $0.99.


iPhone Screenshot

SNUSAT : ARLISS2014

나는 2011년부터 서울대학교 초소형 인공위성 동아리 SNUSAT의 멤버로 활동했다.

SNUSAT은 전신인 SNU CANSAT 팀이 2006년 미국 네바다 주에서 열리는 캔위성 대회 ARLISS(A Rocket Launch for International Student Satellite)에 최초로 참가한 이래로 매년 서울대학교 공과대학 대표팀으로 참가하고 있다.

나는 2014년에 SNUSAT 멤버들과 TEAM SNUSAT2014 멤버들과 함께 ARLISS2014 대회에 참가하였다. Rover의 기계설계를 담당하는 한편 SW 개발을 지원하고, 전체 프로젝트의 관리를 책임지는 프로젝트 매니져로서 참여하였다.


I’ve been a member of SNUSAT, Small Satellite Team of Seoul National University(Club) since 2011.

SNUSAT Team has participated in an international CANSAT competition ARLISS(A Rocket Launch for International Student Satellite) which is held in Nevada US since 2006, representing Seoul National University College of Engineering.

I participated in ARLISS2014, as a member of TEAM SNUSAT2014.

SNUSAT

이 포스트에선 SNUSAT의 ARLISS2014 프로젝트에 대해서 간단히 소개하겠다. SNUSAT에 대한 자세한 내용은 SNUSAT 블로그를 참조바란다. SNUSAT 블로그는 나와 임재영 군이 같이 개설한 블로그이다. 디자인은 디자이너 박종찬 님이 도와주셨다.

This post is for introducing ARLISS2014 project of SNUSAT. Please visit SNUSAT Blog for more detail about SNUSAT.



Overview

ARLISS의 미션은 학생들의 CANSAT(캔위성 : 소형의 인공위성 모사체)을 로켓에 탑재하여 고도 3km 까지 올린 뒤, 낙하시키며 인공위성의 궤도 운동과 통신 프로세스를 모사하는 것이다. 최종목표는 낙하산을 타고 낙하한 인공위성을 목표 지점까지 자동화된 시스템으로 회수하는 것이다.

SNUSAT은 ARLISS2014에서 ‘Bring Back Mission’을 제안하였다. 이 미션은 TEAM SNUSAT2010이 제안한바 있는 미션으로 낙하한 인공위성이 스스로 목표지점으로 이동하는 것이 아니라(Roll Back 또는 Fly Back 방식) 별도의 자동화된 Rover가 인공위성을 찾아서 회수하고, 목표지점으로 이동시키는 방식이다.


Mission of ARLISS is bringing the students’ CANSAT back to the goal point after launch the satellite within rocket to 3km height. During a drop with a parachute, CANSAT simulates the orbital motion and operation such as telecommunication, sensing, scanning etc of real satellites.

SNUSAT proposed the ‘Bring Back Mission’ for ARLISS2014. In Bring Back Mission, a rover searches for a landed satellite, and bring the satellite back to the goal point automatically.

bringback-mission

프로젝트는 2013년 겨울부터 본격적으로 시작되었다. 총 10명의 서울대학교 공과대학 학부생들이 프로젝트에 참여하였다.

The project started in the winter of 2013. 10 undergraduate students of SNU Engineering College were involved in the project.


Rover Design Rendered

Rover Design Rendered

프로젝트에 대한 상세한 보고서와 설계 문서 및 CAD, 소스코드 등의 설계자료들은 오픈소스로 공개해놓았다. 자세한 내용들은 [이곳(http://snusat.github.io)을 참조하기 바란다. 최종적으로 완성된 시스템은 아래 사진들과 같았다.

We opened our design documentations, CAD files, source code etc to the public. You can find them in here.
These are what we built for ARLISS2014.

Rover System

Rover System

Satellite System

Satellite System

대회는 2014년 9월 8일부터 12일까지 미국 네바다주의 ‘Black Rock 사막’에서 진행되었다. SNUSAT은 대회 마지막날인 12일에 두차례 발사를 진행하였다.

Rocket Launch

1차 발사에서는 위성이 낙하산을 타고 성공적으로 낙하하였으나 통신 불능으로 인해서 로버가 위성체를 회수하지 못하고, Plan B(Recovery Mode)에 따라 위성 없이 목표지점으로 이동하였다.

2차 발사에서도 위성이 낙하산을 타고 성공적으로 낙하하였으나 스위치가 작동하지 않아 낙하 후 작동하지 않았다.

자세한 기록 및 실적은 ARLISS를 주최하는 일본의 UNISEC – ARLISS2014에서 확인할 수 있다. 아직 일본어로만 제공되고 있다.

Results

처음에 설정했던 목표는 달성하지 못했지만 SNUSAT은 대회의 Mission Competition 부문에서 공동 3위를 차지하였다.

수개월간의 다소 고된 프로젝트였지만 다른 나라 학생들과 교류하면서 정말 많은 것들을 배울 수 있었던 소중한 경험이었다. 개인적으로도 미국 여행을 하면서 많이 배우고 느낄 수 있었다. 아주 즐겁고 행복했던 기억이다.

SNUSAT