vim을 사용하면서 가장 필요한 기능은 원하는 파일을 빨리 여는 것이다.


Source insight 를 사용하는 경우에는 project 에 파일들을 추가해 놓고 project 내의 파일들은 ctrl+o 의 기능을 활용하여 파일 목록에서 찾을 수 있다.


vim 에서 이와 비슷한 동작 아니 더 빠르고 쉽게 파일을 열 수 있도록 해주는 플러그인 들이 있다.


내가 정확히 원한는 기능은, 미리 파일 목록을 만들어 놓고 그 목록 중에서 파일이름으로 검색하여 해당 파일을 여는 일이다. (source-insight 를 사용하는 형태와 동일)


가장 먼저 사용해본 vim plugin은 ctrl-p ( https://github.com/kien/ctrlp.vim ) 이다.  vim script 로 만들어져 있으며 파일 검색시 fuzzy 알고리즘 이용 및 열려있는 파일중에서 찾기, history 에서 찾기 등이 같이  제공된다. 


난 주로 chromium 소스 분석을 위해 vim을 사용하는데 검색 대상의 파일 수가 30000~40000 개이다. ctrl-p 로 미리 listup 되어 있는 대상을 로드하여 text 로 filtering 하는 과정에서 지연이 발생하게 된다. (느린경우 약 1~2초 정도)


1년정도는 이것을 참고 사용하다가 최근 fzf ( https://github.com/junegunn/fzf.vim )  라는 툴을 접한 후 이 툴을 사용하여 ctrlp를 대체하기 시작하였다. go 언어로 작성된 터미널용 툴이며 vim 에 연결하여 사용하였을때 ctrlp 처럼 딜레이가 생기지 않는다.


fzf 에서도 기본적은 vim 플러그인을 제공하는데, 이것을 사용하더라도 매우 빠르게 동작한다.


다음 번에는 fzf 를 vim과 연동하여 사용하는 법에 대해서 소개해 보고자 한다.


VIM 이야기 (1)

컴퓨터 2013.06.08 00:31

그동안 사용하지 않던 블로그를 다시 글적 거려 본다. 제목을 VIM 이야기 (1) 로 시작한 것은 분명  VIM에 대해서 시리즈로 이어가겠다는 계획이다.

나는 Windows 환경에서 프로그래밍을 시작했다. 솔직히 코딩을 하는 시간 보다는 거대한 소스를 분석하는 시간이 더 많기 때문에 주로 Visual Studio 보다는 source insight  와 더 많은 시간을 보냈다. 그만큼 소스를 분석하는데 있어서 source insight의 역활은 절대적이었다.

source insight 의 기능을 VIM 에서 어떻게 사용할 수 있을지의 관점에 연재하고자 한다.

일단 오늘은 VIM의 기능은 아니지만, plugin을 쉽게 설치/삭제 하도록 도와 주는 vundle 을 소개 하도록 한다.

Vundle 은 Vim bundle 의 약자이며 Vim의 plugin manger 역활을 하는 plugin 이라 이해하면 된다.[1] 

Vundle plugin 설치

$ git clone https://github.com/gmarik/vundle.git ~/.vim/bundle/vundle

환경 설정

.vimrc에 아래 추가

set nocompatible " be iMproved filetype off " required! set rtp+=~/.vim/bundle/vundle/ call vundle#rc() " let Vundle manage Vundle " required! Bundle 'gmarik/vundle' " My Bundles here: " " original repos on github Bundle 'ctrlp.vim' Bundle 'scrooloose/nerdtree' Bundle 'minibufexplorerpp' Bundle 'Tagbar' Bundle 'autoload_cscope.vim'

" ... filetype plugin indent on " required! " " Brief help " :BundleList - list configured bundles " :BundleInstall(!) - install(update) bundles " :BundleSearch(!) foo - search(or refresh cache first) for foo " :BundleClean(!) - confirm(or auto-approve) removal of unused bundles " " see :h vundle for more details or wiki for FAQ " NOTE: comments after Bundle command are not allowed..

bundle 설치

:BundleInstall

왜 vundle 을 쓰는지

개발업무를 하다보면, 여러대의 PC를 사용하는 경우가 많다. 노트북, 서버, 집에 있는 컴퓨터 (집에서는 소스를 보면 안되겠지만 ㅜㅜ)...

이 분산되어 있는 환경을 동일하게 만들려면, VIM의 모든 plugin을 압축하여 다녀야 한다. (포터블 버전...) 

Vundle을 사용하면 plugin 설치가 아주 간편해 지며 (.vimrc 에 Bundle "플러그인명"을 추가하기만 하면됨) .vimrc만 공유가 된다면 여러 pc 환경에서 동일한 vim 환경을 사용 할 수 있다.

dropbox등을 활용하면 .vimrc 를 쉽게 분산된 환경에서 공유가 가능하여 plugin 관리가 아주 편해 진다. 자신이 개발한 vim 스크립트의 경우 github 를 이용하여 스크립트를 추가하고 github의 주소를 bundle로 등록하면 private 한 스크립트도 쉽게 관리가 가능해 진다.


앞으로의 계획

위 .vimrc는 실제 내가 사용중인 것은 아니지만, 사용중인 plugin의 일부를 적어 두었고 다음 포스트 부터는 이 플러그인을 어떻게 사용할지에 대해서 설명하고자 하려고 한다.

[1] https://github.com/gmarik/vundle#readme


python unicode은 utf-8, utf-16 같은 encoding과는 다른 것이었다. 이것 때문에 엄청 해맸다.ㅜㅜ

http://wiki.python.org/moin/UnicodeEncoding 사이트의 내용을 번역해 본다.

파이선에서는 여러가지 Unicode 인코딩을 지원한다.

다음은 주로 쓰이는 유니코드 인코딩이다.
utf-8
utf-16

아주 중요한점은 이 유니코드 인코딩과 파이선 유니코드와는 별개라는 것이다.
 
다음은 utf-8 이나 utf-16 인코딩의 byte string과 파이선 unicode string의 차이점을 보여준다.

u"foo" - 이건 파이선의 unicode string 이다.
"foo" - 이건 그냥 byte string - 3 바이트 이다.
u"foo".encode('utf-8') -- 처음에 파이선 unicode string을 만든다음에, 이걸 다시 utf-8 으로 인코딩 한 byte string을 나타낸다.

'foo'를 표현하는 데는 3바이트가 필요하지만 u'foo'를 표연하는 데는 몇 바이트가 필요한지 알 필요가 없다.  

iPod 터치 2세대 모델을 사용중인데, iOS4 에서 멀티 테스킹과 바탕화면에 배경화면을 제공한다기에 혹해서 업그레이드를 눌렀다.
하지만, 그 다음부터 오늘 성능저하의 스트레스는 엄청났다. 메뉴전환시, 음악을 듣기 위해서 메뉴 진입시 등등 딜레이들이 스트레스를 줬다.
다운그레이드를 하기 위해서 SHSH BLOB를 백업해야 한다는 것은 다운그레이드를 시도하려고 할때 알게 되었다. 넓고 넓은 인터넷을 SHSH BLOB 없이 다운그레이드 하는 방법을 찾아서 해메고 다니다가, iPhone OS 3.0 은 저런게 없이도 된다는 것을 알게 되었고, 3.0 으로 다운그레이드를 시도 하였다. 방법은 성공.

3.0 에서 3.1.2 로 업그레이드 하기 위해서는 3.0 에서 redsn0w 0.8 버전으로 jb 한후에, 3.1.2 custom firmware를 다운로드하면 된다.

3.0 jb 버전에서 recovery mode, dfu 모드 진입 하지 않고 일반 메뉴상태에서 itunes 로 3.1.2 custom firmware를 restore 성공 하였다. 얏호.

그 뒤에 3.1.3 custom firmware로도 해봣는데 잘된다.

소스코드를 문법에 맞게 색을 입혀주는 멋진 스크립트이다. 내 블로그에 사용중인 버전은 3.0.83 버전이다.

syntaxhighlight 를 다운로드 받기 위해서는 http://alexgorbatchev.com/SyntaxHighlighter/download/ 사이트에 방문하여 받고, 압축파을을 해제 한다.

티스토리에 추가하기 위해서는 아래와 같이 HTML/CSS 편집으로 들어간다.


파일 업로드 탭을 선택후, 압축 해제한 파일중 styles 디렉토리와 scripts 디렉토리에 있는 모든 파일을 업로드 한다.
그 다음 HTML/CSS 편집 탭을 누른뒤, 위와 같이 <title> 아래 부분에 syntaxhighlight 에 필요한 소스를 추가해 준다.
<script type="text/javascript" src="./images/shCore.js"></script>
<script type="text/javascript" src="./images/shBrushAS3.js"></script>
<script type="text/javascript" src="./images/shBrushCpp.js"></script>
<script type="text/javascript" src="./images/shBrushCss.js"></script>
<script type="text/javascript" src="./images/shBrushDiff.js"></script>
<script type="text/javascript" src="./images/shBrushJava.js"></script>
<script type="text/javascript" src="./images/shBrushJScript.js"></script>
<script type="text/javascript" src="./images/shBrushPerl.js"></script>
<script type="text/javascript" src="./images/shBrushPhp.js"></script>
<script type="text/javascript" src="./images/shBrushPlain.js"></script>
<script type="text/javascript" src="./images/shBrushPython.js"></script>
<script type="text/javascript" src="./images/shBrushSql.js"></script>
<script type="text/javascript" src="./images/shBrushVb.js"></script>
<script type="text/javascript" src="./images/shBrushXml.js"></script>
<script type="text/javascript" src="./images/shLegacy.js"></script>
<link href="./images/shCore.css" rel="stylesheet" type="text/css">
<link href="./images/shThemeDefault.css" rel="stylesheet" type="text/css">
<script type="text/javascript">
     SyntaxHighlighter.all()
     SyntaxHighlighter.config.stripBrs = true;
     SyntaxHighlighter.config.stripBrs = "blockquote";
</script>
설치한후 syntaxhighlight 를 사용하기 위해서는 아래과 같이 <blockquote> 태그를 이용하면 편하다. <pre> 태그를 이용하면 <br>태그가 마구 생겨남.ㅜ.ㅜ

<blockquote class="brush: 원하는문법">
코드
</blockquote>

문론 사용하려는 문법에 대한 shBrushxxx.js 파일이 위에 포함되어 있어야 한다. ( 위 예제는 내가 주로 사용하는 문법만 포함해 두었다. )티스토리에서 스킨을 변경하면 이전에 올려 놓았던 소스와, skin.html 수정본이 날라가기 때문에 새로 수정해줘야 한다.그때 사용하기 위해서 기록을 남겨 놓는다.

python 에는 list comprehension 이라는 것이 있다. 리스트를 쉽게 만들 수 있게 해주는 문법이다.

1. 0 부터 99 까지 정수를 가지는 리스트를 만들어 보자.
>>> result = [ x for x in range(0,100) ]>>> print result [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60,61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99]>>>
한 줄에 원하는 것을 만들 수 있어서 정말 편하다.

문법을 이해 하자면, 맨 앞의 x 가 리스트의 element로 들어가는 표현이다. x 라고 쓰지 않고 2**x 와 같이 쓴다면, 2 의 x 승의 값이 리스트로 들어 간다. x 값은 그 뒤에 나오는 for 문에 의해서 반복되어진다.

for 문은 중복해서 사용 가능하다. 
>>> result = [(x,y) for x in range(0,10) for y in range(0,10)]>>> print result[(0, 0), (0, 1), (0, 2) , (0, 3), (0, 4), (0, 5), (0, 6), (0, 7), (0, 8), (0, 9),(1, 0), (1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (1, 6), (1, 7), (1, 8), (1, 9),(2, 0), (2, 1), (2, 2), (2, 3), (2, 4), (2, 5), (2, 6), (2, 7), (2, 8), (2, 9),(3, 0), (3, 1), (3, 2), (3, 3), (3, 4), (3, 5), (3, 6), (3, 7), (3, 8), (3, 9),(4, 0), (4, 1), (4, 2), (4, 3), (4, 4), (4, 5), (4, 6), (4, 7), (4, 8), (4, 9),(5, 0), (5, 1), (5, 2), (5, 3), (5, 4), (5, 5), (5, 6), (5, 7), (5, 8), (5, 9),(6, 0), (6, 1), (6, 2), (6, 3), (6, 4), (6, 5), (6, 6), (6, 7), (6, 8), (6, 9),(7, 0), (7, 1), (7, 2), (7, 3), (7, 4), (7, 5), (7, 6), (7, 7), (7, 8), (7, 9),(8, 0), (8, 1), (8, 2), (8, 3), (8, 4), (8, 5), (8, 6), (8, 7), (8, 8), (8, 9),(9, 0), (9, 1), (9, 2), (9, 3), (9, 4), (9, 5), (9, 6), (9, 7), (9, 8), (9, 9)]
if 문을 사용해서 list에 추가 할때 filter를 사용 할 수도 있다.
>>> result = [ x for x in range (0,100) if x%2!=0 and x%3!=0]>>> print result[1, 5, 7, 11, 13, 17, 19, 23, 25, 29, 31, 35, 37, 41, 43, 47, 49, 53, 55, 59, 61, 65, 67, 71, 73, 77, 79, 83, 85, 89, 91, 95, 97]
python 사용하면서 아주 만족도가 높은 문법이다.


수학적 귀납법

p(1) 이 참임을 보인다.
p(n) 이 참이면 반드시 p(n+1) 이 참임을 보인다.

trac 의 한 소스를 보다가 아래와 같은 문장을 보았다.


${ticket.exists and 'Submit changes' or 'Create ticket'}
ticket.exists 가 참이면 'Submit changes' 를 거짓이면 'Create ticket' 을 의미하게 되는 문장이다.
이 문장을 문법적으로 이해하려고 했는데 잘 이해가 되지 않았다.

python 에서 and 와 or 문은 True 나 False로 evaluation 되지 않는다.

x and y 는 첫번째로 x를 evaulation 하고 true 이면 x의 evaulation 값을 리턴하고, false이면 y의 evaluation 값을 리턴한다.

x or y 는 x를 evaluation 하고 true 이면 x의 evaulation 값을, false 이면 y이 evaulation 값을 리턴한다.

${ticket.exists and 'Submit changes' or 'Create ticket'} 문장을 보면 ticket.exists 가 참이면 'Submit changes' 를 evalutation 한다 이는 참임으로 'Submit changes' 스트링이 결과값이다. ticket.exists 가 False 이면 ticket.exists and 'Submit changes' 전체가 ticket.exists 로 계산되고  ticket.exists or 'Create ticket' 을 연산하게 된다.

나중에 python.kr 사이트에서 게시물 검색중 관련된 내용을 알았다.
C언어에서 a ? b : c 라는 표현을 python으로 옮길 때,
a and b or c 와 같이 표현하면 된다는 것을, 하지만 이때 b는 항상 true 로 판별되어야만 가능하다는 것을.....

 해당컴퓨터로 접속은 잘 되는데 보안정책부분에서 guest 허용이 되지 않아 접근이 되지 않는것 같습니다. 혹은 바이러스 때문에 보안정책이 손상되서 그럴수도 있구요.. 다음 방법을 참고해 보세요..

*** 만약 XP pro를 사용하신다면

1. [제어판]-->[사용자계정]-->[guest]가 사용함으로 되어 있는지 확인

2. 되어있다면 시작 → 설정 → 제어판 → 관리도구 → 로컬보안정책/로컬정책/사용자 권한 할당의 우측항목의 '네트워크에서 이 컴퓨터 액세스' 에 'Everyone' 혹은 guest를 추가합니다.

3. 재부팅 시킨 후 공유폴더에 접근하는지 확인해 보세요..


*** 만약 XP Home을 사용하신다면

1. [제어판]-->[사용자계정]-->[guest]가 사용함으로 되어 있는지 확인

2. 주변에 xp pro 사용하는 PC를 찾아 그 PC의 c:\windows\system32 폴더에 가셔서 secedit.exe 파일을 복사

3. 복사한 파일을 xp home의 c;\windows\system32 폴더안에 붙여넣기

4. 다음내용을 메모장에 복사하여 home_allowaccess.inf 파일로 만듬

[Unicode]
Unicode=yes
[Version]
signature="$CHICAGO$"
Revision=1
[System Access]
EnableGuestAccount = 1
[System Log]
[Security Log]
[Application Log]
[Event Audit]
[Registry Values]
machine\system\currentcontrolset\control\lsa\restrictanonymoussam=4,1
machine\system\currentcontrolset\control\lsa\restrictanonymous=4,0
machine\system\currentcontrolset\control\lsa\forceguest=4,1
[Group Membership]
[Privilege Rights]
sedenynetworklogonright =
senetworklogonright = *S-1-1-0,*S-1-5-32-545,*S-1-5-32-547,*S-1-5-32-551,*S-1-5-32-544,*S-1-5-21-1390067357-789336058-1708537768-501
[Registry Keys]
[Profile Description]

5. 만든 inf 파일을 xp home의 c:\windows\system32 폴더안에 넣습니다.

6. xp home에서 명령프롬프트를 실행하셔서 c:\windows\system32로 이동

7. 다음 명령어를 입력하고 엔터
secedit /configure /cfg home_allowaccess.inf /db temp.db /verbose

8. 진행과정이 퍼센티지로 나타나면서 명령을 잘 수행했다는 메세지가 나오면
명령프롬프트 창을 닫고 PC 재부팅!!

9. 공유폴더에 접근하는지 확인해 보세요

성공하셨나요? 참고로 위의 방법은 보안정책값을 초기화하는 방법입니다

회사에서 도메인 정책상 윈도우 자동 업데이트 설정 수정이 되질 않았다. 내 컴퓨터는 자동 업데이트만 시작되면 CPU 점유율이 높아지곤 했다. 설정을 변경하고 싶었지만, 변경이 되질않아 애를 먹었다.
인터넷 검색끝애 아래와 같은 방법을 알아냈다. ㅎㅎㅎ


출처 링크

Automatic Updates options are greyed out?
Published : April 10, 2005

Symptom

When you open the Automatic Updates tab in My Computer Property sheet, or from Control Panel, all of the Automatic Updates configuration options may be grayed out. This happens due to any of the following reasons:

  1. You're not logged on as Administrator (or equivalent)
  2. Automatic Updates Policy is enabled
  3. Automatic Updates (and Windows Update) access is blocked via Group Policy

Resolution

To make the Automatic Updates options configurable by the user (only for stand-alone systems), remove the restrictions 2 & 3 above.

  • Click Start, Run and type REGEDIT.EXE
  • Navigate to this location:

HKEY_LOCAL_MACHINE \ SOFTWARE \ Policies \ Microsoft \ Windows \ WindowsUpdate \ AU

  • In the right-pane, delete the two values AUOptions and NoAutoUpdate
  • Navigate to this location:

HKEY_CURRENT_USER \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Policies \ WindowsUpdate

  • In the right-pane, delete the value DisableWindowsUpdateAccess

Using the Group Policy Editor - for Windows XP Professional

  • Click Start, Run and type gpedit.msc
  • Navigate to the following location:

=> Computer Configuration
==> Administrative Templates
===> Windows Components
====> Windows Update

  • In the right-pane, double-click Configure Automatic Updates and set it to Not Configured
  • Then, navigate to this location:

=> User Configuration
==> Administrative Templates
===> Windows Components
====>  Windows Update

  • In the right-pane, set Remove access to all Windows Update features to Not Configured