최근 한달간 피부로 느낀 교훈 몇가지. 눈으로 보지 못한 것을 믿으면 안 된다. 직접 측정하지 않은것은 신뢰할 수 없다. 데이터는 근거 없는 주장보다 강력하다. 코드를 보지 않고 상상에 의존한 주장과, 그런 주장을 하는 사람을 경계하라. 마지막으로, 모든 것을 의심하라.
– 이상한 나라의 종텐.
최근 한달간 피부로 느낀 교훈 몇가지. 눈으로 보지 못한 것을 믿으면 안 된다. 직접 측정하지 않은것은 신뢰할 수 없다. 데이터는 근거 없는 주장보다 강력하다. 코드를 보지 않고 상상에 의존한 주장과, 그런 주장을 하는 사람을 경계하라. 마지막으로, 모든 것을 의심하라.
– 이상한 나라의 종텐.
나는 일도 취미도 코딩이다. 하지만, 취미 활동을 할 때에는 재밌고 스트레스를 거의 받지 않지만, 일을 할 때는 종종 스트레스를 받는다. 왜 그럴까? “취미는 그만하고 싶으면 그만해도 되지만, 일은 그렇지 않다.” 취미를 하다가, 하기 싫어지면 오늘은 그만하면 된다. 하기 싫을때 하는 경우가 없기 때문에, 취미는 항상 좋은 기억으로 남아있다. 하기 싫어도 해야 한다면 그건 이미 취미의 범주에 속하는게 아니다.
마음대로 할 수 있다는 것. 내 시간에 대한 사용권이 내게 있느냐, 타인에게 있느냐. 지금 내 행동이 내 의지로 이루어지느냐, 타인의 의지로 이루어지느냐. 토요일인 오늘 내가 출근한 것이 내 의지인가, 타인의 의지인가. 그 작은 차이가 우리들의 삶을 지치게 한다. 일을 하기 싫을때 하지 않아도 된다면, 어떤 세상이 될까. 누군가에겐 즐거운 세상일 수도 있고, 누군가에겐 아무 일도 하지 않아서 백수가 되는 세상일 수도 있다. 결론은 없다. 뭐, 그냥 그렇다고.
– 이상한 나라의 종텐
예정에도 없이, 워드프레스로 블로그를 옮겼다. 여러모로 매우 귀찮은 설치형으로 다시 돌아가는건 정말 싫었는데, 잘 쓰지도 않는 블로그를 다른것도 아니고 설치형 워드프레스로 옮길 수 밖에 없던 이유는 몇가지가 있다.
위 세가지 뿐이다. Vim에서 적당히 Markdown으로 쓰고, git push하면 html로 컴파일된 정적파일이 게시되는 블로그를 사용할까 했는데, 댓글을 Disqus같은거 쓰긴 좀 싫기도하고, 뭐 적당히 남의 플러그인을 깔아서 쓸 수 있는 환경이면 나중에 손이 덜 가겠지 싶어서 워드프레스를 선택했다. 3번의 의미는, 기존에 jong10.com/505 로 접속하던 글은 계속 jong10.com/505 로 접속되야 한다. 하지만, 티스토리와 워드프레스는 퍼머링크 형식이 좀 달라서, 약간의 삽질을 했다.
예를 들어서, http://jong10.com/505로 접속하면, http://jong10.com/post/473 로 연결된다. 매핑하는걸 서버에서 301로 날려줄까 하다가, 워드프레스 소스를 고치면 나중에 업그레이드할때 대박 귀찮을 것 같아서 코드를 테마에 넣을 수 있도록 js에서 했다. 실제로는 페이지 뜨다가 js 파싱하면서 리다이렉트 되니깐 0.01초 정도 더 느리긴 하겠지만, 워드프레스 자체를 업그레이드해도 테마는 남아있을테니, 유지보수는 덜 귀찮을 것 같다. 이렇게 리다이렉트하더라도, 티스토리보단 느리지 않다.
아무튼 대충 이사가 끝났다. rails랑 php를 같이 쓰느라 nginx 때문에 삽질도 좀 했고, php랑 mysql도 내 신성한 서버에 어쩔 수 없이 깔았고, 너무 개인적인 글 몇개도 지웠고, 트랙백은 다 깨진 것 같은데 뭐 잘 안 쓰니깐 상관 없고, 글이랑 댓글은 대충 다 복원된 것 같고, 스킨은 비슷하게 생긴거 적용해놨고, DNS도 옮겼는데 48시간 이내에 적용될 것 같고, 급한대로 OpenID랑 Google Analytics도 옮겼고, RSS 피드도 Feedburner로 바꿨고, 아직 폰트라던가 몇가지 마음에 안드는게 있긴 하지만 동작상에는 문제 없도록 대충 다 옮겼다. 블로그 이사하는거 진짜진짜 귀찮다. 평생 안 옮기고 싶다. 설치형을 쓰는건 정말 귀찮지만, html로 글을 쓰다가 Markdown으로 쓰니깐 참 좋다. 앞으로 블로그 글은 Vim에서 써야지.
– 이상한 나라의 종텐.
구글 코리아 코드잼 온라인 예선전을 하는데, 약속장소 정하기라는 문제의 Large Set에서 약 15만개 정도의 정수를 입력받는 부분이 있었다. 처음엔, C++로 작성하고 있었던지라 cin을 썼는데, 입력을 포함해서 연산과 출력, 업로드까지 8분안에 해야 하는데, 뭔가 엄청 오래 걸리는 느낌이었다. 그래서, CTRL+C 를 누르고, 입력이 끝나는 부분에서 로그를 좀 넣고 다시 실행해보니.. 아니 이거 뭐 숫자 입력만 1분이 넘게 걸리더라! 예전에, UVA Online Judge에서, cout으로 했던 코드가 Time limit exceeded 가 나왔는데 printf로 바꿨더니 Accepted가 뜬 적이 있어서, “설마~”하면서 scanf로 바꾸고 실행해보니 10초도 안 걸렸다. 그 순간은 투덜투덜 cin을 욕하면서 넘어갔다. MinGW가 워낙 구리고, g++ 버전도 옛날 버전이고, Windows 환경이라서 그런가 싶긴 했는데, 나중에 윈도우에서 다시 속도를 재보니 비슷하더라! MinGW로 컴파일해서 바이너리에 Cygwin 의존성은 없고, time 명령어가 없어서 단지 속도만 Cygwin에서 쟀다.
$ time ./test_scanf.exe < C-large.in
real 0m0.733s
user 0m0.015s
sys 0m0.015s
$ time ./test_cin.exe < C-large.in
real 0m0.816s
user 0m0.015s
sys 0m0.015s
아까 cin과 scanf의 속도가 차이난다고 느꼈을땐, CPU가 바빴나 싶기도 하고, 파일시스템쪽의 캐시미스였나 싶기도 하고, 뭐 잘 모르겠다. 아무튼 캐시미스가 안나게 램은 좀 빵빵하게 써야하는가보다. 그나저나, C번 문제를 Floyd로 하고, 각 도시-시작위치의 최대값들 중에의 최소값을 구했는데, 라지셋은 (데이터 다운받고, 실행하고, 결과를 파일로 저장해서 업로드하는) 제한시간 8분 안에 첫번째 테스트 케이스의 플로이드 데이터 구축도 안 끝나는 느낌인데… -_-; 10000개 정도의 노드이고, 플로이드가 복잡도가 높기야 하지만, 아니 뭐 그럼 어떻게 푸는거지? 아무튼, 또 망했다. 다음엔 공부 좀 해야..
– 이상한 나라의 종텐.
p.s. 그리고, STL에서의 iostream 라이브러리들의 디자인도 마음에 안 든다. 다른 부분과 달리 붕 떠있는 느낌이고, 레이어도 너무 많다. 문자열쪽도 마음에 안 드는 점이 몇가지 있긴 한데, 제네릭 때문에 그럴수 밖에 없긴 하지만, glibc에 있는 strstr()은 KMP알고리즘보다도 빠르고, std::string의 find()는 KMP보다 훨~씬 느리다. 구현마다 다르긴 하지만, 2008년에 경험했을땐 glibc의 strstr()과 std::string::find()는 10배 넘게 차이가 났었다.
오늘, Google Developer Hackaton Korea에 참여하면서, 안드로이드 태블릿을 위한 코드뷰어를 만들기 위해서, ctags와 cscope를 Android NDK에서 빌드되게끔 포팅했다. 코드뷰어는 다 못만들어서 틈틈히 만들 예정이고, 포팅한 ctags와 cscope를 github에 올렸다.
Ctags는 원래 GPLv2 라서, GPLv2로 할 수 밖에 없었고.. Cscope는 원래는 BSD였는데 포팅하면서 필요한 몇몇 파일을 glibc에서 가져왔더니 GPLv2 가 되어버렸다. 아놔. 결국 둘 다 내가 싫어하는 라이센스 GPLv2가 되었다. 안드로이드에서 ctags, cscope 같은 파일을 직접 실행할 일은 거의 없으나, 뭐 올려두면 누군가는 도움이 될까 싶어서 올린다. Cscope같은 경우는 ncurses를 포팅할 수가 없어서, ncurses를 사용하는 부분은 동작하지 않게 했다. 즉, 인덱스 생성 등도 되고, 커맨드라인에서 옵션으로 검색하는 것도 정상적으로 되지만, ncurses가 필요한 GUI틱한 화면은 동작하지 않는다.
참고로, 루팅한 폰/태블릿에서는 adb shell 연결하고 chmod로 실행권한만 주면, adb shell에서 바로 실행해볼 수 있고, 루팅하지 않은 폰/태블릿에서는 /data/data/자기앱/ 안에 복사하고 권한조정을 해야 한다. 근데, 오늘 해커톤에서 해본바로는 Java의 File.setExecutable 로는 권한이 변경되지 않고, 뭔가 다른 방법을 해보려다가 시간이 다 되서 망했다. 나중에 해보니 잘 된다. File.setExecutable 문제가 아니었다.
– 이상한 나라의 종텐.