"One of the nice things about getting older is that you come to understand that you can integrate multiple aspects of your life together. When you're young, you think everything has to be binary, as that's exactly how you feel at that age".
- Min Jin Lee

Covariant, Contravariant, Invariant등 Type Variances 이해하기


거의 그대로 베껴온 원본 글

계약서로서의 타입

타입을 생각할 때, <계약서>로 생각하는 것이 편하다.

왜냐하면, 전달한 값이 그 타입의 범위 안에서 전달 받은 쪽에서 취급이 제한된다는 보장이 있어야 안전한 코드를 컴파일러는 생성해줄 수 있다. (혹은 그렇게 안전한지 체크를 해준다.)

Subtype, 일반화(Generalization), 특화(Specialization)

타입을 말할 때, 나는 보통 객체지향언어에서의 클래스의 상속 관계를 떠올린다. 꼭 그렇지는 않겠지만, 이 글에서도 그렇게 설명을 해보겠다.

이 글에서는 계속 다음 3개의 타입이 있고, 다음과 같은 관계라고 가정하겠다.

Emacs 시작 시간 빠르게 만들기


이맥스 설정이 조금씩 자라날 때마다 이맥스를 새로 시작하는 시간도 길어져서 짜증이 슬슬나기 시작했다. 그래서 조금 개선해봤다.

Quelpa + MELPA 거절하기

Quelpa 을 이용해서, MELPA등에 등록된 패키지가 아닌 내가 작성해서 GitHub에 올려놓고 사용하는 패키지를 Git으로 받아서 등록해 사용한다.1

그런데, 어차피 use-pacakge을 이용해서 MELPA 등 패키지를 받아와서 사용하는데, 불필요하게 MELPA 인덱스를 시작할 때마다 받아오고 한다는걸 알게 됐다.

당연히 껐다. 한참 빨라졌다.

참고: Inhibit MELPA git checkout or updates on init

esup profiler

Elisp 자체는 프로파일링이 가능한데2, $HOME/.emacs 같은 init file을 실행하는 시간은 측정이 어려운거 같아서 검색해봤다.

<소프트스킬>, <커뮤니케이션 스킬>은 어떻게 한국 사회에서 괴물을 만드는지


우선 이야기를 시작하기 전에 일러두고 싶다. 내게 <소프트스킬>1은 매우 재밌게, 유용하게 읽은 책이었다. (2016년에)

이 이야기는 사실 커뮤니케이션스킬, 소프트스킬을 권장하고, 어떻게 해야 할까 하는 고민에서 나오는, 또한 그런 정말 중요한 것이 어떻게 (적어도 내가 느끼기엔) 이상한 괴물을 옹호하기 위해 변질되어 쓰이는지에 대한 것이다.

<사회생활>, <원만함>에 대해

나는 자라오며 계속해서 잔소리를 들어왔다. 말해주는 사람들은 내 아버지와 몇몇 친척 형, 주변 친구들이었다. 그리고 하나도 그런 말들을 새겨 듣지 않았고, 잘했다고 생각한다.

Lisp에서 Dynamic/Lexical Binding와 JavaScript의 var/let


다음의 간단한 코드를 읽어보자.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
var x = "lexical";

function maker() {
  return function() {
    return x;
  };
}

{
  var x = "dynamic";
  assert(maker()() == "???");
}

maker()() 의 결과는 'dynamic' 이다.

심지어, 맨 마지막에 있는 {..} 블록을 넘어가서도 x 의 값은 여전이 'dynamic' 이다.

자바스크립트에서 binding은 어딘가 이도 저도 아니게 심각하게 고장난 느낌이다. 이 글에서 이야기할 lexical binding이나 dynamic binding에도 속하지 않는 느낌이고, 이번에 새로 추가된 let 도 이해하기가 어려운게 아니라 그냥 제대로 망가져 있는거 같다.

direnv + direnv-mode 이맥스 지원 + C/C++/Python등 프로젝트 설정 적용하기


프로젝트의 빌드 디렉토리, virtualenv와 같은 경로의 설정, 경로 설정에 따른 빌드/실행/테스팅/스크립트을 편하게 하려고 만든 moonshot.el 와 유사한걸 검색해봤다.

몇 가지

이런 비슷한게 몇 가지 있는데, 내 상황에 쓸만한 것은 direnv

NPM: dotenv

https://www.npmjs.com/package/dotenv

Node.js에서 Unix environment variable으로 .env 파일을 로딩해주는 역할인 듯.

Shell에서 Hook 걸어서 사용하기엔 별로 인거 같았다.

그리고 Node.js 이외의 프로젝트에 적용하려면 매번 JS으로 wrapper을 짜주고 하기 싫었고,

.env 파일이 그냥 정적인 key-value 문자열의 나열이라, 파일시스템에서 경로를 조립하고 하는데 별로라는 생각이 들었다. 항상 절대 경로만 표기하거나, getenv 해서 문자열을 가져와서 상대 경로 등으로 지정된 값을 매번 절대 경로로 만드는 작업을 해야할테니까.