파일 탐색 유틸리티 fd 사용법

이 블로그에서 GNU find의 사용법에 대한 글을 올린 적이 있는데, 오늘은 이 GNU find를 대체할 수 있는 fd 라는 툴의 사용법에 대해서 간단히 정리해보고자 한다. fd는 이름부터 ‘find’를 50%줄여서 더 빠르게 쓴다는 취지로 개발되었으나, GNU find를 ‘완전히’ 대체하는 것을 목표로 하지는 않는다. 대신에 옵션명을 보다 직관적으로 현대화(?)하고 더 빠르게 동작할 수 있는데 중점을 두고 개발되었다. 개발자에 따르면 find 유틸이 제공하는 전체 기능의 80% 정도를 커버할 수 있으며, 성능은 대략 9배이상 빠른 것으로 본다고 한다. 무엇보다 윈도환경에서 사용이 가능하다. (msys 같은… 더 보기 »파일 탐색 유틸리티 fd 사용법

이미지를 아스키코드로 렌더링하기

인터넷에 보면 꽤나 유명한 사진 이미지를 아스키문자로 표현해놓은 것들을 종종 볼 수 있다. 선이나 슬래시 문자를 사용해서 그림처럼 그리는 것들은 아마도 장인정신을 발휘하여 한 땀 한 땀 수놓은 것들이겠지만, 그렇지 않고 문자와 문장 부호들만으로 멀리서 보면 그림처럼 보이게 표현해놓은 예들이 무척 많다. 이런 아스키 아트들은 사실 약간의 아이디어만 있으면 간단히 만들 수 있는데, 오늘은 아스키 코드로 이미지를 렌더링하는 방법에 대해서 알아보자. 이미지 처리를 위해서는 간단히 PIL 정도의 라이브러리만 있으면 된다.

더 보기 »이미지를 아스키코드로 렌더링하기

OpenCV를 사용하여 두 이미지의 다른 부분 찾기

두 이미지의 구조적 유사성을 분석하는 알고리듬으로 SSIM (Structural Similarity)가 있는데, 이를 사용하면 두 이미지가 어느 정도로 유사한지, 어느 부위가 다른지를 알아낼 수 있다. ssim을 수행하는 함수는 scikit-image 라이브러리가 제공하고 있으니, 이를 사용해서 두 이미지의 다른 부분을 찾는 작업을 수행할 수 있다. 다만 이미지를 비교하기 위해 필요한 전처리와 이미지 차이를 구분한 이후의 처리를 위해서는 opencv의 사용이 필수불가결하다. https://docs.opencv.org/master/modules.html 에서 각 모듈에 대한 정의와 Python API를 볼 수 있다. 필요한 라이브러리 설치 몇 가지 라이브러리가 필요하다. 먼저 opencv-python을 설치해서 OpenCV를 사용할 수… 더 보기 »OpenCV를 사용하여 두 이미지의 다른 부분 찾기

vim의 키 맵 설정 팁

vim에서 키맵을 잘 활용하는 것의 중요성은 딱히 말하지 않아도 될 것 같으니, 키 맵을 설정하는데 있어서 몇 가지 알아두면 좋은 팁들을 소개하고자 한다. 키 맵 작성 방법 키 맵은 :map 명령을 사용해서 정의할 수 있다. :map A B의 형식이다. A는 사용할 키 시퀀스이고 B는 A를 입력했을 때 작동할 키 시퀀스이다. 여기서 A, B가 모두 키 시퀀스라는 점을 잘 알아두자. 특정한 키 하나를 눌러서 동작을 실행하는게 아니라, 두 개 이상의 키를 순서대로 눌러서 동작을 실행할 수 있다. 따라서 실제로 vim의 키맵은… 더 보기 »vim의 키 맵 설정 팁

Vim에서 팝업 사용하기

vim8부터 popup 기능이 새롭게 도입되었다. 이제 vim script에서 팝업을 만들어서 대화 상자나 메뉴 혹은 그외의 UI들을 팝업 레이어로 만들어서 편집기 위로 띄울 수 있게 되었다. 특히 비동기로 외부 job을 실행하는 함수를 작성하는 경우에 그 결과를 사용자에게 알려주는 용도로 사용하기에 용이하다. 이 기능을 어떻게 사용하는지 살펴보도록 하자.

더 보기 »Vim에서 팝업 사용하기

중심극한정리

통계적 추정은 표본으로부터 모수를 추정하는 것을 말한다고 했다. 그런데, 통계량은 표본을 추출할 때마다 달라지는데, 어떻게 매번 변하는 통계량을 가지고 모수를 추정할 수 있을까? 통계적 추정은 중심극한정리라는 원리를 근본으로 작동한다. 오늘은 중심 극한 정리가 무엇이며, 통계적 추정에서 어떤 의미를 갖는지 살펴보자. 먼저 확률 변수에 대해 알아보자. 확률 변수(Random Variable)은 프로그래밍할 때 그 변수(값을 저장해놓는다)의 개념과는 좀 다른 것으로, 말 그대로 변하는 값들을 말한다. 즉, 무작위 실험을 했을 때 특정 확률로 발생하는 각각의 결과를 말한다. 이 때 확률 변수는 확률에 대한 변수가… 더 보기 »중심극한정리

순열과 조합 – itertools (python)

알려져 있는 원소들로 구성되는 가능한 모드 조합 및 순열을 구하려 할 때, 이를 직접 구현해보는 것도 좋지만 itertools 모듈에 있는 함수를 사용하는 것을 추천한다. 이 함수들은 기본적으로 제너레이터 함수이기 때문에 한번에 리스트 등으로 만들기 전까지는 메모리에 큰 부담을 주지 않으며 성능도 적절한 편이다. 오늘은 itertools의 함수 중에서 순열과 조합에 관련된 함수들을 알아보도록 하자.

더 보기 »순열과 조합 – itertools (python)

파이썬 패턴매칭

파이썬 3.10에서는 구조적 패턴 매칭이라는 새로운 문법이 도입된다. 패턴매칭은 match 문이라는 새로운 구문에 적용된며, 스칼라 같은 다른 언어들에서 영향을 받았다고 한다. match 문은 어떤 값(subject)을 여러 다른 형태(pattern)들과 들어맞을 때 까지 비교한다. 이는 C와 같은 언어의 switch 문과 같은 것이 아니냐고 할 수 있겠지만, switch 문이 여러 케이스의 값을 비교하는 것과 달리, match 문은 값에 대해서 패턴에 들어맞는지를 보는 것이 차이라 하겠다.

더 보기 »파이썬 패턴매칭

오일러 프로젝트 87번

보다 영리하게 푸는 방법은 여전히 모르겠고, 현재로서는 brute-force로 푸는 것이 최선인 것 같다. 5천만이라는 한계값이 정해져 있으므로 범위 내에서 에라토스테네스의 체를 사용해서 소수 세트를 미리 만들어 놓고 삼중 루프를 돌면서 범위를 벗어나지 않는 값들을 집합에 더하는 식으로 계산한다. 이 때 작은 값부터 더해나가면서 한계치를 초과하는 부분을 쓸데없이 계산하지 않도록만 해준다. 필요한 가장 큰 소수는 대략 5천만의 제곱근 수준인 것 같다. (정확히는 5천만 – 8 – 16 의 제곱근) 소수체만 잘 만들 수 있다면 파이썬으로도 1초 이내에 계산 가능하다. (600~700 ms… 더 보기 »오일러 프로젝트 87번

vim 플러그인의 키맵과 함수 이름

vim 플러그인을 작성하는 것을 간단히 요약하면 어떤 기능을 수행하는 함수를 작성하고, 이 함수를 호출할 수 있는 방법을 제공해주는 것이라 할 수 있다. 이 때 고려해야하는 중요한 요소 중 하나는 사용자는 내가 작성하는 플러그인 말고도 엄청나게 많은 다른 플러그인을 사용하고 있을 것이라는 것이다. 따라서 함수의 이름이나 사용자 정의 명령의 이름, 키 맵핑등이 온전히 내가 원하는대로 사용자가 쓸 수 있을 것이라는 생각을 하는 것은 위험하다.

더 보기 »vim 플러그인의 키맵과 함수 이름