koodev

Blender Vertex ID 지정해서 선택하기

Computer

특정 Vertex ID(번호)에 해당하는 점이 모델에서 어디에 위치해 있는지 알아야 할 필요가 있어서 그런 툴을 만들어 봐야 하나 생각해 봤는데, Blender에서 파이썬 스크립트 사용하여 해결할 수 있었다. 이에 대한 내용을 정리해 보았다.

우선 정점 인덱스가 잘 선택되었는지 알아보기 위해 Blender를 디버그 모드로 띄웠다. https://koodev.tistory.com/39 참고. 그리고 대상 모델을 로드하자.

Blender의 좌상단 메뉴 막대 Help 옆에 보면 "Choose Screen layout." 콤보박스에 "Default" 가 선택되어 있다. 이것을 "Scripting" 으로 바꾸자.

그러면 위와 같이 3분할된 화면 구성으로 바뀔 것이다. 이 3분할에서 좌상단이 Text Editor 인데, "+ New" 버튼을 누른 다음 입력창에 아래 코드를 입력한다.

import bpy
import bmesh

def select(*args):
    obj = bpy.context.object
    me = obj.data
    bm = bmesh.from_edit_mesh(me)

    vertices= [e for e in bm.verts]
    oa = bpy.context.active_object

    for vert in vertices:
        if vert.index in args:
            vert.select = True
        else:
            vert.select = False

    bmesh.update_edit_mesh(me, True)

(참고로 이 코드는 하단의 "Console" 창에 입력하면 바로 사용할 수 있다. 그런데, 인터프리터에서 들여쓰기를 자동으로 해 주기 때문에 한 번에 붙여넣을 수 없고 한줄씩 붙여넣어야 한다.)

이제 텍스트 에디터의 코드를 하단의 콘솔로 가져와야 한다. 콘솔창에 아래 명령어를 차례로 입력한다.

import bpy
code = bpy.data.texts['Text'].as_string()
exec(code)

이제 준비가 완료되었다. 콘솔에서 select 함수를 실행하여 정점 번호를 지정해 주면 된다.

참고

Emacs JSON 과 C 블록 숨기기

Emacs

지난주에 Emacs로 좀 긴 JSON 파일을 보고 있었는데, 다른 에디터에는 들어가 있는 폴딩(folding)을 할 수가 없어서 https://jsonlint.com 에서 붙여놓고 보고 있었다. 나중에 당연히 Emacs 에서도 할 수 있을것 같아서 (기본 제공되는 모드 위주로) 찾아 보았다.

hs-minor-mode

hs는 여기서 hide & show 이다. 로드되지 않은 상태에서는 M-x hs-minor-mode 로 활성화 시킨다. 블록 커서 위에서만 동작하는 듯 하다. Hide/Show 상태를 토글하는 명령어인 C-c @ C-c 만 잘 기억해 두고 자세한 정보는 여기에서 참고한다.

hide-ifdef-mode

hs-minor-mode 는 C언어의 #ifdef 같은 매크로에는 적용되지 않는다. 이 모드는 #ifdef, #if 등의 매크로 블록을 숨기는 기능이다. 기본 키바인딩이 hs-minor-mode 와 조금 다르다. C-c @ C-d 로 숨기고 C-c @ C-s 로 다시 보이게 한다(보이기는 hs-minor-mode 와 같다). 토글하는 명령어는 없는 듯 하다.

'Emacs' 카테고리의 다른 글

Emacs Major/Minor 모드  (0) 2019.10.23
Emacs - Python 문서 열람시 멈춤현상  (0) 2019.09.18
Emacs Wdired 모드  (0) 2019.06.29
macOS 에서 Emacs 데몬이 종료되지 않는 문제  (0) 2019.06.07
Create a new file in ido mode  (0) 2019.06.07

Places365-Challenge mean pixel value

Programming

Places365-Challenge train dataset의 평균 픽셀값을 계산해보면 (117.8, 114.4, 105.7) 이 나온다. 데이터량이 많아(476GB) 계산 과정이 꽤 오래 걸려서 여기에 기록해 둔다.

데이터셋 다운로드 페이지: http://places2.csail.mit.edu/download.html

Emacs Major/Minor 모드

Emacs

Emacs 에는 모드라는게 있어서 키 입력이나 상황에 따라 모드마다 라는 동작을 한다. 모드에는 크게 Major 모드와 Minor 모드가 있다. Emacs 모드에 대해서 GNU Emacs 매뉴얼의 내용을 보면서 정리했다.

Major 모드

Major 모드는 버퍼에 1개씩 할당되는 모드이다. Major 모드는 바꿀 수는 있지만 없앨 수는 없어서 버퍼마다 반드시 1개의 모드가 활성화되어야 하는 제약이 있다. Major 모드는 Emacs 윈도우의 하단 Mode Line 의 오른편에 있는 소괄호 안에 Minor 모드와 함께 (major minor) 식으로 표시된다.

매뉴얼에서는 Major 모드를 다시 크게 세 가지로 분류한다. ① 일반적인 문자 편집을 위한 것들로 예를 들어 Text Mode, HTML Mode, Tex Mode, Outline Mode 등이 있다. ② 프로그래밍을 위한 모드들로 C Mode, Fortan Mode 등이 그 예이다. ③ 특정 파일과 관계가 없는 모드들이 있는데, 예를 들어 터미널 안에서 파일탐색기 역할을 하는 Dired Mode, 이메일을 보낼 수 있는 Message Mode, Emacs 안에서 쉘을 열 수 있는 Shell Mode 등이 있다.

Major 모드는 반드시 버퍼당 1개가 할당되어야 하기 때문에 Emacs 에서 최소한 자동으로 지정되게 되어 있다. 강제 지정을 위해서는 M-x xxx-mode 이런 식으로 입력하면 된다. 다시 한 번 말하지만 Major 모드는 끌 수가 없기 때문에 비활성화 하려면 다른 모드로 바꿔야 한다.

일반적으로 Major 모드는 파일 이름을 보고 결정하게 설정한다. auto-mode-alist 라는 변수(Association List)에 아래와 같이 등록하면 해당 파일 패턴에서 대응하는 Major 모드가 활성화된다.

;; glsl mode
(autoload 'glsl-mode "glsl-mode" nil t)
(add-to-list 'auto-mode-alist '("\\.glsl\\'" . glsl-mode))
(add-to-list 'auto-mode-alist '("\\.vert\\'" . glsl-mode))
(add-to-list 'auto-mode-alist '("\\.frag\\'" . glsl-mode))
(add-to-list 'auto-mode-alist '("\\.geom\\'" . glsl-mode))
(add-to-list 'auto-mode-alist '("\\.fs\\'" . glsl-mode))
(add-to-list 'auto-mode-alist '("\\.gs\\'" . glsl-mode))
(add-to-list 'auto-mode-alist '("\\.vs\\'" . glsl-mode))

사실 파일 이름을 보고 Major 모드를 동작시키는 단계는 처리 순서상 비교적 뒤의 단계에 위치한다(5단계 중 4번째). 가장 우선 순위가 높은 모드선택은 파일로컬 변수에서 -*- 로 지정된 이름을 보고 결정하는 것이다. 두 번째는 재미있게도 스크립트 파일을 만들 때 제일 위의 라인에 해당 스크립트를 실행할 인터프리터 역할을 하는 파일을 #! 와 함께 적어주는데 이 파일의 이름을 보고 유추하여 모드를 선택한다. 예를 들어 어떤 스크립트 파일의 제일 윗줄에 #!/usr/local/bin/perl 이라고 적혀 있었으면, Perl Mode를 로드한다.

세 번째는 파일 내용의 앞단(어디까지인지는 모르겠지만)을 정규표현식 매칭하여 모드를 결정하는 단계가 있다. magic-mode-alist 라는 변수에 (정규표현식 . 모드) 이런 식으로 등록한다. nil로 줄 경우 이 과정을 건너뛰며 기본값은 nil 이다.

네 번째가 앞서 언급한 파일이름 패턴을 보는 단계이고 마지막은 magic-fallback-mode-alist 라는 변수를 보고 역시 파일 앞부분의 내용을 보고 정규표현식 매칭하는 단계이다. 여기에는 기본값이 셋팅되어 있는데, 이미지 파일이나 HTML, JSON 파일 등을 대상으로 한다.

major-mode 라는 변수는 Major 모드의 이름을 나타내는 버퍼로컬 변수이다. 현재 활성화된 Major 모드를 나타내는데, 자동으로 설정되므로 웬만하면 수정하지는 말고, 필요할 때 읽어 쓰기만 하자. C-x b 로 버퍼를 새로 만들 때 기본으로 켜지는 모드를 지정할 수 있다라고 하는데 일단 기본값은 fundamental-mode 이고, nil로 설정할 경우 이전 버퍼의 것을 그대로 가져다 써서 모드가 결정된다고 한다.

(Fundamental 모드를 제외한) 모든 Major 모드는 xxx-mode-hook 이런 이름으로 Hook 을 지정할 수 있다. 보통 이런 모드 hook 은 다른 Minor 모드들을 로드하는데 사용한다.

Minor 모드

Minor 모드는 무언가 옵션같은 느낌이다. Major 모드는 버퍼당 반드시 1개가 켜져있어야 하지만 Minor 모드는 동시에 여러개를 활성화시킬 수도 있고, 비활성화도 가능하다.

메뉴얼에서는 Minor 모드를 크게 2가지로 분류한다. ① 버퍼로컬 Minor 모드는 특정 몇몇 버퍼에서 활성화되고 그외에는 비활성화되는 특징을 갖는다. ② 글로벌 Minor 모드는 활성화되면 현재 Emacs 세션 전반에 걸쳐 영향을 준다.

대부분의 버퍼로컬 Minor 모드는 활성화 되었을 때 Mode Line 에서 Major 모드 옆에 표시된다(즉, 활성화된 모든 Minor 모드가 다 표시되는건 아님).

Major 모드와 마찬가지로 Minor 모드를 활성화시키는 명령어는 (xxx-mode) 이다. Minor 모드는 비활성화도 가능하기 때문에 활성화된 상태에서 해당 모드 명령어를 실행시키면 토글되어 비활성화된다. Minor 모드 활성화 명령어와 관련된 내용을 정리하면 아래와 같다.

  • Prefix argument 없이 M-x 나 키바인딩으로 실행시킨 Minor 모드 커맨드는 현재 상태를 토글한다
  • 위의 경우 Prefix argument 가 0이나 음수 값이라면 해당모드는 비활성화로 바뀌고, 다른 argument의 경우 활성화된다
  • Lisp 코드로(소괄호 Call 방식) 실행시킬 경우 argument가 nil 또는 생략되었을 경우 비활성화 되고, 그 외 다른 값을 넣을 경우 활성화된다

대부분의 minor 모드는 해당 모드 커맨드와 같은 이름의 변수를 갖는데, 활성화된 상태에서 non-nil 값을, 비활성화된 상태에서 nil 값을 갖는다. major-mode 변수와 마찬가지로 이 변수는 자동 세팅되기 때문에 읽기만 하고 괜히 수정하는 것은 추천하지 않는다.

Major 모드는 대체로 특정 프로그래밍 언어나 특정 작업에 대한 기능을 제공하는 반면, Minor 모드는 비교적 작은 규모이지만 여러 다른 작업에 유연하게 적용될 수 있는 기능을 제공한다. Minor 모드 중에 auto-fill 이라는 모드를 예로 들어보자. 이 모드는 엔터키를 입력하여 줄바꿈을 하였을 때에 대한 처리를 제공한다. 이 모드는 text-mode 일때와 java-mode 일때 다르게 동작하는데, text-mode 일때는 줄이 너무 길어지면 word wrap을 실행하지만 jave-mode 에서는 word wrap을 실행하지 않는다. 하지만 java-mode 에서도 주석을 편집하는 경우는 word warp이 되어야 하는데 auto-fill 모드는 주석의 경우 알아서 word warp을 하도록 처리해 준다. 이렇듯 전세계의 Emacs 모드 개발자들은 Minor 모드가 Monor 모드의 정체성을 유지하도록 하기 위해 엄청나게 신경쓰고 있는 것이다(The authors of various Emacs modes have done a great job of making sure that things that should work as minor modes are minor modes).

참고

'Emacs' 카테고리의 다른 글

Emacs JSON 과 C 블록 숨기기  (0) 2019.11.17
Emacs - Python 문서 열람시 멈춤현상  (0) 2019.09.18
Emacs Wdired 모드  (0) 2019.06.29
macOS 에서 Emacs 데몬이 종료되지 않는 문제  (0) 2019.06.07
Create a new file in ido mode  (0) 2019.06.07

PyTorch torch_shm_manager Runtime Error

Programming
RuntimeError: error executing torch_shm_manager at "/Users/koodev/.virtualenvs/pyto/lib/python3.6/site-packages/torch/bin/torch_shm_manager" at ../torch/lib/libshm/core.cpp:99

PyTorch 코드를 만들다가 위와 같은 런타임 에러가 났다. 원인은 현재 환경에서 해당 유틸(torch_shm_manager)에 실행 권한이 없어서였다. chmod +x 로 해당 파일의 권한을 수정해주면 해결된다.

참고: https://qiita.com/toshitanian/items/5137a68bbc9396817a3f

'Programming' 카테고리의 다른 글

macOS 앱에서 dylib 이 로드되지 않는 문제  (0) 2020.01.06
Places365-Challenge mean pixel value  (0) 2019.11.07
Tentative Symbol in C  (0) 2019.06.07
pip 설치 중 setuptools 관련 오류  (0) 2019.06.04
ARM A32 명령어셋 VZIP  (0) 2019.03.11

macOS Mission Control 에서 윈도우 사라지는 현상

Computer

마침내 오랬동안 해결되지 않았던 macOS Mission Control 문제의 (임시) 해결 방법을 알아냈다.

제목 그대로 macOS의 Mission Control(트랙패드에 손가락 네개를 올려놓고 쓸어 올리는 동작)을 동작시키면 원래는 데스크탑에 띄어놓은 윈도우창이 모두 보여야 하는데 다 없어지는 현상이다. 처음에는 집에서 사용하는 MacBook Pro에서만 발생하는 현상 같았는데 인터넷 검색을 해 보니 iMac에서도 일어나는 현상으로 보아 macOS 공통 버그인듯 하다. 내 경우 macOS 버전은 Mojave 10.14.6 이다.

명확한 원인은 알 수가 없었고, 특정 프로그램(들)이 Mission Control에 버그를 일으키는 것 같다. 내 경우는 Steam 앱이 문제였다. Steam 앱을 종료시키고 나니 Mission Control이 정상 동작하는 것을 확인했다. 그렇지만 다시 Steam 앱을 실행시켰을 때 문제가 발생하지 않은 것으로 보아 다른 복합적인 원인이 있는 것 같다. 그리고 Steam 뿐만 아니라 다른 앱들도 잠재적인 문제가 있을 수 있다. 아래 링크에서는 Cross DJ 라는 앱이 말썽을 일으켰다고 한다.

참고: https://discussions.apple.com/thread/8515674

macOS Dock 아이콘 이동하기

Computer

Herculacina 님과 아드님께 감사

조금 슬픈 이야기이다. 언젠가부터 macOS의 Dock(바탕화면에서 바로가기 아이콘들이 모여있는 길다란 영역)의 아이콘이 움직이지 않았다. 트랙패드를 꾹 눌러 포스터치를 해봐도 요지부동이었다. macOS가 업데이트되면서 그새 뭐가 바뀌었나 하여 인터넷을 뒤져보니 글쎄, Dock의 아이콘을 누르고 '아주 빨리' 움직이면 된단다. 잘 쓰다가 이렇게 되었다는 것은 내 몸과 정신의 민첩함이 예전 같지 못하다는 뜻이겠지.

참고: https://discussions.apple.com/thread/3817000

Emacs - Python 문서 열람시 멈춤현상

Emacs

제목을 두서없이 쓰긴 했는데, 다음 스택오버플로 링크와 똑같은 문제이다.

https://stackoverflow.com/questions/21517747/emacs-freezing-when-asking-jedi-auto-complete-information-while-interpreter-is-b

어느날부터 이맥스로 파이썬 문서를 열고, 커서를 움직이다가 보면 커서가 멈추고 에디터에 반응이 없게 되는 현상이 발생하기 시작했다. 파이썬 문서에서만 발생하며, C-g 를 연타하면 멈춤현상에서 빠져나올 수 있지만 잠시 후 다시 멈춤현상이 나타난다. 멈춤현상이 발생했을 때 top 명령어로 프로세스들을 봤는데 (elpy인지 jedi인지 확실하지 않지만) 어떤 파이썬 프로세스의 CPU 점유율이 100% 가까이 되었고, 메모리 사용량도 계속 늘어나고 있었다. 환경은 iMac 27-inch Late 2015, macOS Mojave Version 10.14.6, Emacs 26.3(25.1.1 에서도 동일) 이다.

elpy 관련 패키지를 추가로 설치한 지금은 멈춤현상이 발생하는 빈도가 많이 줄었다. M-x elpy-config 를 실행하면 elpy 설정정보가 나오는데, 여기에서 elpy 관련 추가 패키지들의 버전 정보 등을 보여준다. 내 경우 기본 패키지만 설치되어 있었고 그마저도 예전 버전이라서 기본 패키지와 더불어 추가 패키지들도 모두 설치했다. 패키지들은 jedi, autopep8, yapf, black, flake8 등이었고 pip 명령어를 실행할 수 있도록 elpy-config 버퍼에서 실행 링크를 제공하고 있다.

참고: https://emacs.stackexchange.com/questions/47128/elpy-autocomplete-stops-working-unexpectedly

'Emacs' 카테고리의 다른 글

Emacs JSON 과 C 블록 숨기기  (0) 2019.11.17
Emacs Major/Minor 모드  (0) 2019.10.23
Emacs Wdired 모드  (0) 2019.06.29
macOS 에서 Emacs 데몬이 종료되지 않는 문제  (0) 2019.06.07
Create a new file in ido mode  (0) 2019.06.07

미분 Chain Rule

Math

미분에서 Chain Rule(연쇄법칙)은 합성함수를 미분할 때 사용하는 공식으로 아래와 같은 형태를 갖는다.

F = f ∘ g,즉, F(x) = f(g(x)) 라고 할 때, F'(x) = f'(g(x)) ⋅ g'(x)

또는 아래와 같이 d 기호를 써서 나타낼 수도 있다(내가 선호하는 방식이다).

Chain Rule을 사용하면 복잡한 형태의 함수를 공식을 외우거나 전개하지 않고도 좀 더 쉽게 미분할 수 있다. 예를 들어 y = sin2(x) 를 미분한다고 해 보자(sin'(x) = cos(x) 은 미리 알고 있다고 가정한다).

위의 경우는 아주 간단한 문제였지만, 지수 부분이 다른 숫자이거나 분수인 경우에도 Chain Rule을 사용하여 문제를 나누어 풀이할 수 있다.

'Math' 카테고리의 다른 글

Rank  (0) 2020.10.13
Manifold  (0) 2019.12.24
미분 곱의 법칙 (Product rule)  (0) 2019.07.22
미분 관련 수학 기호  (1) 2019.06.07
Right Coset  (0) 2017.06.27

미분 곱의 법칙 (Product rule)

Math

미분에서 곱의 법칙(Product rule)에 대해 정리해 본다. 곱의 법칙은 두 개 이상의 함수가 곱으로 연결되어 있을 경우에 사용하는 공식으로 아래와 같이 정의된다.

(f ⋅ g)' = f' ⋅ g + f ⋅ g'

그럼 지금부터 이 공식 증명을 해 본다. 증명방법은 위키피디아에 있는 방식을 가져와서 내가 이해할 수 있는 수준으로 풀어서 정리한다. 증명에서 핵심은 중간에 f(x)g(x+Δx)를 빼 주고 더해 주는 트릭이다.

h(x) = f(x)g(x) 라고 하고, h'(x)를 구한다고 해 보자(h(x)는 x의 위치에서 미분 가능하다는 가정). 그리고 미분의 정의는 아래와 같다는 사실을 염두해두자.

여기서 h(x)를 f(x)g(x) 로 치환해서 위의 식에 대입해보자.

여기서 트릭을 하나 써본다. 아래와 같이 분자의 두 항에 대해서 각각 f(x)g(x+Δx)를 빼 주고 더해 준다.

위 식을 분배법칙에 의해서 정리해 본다.

이어서 극한기호(lim)까지 전개하여 아래와 같이 정리할 수 있다.

이 상태에서 각 항들을 자세히 살펴보면 아래와 같이 첫 번째와 세 번째 극한(lim) 항은 각각 g(x)와 f(x)로, 두 번째와 네 번째는 각각 f와 g의 미분 도함수로 정리된다는 사실을 확인할 수 있다.

'Math' 카테고리의 다른 글

Manifold  (0) 2019.12.24
미분 Chain Rule  (0) 2019.07.31
미분 관련 수학 기호  (1) 2019.06.07
Right Coset  (0) 2017.06.27
Lagrange's Theorem과 Counting Formular  (0) 2017.06.22