emacsclient를 통해서 이막수군을 실행하다보면 다음과 같은 메세지창이 뜨는 경우가 있다.

대상 컴퓨터에서 연결을 거부했으므로 연결하지 못했습니다.

이는 이전 실행시에 비정상 종료가 되어 서버 파일이 남아있어서 발생하는데 여기서 확인을 누르고 들어가면 Emacs 내부에서 다시 다음과 같은 메세지를 볼 수 있는데

Warning: desktop file appears to be in use by PID ***. Using it may cause conflicts. Use it anyway? (y or n)

여기서 y를 누르면 대부분의 경우 정상동작으로 복귀되지만 가끔씩 복원되지 않는 경우도 있다. 이 경우 emacsclient를 통해 파일을 열 경우 기존의 창을 사용하지 않고 계속해서 새 창이 생성되게 된다.


해결책은 <사용자 폴더>/AppData/Roaming/.emacs.d/server 밑에 있는 server 파일을 삭제하면 된다.


<테스트 환경>
- OS : Windows 7
- Emacs 버전 : Emacs 24.3 윈도우


,
;; 1) 외부에서 파일이 수정되었을 때 자동으로 다시 읽어들이도록 하는 설정
(global-auto-revert-mode t)

;; 2) <f5>키에 수동으로 파일을 다시 읽어들이는 기능을 설정 (1번 설정을 하지 않았을 경우 사용)
(global-set-key (kbd "<f5>") 'revert-buffer)

;; 3) 탭 문자 대신 스페이스 문자를 사용. 스페이스 사이즈는 4로 함.
(setq-default indent-tabs-mode nil)
(setq-default tab-width 4)

;; 4) <f5>키에 선택한 블럭에 대해 탭 문자를 스페이스로 바꾸는 기능을 설정
(global-set-key (kbd "<f5>") 'untabify)

;; 5) <f5>키에 탭 문자의 사이즈를 4<->8로 토글하는 기능을 설정 (탭 문자 사용시)
(global-set-key (kbd "<f5>") 'tf-toggle-tab-width-setting) ; ' "fix" highlighting
(defun tf-toggle-tab-width-setting ()
    (interactive)
    (setq tab-width (if (= tab-width 8) 4 8))
    (message (number-to-string tab-width))
    (redraw-display))

;; 6) <f5>키에 이전 버퍼로 전환(C-x 왼쪽) 기능을 설정
(global-set-key (kbd "<f5>") 'previous-buffer)

;; 7) <f6>키에 다음 버퍼로 전환(C-x 오른쪽) 기능을 설정
(global-set-key (kbd "<f6>") 'next-buffer)

;; 8) <f5>키에 다른 창으로 전환(C-x o) 기능을 설정
(global-set-key (kbd "<f5>") 'other-window)

;; 9) Alt + 화살표 키를 사용하여 다른 창으로 이동하도록 설정
(windmove-default-keybindings 'meta)

;; 10) 세션 저장하도록 설정
(desktop-save-mode 1)

;; 11) 버퍼 리스트(C-x C-b)에서 버퍼 선택시 같은 창에서 열리도록 설정
(global-set-key "\C-x\C-b" 'buffer-menu)

;; 12) 버퍼 선택(C-x b)시에 가로로 버퍼 리스트를 표시하며 좌우 커서로 스크롤하여 선택가능하게 한다.
;; 파일 선택(C-x f) 모드에서는 폴더내 모든 파일(열지 않았더라도) 사이에서 스크롤하여 선택할 수 있다.
(ido-mode)

;; 13) C-x C-u 시 확인창 안 뜨게 설정
(put 'upcase-region 'disabled nil)

;; 14) C-x C-l 시 확인창 안 뜨게 설정
(put 'downcase-region 'disabled nil)

* <f5> 등 펑션키는 겹쳐지지 않게 적당한 값으로 조정하여 사용한다.


<테스트 환경>
- OS : Windows 7
- Emacs 버전 : Emacs 24.3 윈도우
,

PyMunk에 pyGame을 결합한 예제 코드입니다.

우선 pyGame 기본 예제는 아래 글을 참고하시기 바랍니다.

>> pyGame 기본 예제

 

사전 설치 요구사항

pygame 모듈 사용시, 추가적인 pygame 모듈 설치를 필요로 합니다.

pip install pygame

 

예제 코드

import pygame
from pygame.locals import *
import pymunk
import pymunk.pygame_util

SCREEN_WD = 400
SCREEN_HT = 400
TARGET_FPS = 60

screen = pygame.display.set_mode((SCREEN_WD, SCREEN_HT), 0, 32)
pygame.display.set_caption("PyMunk_Example")
clock = pygame.time.Clock()

space = pymunk.Space()
space.gravity = 0, -1000
draw_options = pymunk.pygame_util.DrawOptions(screen)

ground = pymunk.Body(body_type=pymunk.Body.STATIC)
ground.position = 50, 50
 
ground_shape = pymunk.Segment(ground, (-50, 0), (50, 0), 1)
space.add(ground_shape)

body = pymunk.Body(1, 1666)
body.position = 50, 100
 
poly = pymunk.Poly.create_box(body, (10, 10))
space.add(body, poly)

timeStep = 1.0 / 60

running = True
while running:
    for event in pygame.event.get():
        if event.type == QUIT:
            running = False
            continue
        if event.type == KEYDOWN and event.key == K_ESCAPE:
            running = False
            continue

    screen.fill((0, 0, 0, 0))

    space.debug_draw(draw_options)

    space.step(timeStep)

    pygame.display.flip()
    clock.tick(TARGET_FPS)

pygame.quit()
print("done")

PyMunk에서는 다음 두 호출을 통해 기본적인 내용을 자동적으로 pyGame 영역에 그려주게 됩니다. 다만 (0, 0)에서부터 그려주므로 앞의 예제에서 전체적으로 (+50, +50) 만큼 좌표를 이동시켰습니다.

draw_options = pymunk.pygame_util.DrawOptions(screen)
...

space.debug_draw(draw_options)

 

정찰 위성 이미지

 

<테스트 환경>
  - OS : Windows 7
 - Python 버전 : 3.6
 - Pymunk 버전 : 5.3.2
 - PyGame 버전 : 1.9.3

 

,

파이썬용 2D 물리엔진중 하나인 Pymunk에 관한 기본 예제 코드를 소개하고자 합니다.



사전 설치 요구사항


pymunk 모듈 사용시, 추가적인 pymunk 모듈 설치를 필요로 합니다.

pip install pymunk


기본 예제


(0, 50) 좌표에 위치한 박스가 중력에 의해 지면을 향해 떨어져 지면에 부딧혀 멈출 때까지의 박스의 좌표가 출력되는(무려 텍스트로!) 예제 코드입니다. Pymunk 자체에는 그래픽 표현 기능이 없으므로 좌표 계산만 해줍니다. 이것을 화면 상으로 표현하는 것은 이후의 예제를 통하여 알아보겠습니다.

# -*- coding: utf-8 -*-

import pymunk

# 시뮬레이션 공간을 생성하고, 중력의 방향 및 크기를 설정한다.
space = pymunk.Space()
space.gravity = 0, -1000

# 두 점을 있는 직선을 나타내는 Segment 요소를 사용하여 지면을 생성한다.
# 길이 100, 두께 1인 직선을 생성하여 (0, 0)에 위치시킨다.
ground = pymunk.Body(body_type=pymunk.Body.STATIC)
ground.position = 0, 0
 
ground_shape = pymunk.Segment(ground, (-50, 0), (50, 0), 1)
space.add(ground_shape)

# (0, 50) 위치에 (10, 10) 크기의 박스를 생성한다.
body = pymunk.Body(1, 1666)  # 질량, 모멘트를 지정한다.
body.position = 0, 50
 
poly = pymunk.Poly.create_box(body, (10, 10))
space.add(body, poly)

# 1초 동안 1.0 / 60 초씩 진행시키며 박스의 좌표를 출력한다.
for i in range(60):
    space.step(1.0 / 60)
    print(body.position)


결과 캡처

Vec2d(0.0, 50.0)
Vec2d(0.0, 49.72222222222222)
Vec2d(0.0, 49.166666666666664)
Vec2d(0.0, 48.33333333333333)
Vec2d(0.0, 47.222222222222214)
Vec2d(0.0, 45.83333333333333)
Vec2d(0.0, 44.166666666666664)
Vec2d(0.0, 42.22222222222222)
Vec2d(0.0, 40.0)
Vec2d(0.0, 37.5)
Vec2d(0.0, 34.72222222222222)
Vec2d(0.0, 31.666666666666664)
Vec2d(0.0, 28.333333333333332)
Vec2d(0.0, 24.72222222222222)
Vec2d(0.0, 20.833333333333332)
Vec2d(0.0, 16.666666666666664)
Vec2d(0.0, 12.222222222222221)
Vec2d(0.0, 7.5)
Vec2d(0.0, 2.5)
Vec2d(0.0, 2.886956552845999)
Vec2d(0.0, 3.2330661044876274)
Vec2d(0.0, 3.542236920798546)
Vec2d(0.0, 3.8179830207826186)
Vec2d(0.0, 4.065083408185165)
Vec2d(0.0, 4.286249625299963)
Vec2d(0.0, 4.483745226989828)
Vec2d(0.0, 4.659603964972919)
Vec2d(0.0, 4.81565131414432)
Vec2d(0.0, 4.95352387113101)
Vec2d(0.0, 5.074686834357406)
Vec2d(0.0, 5.180449754301324)
Vec2d(0.0, 5.273414633437768)
Vec2d(0.0, 5.356441970464741)
Vec2d(0.0, 5.431683496733098)
Vec2d(0.0, 5.500322361070223)
Vec2d(0.0, 5.562826033647434)
Vec2d(0.0, 5.619373494273605)
Vec2d(0.0, 5.670188929782226)
Vec2d(0.0, 5.7156761612570905)
Vec2d(0.0, 5.756385891638544)
Vec2d(0.0, 5.792908604984999)
Vec2d(0.0, 5.822032616838716)
Vec2d(0.0, 5.844112775433398)
Vec2d(0.0, 5.859454641289297)
Vec2d(0.0, 5.868318121528639)
Vec2d(0.0, 5.870920746762018)
Vec2d(0.0, 5.86744062807873)
Vec2d(0.0, 5.858019128912104)
Vec2d(0.0, 5.897059737778078)
Vec2d(0.0, 5.925671363059304)
Vec2d(0.0, 5.909019468605577)
Vec2d(0.0, 5.9310174562872575)
Vec2d(0.0, 5.94492949182134)
Vec2d(0.0, 5.953966287149509)
Vec2d(0.0, 5.958854474347584)
Vec2d(0.0, 5.959613136913926)
Vec2d(0.0, 5.961507841637967)
Vec2d(0.0, 5.964013945366503)
Vec2d(0.0, 5.9657250791899505)
Vec2d(0.0, 5.966229061776563)


참고 자료

<테스트 환경> 
- OS : Windows 7 
- Python 버전 : 3.6
- Pymunk 버전 : 5.3.2
,

HTML 모드에서 기본적으로 들여쓰기시 스페이스 두개를 사용하도록 되어있습니다. 이것을 탭 문자를 사용하도록 설정하는 방법입니다.


.emacs 파일에 아래와 같이 정의합니다.

(add-hook 'html-mode-hook
          (lambda()
            (setq sgml-basic-offset 4) ; 사용 중인 탭 사이즈가 들어갑니다.
            (setq indent-tabs-mode t)))


<테스트 환경> 
OS : Windows 7 
Emacs 버전 : Emacs 24.3 윈도우
,

다양한 선택권을 제공하는(..이라고 쓰고 ‘헷갈리는’ 이라고 읽는다) Clojure 실행방법과 그 사용 조건에 대해 정리해보겠다.



1.

lein run -m <네임스페이스>/<함수명>
  • 사용 조건

    • 없음

2.

lein run -m <네임스페이스>
  • 사용 조건

    • 해당 네임스페이스에 -main 함수 존재

3.

lein run
  • 사용 조건 1

    • project.clj에 메인 네임스페이스 및 함수 지정
  • 사용 조건 2

    • project.clj에 메인 네임스페이스 지정되어 있고,

    • 해당 네임스페이스에 -main 함수 존재

4.

lein uberjar
java -jar <생성된 jar 파일명>.jar
  • 사용 조건

    • project.clj에 메인 네임스페이스 지정되어 있고,

    • 해당 네임스페이스에 -main 함수 존재하고,

    • 해당 네임스페이스에 (:gen-class) 옵션 존재

5.

lein uberjar
java -cp <추가적인 class path or jar 파일>;<생성된 jar 파일명>.jar
  • 사용 조건

    • project.clj에 메인 네임스페이스 지정되어 있고,

    • 해당 네임스페이스에 -main 함수 존재하고,

    • 해당 네임스페이스에 (:gen-class) 옵션 존재하고,

    • 추가적인 class path 혹은 jar 파일 지정 필요시

자바 명령으로 실행하기 위해서는 (:gen-class) 옵션이 들어가야 한다는 것과 -main 함수만을 엔트리 함수로 사용할 수 있다는 것에 유의하자.


<테스트 환경> 
- OS : Windows 7 
- Leiningen 버전 : 1.0.0
,
프롬프트로부터 값을 입력받아 처리하는 함수 정의입니다.
(defun <함수명> ()
  (interactive (let ((<변수명>  (read-string "<프롬프트 문자열>")))
                     <처리할 구문>
                     ))
)


<테스트 환경> 
- OS : Windows 7 
- Emacs 버전 : Emacs 24.3 윈도우
,

태그명을 입력받아 한쌍의 열기/닫기 태그를 한번에 입력해주는 함수 정의입니다.

(defun enter-tag ()
  (interactive (let ((tag-name  (read-string "Tag name?")))
                 (insert (format "<%s>\n</%s>" tag-name tag-name))
                 ))
  )


<테스트 환경>
- OS : Windows 7
- Emacs 버전 : Emacs 24.3 윈도우
,