자택경비대

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

파이썬의 다중 대소비교

Programming

파이썬에서 1 < 3 and 3 > 21 < 3 > 2 식으로 줄여서 사용이 가능하다.

물론 result = 1 < 3; result > 2 식으로 여러 행에 걸쳐 처리하게 되면, 예상대로 문제가 발생하지만 (True > 2 == False이기 때문에..) 한 줄로 처리하게 되면 and로 결합한 것 과 같은 결과를 나타낸다.

범위 표현식을 간결하게 표현 할 때 상당히 유용할 것 같다.

몰랐던 사실..

>>> 1 < 3 > 2
True
>>> 1 < 3
True
>>> True > 2
False
>>> 1 < 3 and 3 > 2
True

bash에서 exec와 eval의 차이는 무엇일까?

stackoverflow

evalexec는 둘다 bash(1)의 내장 명령어 입니다.
exec가 몇 가지 다른 옵션을 가지고 있는것은 알지만 둘의 차이점은 무엇인가요?


evalexec는 완전히 다른 명령어라고 보셔도 됩니다.

$ help exec
exec: exec [-cl] [-a name] [command [arguments ...]] [redirection ...]
    Replace the shell with the given command.

exec cmd가 하는 일은, 그냥 cmd를 실행 했을때와 완전히 동일합니다.
다만, 다른 프로세스를 띄워서 명령어를 실행하는것이 아닌, 현재의 쉘을 명령어로 대체하게 됩니다.
내부적으로는, 예를들어 /bin/ls를 실행 할 경우 fork()를 호출하여서 자식 프로세스를 만든 후에 생성된 자식 프로세스 내에서 exec()를 재호출해서 /bin/ls를 실행하게 됩니다. exec /bin/ls는 이 과정(fork() 호출)을 거치지 않고 명령어를 실행하게 됩니다.

아래의 두 예제를 봅시다.
1.

$ bash -c 'echo $$ ; ls -l /proc/self ; echo foo'
7218
lrwxrwxrwx 1 root root 0 Jun 30 16:49 /proc/self -> 7219
foo

2.

$ bash -c 'echo $$ ; exec ls -l /proc/self ; echo foo'
7217
lrwxrwxrwx 1 root root 0 Jun 30 16:49 /proc/self -> 7217

echo $$ 명령어는 처음에 명령어를 호출한 쉘의 PID값을 출력하게 됩니다. 그리고 /proc/self를 대상으로 ls 명령어로 리스팅을 하게 되면 명령어를 실행하는 프로세스의 PID를 가져올 수 있습니다. 일반적으로, (1)에서 볼 수 있듯이 두 PID는 다른 값을 가지게 되지만, exec를 통해 실행된 명령은 같은 PID를 갖는 것을 알 수 있습니다.
또한, exec명령어가 현재의 쉘을 완전히 대체하였기 때문에, 뒤 따르는 echo foo 명령이 실행되지 않은 것도 확인할 수 있습니다.

한편,

$ help eval
eval: eval [arg ...]
    Execute arguments as a shell command.

eval명령어는 인자를 받아서 현재의 쉘에서 실행하게 됩니다. 쉽게 말하면 eval foo barfoo bar은 완전히 같다 볼 수 있습니다.
다만, 변수들이 명령어가 실행되기 전에 확장되어 변수에 담겨있는 명령어를 실행하는 것이 가능해집니다.

$ unset bar
$ cmd="bar=foo"
$ eval "$cmd"
$ echo "$bar"
foo

fatal error: pcap.h: No such file or directory 오류 해결법

Programming

pcap 라이브러리를 컴파일러가 인식하지 못하여 발생하는 에러이다.

라이브러리가 설치되어있지 않다면 아래의 명령어를 통해 설치 할 수 있다.
sudo apt-get update && sudo apt-get install libpcap-dev

설치 후에도 문제가 발생한다면 -I 옵션을 통해 경로를 지정하여 에러를 해결하거나, -lpcap 옵션을 통해서 해결이 가능하다.

Gist에 이미지를 업로드 하는 방법

Programming
  1. 우선 자신만의 gist를 만드세요.

  2. 생성한 gist를 다음과 같은 명령어로 clone 합니다. (<hash>를 자신의 gist의 해쉬 값으로 변경하세요):

     # with ssh
     git clone git@gist.github.com:<hash>.git mygist
    
     # with https
     git clone https://gist.github.com/<hash>.git mygist
  3. clone한 gist의 경로로 이동합니다:

    cd mygist
  4. 이미지를 추가하고 커밋합니다.:

     git add tulip.jpg
     git commit -m "Add tulip to gist"
  5. push 명령어로 원격 저장소를 업데이트 합니다:

     git push origin master

다음 블로그 포스팅 내용도 확인해보세요 -> post.

출처

+추가

위 과정을 자동화하는 프로그램 https://github.com/Xvezda/fist

VIM :help 전체화면으로 보는방법

Programming

기본적으로는 :help 명령어를 사용해서 도움말을 보게되면 절반정도 크기로 창이 열리게 되는데
one-line 명령어로 :help <keyword> | only 처럼 only를 붙여주면 전체크기로 열리게 된다.

VIM script로 파일 경로 문자열에서 파일명 뽑아내는 방법

Programming

fnamemodify 함수를 사용해서 아래와 같이 절대 경로에서 파일명만 추출하는것이 가능하다.

" echo baz
echo fnamemodify('/foo/bar/baz', ':t')