메아리 저널

SAC OOPS 논문 뒷얘기​

몇 달의 삽질을 통해 오늘 (정확히는 9시간 전에) 지금껏 교수님과 함께 열심히 쓴 논문을 SAC OOPS 2011에 submit했다.


우리 연구실 사람들이 연구하는 주제는 기본적으로는 셋 다 포트리스에 대한 것이라는 점에서는 동일한데, 세부적으로는 상당한 차이가 있다. Formal semantics를 증명 보조기로 기계화하는 쪽도 있고, 언어 코어에 새로운 기능을 집어 넣는 사람도 있는데, 나 같은 경우 순전히 언어 내부를 안 들여다 보고 내부의 겉 기능을 가지고 뭔가를 하자는 쪽이었다. (아주 의도한 방향은 아니었는데 결국 겉 기능만 가지고 안 되긴 했다…) 그래서 얘기가 나온 것이 하스켈의 QuickCheck을 포팅하면서 좀 탐색을 해 보자…는 거였는데 최종 논문이 이 쪽으로 가긴 했다.

그래서 봄 학기 쯤에는 귀찮아서 안 쳐다 보던 하스켈 공부 좀 다시 하고, 한 번 초록(abstract)만 써 내자는 얘기를 듣고 아이디어를 급조해서 워크샵에 내 보았더니 그 워크샵이 사람 없다고 폐쇄되는 허무한 일이 일어나기도 했다. (근데 지금 생각해 보면 그 때 얘기했던 아이디어는 현재 포트리스 구현체의 상태를 볼 때 하루 이틀에 구현 가능한 건 아니었다;) 그 뒤 교수님께서 다른 워크샵에 이 주제로 논문을 내자고 하셨는데 그 때가 submission due 6주 전… 게다가 교수님은 그 기간 대부분동안 해외 출장을 가셔서 순전히 나 혼자서만 열심히 삽질을 해야 하는 상황. 뭐 그래도 어쩌나, 6주가 적은 시간은 아니지만 탐색이나 그런 걸 거쳐서 아이디어를 굳힐 만큼 많은 시간도 아닌지라 최대한 빨리 선택과 집중을 해야 했는데, 이 과정에서 앞에 썼던 대략의 초록이 도움이 되었다. 일단 아이디어는 있긴 하니까-_-; 아이디어 중에서 하기 힘들 것 같은 건 제끼고 확실히 할 수 있을 듯한 아이디어를 구체화하자, 로 가닥이 잡혔다.

그래서 6주 중 첫 주는 아마 아이디어를 굳히고 원래 초록을 가지고 논문 초안을 조금 썼던 것 같고, 그 다음 3주동안 구현을 한 뒤1 나머지 2주동안 버그 잡고 논문 마저 쓰고 했었다. 코드가 거의 제대로 돌아가기 시작한 때가 대략 due 10일 전이었고, 그 때부터 안 되는 영어로 논문 초안을 개판으로 써 놓은 뒤 교수님께서 (시간이 없으니 첨삭지도를 바로 할 수는 없고) rewriting을 하시고 내가 다시 체크를 해 보고 문제 있으면 논의하고 뭐 그렇게 진행했다. 거기에 동일한 주제로 due 사흘 후에 ROSAEC 워크샵에서 talk도 해야 해서 초긴장 상태. 다행인지 불행인지 due 당일에 1주일 연장이 되어서 조금 널럴한 환경(?)에서 rewriting 및 내부 리뷰를 끝낼 수 있었는데, 어쨌든 논문 쓰랴 코드 고치랴 발표 준비하랴 몇달치 긴장은 다 쓴 것 같다.

개인적으로는 QuickCheck이 전형적인 비방향성(undirected) 랜덤 테스팅 시스템인데 사실 이거가 방향성 랜덤 테스팅이나 일반적인 체계적(systematic) 테스팅보다 당연히 커버리지나 그런 건 낮을 수 밖에 없어서 이거 논문을 쓰긴 했는데 효용이 있을까 싶긴 했는데, 뭐 그렇다고 포트리스에서 커버리지 체크하고 어쩌구 저쩌구 하는 걸 일일이 짜고 앉아 있을 수는 없으니까2 이 방향은 진즉에 포기했고, 대신 포트리스 프로그램의 성질(property)을 기술하는 게 일반 프로그램 성질보다 좀 더 넓은 범위의 뭔가를 필요로 하고 그래서 이걸 요렇게 구현했다 식으로 서술했는데 (테스팅을 포기하고 표현력-_- 부분을 좀 강화한 셈), 먹히려나 모르겠다.

…뭐 이미 submit한 논문 가지고 이런 얘기 하는 건 뭐하니까 넋두리는 그만 하고, 결과는 10월인가에 나오니까 그 때까지는 기다려 봐야 알겠지만 일단은 쉴랜다. 근데 쉬고 싶어도 학기가 시작되어서 조교질 해야 한다. 아.


  1. 이것도 참 뭐한게 포트리스가 인터프리터랑 (자바 바이트코드를 타게팅하는) 컴파일러가 둘 다 있는데 전자는 구현은 잘 되어 있지만 느려 터졌고 후자는 좀 더 빠를 것 갈지만 개발 중이었다. 내가 사용해야 하는 기능은 후자에서 구현 안 된 기능을 대거 사용했으므로 전자를 써야 했는데, 포트리스 개발팀이 모조리 후자에만 집중하고 있어서 전자에 있는 버그들이 안 고쳐지고 남아 있는 게 태반… 결국 다양한 workaround를 동원해서 다 피해 가긴 했는데 막막하다. 

  2. 사실 이거 구현하면서 난수 생성 라이브러리랑 reflection 라이브러리 새로 만들었다. 표준 라이브러리에 없더라… 

Windows 95 Turns 15

윈도 95가 15년 전 오늘(미국 시간), 즉 1995년 8월 24일에 출시되었다. 마이크로소프트가 딱히 좋은 회사인 건 아니지만, 그리고 내가 윈도를 꼭 좋아하는 건 아니지만 (그렇다고 맥 오에스 텐을 좋아하는 건 더더욱 아니고), 일반 대중에게 처음으로 완전한 GUI 환경을 제공해 줬다는 의의가 있는 만큼 — 이를테면 나는 윈도 95로 늦게 갈아탄 사람이었지만 결국 1년 안에 도스 멀티부팅을 완전히 버릴 수 있었다 — 세상을 바꾼 운영체제라는 데 이견을 가질 사람은 없을 듯 하다.

뭐, Russ Cox가 말하듯 현 상황은 좀 많이 암울하지만. 그보다 저 슬라이드도 10년 되었잖아


저널에 글이 안 올라오는 이유는 순전히 아직도 끝나지 않은 논문 작업과 발표 준비 때문에…

어떤 아프리카 영상을 다운로드하려고 좀 살펴 봤는데, 결국 받긴 받았지만 간단하진 않은 것 같다. 대략적인 작업 과정:

  • 크롬에서 about:cache로 들어 가서 최근 캐시 목록을 살펴 본다. 살펴본 결과 썸네일을 iflv4.afreeca.com:8099에서 받는 건 확인했는데, 어째 flv 파일 링크는 없다. 아무래도 RTMP를 쓰는듯.
  • Wireshark로 패킷 덤프를 떠 본다. 내 넷북 무선랜 드라이버가 뭔가 맛이 갔는지 기본값인 promiscuous mode로 갈무리가 잘 안 되는데, 뭐 꺼도 상관 없어서 끄니까 잘 되는듯.
  • 덤프에서 필요한 RTMP 패킷들만 저장한다. 패킷 목록에서 RTMP로 전송되는 패킷들만 follow TCP stream으로 필터링한 뒤 받은 패킷만 저장하면 됨.
  • 이제 RTMP 패킷 덤프를 replay할 프로그램이 필요한데, 좀 찾아 보니까 flazr 0.5가 이 기능을 지원하는 것 같아서 좀 들여다 봤다. (신비롭게도 0.7에는 대응되는 기능이 없는듯…) wireshark.groovy라는 그루비 스크립트가 있는데 이걸 파일 이름만 고쳐서 실행하면 된다.
  • 그러나 왠진 몰라도 BufferUnderflowException이 나면서 실패. 음…
  • 왜 그런가 분석하던 도중, 왠지 눈에 익은 문자열이 보여서 다시 확인해 보니까 RTMP 패킷 맨 첫머리에 HTTP로 접근할 수 있는 URL이 쓰여 있다. 응?;

뭐 그래서 그냥 아까 전에 썸네일 받았던 URL에다가 RTMP 패킷에 들어 있던 URL을 합쳐서 그냥 wget으로 받았다는 훈훈한 얘기. -_-;

유비트 니트 감상​

충분히 많이 (20판) 했다고 생각이 들어서 한국 발매 5일… 아니 자정 지났으니까 6일 만에 소감을 써 본다. 음, 모르시는 분들을 위해 재탕을 하자면 저는 유비트 지난 14개월동안 하면서 40만원 가까이 유비트에 갖다 바친 사람입니다. 유비트가 지급률 0%짜리 대형 저금통이라는 얘기가 농담이 아닌듯 orz

연구실에서의 개삽질​

<lifthrasiir>
크아앗ㅊㅁ열팟마팔엿ㅏ!!!
<d****>
lifthrasiir, 열팟 마팔엿!
<lifthrasiir>
어제 밤새도록 삽질하고 끝내 미팅까지 날리는 수모를 겪게 만든 삽질이
<lifthrasiir>
어처구니 없이 해결되었어!
<d*********>
''?
<k****>
미팅을 안하셨으니
<k****>
좋은거군요
<d*********>
ㅋㅋㅋㅋㅋ
<lifthrasiir>
k****, 아니죠 follow-up을 해야죠 -_-
<lifthrasiir>
뭐 저는 미팅에 부담을 가지는 사람은 아니지만 (연구실 한정)
<k****>
(가지는 사람)
<d*********>
(여자랑은.. )
<lifthrasiir>
회사에서의 미팅은 귀찮죠
<lifthrasiir>
...
<lifthrasiir>
어쨌든
<lifthrasiir>
AST node랑 runtime type이랑 섞이면서 굉장히 미친듯이 꼬이는 문제를
<lifthrasiir>
잡았습니다.
<k****>
ㅊㅋ
<lifthrasiir>
...AST node 어딘가에 runtime type으로 변환해 주는 게 있더군요
<d*********>
ㅋㅋㅋ
<lifthrasiir>
없는 줄 알았는데 disambiguation 과정에서 만들어 줌
<lifthrasiir>
이걸 내가 몰랐다니
<d*********>
열심히 찾으려고 했는데 원래 다 있는거죠.
<d*********>
-.-;;
<lifthrasiir>
꼭 그런 거는 아닌데
<lifthrasiir>
정말... 안 보이는 곳에 박혀 있어서
<d*********>
lifthrasiir: 원래 이상형은 정말 안보이는곳에 박혀 있는법이죠 (응?)
<lifthrasiir>
정확히 말하면 Type이 있고 (AST node) FType이 있는데 (runtime type)
<lifthrasiir>
평소에는 FType만 가지고 놀면 참 좋겠는데 generic type에 인자를 끼워 넣으려면 Type을 써야 함
<lifthrasiir>
근데 trait type 같은 건... Type을 제대로 만들어야 하잖아요?
<lifthrasiir>
예를 들어서 어떤 api(module의 개념) A에 있는 T라는 타입을 api B의 X[\...\]에서 쓸 경우
<d*********>
<lifthrasiir>
근데 api A가 B에서는 안 보일 경우
<lifthrasiir>
api name을 다 갖다 집어 넣어야 하는데 이게 안 보임
<d*********>
-.-;;;;
<lifthrasiir>
아무리 뒤져 봐도 X[\...\]에 대응하는 declaration node에서 "X"를 반환하는 건 있는데 "B"를 반환하는 건 없음;
<lifthrasiir>
그래서 뭔가 더 없나 하고 AST node dump를 떠 봤는데
<lifthrasiir>
SelfType이라는 게 보이는 거에요 (기본적으로 이건 declaration에서 self라는 키워드의 타입을 결정하는...)
<lifthrasiir>
거기에 api name도 반환하는 게 있어서 옳다구나 하고 쓰려다가
<lifthrasiir>
잠시 위화감이 들어서 출력을 다시 읽어 보니 selfType이 반환하는 값 자체가 Type임
<lifthrasiir>
ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
<lifthrasiir>
시발 나 뭐 한 거야
<d*********>
ㅋㅋ

그… 제가 내색은 안 하고 있어도 좀 짜증나는 질문을 잊을 만 하면 꾸준히 받아 왔는데요, 뭐냐 하면 “오징어 같은 IRC 네트워크 구축하려면 어떻게 하나요?” 같은 질문이에요. 웬만하면 친절하게 받아 주려고 했는데 최근 들어서 똑같은 질문을 하는 사람들이 늘어나서, 오늘 자로 공식적으로 선언합니다.

네트워크 설정에 대한 질문은 더 이상 답변하지 않겠습니다.

짜증나는 점 중 하나는 InspIRCd 위키가 멀쩡하게 있음에도 불구하고 제대로 확인도 안 하고 질문하는 사람이 대부분이라는 거고요, 다른 하나는… 솔직히 말해서 오징어나 다른 데에서 그냥 채널 돌리면 될 일을 가지고 괜시리 IRC 네트워크를 만드는 경우가 대부분이라는 거에요. 제 기억으로는 정말로 써야 할 이유가 있어서 물어 봤던 사람이 한 사람 밖에 없었고 (사내 용도로 쓰는 경우) 나머지는 그냥 있는 네트워크 쓰면 되는 걸 자기네가 만들려고 하는 거란 말이에요. 무슨 IRC 네트워크 운영이 그냥 만들어 놓고 내버려 놓으면 되는 줄 아는 것 같단 말이죠.

저를 그냥 단순히 “InspIRCd에 UTF-8 설정을 성공시킨 사람”이라고 생각하고 문의할 거면 저한테 질문하지 마세요. (오늘도 누가 물어 봤는데, 그냥 소스 트리가 UTF-8 설정된 상태 그대로니까 알아서 갖다 쓰세요. 저는 책임지지 않습니다.) 저는 InspIRCd 개발자도 아니고 제 본업이랑 오징어 운영 및 개발만 해도 바쁜 사람입니다.


텀블러를 씁니다.