NaN

Compiler Optimization

디버깅을 위해 generality를 위해 약간(?) 복잡한 구조로 되어 있는 코드를 풀고 specific한 case를 가정하여 최대한 function call을 줄인 임시 코드를 새로 만들었다.

그러면서 조금씩 비교해보는데, original 코드가 쓸데없이 빠르다. 뭐 빠뜨렸나 싶어서 아무리 체크를 해봐도 original이 월등히 빠르다. 생각해보니, 처음 프로젝트 만들때 세팅하면서 (MSVC 씀) 내가 compiler flags를 O3를 줌. 전에는 켜나 안켜나 별 차이 못느꼈는데, 이건 확실히 다르구나.

Homebrew, gfortran

homebrew가 최근에 gfortran을 별도의 formula로 두지 않고 GCC 내부로 통합시켰다. 잘한 것 같다.

근데 문제는 내가 그걸 모르고 julia 설치하다가 몇 가지를 에러를 경험하고 그 에러를 해결하는 과정에서 homebrew 정리를 했더니, gfortranlink하지 못해 몇 시간 삽질했다. openblas는 옛날 gfortran library랑 연결되어있고, 다른 애들은 GCC 안의 gfortran library랑 연결되어있는 바람에, 자꾸 파일을 못찾는다고 에러를 뱉어냈던 것.

다음부터 간만에 homebrew쓰려면 brew update, brew upgrade, brew cleanup부터 하고 들어가야겠다.

예전엔 내 뒷사람을 위해서 C++ 고급기능 & C++11 안쓰려고 했는데, 내가 빡쳐서 못해먹겠다. 그래서 걍 신경안쓰고 내맘대로 코드를 짜게 된다. 근데 나도 잘 몰라서 삽질한다. 하지만 이렇게 고생하면 기억에 오래 남지.

Template and LNK4221

C++ Template은 시방 위험한 물건이다.

http://ofekshilon.com/2009/02/24/resolving-linker-warning-lnk4221/ http://www.parashift.com/c++-faq-lite/templates-defn-vs-decl.html http://stackoverflow.com/questions/495021/why-can-templates-only-be-implemented-in-the-header-file

나의 실수는 function 하나를 정의하는데 template를 썼다는 것이고, 그것을 header와 cpp file에 declaration과 definition을 분리했다는 것이다. 그래서 LNK4221 (”warning LNK4221: This object file does not define any previously undefined public symbols, so it will not be used by any link operation that consumes this library”) Warning이 뜨고, implementation을 찾지 못해서 unresolved external symbol 에러가 떴다.

"Because when instantiating a template,** the compiler creates a new class with the given template argument**" "If these implementations were not in the header, they wouldn’t be accessible, and therefore the compiler wouldn’t be able to instantiate the template."

명심하자.

Containers At Scale - Google 엔지니어의 슬라이드. 구글 SW는 모두 컨테이너에서 돌아가

stadia:

yisangwook:

  • 구글의 소프트웨어는 모두 컨테이너 위에서 돌아간다. Everything at Google Runs in a container.
  • 매주 20억개 이상의 컨테이너가 시작된다. We start over 2 billion containers per week.

구글은 이미 Docker 와 같은 컨테이너 형태의 가상화로 전부 운영하는 듯 하다.

가싱화, 컨테이너의 시대

Papers sync error between a PC and Mac ver.

논문관리용으로 Papers를 쓰는데, iTunes의 재생목록나 Gmail의 라벨과 비슷하게 Collections이라는 기능이 있다. 폴더 정리로는 2%로 부족한 논문정리를 간편하게 할 수 있어서 매우 사랑하지만, 근래에 sync와 관련된 심각한 버그때문에 Database가 문제가 생겨서 고생하고 있다. sync하는 과정을 살펴보면 Dropbox에 Sqlite3로 된 db파일을 저장해놓고 lock을 걸고 (걍 텍스트 파일을 씀) sync를 하는데, PC ver.에서 sync를 하면 sync하는 중간에 db(sqlite3)의 키값을 없애나 보다. 그래서 PC ver.으로 부터 sync된 Mac ver,에서 문제가 생긴다. (PC ver.는 크게 문제는 없다 다만 가끔 다운이 잘 될 뿐) 참고로 이번 버전(3.0)에서 Dropbox sync와 PC ver.이 새롭게 추가되었다. 기존에는 Mac과 iOS 버전이 있었던 상태.

에러 메시지는 다음과 같다. 'NSInvalidArgumentException', reason: '*** setObjectForKey: key cannot be nil' terminating with uncaught exception of type NSException

분명 뭔가 중간에 문제가 생겨서 key를 nil로 만드는 것 같다. 저번에도 비슷한 현상이 있었는데 그 때는 Papers는 실행할 수 있었고 다만 collection에 접근할때마다 crash되는 현상이 전부였다. 그러나 이번엔 Papers 실행조차 안되는 상황이 나타났다. 내 생각엔 매우매우 중대한 문제같은데, 나름 내가 할 수 있는 모든걸 다 설명하면서 리포팅을 해도 워낙 소그룹의 회사라 그런지 반응이 느려서 짜증이 난다. 이런 저런 테스트 해주면서 디버깅 도와 줄 용의가 있는데 협조를 안해준다.

한가지 더 궁금한건, 드랍박스에 저런 식으로 텍스트 파일을 lock이라고 가정하고 동기화시키는 것 밖에 없나라는 궁금중이다. sqlite3 db 파일이 conflicted copy 나면 이걸 감지해서 merging하는게 복잡해서 이런 방법을 쓰는 것이라고 추측할 뿐이지만, 혹시 더 나은 해결책이 없는지 궁금하다.