자택경비대

Yarn 으로 파일 시스템 상의 패키지 설치하는법

Programming

npm과는 다르게 yarn에서는 로컬 파일 시스템의 패키지를 설치 할경우

npm install -g . # 현재 디렉토리의 패키지를 전역 설치

처럼 파일 경로를 명시하는 방식으로 설치하게 되면 오류가 발생한다.

이를 해결하려면 file:// 프로토콜을 앞에 덧붙여 파일 시스템상의 패키지라고 명시해주면 해결 할 수 있다.

yarn global add file:$PWD # yarn으로 현재 디렉토리의 패키지를 전역 설치

두개의 명령어 출력을 하나로 합치는 방법

Programming

예를 들어 echo fooecho bar, 두 개의 명령어의 출력을 하나로 합쳐서 cat으로 파이핑 하고 싶다면 아래와 같은 방법으로 해낼 수 있다.

# 방법 1
( echo foo ; echo bar ) | cat

# 방법 2
{ echo foo ; echo bar ; } | cat

꼬리재귀(Tail Recursion)란

Programming

Tail Call

Tail Call은 어떠한 함수가 Return 명령어를 만나기 바로 직전에 호출 되는것을 뜻한다.

이때의 직전, 혹은 마지막이란 위치 개념은 컴파일 이전의 코드에서의 개념이 아닌, 실제 스택 프레임의 할당 해제 가 일어나기 직전의 위치를 뜻한다.

그러므로 다음과 같은 경우는 코드의 마지막에 위치하지만 Tail Call에 해당하지 않는다.

e.g.

return func(n--);  // 꼬리 호출이 아니다. (호출이 일어난 뒤, n의 감소가 이루어진다)
// 만약 위 코드가 `return func(--n)` 였다면, 꼬리 호출이다.

TCO

TCO(Tail Call Optimization)는 마지막 호출에서 Call (Tail call) 을 하는경우, 새로운 스택 프레임 생성을 반복 하지 않고

같은 스택 프레임 내에서 다시 호출되는 함수의 진입점으로 Jump 하여 루틴을 진행할 수 있는것을 뜻한다(스택 프레임의 재사용 안전성).

그리고 Recursion 즉, 자기 자신을 호출하는 함수가 명령어의 가장 마지막에 위치할 때 이것을 Tail Recursion이라고 한다.

Tail Recursion Elimination

TCO(Tail Call Optimization)의 특별한 경우인 Tail Recursion Elimination 은 어떠한 함수가 꼬리재귀에 해당 할 때,

이를 반복문의 형태로 재구성 할 수 있는것을 뜻한다.

많이 착각하는 부분은, 꼬리 재귀의 형태로 구현이 되면 Tail Recursion Elimination이 된다고 생각하는 것인데,

이는 재구성 할 수 있다 라는 것이지 실제 컴파일러에서 최적화를 진행하지 않으면 일반적인 재귀와 마찬가지로 일반적인 Call이 이루어지게 된다.

Reference

Node.js에서 watch 프로세스를 두개 이상 띄우는 방법

Programming

concurrently를 설치해서 사용하면 된다.

밑의 예제에서 cmdN 부분을 watch 프로세스를 띄우는 명령어로 교체해서 사용하면 된다.

npm install --save concurrently
npx concurrently "cmd1" "cmd2"
# OR
npm install -g concurrently
concurrently "cmd1" "cmd2"

Alpine Linux에서 root 유저로 권한 변경하는법

Programming

Alpine Linux에서는 sudo 명령어를 사용할 수 없기 때문에, 대신 su root 명령어를 사용하면 된다.


~$ sudo

-ash: sudo: not found

~$ su root

Password:

~# whoami

root

Alpine Linux에서 일반유저로 도커 관리하는 방법

Programming

알파인 리눅스에서는 sudo, usermod 명령어가 없기 때문에 addgroup 명령어를 사용해서 일반 유저를 도커 그룹에 추가해주어야 한다.


~# addgroup docker [USERNAME]

root 권한으로 위 명령을 실행한 뒤에 일반 로그인유저로 접속하면 된다.

혹은, ssh 등으로 이미 접속해 있는 상태였다면 로그아웃 한 뒤에 재접속 하면 해결완료.

Alpine linux ERROR: unsatisfiable constraints: docker (missing): required by: world[docker] 오류 해결방법

Programming

알파인 리눅스에서 도커를 설치하려고 할때 다음과 같은 오류가 발생하는 경우

~# apk add docker
ERROR: unsatisfiable constraints:
  docker (missing):
    required by: world[docker]
~#

아래 명령어로 repository를 추가해준뒤 apk update하여 다시 시도하면 해결된다.

~# echo "http://dl-cdn.alpinelinux.org/alpine/latest-stable/community" >> /etc/apk/repositories
~# apk update
~# apk add docker

Python timeit 모듈 사용법 (성능 측정)

Programming
# 기본적인 사용법
# import timeit
# timeit.timeit(stmt='pass', setup='pass', timer=<default timer>, number=1000000)
#
# stmt: 성능을 측정할 코드를 뜻한다.
#         '''code''', """code""" 등의 멀티라인 스트링을 이용해서 작성할 수도 있다.
# e.g.)
# >>> timeit('''\
# ... for i in range(100):
# ...     n += i
# ... ''', setup='n=0')
#
# setup: 측정 전 필요한 코드를 나타낸다. 유닛 테스트의 setup, teardown 과 같은 개념이라고 봐도 무방하다.
# timer: 측정에 사용할 타이머 함수를 지정한다. 이는 파이썬을 실행하는 플랫폼에 따라 달라질 수 있다.
# number: 테스트를 몇 번 시행할 지 나타낸다.

>>> from timeit import timeit
>>> timeit('"number is " + str(n)', setup='n=123')
0.26701879501342773
>>> timeit('"number is %d" % (n,)', setup='n=123')
0.6445150375366211

Python curses 모듈 사용법

Programming
curses.echo()  # 키보드 입력값이 화면에 출력되도록 설정
curses.noecho()  # 키보드 입력값이 화면에 보이지 않도록 설정

curses.cbreak() # 일반적으로는 키보드 입력값이 버퍼링 되며, Enter키를 눌렀을때 입력이 되지만 
                # cbreak 모드를 설정하면 버퍼링 없이 입력을 받을 수 있다
curses.nocbreak() # 위에서 언급한 cbreak 모드를 해제

curses.initscr() # stdscr을 초기화
curses.endwin()  # 프로그램이 실행 되기 이전의 터미널 세션을 복원한다

from curses import wrapper  # wrapper는 위의 curses.initscr()과 curses.endwin()의 과정을
                            # 중간에 Exception이 발생하여 강제종료 되었을 경우에도 핸들링 되도록 한다

wrapper(main)  # 이런식으로 callable 객체를 파라미터로 넘겨주면 된다

def main(stdscr):
    print('LINES:', curses.LINES, ', COLS:', curses.COLS)  # LINES, COLS 값을 가져 올 수 있다
    y = x = 0
    stdscr.move(y, x)  # 커서를 y, x 좌표로 이동시킨다.

busybox 사용법

Programming

간단하게는 busybox <프로그램 이름> <매개변수> 형태로 사용 할 수 있다.

또한, busybox는 자신의 실행 이름(C에서의 argv[0])을 인식하여 동작하기 때문에
ln 명령어를 이용한 심볼릭 링크 생성을 통해, 해당 이름을 가진 프로그램으로의 동작이 가능하다.

e.g.)

ln -s /bin/busybox echo  # Create soft symbolic link name `echo`
./echo test  # test

Reference