Email #161 - #180

Email-161

Date: Sun, 14 Feb 2010 19:55:51 +0200
From: mmalmi@cc.hut.fi
To: Satoshi Nakamoto <satoshin@gmx.com>
Subject: Re: JSON-RPC status

아직 다른 것으로는 JSON-RPC 서버를 테스트해보지 않았습니다. 만약 여러분이 해본다면, 어떻게 되었는지 알려주세요. 파이썬을 사용하고 있죠?

GTK가 설치되지 않은 상태에서 Linux 버전을 실행시키는 것은 별개의 작업이 될 것입니다.

네, 파이썬을 사용하고 있습니다. 아직 VPS에 비트코인을 설치하지 않아서 JSON-RPC를 테스트하지 않았습니다. GTK 라이브러리가 설치되어 있어도 윈도우 매니저 없이는 작동하지 않습니다. wxWidgets 포럼(http://wxforum.shadonet.com/viewtopic.php?t=26954)에 물어봤지만 그들도 많은 단서를 주지 못했습니다. 아마도 우리는 두 개의 다른 바이너리를 만들어야 할지도 모릅니다.

Email-162

Date: Sun, 14 Feb 2010 19:59:12 +0200
From: mmalmi@cc.hut.fi
To: Satoshi Nakamoto <satoshin@gmx.com>
Subject: Re: Exchange options

SMS 결제를 제공하는 ZayPay로 고객이 코인을 구매할 때만 거래를 자동화하는 방향으로 나아가고 있습니다. Pecunix는 내 예비금을 보관할 만큼 신뢰할 수 있고 실용적인 유일한 전자화폐입니다만, 환전 수수료가 상당히 높습니다(약 5%).

코인을 구매할 때, 제가 추천하는 결제 방법은 IBAN 이체입니다. 또한 "다른 결제 옵션으로 구매/판매하고 싶다면 연락 주세요"라고 말하고 각 주문을 별도로 처리할 수도 있습니다. PayPal로도 단일 주문을 수동으로 받아들일 수 있습니다. 단, 내 돈을 거기에 보관하지 않고 고객이 수수료를 지불하는 한입니다.

Email-163

Date: Sun, 14 Feb 2010 21:48:31 +0000
From: Satoshi Nakamoto <satoshin@gmx.com>
Subject: Re: JSON-RPC status
To: mmalmi@cc.hut.fi

아직 다른 것으로는 JSON-RPC 서버를 테스트해보지 않았습니다. 만약 여러분이 해본다면, 어떻게 되었는지 알려주세요. 파이썬을 사용하고 있죠?

GTK가 설치되지 않은 상태에서 Linux 버전을 실행시키는 것은 별개의 작업이 될 것입니다.

네, 파이썬을 사용하고 있습니다. 아직 VPS에 비트코인을 설치하지 않아서 JSON-RPC를 테스트하지 않았습니다. GTK 라이브러리가 설치되어 있어도 윈도우 매니저 없이는 작동하지 않습니다. wxWidgets 포럼(http://wxforum.shadonet.com/viewtopic.php?t=26954)에 물어봤지만 그들도 많은 단서를 주지 못했습니다. 아마도 우리는 두 개의 다른 바이너리를 만들어야 할지도 모릅니다.

아마도 저는 그렇게 할 것입니다. 초기화와 종료를 init.cpp 또는 start.cpp 같은 곳으로 옮길 수 있고, ui.o와 uibase.o를 연결하지 않고 wxbase만 연결할 수 있습니다.

wxWidgets는 대부분 Windows 사용자들이기 때문에, GTK에 대해 많이 알지 못할 것입니다.

Ubuntu 랩톱이 있어서 VPS로 실험하지 않고 테스트하고 컴파일할 수 있지 않으신가요?

Email-164

Date: Mon, 15 Feb 2010 15:00:34 +0200
From: mmalmi@cc.hut.fi
To: Satoshi Nakamoto <satoshin@gmx.com>
Subject: Re: JSON-RPC status

Ubuntu 랩톱이 있어서 VPS로 실험하지 않고 테스트하고 컴파일할 수 있지 않으신가요?

네. 파이썬의 JSON-RPC로 테스트해 보았고, 잘 작동하는 것 같습니다! 정말 사용하기 쉽네요.

Email-165

Date: Mon, 15 Feb 2010 18:11:53 +0000
From: Satoshi Nakamoto <satoshin@gmx.com>
Subject: Re: JSON-RPC status
To: mmalmi@cc.hut.fi

Ubuntu 랩톱이 있어서 VPS로 실험하지 않고 테스트하고 컴파일할 수 있지 않으신가요?

네. 파이썬의 JSON-RPC로 테스트해 보았고, 잘 작동하는 것 같습니다! 정말 사용하기 쉽네요.

만세, 첫 시도에 성공했네요.

테스트를 위해 나중에 사용할 수 있도록 당신이 사용한 파이썬 코드를 보내주실 수 있나요? 그렇게 한다면 제가 직접 알아내려고 애쓸 필요가 없을 것입니다.

Email-166

Date: Mon, 15 Feb 2010 20:33:23 +0200
From: mmalmi@cc.hut.fi
To: Satoshi Nakamoto <satoshin@gmx.com>
Subject: Re: JSON-RPC status

Ubuntu 랩톱이 있어서 VPS로 실험하지 않고 테스트하고 컴파일할 수 있지 않으신가요?

네. 파이썬의 JSON-RPC로 테스트해 보았고, 잘 작동하는 것 같습니다! 정말 사용하기 쉽네요.

만세, 첫 시도에 성공했네요.

테스트를 위해 나중에 사용할 수 있도록 당신이 사용한 파이썬 코드를 보내주실 수 있나요? 그렇게 한다면 제가 직접 알아내려고 애쓸 필요가 없을 것입니다.

python-json-rpc(http://json-rpc.org/wiki/python-json-rpc)를 그들의 svn에서 다운로드 받아서 파이썬 인터프리터와 직접 대화하며 테스트했습니다. 이렇게 말이죠:

pythons = ServiceProxy("http://localhost:8332")
s.getblockcount()

Email-167

Date: Wed, 17 Feb 2010 19:32:04 +0200
From: mmalmi@cc.hut.fi
To: Satoshi Nakamoto <satoshin@gmx.com>
Subject: Non-GUI option

GUI 없이 동일한 바이너리를 실행하는 방법에 대해 찾은 몇 가지 단서는 다음과 같습니다:

  1. GTK는 디스플레이 없이 프로그램을 실행하는 것을 지원합니다: http://library.gnome.org/devel/gtk/2.12/gtk-General.html#gtk-init-check. 이것이 wxWidgets에서도 가능한지는 명시되어 있지 않습니다.

  2. wx 2.9의 wxAppConsole이 어떻게든 유용할 수 있습니다. 단순히 wxApp을 wxAppConsole로 교체하는 것은 작동하지 않으며, 이것이 어떻게 사용되어야 하는지 확실하지 않습니다. 문서화가 잘 되어 있지 않습니다.

  3. 다른 옵션으로는 IMPLEMENT_APP_NO_MAIN()을 사용하고 우리 자신의 메인 메소드를 만드는 것이 있습니다.

Email-168

Date: Mon, 22 Feb 2010 20:17:42 +0000
From: Satoshi Nakamoto <satoshin@gmx.com>
Subject: Re: Non-GUI option
To: mmalmi@cc.hut.fi

GUI 없이 동일한 바이너리를 실행하는 방법에 대해 찾은 몇 가지 단서는 다음과 같습니다:

  1. GTK는 디스플레이 없이 프로그램을 실행하는 것을 지원합니다: http://library.gnome.org/devel/gtk/2.12/gtk-General.html#gtk-init-check. 이것이 wxWidgets에서도 가능한지는 명시되어 있지 않습니다.

wxApp::Initialize에서 gtk-init-check를 호출하는 것을 보았습니다.

Initialize를 서브클래스로 만들고, 오류 메시지를 억제하면서 원본 메소드를 호출한 다음 반환 값을 무시할 수 있습니다. 이 방법이 작동하는 것 같습니다.

명령줄 스위치의 이름을 무엇으로 하고 어떻게 설명할지에 대한 제안이 있습니까? 전통적인 표준이 있나요? 현재 사용 중인 것은 다음과 같습니다:

-daemon (or -d)   (Enables RPC and runs in the background)
-server           (Enables RPC)

Email-169

Date: Tue, 23 Feb 2010 01:41:01 +0000
From: Satoshi Nakamoto <satoshin@gmx.com>
Subject: Re: Non-GUI option
To: Martti Malmi <mmalmi@cc.hut.fi>

GUI 없이 동일한 바이너리를 실행하는 방법에 대해 찾은 몇 가지 단서는 다음과 같습니다:

  1. GTK는 디스플레이 없이 프로그램을 실행하는 것을 지원합니다: http://library.gnome.org/devel/gtk/2.12/gtk-General.html#gtk-init-check. 이것이 wxWidgets에서도 가능한지는 명시되어 있지 않습니다.

wxApp::Initialize에서 gtk-init-check를 호출하는 것을 보았습니다.

Initialize를 서브클래스로 만들고, 오류 메시지를 억제하면서 원본 메소드를 호출한 다음 반환 값을 무시할 수 있습니다. 이 방법이 작동하는 것 같습니다.

이 방법이 작동합니다. 몇 가지 더 하고 나면 업로드할 예정입니다.

사람들에게 GTK 라이브러리를 설치하라고 알려야 할 것입니다. GTK를 설치하기 위한 apt-get 명령어를 기억하십니까? 그리고 GUI 없이 설치할 수 있나요?

Email-170

Date: Tue, 23 Feb 2010 15:19:51 +0200
From: mmalmi@cc.hut.fi
To: Satoshi Nakamoto <satoshin@gmx.com>
Subject: Re: Non-GUI option

GUI 없이 동일한 바이너리를 실행하는 방법에 대해 찾은 몇 가지 단서는 다음과 같습니다:

  1. GTK는 디스플레이 없이 프로그램을 실행하는 것을 지원합니다: http://library.gnome.org/devel/gtk/2.12/gtk-General.html#gtk-init-check. 이것이 wxWidgets에서도 가능한지는 명시되어 있지 않습니다.

wxApp::Initialize에서 gtk-init-check를 호출하는 것을 보았습니다.

Initialize를 서브클래스로 만들고, 오류 메시지를 억제하면서 원본 메소드를 호출한 다음 반환 값을 무시할 수 있습니다. 이 방법이 작동하는 것 같습니다.

명령줄 스위치의 이름을 무엇으로 하고 어떻게 설명할지에 대한 제안이 있습니까? 전통적인 표준이 있나요? 현재 사용 중인 것은 다음과 같습니다:

-daemon (or -d)   (Enables RPC and runs in the background)
-server           (Enables RPC)

그 방법이 좋아 보입니다. 저도 그에 관한 표준은 잘 모르겠습니다.

Email-171

Date: Tue, 23 Feb 2010 16:47:59 +0200
From: mmalmi@cc.hut.fi
To: Satoshi Nakamoto <satoshin@gmx.com>
Subject: Re: Non-GUI option

GUI 없이 동일한 바이너리를 실행하는 방법에 대해 찾은 몇 가지 단서는 다음과 같습니다:

  1. GTK는 디스플레이 없이 프로그램을 실행하는 것을 지원합니다: http://library.gnome.org/devel/gtk/2.12/gtk-General.html#gtk-init-check. 이것이 wxWidgets에서도 가능한지는 명시되어 있지 않습니다.

wxApp::Initialize에서 gtk-init-check를 호출하는 것을 보았습니다.

Initialize를 서브클래스로 만들고, 오류 메시지를 억제하면서 원본 메소드를 호출한 다음 반환 값을 무시할 수 있습니다. 이 방법이 작동하는 것 같습니다.

이 방법이 작동합니다. 몇 가지 더 하고 나면 업로드할 예정입니다.

사람들에게 GTK 라이브러리를 설치하라고 알려야 할 것입니다. GTK를 설치하기 위한 apt-get 명령어를 기억하십니까? 그리고 GUI 없이 설치할 수 있나요?

아마도 apt-get install libgtk2.0-0이었을 겁니다. 이렇게 하여 사용 가능한 패키지를 검색할 수 있습니다: "apt-cache search libgtk".

bitcoin.org 번역가들에게 Drupal 계정을 제공해서, 번역본을 최신 상태로 유지할 수 있도록 할 겁니다.

Email-172

Date: Wed, 24 Feb 2010 06:34:52 +0000
From: Satoshi Nakamoto <satoshin@gmx.com>
Subject: Re: Non-GUI option
To: mmalmi@cc.hut.fi

bitcoin.org 번역가들에게 Drupal 계정을 제공해서, 번역본을 최신 상태로 유지할 수 있도록 할 겁니다.

좋습니다, 이렇게 하면 그들에게 약간의 소유감과 책임감을 줄 수 있을 것입니다.

소프트웨어 번역을 위한 적어도 하나의 .mo 파일을 0.3 릴리스에 포함시킬 수 있기를 바랍니다.

Email-173

Date: Sun, 28 Feb 2010 06:12:44 +0200
From: mmalmi@cc.hut.fi
To: Satoshi Nakamoto <satoshin@gmx.com>
Subject: Bitcoind

제가 만든 bitcoind를 ddd 디버거로 디버깅을 시도해 보았지만, 아직 큰 성공을 거두지 못했습니다. 항상 시스템의 모든 메모리를 사용한 끝에 결국 충돌합니다. 최신 64비트 빌드의 bitcoind를 다시 보내주실 수 있습니까? 제 빌드에 문제가 있는지 확인해보고 싶습니다.

Email-174

Date: Sun, 28 Feb 2010 14:47:01 +0000
From: Satoshi Nakamoto <satoshin@gmx.com>
Subject: Re: Bitcoind
To: mmalmi@cc.hut.fi

bitcoin.org/download/linux64-0.2.7.1.tar.gz에 올려두었습니다. 받으신 후에는 삭제하셔도 됩니다.

당신이 겪고 있는 문제의 원인에 대해 생각해 보았고, 이 빌드에 포함된 변경사항을 만들었습니다. 이 코드는 안전하지 않았을 수 있지만, 아마도 항상 운이 좋았을 겁니다.

util.cpp에서 이전 코드는 다음과 같습니다:

const char* wxGetTranslation(const char* pszEnglish)
{
     // Wrapper of wxGetTranslation returning the same const char* type 
as was passed in
     static CCriticalSection cs;
     CRITICAL_BLOCK(cs)
     {
         // Look in cache
         static map<string, char*> mapCache;
         map<string, char*>::iterator mi = mapCache.find(pszEnglish);
         if (mi != mapCache.end())
             return (*mi).second;

         // wxWidgets translation
         const char* pszTranslated = 
wxGetTranslation(wxString(pszEnglish, wxConvUTF8)).utf8_str();

         // We don't cache unknown strings because caller might be 
passing in a
         // dynamic string and we would keep allocating memory for each 
variation.
         if (strcmp(pszEnglish, pszTranslated) == 0)
             return pszEnglish;

         // Add to cache, memory doesn't need to be freed.  We only 
cache because
         // we must pass back a pointer to permanently allocated memory.
         char* pszCached = new char[strlen(pszTranslated)+1];
         strcpy(pszCached, pszTranslated);
         mapCache[pszEnglish] = pszCached;
         return pszCached;
     }
     return NULL;
}

new:
const char* wxGetTranslation(const char* pszEnglish)
{
     // Wrapper of wxGetTranslation returning the same const char* type 
as was passed in
     static CCriticalSection cs;
     CRITICAL_BLOCK(cs)
     {
         // Look in cache
         static map<string, char*> mapCache;
         map<string, char*>::iterator mi = mapCache.find(pszEnglish);
         if (mi != mapCache.end())
             return (*mi).second;

         // wxWidgets translation
         wxString strTranslated = wxGetTranslation(wxString(pszEnglish, 
wxConvUTF8));

         // We don't cache unknown strings because caller might be 
passing in a
         // dynamic string and we would keep allocating memory for each 
variation.
         if (strcmp(pszEnglish, strTranslated.utf8_str()) == 0)
             return pszEnglish;

         // Add to cache, memory doesn't need to be freed.  We only 
cache because
         // we must pass back a pointer to permanently allocated memory.
         char* pszCached = new char[strlen(strTranslated.utf8_str())+1];
         strcpy(pszCached, strTranslated.utf8_str());
         mapCache[pszEnglish] = pszCached;
         return pszCached;
     }
     return NULL;
}

If you still suspect this code, for testing you could change it to:
const char* wxGetTranslation(const char* pszEnglish)
{
     return pszEnglish;
}

제가 만든 bitcoind를 ddd 디버거로 디버깅을 시도해 보았지만, 아직 큰 성공을 거두지 못했습니다. 항상 시스템의 모든 메모리를 사용한 끝에 결국 충돌합니다. 최신 64비트 빌드의 bitcoind를 다시 보내주실 수 있습니까? 제 빌드에 문제가 있는지 확인해보고 싶습니다.

Email-175

Date: Sun, 28 Feb 2010 20:09:07 +0000
From: Satoshi Nakamoto <satoshin@gmx.com>
Subject: Re: Bitcoind
To: mmalmi@cc.hut.fi

debug.log 파일을 보내주실 수 있나요?

제가 만든 bitcoind를 ddd 디버거로 디버깅을 시도해 보았지만, 아직 큰 성공을 거두지 못했습니다. 항상 시스템의 모든 메모리를 사용한 끝에 결국 충돌합니다. 최신 64비트 빌드의 bitcoind를 다시 보내주실 수 있습니까? 제 빌드에 문제가 있는지 확인해보고 싶습니다.

Email-176

Date: Tue, 02 Mar 2010 21:33:24 +0200
From: mmalmi@cc.hut.fi
To: Satoshi Nakamoto <satoshin@gmx.com>
Subject: Re: Bitcoind

알겠습니다. 충돌 오류 메시지를 언급하는 것을 잊었습니다:

terminate called after throwing an instance of 'std::bad_alloc'
what():  std::bad_alloc

debug.log 파일을 보내주실 수 있나요?

제가 만든 bitcoind를 ddd 디버거로 디버깅을 시도해 보았지만, 아직 큰 성공을 거두지 못했습니다. 항상 시스템의 모든 메모리를 사용한 끝에 결국 충돌합니다. 최신 64비트 빌드의 bitcoind를 다시 보내주실 수 있습니까? 제 빌드에 문제가 있는지 확인해보고 싶습니다.

Email-177

Date: Tue, 02 Mar 2010 21:36:10 +0200
From: mmalmi@cc.hut.fi
To: Satoshi Nakamoto <satoshin@gmx.com>
Subject: Re: Bitcoind

이것은 당신이 보내주신 컴파일에서 발생한 것으로, 같은 문제가 발생했습니다.

알겠습니다. 충돌 오류 메시지를 언급하는 것을 잊었습니다:

terminate called after throwing an instance of 'std::bad_alloc'
what():  std::bad_alloc

debug.log 파일을 보내주실 수 있나요?

제가 만든 bitcoind를 ddd 디버거로 디버깅을 시도해 보았지만, 아직 큰 성공을 거두지 못했습니다. 항상 시스템의 모든 메모리를 사용한 끝에 결국 충돌합니다. 최신 64비트 빌드의 bitcoind를 다시 보내주실 수 있습니까? 제 빌드에 문제가 있는지 확인해보고 싶습니다.

Email-178

Date: Tue, 02 Mar 2010 22:27:22 +0000
From: Satoshi Nakamoto <satoshin@gmx.com>
Subject: Re: Bitcoind
To: mmalmi@cc.hut.fi

getinfo를 실행하지 않았을 때도 여전히 그런가요?

아래에 나열된 CreateThreads를 주석 처리한 다음, 하나씩 다시 활성화하면서 문제가 다시 발생할 때까지 해보세요. 그러면 어느 스레드에 문제가 있는지 알 수 있을 것입니다.

net.cpp, under // Start threads
     CreateThread(ThreadIRCSeed, NULL)
     CreateThread(ThreadSocketHandler, NULL, true)
     CreateThread(ThreadOpenConnections, NULL)
     CreateThread(ThreadMessageHandler, NULL)

init.cpp:
     CreateThread(ThreadRPCServer, NULL);

이것은 당신이 보내주신 컴파일에서 발생한 것으로, 같은 문제가 발생했습니다.

알겠습니다. 충돌 오류 메시지를 언급하는 것을 잊었습니다:

terminate called after throwing an instance of 'std::bad_alloc'
what():  std::bad_alloc

debug.log 파일을 보내주실 수 있나요?

제가 만든 bitcoind를 ddd 디버거로 디버깅을 시도해 보았지만, 아직 큰 성공을 거두지 못했습니다. 항상 시스템의 모든 메모리를 사용한 끝에 결국 충돌합니다. 최신 64비트 빌드의 bitcoind를 다시 보내주실 수 있습니까? 제 빌드에 문제가 있는지 확인해보고 싶습니다.

Email-179

Date: Wed, 03 Mar 2010 03:50:39 +0200
From: mmalmi@cc.hut.fi
To: Satoshi Nakamoto <satoshin@gmx.com>
Subject: Re: Bitcoind

getinfo와 관계없이 오류가 발생합니다. ThreadIRCSeed를 주석 처리하니 문제가 해결되었습니다.

getinfo를 실행하지 않았을 때도 여전히 그런가요?

아래에 나열된 CreateThreads를 주석 처리한 다음, 하나씩 다시 활성화하면서 문제가 다시 발생할 때까지 해보세요. 그러면 어느 스레드에 문제가 있는지 알 수 있을 것입니다.

net.cpp, under // Start threads
     CreateThread(ThreadIRCSeed, NULL)
     CreateThread(ThreadSocketHandler, NULL, true)
     CreateThread(ThreadOpenConnections, NULL)
     CreateThread(ThreadMessageHandler, NULL)

init.cpp:
     CreateThread(ThreadRPCServer, NULL);

이것은 당신이 보내주신 컴파일에서 발생한 것으로, 같은 문제가 발생했습니다.

알겠습니다. 충돌 오류 메시지를 언급하는 것을 잊었습니다:

terminate called after throwing an instance of 'std::bad_alloc'
what():  std::bad_alloc

debug.log 파일을 보내주실 수 있나요?

제가 만든 bitcoind를 ddd 디버거로 디버깅을 시도해 보았지만, 아직 큰 성공을 거두지 못했습니다. 항상 시스템의 모든 메모리를 사용한 끝에 결국 충돌합니다. 최신 64비트 빌드의 bitcoind를 다시 보내주실 수 있습니까? 제 빌드에 문제가 있는지 확인해보고 싶습니다.

Email-180

Date: Wed, 03 Mar 2010 03:54:52 +0000
From: Satoshi Nakamoto <satoshin@gmx.com>
Subject: Re: Bitcoind
To: mmalmi@cc.hut.fi

그렇다면 문제의 범위를 많이 좁혔네요. debug.log에 IRC 활동이 기록되지 않았으므로, RecvUntil을 지나지 못했을 것으로 추측됩니다. 육안으로 봐서는 명확한 문제를 발견할 수 없습니다. 문제는 ConnectSocket 또는 RecvUntil 중 하나에 있을 것으로 보입니다.

첨부된 irc.cpp와 net.cpp로 시도해 보시고 debug.log를 보내주세요.

또는 gdb에서 실행하여 ThreadIRCSeed를 단계별로 진행해 볼 수도 있습니다.

gdb --args bitcoin [switches]
b ThreadIRCSeed
run
step
or u to step over and up out of routines.

getinfo와 관계없이 오류가 발생합니다. ThreadIRCSeed를 주석 처리하니 문제가 해결되었습니다.

getinfo를 실행하지 않았을 때도 여전히 그런가요?

아래에 나열된 CreateThreads를 주석 처리한 다음, 하나씩 다시 활성화하면서 문제가 다시 발생할 때까지 해보세요. 그러면 어느 스레드에 문제가 있는지 알 수 있을 것입니다.

net.cpp, under // Start threads
     CreateThread(ThreadIRCSeed, NULL)
     CreateThread(ThreadSocketHandler, NULL, true)
     CreateThread(ThreadOpenConnections, NULL)
     CreateThread(ThreadMessageHandler, NULL)

init.cpp:
     CreateThread(ThreadRPCServer, NULL);

이것은 당신이 보내주신 컴파일에서 발생한 것으로, 같은 문제가 발생했습니다.

알겠습니다. 충돌 오류 메시지를 언급하는 것을 잊었습니다:

terminate called after throwing an instance of 'std::bad_alloc'
what():  std::bad_alloc

debug.log 파일을 보내주실 수 있나요?

제가 만든 bitcoind를 ddd 디버거로 디버깅을 시도해 보았지만, 아직 큰 성공을 거두지 못했습니다. 항상 시스템의 모든 메모리를 사용한 끝에 결국 충돌합니다. 최신 64비트 빌드의 bitcoind를 다시 보내주실 수 있습니까? 제 빌드에 문제가 있는지 확인해보고 싶습니다.

Last updated