vim에서 터미널로 코드를 실행하기

vim에서 파이썬이나 자바스크립트 코드를 작성하고 바로 실행하는 가장 쉬운 방법은 :!python % 과 같이 외부 명령을 바로 호출하는 것이다. 이 경우 vim은 잠시 숨겨지고 해당 명령을 실행하는 상태로 화면이 전환된다.

보다 IDE와 비슷한 느낌(느낌 알잖아요…)이 중요하다면 vim내에서 창을 나누고 그 창에서 실행 결과를 보는 방법이 있다. vim8에서 도입된 job 기능을 사용하여 백그라운드에서 해당 프로그램이 실행되면 그 결과를 새 버퍼로 받아서 보여주는 방법도 있고, 또 아예 :term 명령으로 해당 파일을 여는 방법도 있다.

더 보기 »vim에서 터미널로 코드를 실행하기

ZMQ 프록시 사용하기

ZMQ 디바이스를 사용하여 네트워크를 확장하는 예를 살펴본 적이 있었는데, zmq.device()는 이제 deprecated 되었고 대신에 zmq.proxy()를 사용하라는 내용을 공식문서에서 보게 되었다. 단지 device에서 proxy로 이름이 바뀐 것인가 싶었는데, 프록시는 zmq 디바이스보다 좀 더 오픈되고 유연한 형태의 네트워크 중계 장치이며, 사용도 더 간편하기 때문에 소개하고자 한다.

더 보기 »ZMQ 프록시 사용하기

(Python) prompt_toolkit 사용법

prompt_toolkit은 xNIX 계열의 쉘에서 사용되는 readline 라이브러리를 순수 파이썬으로 구현한 것으로 명령줄 도구를 사용할 때 히스토리 탐색이나 자동 추천, 자동 완성등의 기능을 쓸 수 있게 해주는 라이브러리이다. readline 자체가 제공하는 기능이 워낙 다양하고 유용하기 때문에 대화형 쉘과 같은 프로그램을 매우 쉽게 만들 수 있게 해준다. prompt toolkit의 제작자는 이 라이브러리의 기능을 활용하여 ptpython이라는 개선된 파이썬 대화형 쉘을 제작하였으며, vim의 기능을 흉내낸 pyvim 프로젝트도 개발하고 있다. (공식문서보기)

prompt_toolkit은 입력 프롬프트 상에서 표시되는 내용과 입력에 대한 검증을 실시간으로 가능하게 하기 때문에, 입력을 특정한 규격에 맞춰야 하는 프로그램에서 아주 유용하다. 또한 텍스트에 컬러를 지정하는 것도 가능하며, 입력 중인 내용에 대해 구문 강조를 적용하는 것도 가능하기 때문에 예쁜 CLI 프로그램을 만드는데 도움을 준다.

오늘은 prompt_toolkit에 대해 좀 알아보도록 하자.

더 보기 »(Python) prompt_toolkit 사용법

[vim] coc-python의 인터프리터가 변경되지 않을 때

coc-python에서 파이썬 파일을 편집할 때 인터프리터가 아무거나 설정되기 때문에 ~/.vim/coc-settings.json 파일에 기본 파이썬 인터프리터 경로를 다음과 같이 설정하면 인터프리터를 고정할 수 있다. 문제는 이렇게 설정했을 때에는 별도의 프로젝트별 .vim/coc-settings.json에서 설정을 해주지 않는 이상, python.setInterpreter에서 설정한 값으로 변경이 안된다는 것이다. 방법은 두 가지인데, coc-settings.json에서 기본 인터프리터 경로를 빼거나, 아니면 다음과 같이 coc#config()함수를 호출하는 것이다. 이렇게 호출한 뒤에 :CocRestart하면 적용된다.

(Swift) 폰트의 포스트 스크립트 이름 확인 방법

CATextLayer에서 텍스트의 폰트를 지정해주려면, CTFontRef를 만들어서 넘겨주어야 한다. 이 값은 CTFont 나 CGFont 타입과 브릿징되기 때문에 CTFont를 만들어야 한다. 만약 시스템에 설치된 서드파티 폰트를 사용해서 CTFont 객체를 만들려면 해당 폰트의 포스트 스크립트 이름을 알고 있어야 한다. 즉 CATextLayer에서 커스텀 폰트를 사용하려면 해당 커스텀 폰트의 포스트스크립트 이름이 필요하다는 이야기이다. macOS에서는 간단하게 서체 관리자에서 해당 폰트를 선택하여 정보보기(cmd + i)를 통해 PostScript Name을 확인해서 이 값을 알 수 있다. 그런데 iOS에서는 서체 관리자가 없기 때문에 이 방법을 쓸 수 없다. 대신에 다음… 더 보기 »(Swift) 폰트의 포스트 스크립트 이름 확인 방법

matplotlib의 기본 사용법 및 다른 시각화 라이브러리

오늘은 파이썬의 시각화 부분에서 가장 널리 쓰이고 있는 matplotlib에 대해서 알아보도록 하자.

matplotlib을 사용할 때 주로 서브패키지인 pyplot을 사용한다. pyplot은 MATLAB의 인터페이스와 유사하게 작동할 수 있도록 하여 MATLAB을 사용하는 사용자층이 쉽게 matplotlib으로 옮겨오도록 하고 있다. 문제는 MATLAB의 인터페이스가 그모양이어서 그런지 모르겠는데, matplotlib의 인터페이스가 일관성도 없는 편이고 그다지 객체지향적이지도 않아서 사실상 API 문서만으로도 사용이 어렵고 관련 예제를 보면서 코드를 따라써야 하는 수준으로 처리해야 하는 경우가 많다는 것이다.

더 보기 »matplotlib의 기본 사용법 및 다른 시각화 라이브러리

파이썬으로 이진 탐색 구현하기

이진 탐색(binary search)은 정렬된 데이터에서 특정한 값을 아주 빠르게 찾는 방법이다. N개의 데이터 중에서 특정한 값 x를 찾을 때, 최악의 경우 N번의 비교가 필요한데, 이진 탐색의 경우 최대 log_{2}N만큼의 비교를 하게 된다. 즉 자료의 크기가 클수록 선형 탐색에 비해 성능이 매우 우수해진다. 다만 이진 탐색은 자료가 정렬되어 있다는 전제가 필요하다. (이 때문에 컴퓨터 과학에서는 정렬이 매우 중요하고, 성능이 좋은 정렬 알고리듬을 만들기 위해 많은 노력이 있어왔다.)

더 보기 »파이썬으로 이진 탐색 구현하기

생일 문제

30명의 사람이 있을 때, 이 중 생일 같은 사람이 최소 2명 있을 확률을 구하고 싶다. 어떻게 계산할 수 있을까? 이러한 문제를 생일 문제라 한다. 흥미로운 점은 생일 문제가 우리의 직관을 비웃는 것 같은 결과를 보인다는 것이다.

예를 들어 당신이 누군가를 만났다고 하자. 그 사람이 당신과 생일이 같을 확률은 얼마일까? 당신의 생일이 정해져 있으므로 그 사람의 생일은 365일 중 같은 날인 하루여야 한다. 이 때의 확률은 1/365로 약 0.274% 밖에 안된다. 이처럼 1년의 날 수가 365일이나 되기 때문에 생일이 같아질 확률이 매우 작아 보인다.

더 보기 »생일 문제

asyncio의 동기화수단들

asyncio는 단일 스레드에서 비동기 코루틴을 사용하여 동시성 처리를 한다. 따라서 asyncio의 세계에서는 적어도 멀티 스레드에서 발생할 수 있는 자원 선점문제가 없을 것이라 생각할 수 있다. 전적으로 틀린 것은 아니다. 스레드가 1개밖에 없기 때문에 메모리 내의 특정한 객체를 동시에 액세스하는 일은 없을 것이다. 그러나 그외의 IO와 관련된 자원은 여전히 선점 문제가 발생할 수 있다. 이러한 문제를 피하기 위해서 asyncio는 threading과 유사한 동기화 수단들을 제공하고 있으며, 이들의 사용 방법 또한 거의 유사하다. asyncio에서 제공하는 동기화 수단에는 다음과 같은 것들이 있다.

  • 락(Lock)
  • 이벤트(Event)
  • 컨디션(Condition)
  • 세마포어(Semaphore)
  • 바운디드세마포어(BoundedSemaphore)
더 보기 »asyncio의 동기화수단들

타입 지우기 – Type Erasure (Swift)

프로토콜 타입

우리가 만약 타입을 알 수 없는 어떤 객체의 특정한 메소드를 호출해야 하는 상황을 생각해보자. (어렵게 생각할 것 없이, 델리게이트 패턴에서 이것은 매우 흔한 일이다.) 타입을 알 수 없다는 것은, 그 객체가 공개하고 있는 인터페이스를 알 수 없다는 뜻이며, 따라서 어떤 메시지를 보내는 것이 불가능하다는 것을 의미한다. 하지만, 서로 다른 타입들이 같은 이름의 메소드를 구현해 둘 것을 약속만 한다면, 이야기가 달라진다.

프로토콜은 미리 정의된 인터페이스의 모음으로, 이를 따르는 타입들은 그 프로토콜에 명시된 인터페이스를 구현해놓은 것으로 가정할 수 있다. 동적 프로그래밍에서는 어떤 객체가 A타입처럼 행동하면 A타입으로 간주할 수 있다고 한다. (어떤 새가 오리처럼 날고, 오리처럼 꽥꽥거린다면 그 새를 오리라 부르지 않을 이유가 무엇인가) 굳이 동적 언어가 아니더라도, 어떤 객체가 그 실제 타입 T가 무엇이든간데, 프로토콜 P를 준수하고 있다면 우리는 P 타입에 대한 상호작용만 한다는 가정하에서 그 객체를 P 타입으로 보아도 무방할 것이다. 아니면 다른 S타입의 객체가 P를 준수한다고 하면, 두 객체를 여전히 같은 P 타입으로도 볼 수 있을 것이다.

더 보기 »타입 지우기 – Type Erasure (Swift)