자택경비대

RE(IEEE Std 1003.2)와 BRE(Basic Regular Expression)

Programming

정규식

RE(Regulare Expression)은 한국어로 정규식이라고 불리며, POSIX.2 IEEE Std 1003.2에 정의되어 있다.

정규식은 atom이라는 주 단위를 사용하는데, 이는 다음과 같다.

()또는 [] 표현식, . (어떠한 한 글자), ^ (글자를 포함하지 않은 줄의 시작점), $ (글자를 포함하지 않은 줄의 끝 지점), \를 포함하는 ^.[$()|*+?{\ 문자, 0 부터 9 까지의 숫자를 포함하지 않은 { 문자, 혹은 다른 식별자를 포함하지 않는 문자.

문법

atom 뒤에 다음과 같은 식별자를 사용하여 표현할 수 있다.

*은 0 혹은, 그 이상의 문자와 일치하는것, +는 1 혹은 그 이상의 문자와 일치, 그리고 ?는 0 혹은 1 문자와 일치하는지를 나타낸다.

범위

{로 시작하여 정수형 숫자를 포함하고, 이후 , 가 사용될 수 있고, 다시 정수형 숫자를 포함할 수 있고, }로 끝나는 표현을 의미한다.

만약 두 숫자가 사용되었다면 , 이전의 값은 , 이후의 값을 넘어갈 수 없다.

, 없이 한 숫자만 사용되었으며 바로 }문자로 닫힌 표현식은 정확히 그 숫자의 갯수만큼이 일치함을 나타낸다.

, 뒤에 어떠한 숫자가 없이 }문자로 닫힌 표현식은 , 이전의 숫자를 i로 정의하고, , 이후의 숫자를 j로 정의할 경우, i부터 j까지의 범위의 어떠한 경우에 일치함을 나타낸다.

Bracket expression

[]로 둘러싸인 표현식을 의미하며, 일반적으로 [] 사이의 나열된 문자열에 일치함을 뜻한다. 만약 첫 글자가 ^로 시작한다면, []사이의 나열된 문자열에 불일치함을 뜻한다.

만약, 두 글자 사이에 - 문자가 사용되었다면, 그것은 두 문자 사이의 ASCII 범위를 포함하는것을 뜻하게 된다.

[::]로 둘러싸인 표현식은 사이에 character class의 이름을 사용하여 미리 정의된 범위의 문자열을 나타낼 수 있다.

character class의 내용들은 C 에서 사용되는 ctype.h의 character classification 정의들과 같다.

     
alnum digit punct
alpha graph space
blank lower upper
cntrl print xdigit

[:class:] 또한 [^로 시작되는 반대되는 개념의 일치에도 사용될 수 있다. 따라서 [^[:class:]]는 해당 character class에 포함되지 않는 문자열의 집합을 의미하게 된다.

단어의 범위를 나타내는 특별한 [[:<:]], [[:>:]] 표현식도 있다. 각각 단어의 시작, 끝부분을 나타내게 된다.

예제는 다음과 같다.

# With out bracket expression
echo 'this is island' | sed 's/is/foo/g'

thfoo foo fooland


# With bracket expression
echo 'this is island' | sed 's/[[:<:]]is[[:>:]]/foo/g'

this foo island

비식별자로서의 특수문자

문자 ]를 리스트, 즉 []에서 사용하기 위해선, 가장 처음의 문자로 두거나, 첫 문자 ^ 뒤에 바로 두면 된다.

문자 -를 리스트내에서 사용하려면, ]와 마찬가지로 가장 처음의 위치에 두거나, 가장 마지막 자리에 두면 된다.

이외에 다른 특수문자를 사용하고 싶다면 백 슬래시 \를 앞에 함께 사용하여 식별자로서의 기능을 잃게 할 수 있다.

Basic Regulare Expresion

BRE또는 Obsolete RE 라고도 불리며 현재는 대부분 하위호환성을 유지하기 위해 존재한다.

BRE에서는 +, |, ?가 일반문자로 사용된다.

향상된 정규식

perl이나 python등에서 사용되는 기능이 추가된 정규식을 뜻한다.

  • \<: 글자를 포함하지 않는 단어의 시작부분을 뜻한다. [[:<:]]와 동일하다.
  • \>: 글자를 포함하지 않는 단어의 끝부분을 뜻한다. [[:>:]]와 동일하다.
  • \b: \<\> 두가지 모두의 의미를 포함한다.
  • \B: \b와 반대되는 표현이다.

아래와 같은 줄임표현도 있다.

  • \d: [[:digit:]]과 같은 표현이다.
  • \D: \d와 반대되는 표현이다.
  • \s: [[:space:]]와 같은 표현이다.
  • \S: \s와 반대되는 표현이다.
  • \w: [[:alnum:]_]과 같은 표현이다.
  • \W: \w와 반대되는 표현이다.

자바스크립트 모듈 개념정리 (AMD, CJS, ESM, UMD)

Programming

AMD

Ansynchronous Module Deifinition

  • 모듈을 비동기적으로 불러옴
  • Front-End 용으로 개발되었음

CJS

Common JS

  • Node.js의 모듈 시스템에 사용됨
  • 모듈을 동기적으로 불러옴
  • Back-End 용으로 개발되었음

ESM

ES Modules

  • 표준 자바스크립트 모듈 시스템으로 기획되었음
  • 최신 브라우저에서 대부분 지원
  • 이전의 모듈 시스템들의 장점들을 채택; CJS의 문법을 차용, AMD의 비동기 로드를 가져옴.
  • Tree-shaking 이 가능하다 (크기최적화 가능)

UMD

Universal Module Definition

  • AMD, CJS 같은 개념과는 다르게, 여러 모듈 시스템을 동작 가능하게 하는 패턴에 가깝다.
  • Front-End, Back-End 양쪽에서 사용가능.
  • Webpack이나 rollup 같은 Bundler의 fallback으로 많이 사용된다.

2>&-, 2>/dev/null, |&, &>/dev/null and >/dev/null 2>&1 의 차이점에 대해서

stackoverflow

배경지식: 각 fd (file descriptor), 1stdout, 2stderr 그리고 0stdin 을 가리킨다.

N>&-: N에 해당하는 fd를 닫는다.
N>/dev/null: N에 해당하는 fd로 부터의 출력을 /dev/null로 리다이렉팅 한다.
N>&M: N의 출력을 M의 출력과 하나로 합친다.
|&: 2>&1 | 의 축약어이다. (bash4 버전부터 추가)
&>/dev/null: >/dev/null 2>&1 의 축약어이다.

Bash 파일 테스트 연산자

Programming
  • 아래의 조건이 일치할 경우 참을 반환한다.

-e: 파일이 존재할 경우
-a: -e 와 같다. (deprecated)
-f: 일반 적인 파일일 경우 (디렉토리, 디바이스 드라이버 파일의 경우 거짓)
-s: 파일의 크기가 0이 아닐경우
-d: 디렉토리인 경우
-b: 파일이 블록 디바이스인 경우
-c: 파일이 캐릭터 디바이스인 경우
-p: 파일이 파이프인 경우
-h, -L: 파일이 심볼릭링크인 경우
-S: 파일이 소켓인 경우
-t: fd가 터미널 디바이스와 관련이 있는경우
-r: 읽기 권한이 있는경우
-w: 쓰기 권한이 있는경우
-x: 실행 권한이 있는경우
-g: sgid 플래그가 설정되어 있는경우
-u: suid 플래그가 설정되어 있는경우
-k: stickybit가 설정되어 있는경우
-O: 파일의 소유자인 경우
-G: 파일과 같은 그룹인 경우
-N: 파일이 마지막으로 읽은 후에 수정된 경우
f1 -nt f2: f1 파일이 f2 파일보다 새로운 경우
f1 -ot f2: f1 파일이 f2 파일보다 오래된 경우
f1 -ef f2: f1 파일이 f2 파일과 같은경우 (hardlink)
!: not 연산자, 다른 연산자 앞에 쓰여서 반대 효과를 낼 수 있다.

Reference

CSS에서 a, a[href], a:link, a:visited 의 차이

Programming

a: <a ...로 시작하는 모든 태그, 가장 포괄적인 범위를 가르킨다.
a[href]: <a href="..."> 처럼 a 태그에서 href attribute 까지 가지고 있어야한다.
a:link: href attribute가 가리키는 주소를 브라우저가 방문하지 않은 경우에만 활성화 된다.
a:visited: href attribute가 가리키는 주소를 브라우저가 방문한 경우에만 활성화 된다.

'Programming' 카테고리의 다른 글

자바스크립트 모듈 개념정리 (AMD, CJS, ESM, UMD)  (0) 2020.06.02
Bash 파일 테스트 연산자  (0) 2020.05.28
커맨드라인 팁 모음  (0) 2020.05.01
XPath 사용방법  (0) 2020.04.21
Python scrapy 사용법  (0) 2020.04.21

XPath 사용방법

Programming

XPath란?

XML Path Language

Expression

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

파이썬의 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이 되는지 조절 가능
    • 프로세스가 자발적으로 주도권을 양보한다

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로 치환합니다.

XY problem이란?

stackoverflow

XY problem이 무엇인가요?

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


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

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

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