자택경비대

커맨드라인 팁 모음

Programming
  1. 이전에 쳤던 명령어를 다시 사용하려면 Ctrl+r 을 눌러서 역순검색을 할 수 있다.
  2. 출력 결과가 긴 명령어는 뒤에 | less 를 붙여 less 프로그램으로 넘겨주면 편하게 볼 수 있다.
  3. cat file | program 형식으로 Piping 할 필요없이 대부분의 프로그램은 -f 옵션이나 마지막 인자로 파일을 넘겨주는 것으로 파일 입력이 가능한 경우가 많다.

'Programming' 카테고리의 다른 글

Bash 파일 테스트 연산자  (0) 2020.05.28
CSS에서 a, a[href], a:link, a:visited 의 차이  (0) 2020.05.16
XPath 사용방법  (0) 2020.04.21
Python scrapy 사용법  (0) 2020.04.21
파이썬의 GIL(Global Interpreter Lock)  (0) 2020.04.12

XPath 사용방법

Programming

XPath란?

XML Path Language

Expression

/: root노드로 부터 선택
//: document 내부의 모든 가능한 곳에서 선택
.: 현재 노드를 선택
..: 상위 노드를 선택
@: attribute를 선택
[n]: n번째 노드를 선택. 단, XPath에서는 시작점이 0이 아닌 1부터 시작한다.
[last()]: 마지막 노드를 선택
*: 현재 위치에서 모든 가능한 노드를 선택
@*: 모든 attribute를 선택
|: 다수의 XPath expression을 연결할 수 있다.

Python scrapy 사용법

Programming

개요

기본적으로 scrapy crawler의 조작은 scrapy 명령어를 통해 이루어진다.

scrapy는 해당 모듈을 global이 아닌 virtualenv등을 이용하여 프로젝트 단위로 관리하는 것을 권장한다.

Spider class?

CrawlerRule, 즉 규칙을 구체화 시킬 수 있도록 만든 클래스이다. 디자인 패턴에서는 Template Method Pattern과 같이 scrapy.Spider 클래스 자체로는 특별한 일을 하지 않지만, 크롤러의 행동을 정의해 놓았기 때문에 이를 상속된 하위 클래스에서 구현해주는 패턴으로 생각하면 될 것 같다.

하위 클래스에서는 기본적으로 scrapy.Spider 클래스를 상속받도록 구현해야 한다. 흐름은 start_requests 함수에서 반환된 scrapy.Request객체를 시작으로, 각 응답 scrapy.http.Responsecallback 매개변수의 인자로서 넘겨주게 된다.
start_requests는 일련의 scrapy.Request객체들을 반환하는데, 이는 start_urls라는 URL을 모은 list타입의 Property로 대체할 수 있다. (이 때는, scarpy.Request처럼 callback 지정이 없기 때문의 자동으로 self.parsecallback으로 사용한다.)
callback 매개변수는 보통 parse 함수를 지정하게 되는데, 여기서 받아온 응답에 대한 처리를 진행하게 된다.
callback에서 인자로 받은 응답 값을 처리하여 직접 파일로 저장하게 하거나, 반환하여 scrapy에서 처리하도록 할 수 있다.
parse에서 반환된 객체들은 결과물로서 scrapy 옵션에 따라 파일에 저장되거나 stdout 으로 출력되게 할 수 있다.
parse 함수 또한 scrapy.Request객체를 돌려주도록 할 수 있는데, 이 경우 다시 start_requests로 흐름이 넘어가 응답을 받아오게 된다.
따라서 파싱 된 결과물에서 다음페이지로 이동 등의 링크를 추출하여 다시 start_requests로 넘겨주는 것이 가능하게 된다. 이 때는 보통 response.follow라는 축약 명령을 사용해서 가독성을 높이고, 불필요한 타이핑도 줄일 수 있다.

scrapy command

scrapy 프로젝트 생성하기
scrapy startproject [project_name]

구현한 spider를 실행
scrapy crawl [spider_name]

특정 URL의 spider구현을 위한 interactive 모드
scrapy shell [URL]

scrapy.Spider를 상속하는 템플릿 코드 생성
scrapy genspider [spider_name] [URL]

spider의 목록을 출력
scrapy list

파이썬의 GIL(Global Interpreter Lock)

Programming

GIL(Global Interpreter Lock)의 존재 이유

멀티스레딩 환경에서 CPython의 경우 메모리 관리목적으로 reference count를 측정하는데, 이때 race condition이 일어나서 메모리 누수가 일어나거나, 사용중인 객체의 해제등의 치명적인 문제가 발생할 수 있기 때문에 각 객체에 락을 거는 방안을 생각했으나, 이 또한 동시에 여러개의 객체에 락이 걸리게 되면서 데드락의 문제가 발생할 수 있어, 파이썬 바이트코드 단위에 락을 걸어 두가지의 문제를 해결 할 수 있지만 한편으로는 이로 인해서 싱글 스레드로 동작할 수 밖에 없는 환경이 만들어지게 되었다.

GIL이 최선의 방안이었을까? 혹은, 단순히 파이썬 개발진의 잘못된 선택은 아니었을까?

역설적으로 GIL로 인해서 파이썬이 추구하던 쉽고 빠른 개발의 디자인을 완성할 수 있게 되었다. C로 작성된 많은 확장 프로그램들이 파이썬으로 옮겨질때 양측의 조화를 위해 thread-safe한 메모리의 제공이 필요했는데 GIL이 이 역할에 제격이었던 것이다. 이로써 thread-safe하지 않은 C 프로그램들이 python으로 쉽게 확장 될 수 있었다.

Reference

'Programming' 카테고리의 다른 글

XPath 사용방법  (0) 2020.04.21
Python scrapy 사용법  (0) 2020.04.21
pre-emptive multitasking vs cooperative multitasking  (0) 2020.04.12
Python2 pwntools SyntaxError: invalid syntax 해결방법.  (0) 2020.04.03
Bash 매개변수 확장  (0) 2020.03.31

pre-emptive multitasking vs cooperative multitasking

Programming
  • pre-emptive multitasking (i.e. threading)

    • 운영체제가 언제든지 태스크에 개입하여 switch 가능
    • 시간기반으로 스케줄러에 의해 관리됨"
  • copperative multitasking (i.e. asyncio)

    • 코드 상에서 어디에서 태스크가 끝나고 switching이 되는지 조절 가능
    • 프로세스가 자발적으로 주도권을 양보한다

Python2 pwntools SyntaxError: invalid syntax 해결방법.

Programming
...
pygments/formatters/html.py", line 554
    file=sys.stderr)
SyntaxError: invalid syntax

Pygments 패키지가 2.6 버전부터 python2 지원을 중단하면서 발생한 문제다.

아래와 같이 pwntools 제거 후 Pygments 다운그레이드를 진행하고 재설치 하면 된다.

sudo pip uninstall pwntools
sudo pip install 'pygments==2.5.1'
sudo pip install pwntools

Bash 매개변수 확장

Programming

${variable:-word}

$variable이 존재하지 않거나 null인 경우 word로 치환됩니다.

${variable:=word}

$variable이 존재하지 않거나 null일 경우 word값을 $variable에 대입하고 치환합니다.

${varaible:?word}

$variable이 존재하지 않거나 null일 경우 word 값을 stderr에 출력하고 종료합니다.

${variable:+word}

$variable이 존재하지 않거나 null일 경우 아무것도 하지 않습니다. 이외의 경우 word로 치환합니다


${variable:offset:length}

파이썬의 slice와 동일하게 동작합니다. 단, step이 존재하지 않습니다. 음수로 offset, length를 지정할 때에는 : 으로부터 공백을 추가 하는것을 권장합니다(:- 확장과 혼동할 수 있기 때문).

${!prefix*}
${!prefix@}

prefix로 시작하는 변수들을 IFS 변수로 구분하여 확장합니다.

${!variable[*]}
${!variable[@]}

$variable이 배열 변수일 경우 원소들을 IFS변수로 구분하여 확장합니다. 배열이 아니거나 null일 경우 0으로 확장합니다.

${variable#match}  # Shortest
${variable##match}  # Longtest

# e.g.)
FOO="foobarbaz"; echo ${FOO#*ba}
rbaz
FOO="foobarbaz"; echo ${FOO##*ba}
z

앞에서 부터 match와 동일한 부분을 삭제하여 확장합니다. #은 가장 짧은 경우, ##은 가장 긴 경우를 삭제합니다.

${variable%match}
${variable%%match}

# e.g.)
FOO="foobarbaz"; echo ${FOO%ba*}
foobar
FOO="foobarbaz"; echo ${FOO%%ba*}
foo

#와 같이 match되는 부분을 삭제하여 확장하지만, 뒤에서 부터 확인합니다.

${variable/pattern/word}

patternword로 치환하여 확장합니다. 만약 pattern/으로 시작할 경우 모든 패턴을 word로 치환합니다.

실행 vs 읽기 비트, 리눅스폴더에서는 어떻게 동작하나요?

stackoverflow

사용자가 폴더를 열기 위해서는 실행 비트(+x)가 설정되어 있어야 한다는 것을 깨달았습니다. 왜 실행 권한이 폴더를 읽는데 필요한건가요?


리눅스에서 폴더에 권한을 부여할 때에는, 일반 파일에 권한을 부여할 때와 차이점이 있습니다.

  • 읽기 비트(r)가 유저에게 폴더안의 파일목록을 볼 수 있도록 합니다.
  • 쓰기 비트(w)가 유저에게 파일의 생성, 이름 변경, 삭제, 그리고 폴더의 속성 변경을 가능하게 합니다.
  • 실행 비트(x)가 유저에게 폴더로 들어 올 수 있도록 하고, 내부 파일들에 접근 가능하도록 합니다.
  • Sticky 비트 (실행 비트가 설정되어 있는경우 T 혹은 t)가 폴더 내부의 파일 혹은 폴더의 삭제, 이름 변경이 소유자에 의해 가능하도록 설정합니다.

XY problem이란?

stackoverflow

XY problem이 무엇인가요?

질문을 할때, XY problem에 직면하지 않으려면 어떻게 해야 할까요?


XY problem은 질문을 할 때, 실제적인 문제 그 자체보다는 문제를 해결하려 한 시도에 관해서 질문하는것을 뜻합니다.

예로, 당신이 X라는 문제를 해결하려 Y라는 해결책을 생각해냈을때, 실제로 문제를 해결하는 과정에서 문제를 직면하게 되면 X에 대해서 질문하는것이 아니라 Y에 대해서만 묻는 경우를 말합니다.

이것은 답변을 해주는 사람 입장에서 굉장히 성가신 문제가 될 수 있는데, 왜냐하면 당신이 질문한 내용이 사실은 실제 문제를 해결하는데에 있어 아무런 연관이 없을 가능성이 있기 때문입니다.

VIM 디버깅 팁 - 옵션 추적

Programming

어떤 옵션이 설정이 되어있을 때, 이 옵션이 어떤 플러그인, 혹은 설정 파일에서 설정된 옵션인지 확인하고 싶을때

아래와 같이 verbose 명령어를 사용해서 추적이 가능하다.


verbose set option?



# 예를 들어 `shiftwidth` 옵션을 추적하려면 아래와 같이 하면 된다.



verbose set shiftwidth?