가톨릭 성가 (수정판) 발행 사는 이야기

성가 수정판이 나왔다.
얘기를 들어보니 저작권에 문제가 생긴 모양이다. (참고1)
저작권은 성당도 피해갈 수가 없었나 보다.
그나마 몇 곡은 같은 마디를 덧붙인다던가 하는 식으로 약간 수정하고 말았지만 몇 곡은 아예 삭제가 되었다.

옛날에 운동하던 형들은 "민중가요는 10년, 20년전 선배들이랑도 같이 부를 수 있어"서 좋아했었다.
넥타이 매고 온 아저씨들이랑 신입생이 같은 자리에서 소주 마시면서 같은 노래를 부를 때는
서로 통하는 게 있는 거 같은 그런 짜릿함도 느껴졌다.

나에겐 가톨릭 성가도 약간 그런 느낌이었다.
대학교때 노느라 안 가다가 몇 년 지나서 갔는데도,
어릴 때 부르던 그 노래를 똑같이 부를 때 '고향집에 돌아간 느낌'
수정된 곡이 많진 않지만, 그래서 살짝 아쉽다. :)

씨앤블루, YNot... 사는 이야기


신해철이 '씨앤XX이 인디밴드면 파리가 새다. XX불루가 진짜밴드면 내가 은퇴한다.
그 노래가 표절이 아니면 표절은 세상에서 사라진다. 힘없는 인디의 대가리들 위에 오줌싸고 침도 뱉는구나.
한방에 땅속으로 쳐박아버릴란다. 인간막장들
' 이라고 했다길래,
누구 노래를 표절했다는 거야, 라고 찾아봤더니 무려 Ynot...

Ynot 은 10년 전에도 홍대 메이저 그룹이었는데,
이번 일로 다시 이름을 듣게 되어서 반갑기도 하고, 아직도 음악하고 계시는구나 싶어서 안타깝기도 하다.

90년대 말에는 홍대가 재미있었는데,
요즘 홍대는 춤추는 클럽밖에 안 남았고, 재머스니 슬러거니 다 없어진지 오래더라.
(재머스 안 망했나 보네. 한 번 가 봐야겠다.)
홍대 놀이터에서 공연하는 분들도 수준이 바로 방송 나가도 되겠던데,
공연할 곳이 없어서 거기에서 그러고 있는 건지(다른 이유일지도 모르지만) 보고 있으면 안타깝다.

씨엔블루는 라디오스타에서 처음 봤는데, 나도 거기에서 인디..? 언더? 밴드 어쩌고 하길래 헉 했었다.
씨엔블루가 인디밴드는 아니지... '인디' 가 무슨 뜻인지 안다면 말이지.

FNC뮤직 얘기 들어보면
'와이낫이란 그룹은 난생 처음 들어봤다. 우리가 2008년 음악까지 다 찾아 들었을 리도 없거니와 만약 표절을 하려 했다면 외국의 더 좋은 곡을 했을 것'이라고 했다는 데다가
'이슈화 직후 와이낫 측과 만나 '두 노래의 유사성이 없으며 법적인 절차를 밟겠다'는 의사를 분명히 전했습니다.'
라고 했다는데, 잘 모르는 내가 봤을 때는 FNC 쪽에서 와이낫쪽에다가 '너네 까불면 법으로 괴롭혀 주겠어' 라고 협박했다는 걸로 밖에 안 보이는데, 나만 그런건가...

'실력파 밴드'라는 표현도 웃기다.
그냥 음악듣고 좋으면 되지, 무슨 실력파니 일본에서 음반을 냈니, 그게 왜 그리 중요하냐.
이게 다 학교에서 '공부 열심히 해라' 는 얘기만 듣고 자라다 보니까 그런 거다.
'잘 하지' 않아도 '멋지거나', '나와 맞으면' 좋은거지, 음악에서 실력파는 왜 따져.
기타의 신이 임펠리터리(Chris Impelliteri)냐, 잉베이 맘스틴(Yngwie Malmsteen) 냐,
보컬의 신이 스틸 하트냐 저니냐 따지는 거랑 다를게 없다.

내가 생각하는 진짜 실력파 밴드라는 건, 자기가 가장 잘 할 수 잇는 음악을 스스로 만들어서 공연할 수 있는 밴드라고 생각하고, 지금 씨엔블루처럼 '이 곡은 저희가 작곡한 게 아니니까, 작곡가의 문제지 저희 문제가 아닙니다' 라고 얘기하는 순간 이미 실력파 밴드라고 얘기하면 안 된다고 본다.

그래도 씨엔블루 좋아해도 상관없지. 나도 카라, 소녀시대, 아이유 좋아하니까... 연예인으로서...

ATI + HD audio = BlueScreen 젠장... 사는 이야기

Geforce 6600 을 몇 년간 써 오다가 Batman Arkham Asylum 이 너무 느려서 라데온 HD 4650 을 설치했었더랍니다.
네버 윈터 나이츠2 가 그래픽이 구리다고 생각했었는데, 제 그래픽 카드가 구린거였더군요.
HD 1080p 영화를 720p 으로 인코딩 안 하고 바로 볼 수도 있고요.
5만원이면 되는 걸 왜 안 하고 있었을까. 흑...

그런데, 언젠가부터 '대기 모드' 만 들어가면 BlueScreen 블루스크린이 뜨는 겁니다.

f78dad44 f6c9687b 8a238210 f78dad70 8a0ea1c8 HDAudBus!FxPkgFdo::PowerCallDriver+0x27
f78dad68 8056ff51 88cefdc8 00000000 8056c5fc HDAudBus!FxPkgFdo::DeviceSetPowerWorker+0xf4
IMAGE_NAME:  pci.sys

드라이버를 여러번 새로 깔아도 똑같길래 윈도우 새로 깔아야겠다 하고 있었는데,
어떤 귀인이 트위터로 '걍 장치관리자에서 그래픽카드쪽 오디오가 있다면 사용안함 하면 어떨까' 라고 하더군요.
들어가봤더니.. 흑..

이 장치를 사용하기에는 리소스가 부족합니다. (코드 12)
이 장치를 사용하려면 시스템에서 다른 장치의 사용을 중단하십시오.
컴퓨터를 다시 시작해야 이 장치의 변경 내용이 적용됩니다.

이런 에러와 함께 경고표시가 되어 있어서 그걸 사용안함으로 바꿨더니 더 이상 블루스크린이 안 뜨네요.
나만 컴맹이라서 이런 거 모르고 있었던 건가요.
여튼 혹시 다른 분들도 이런 문제로 고생하고 계신다면 이렇게 한 번 해 보세요.

UnitTest++ 1.5 나왔네요. 개발 이야기

UnitTest++ 1.5 가 나왔네요. 다운로드는 여기에서...
원래 UnitTest++ 을 개발하던 Noel Llopis, Charles Nicholson 대신 다른 사람이 개발하고 있는 거 같긴 한데, 정확하게는 모르겠네요.

1.3 -> 1.4 에서는
"testResults 대신 UnitTest::CurrentTest::Results(), m_details 대신 UnitTest::CurrentTest::Details() 사용
즉, 전역 객체를 만들어서 다른 함수에서도 CHECK 등의 macro 를 쓸 수 있게 해 줌

TestProject 예제에서처럼 ScopedCurrentTest 를 스택에 만들면,
전역 테스트 결과에는 영향을 미치지 않는 로컬 결과를 따로 만들어 검사할 수 있음"

와 같이 바뀐 거 같네요. 자세한 내용은 UnitTest++ 1.4 버전의 달라진 점 을 참고하세요.

1.4 -> 1.5 에서는
LeakDetector 이 추가되고, VS6, VS10 지원되는 듯 하네요(원래 안 되었나?). 대강 이런 식으로...

   1: LeakDetector::LeakDetector() {
   2:     _CrtMemCheckpoint(&originalMemoryState);
   3: }
   4:  
   5: // Fucking VS10...
   6: #pragma warning(push)
   7: #pragma warning(disable:4101)
   8: bool LeakDetector::IsLeakDetected() {
   9:     _CrtMemState newState;
  10:     _CrtMemState temp;
  11:     _CrtMemCheckpoint(&newState);
  12:     return !!_CrtMemDifference(&temp, &originalMemoryState, &newState);
  13: }
  14:  
  15: void Test::Run() {
  16:     CurrentTest::Details() = &m_details;
  17:     LeakDetector memoryLeakChecker;
  18:      ExecuteTest(*this, m_details);
  19:     if(memoryLeakChecker.IsLeakDetected())
  20:         CurrentTest::Results()->OnTestFailure(m_details, "Memory Leak Detected!");
  21: }

사실 LeakDetector 같은 건 따로 만들어서 해도 되지만, framework 에서 바로 해 주면 좋겠지요.
단, singleton 같이 의도대로 memory 를 해제하지 않는 코드가 실행될 경우 에러라고 보여질 위험이 있을 거 같은데,
이 부분은 좀 확인해 봐야 할 거 같습니다.


   1: void IsZero(int ret) {
   2:     // 1.4 부터 지원
   3:     // testResults 대신 UnitTest::CurrentTest::Results() 을
   4:     // m_details 대신 UnitTest::CurrentTest::Details() 사용
   5:     // 결과 객체가 전역이기 때문에 TEST 밖 함수에서도 CHECK 함수 사용 가능
   6:     CHECK_EQUAL(0, ret);
   7: }
   8:  
   9: TEST(Test1) {
  10:     CHECK_EQUAL(1, 2);
  11:     char* pTest = new char[10];        // memory leak : 1.5 에서 지원.
  12: }
  13:  
  14: int _tmain(int argc, _TCHAR* argv[]) {
  15:     int ret = UnitTest::RunAllTests();
  16:  
  17:     char test;
  18:     cin >> test;
  19:     return ret;
  20: }
  21:  
  22: d:\work\test\unittest15prj\unittest15prj.cpp(22): error: Failure in Test1: Expected 1 but was 2
  23: d:\work\test\unittest15prj\unittest15prj.cpp(21): error: Failure in Test1: Memory Leak Detected!
  24: FAILURE: 1 out of 1 tests failed (2 failures).
  25: Test time: 0.00 seconds.

google test 가 잘 나와서 그런지 UnitTest++ 이 많이 죽는 느낌이 있습니다만,
UnitTest++ 정도만 있어도 충분히 단위테스트를 할 수 있습니다.
아직까지는 담백한 unittest++ 가 더 좋다는... ㅎㅎ

Meyer's Singleton 쓸 때 주의할 점 개발 이야기

오래간만에 코드 이야기입니다.

Meyer's Singleton 를 쓰면 간단하게 싱글턴을 만들 수 있지만, 아래와 같은 실수를 하지 않도록 주의해야 합니다.


   1: class CTest {
   2: public:
   3:     static CTest& Inst() {
   4:         static CTest s;
   5:         return s;
   6:     }
   7:     const char* GetName(int i) {
   8:         return m_Name[i].c_str();
   9:         //return m_Name[i]->c_str();
  10:     }
  11:  
  12: private:
  13:     CTest() {
  14:         cout << "CTest construct start\n";
  15:         for (int i = 0; i < 3; ++i) {
  16:             m_Name[i] = string("Test");
  17:             //m_Name[i] = new string("test");
  18:             cout << i << endl;
  19:             SleepEx(100, FALSE);
  20:         }
  21:         cout << "CTest construct end\n";
  22:     }
  23:  
  24:     string m_Name[3];
  25:     //string* m_Name[10];
  26: };
  27:  
  28: unsigned __stdcall ThreadTest(void* pArguments) {
  29:     int nIndex = (int)pArguments;
  30:  
  31:     cout << "ThreadTest start : [" << nIndex << "]" << endl;
  32:     const char* pName = CTest::Inst().GetName(nIndex);
  33:     cout << "thread [" << nIndex << "]. name is : " << pName << endl;
  34:     cout << "ThreadTest end : [" << nIndex << "]" << endl;
  35:  
  36:     return 0;
  37: }
  38:  
  39: int _tmain(int argc, _TCHAR* argv[]) {
  40:     HANDLE hThreads[2];
  41:     unsigned threadID = 0;
  42:  
  43:     hThreads[0] = (HANDLE)_beginthreadex(NULL, 0, &ThreadTest, (void*)0, 0, &threadID);
  44:     hThreads[1] = (HANDLE)_beginthreadex(NULL, 0, &ThreadTest, (void*)2, 0, &threadID);
  45:  
  46:     WaitForMultipleObjects(2, hThreads, TRUE, INFINITE);
  47:     cin >> threadID;
  48:  
  49:     return 0;
  50: }

두 thread 가 동시에 싱글턴인 CTest 의 멤버변수를 접근하는 코드입니다.
출력은 아래와 같습니다. (실제로 해 보면 cout 내에서도 thread switching 이 발생해서 출력이 섞여서 보일 것입니다)


   1: ThreadTest start : [0]        // thread 0 시작
   2: CTest construct start        // CTest::Inst() singleton 생성 시작
   3: 0                            // CTest 생성자 for loop 0 번째
   4: ThreadTest start : [2]        // thread 2 시작
   5: thread [2]. name is :        // 생성자 실행중인 CTest 객체를 리턴받아서 출력
   6: ThreadTest end : [2]        // thread 2 종료
   7: 1                            // CTest 생성자 for loop 1 번째
   8: 2                            // CTest 생성자 for loop 2 번째
   9: CTest construct end            // CTest 생성자 완료
  10: thread [0]. name is : Test    // thread 0 에서 생성자 호출 완료된 CTest 객체로 작업
  11: ThreadTest end : [0]        // thread 0 종료

thread 0 이 시작된 후, CTest 생성자를 호출합니다.
하지만, 생성자에서 SleepEx 호출될 때 thread 2 로 task switch 됩니다.
문제는 thread 2 가 CTest::Inst().GetName() 할 때는 아직 thread 0 에서 생성자 작업이 한창중인 CTest 싱글턴 객체를 리턴해 버리는데 있습니다. 그래서, 출력 5 번에 보면 name is : 에 아무것도 보이지 않습니다.
thread 2 가 종료된 후, thread 0 은 계속 CTest 생성자 작업을 하고, 출력 10 번에서 정상적으로 생성자를 호출한 CTest 로 name is : Test 를 제대로 보여주고 있습니다. 만약 코드 25 번에서처럼 m_Name 을 포인터로 만들면, thread 2 가 초기화가 아직 안 된 m_Name 포인터에 접근하기 때문에 거의 언제나 crash 가 납니다.

이렇게 생성자 함수 실행 속도나 순서에 문제가 있는 싱글턴은, 어플리케이션이 처음 로딩될 때 한 번 호출도록 고치는 게 좋습니다. Meyer 도 effective c++ 에서 그렇게 할 것을 권장하고 있습니다.
그러니까, 코드 43, 44 에서 _beginthreadex 하기 전에, CTest::Inst() 를 호출해, single-thread 상태에서 한 번 싱글턴을 호출해 미리 객체를 준비해 두는 것입니다.

CTest::Inst(); 만 할 경우 release 에서 최적화 하면서 코드를 제거할 수도 있으니, 최적화 안 될만한 작업을 해 주는 것도 좋습니다. -> 이 부분은 최적화되지 않는다고 하네요. 좀 더 실험할 기회가 있다면 다시 포스팅 해 보도록 하겠습니다.

소녀시대 Oh! 사는 이야기

이번 곡이 성공할지 어떨지 느낌이 바로 오진 않는다.
하지만 어느새 따라 부르고 있겠지.
나의 음악 취향을 과연 나의 것이라고 부를 수 있을런지.
좋은 음악 고르기 귀찮아서, 들리는 대로 듣는 건 아닌지.
..



..

T-ara - Bo Peep Bo Peep 사는 이야기

티아라가 뭐예요. 먹는거예요? 라고 물어보는 사람이 있어서 포스팅...
검색을 뽀삐뽀삐로 찾았더니 '티아라, '뽀삐' 화장지 한 트럭 선물 받아' 뭐 이런 것만 나와서 힘들었지요.
참고로 고양이 장갑은 여기에서 구매!
(저는 호랑이 장갑이 있지요. 후후)



얘들이 이런 포텐이 있었다니...
잘 안 될 줄 알았는데 ㅋㅋ
그나저나 춤 따라하면서 이거 보다가 혼났다능... 흑...

Windows Live Writer + Code Snippet 사는 이야기

egloos 에서 Code Syntax 보여줄 방법을 계속 못 찾고 있다가, minjang 님 덕분에 좋은 것을 알게 되었다.
바로 Windows Live Writer + Code Snippet

   1: void main(){
   2:     cout << "Hello, World";
   3:     return;
   4: }

이글루에서도 이런게 되는군요.
뭐, 코드는 별로 포스팅 안 하지만, 왠지 이런 방법을 알고 나니까 코드를 올리고 싶은 생각이 드는군요.
망치의 오류랄까. :)

[http]Windows Live Writer 편집 화면을 보다 깔끔하고 보기 쉽게 만들기
[http]Code Snippet plugin for Windows Live Writer


2009 일본 동경 여행 (5,6)/6 사는 이야기

5일 : 아사쿠사 -> 아키하바라 -> 긴자
6일 : 지유가오카

아침은 어제 사온 오니기리와 빵입니다.
오니기리를 볼 때마다 '카모메 식당(かもめ食堂)' 이 생각납니다.
카모메 식당 덕분에 일본에서는 핀란드 여행 붐이 일었다고 하는군요. 영화는 좀 심심하던데.
귀여운 북극곰 빵은 반으로 갈라서 먹었습니다. (안에는 초콜릿)


2년전 아사쿠사에서 4일간이나 묵었으면서도 제대로 보지 못한 센소지입니다.
입구에서부터 인력거꾼들이 호객행위를 하더군요.
책에는 영어도 잘 하고, 1 시간 코스로 관광을 시켜준다라고 되어 있습니다만 안 타봐서 모르겠네요.
점심으로 꼭 먹고 싶었던 일본 본토 타코야끼와 야끼소바를 시켜먹었습니다...만,
역시 관광지에서는 뭘 기대하면 안 된다'더군요.
제대로 익지도 않은 밀가루 덩어리 같은 걸 주는데, 완전 실망. 그나마 야끼소바는 그럭저럭이었지만.
주위에 초등학교가 있었는데, 학군이 안 좋은 곳인지 운동장 바로 옆에 노숙자 할아버지가 몇 분 계시더군요.
대부분의 초등학교에 수영장이 있다는 얘기를 들었던 거 같은데, 그런 것도 안 보입니다.

왠지 가야 할 거 같아서 아키하바라를 갔습니다.
2007 년 여행책자에는 아키하바라가 따로 분류가 되어 있었는데
2009 년 책에는 한 페이지 귀퉁이에만 소개가 되어 있습니다.
요도바시 카메라 같은 가게들이 여기저기 생기면서 아키하바라가 많이 활력이 죽어있는 듯 합니다. (2 년전 살인 사건도 있겠고요)
커널형 이어폰(MDR-EX300SL) 을 3980 엔에 샀는데, 한국 최저가가 58600 이군요. 거의 뭐 같은 가격에 샀군요. T_T
아키하바라에서 すしざんまい(스시잔마이) 라는 스시집을 갔습니다. 그냥 집히는대로 들어간 집이었는데, 괜찮았네요.
광고에 나오는 사장님도 젊었을때는 미남에 몸매도 좋던데... 다 성공하면 저런 몸매가 되는 겁니다.
24 시간, 연중 무휴라고 하는군요.



드디어 긴자입니다...만,
벌써 저녁 8시. 게다가 12월 31일. 야경은 아름답지만, 가게란 가게는 전부 문을 닫았습니다(이것도 계획대로... 후후).
하지만, 의외의 복병 ZARA 가 문을 열었더군요. 게다가 할인.
예상외의 쇼핑을 해 버렸습니다.

길거리에서는 술과 떡을 나눠줍니다. 심지어 1월 1일 아침 호텔에서도, 면세점에서도 술을 나눠주더군요.
술은 사케라 그다지 맛이 있는지는 모르겠습니다만, 이렇게 나눠주는 분위기는 일본에서 거의 보질 못해서 신기하더군요.

호텔에서 간단하게 아침을 먹은 후 지유가오카 自由が丘駅 (じゆうがおかえき)로 갔습니다...만,
역시 1월 1일 오전이다보니, 장사하는 가게가 한 곳도 없더군요.
게다가 지하철 코인라커가 너무 작아서 가방이 들어가질 않아...서 끌고 다니다 보니 제대로 구경하질 못했네요.
남들이 찍어놓은 지유가오카 사진을 보면, 우리는 이상한데를 간 거 같다는...
그나마 영업중인 라면집이 있어서 들어갔는데, 여기가 맛이 좋더군요.
가장 자신있는 라면을 알려달랬더니 가장 비싼 라면을 알려주긴 했지만(당연한 것일지도 모르지만)...
Organic Ramen 집 답게 담백하면서도 시원한 라면맛이, 이번 여행중에 먹은 라면중에서 가장 좋더군요.

이렇게 아내랑 같이 한 두 번째 해외여행이 끝났군요. :)
다른 사람 손에 이끌려서 다녔을 때보다 직접 여행계획을 잡고 지도를 보면서 찾아다녔더니 좀 더 기억이 많이 남습니다.
일본어를 모르면 아무 곳도 못 갈 거 같았는데, 의외로 다닐만 하더군요.
지하철에서는 Suica 카드만 있으면 현지인 같이 다닐 수 있습니다. 이 카드만 있으면 어디든 다닐 수 있더군요.
심지어 편의점에서도 결제가 가능한 곳이 있더군요.

2009 일본 동경 여행 4/6 사는 이야기

하라주쿠 -> 오모테산도 -> 시부야 -> 요코하마(미나토미라이역) -> 주카가이 -> 차이나타운) -> 귀환

하라주쿠에서 내려서 오모테산도, 시부야를 걸어서 이동했습니다.
아침이라 그런지 문을 연 곳이 거의 없더군요. (나름 다 계산한 것이지만 ㅎㅎ)
시부야 가기 전에 아침으로 먹은 KUA' AINA 버거입니다.(일본 버거인 줄 알았더니 하와이쪽에서 온 거 같네요.)
큼지막한 아보카도가 덮여져 있습니다. 가격도 꽤 쎕니다.(1400 엔)
참고로 모스버거는 참 보기 어렵더군요. 다 망한 것인지...

시부야에서는 오락실, 만다라케, 쇼핑몰(신주쿠 109 백화점)을 갔습니다.
오락실은 한국에 없는 기종이 많더군요.
요즘 일본에서도 아케이드 시장이 줄어서 개발자들도 많이 짤린다고 하더군요.
워낙 가정용 게임이 성능이 좋다보니, 오락실용 게임기는 좀더 다른 경험을 제공할 수 있는 게임기가 많아보였습니다.
200엔 내고 파칭코도 한 번 해 봤는데, 도대체지 어떻게 하는건지 몰라서 일본 직원에게 물어보았습니다.
하나도 못 알아듣다가 '나가리' 라는 말을 알아들었지요. ㅋㅋ
구슬을 막 튀겨서 원하는 곳에 넣어야 하는데, 너무 쎄게 쏘면 '나가리' 되니까 조심해라 뭐 이런 말인 거 같더군요.
어떻게든 설명해 주려고 고생한 점원씨 고마워요.

만다라케야 2년 전과 달라진 게 거의 없었구요.
쇼핑몰은 아내 때문에 어쩔 수 없이 갔는데, 신주쿠 109 백화점 여기에는 남자 옷이라고는 하나도 찾아볼 수 없더군요.
점원들도 대부분 갸루(ギャル) 스타일이고. 흑... 나도 시부야 스타일로 입고 싶었는데.

점심으로는 오코노미야키(お好み焼き)를 먹었습니다.
결혼 못 하는 남자에서 나오는 거 보고 꼭 한 번 이렇게 만들어 먹어보고 싶었거든요.
어떻게 쉬림프! 라는 말을 알아들어서 해물 오코노미야키를 시켰습니다만,
둘 다 일본어를 못 하다 보니 하는 방법을 몰라서 대강 느낌대로 만들어 먹었습니다.
맛이 꽤 괜찮은 거 보면 그럭저럭 제대로 한 거 같네요.

저녁에는 요코하마를 갔습니다.
야경이 이쁘다고 하던데, 도착한 시간이 5시 10분 전이라서 그런지 감탄할 정도는 아니더군요.
대관람차도 바람이 많이 불어서 타 보지 못했습니다.
요코하마 간다고 해서 저희처럼 요코하마에서 내리면 망합니다. 꼭 미나토미라이 같은데서 내려야 합니다. :)
차이나타운은 어마어마합니다. 샌프란시스코의 차이나타운보다도 훨씬 규모도 크고, 사람도 많고 식당도 많습니다.
음식을 좀 다양하게 고를 것을 너무 대강 골라서 아쉬움이 남는군요.



1 2 3 4 5 6 7 8 9 10 다음