webrtc.org native를 사용하여 MacOS 프로그램
9839 단어 WebRTC
개요
결국 MacOS, Android, iOS에서
unity와 webrtc를 함께 사용하여 다양한 작업을 수행하는 것이 목표
우선 이번에는 MacOS에서 사용할 수 있는 준비를 하는 것이 목표
여기에 쓰여진 내용은 우선 제가 잘 됐다는 이야기입니다.
여기에 샘플을 둘 예정
htps : // 기주 b. 이 m / k와 d / 우니 ty ぇ brtc P ㅅ
라이브러리 컴파일
htps : // ぇ brtc. 오 rg / 나치 ゔ ぇ 코코 / / ゔ ぇ p 면 t /
여기에 따라 ninja에서 build를 실시한다.
사용한 버전은 다음과 같습니다.
$ cat .gclient_entries
entries = {
'src': 'https://webrtc.googlesource.com/src.git',
'src/base': 'https://chromium.googlesource.com/chromium/src/base@1325ca683ab2b427aa27112cfff53614328a1781',
'src/build': 'https://chromium.googlesource.com/chromium/src/build@d9b1b8481806794959fae0ced886a212d9746057',
'src/buildtools': 'https://chromium.googlesource.com/chromium/buildtools.git@1be57dc4c2c68fa564ee258a3af0cf8003007edf',
'src/testing': 'https://chromium.googlesource.com/chromium/src/testing@8e923163dd2388b953418843ff9be4b7177023ce',
'src/third_party': 'https://chromium.googlesource.com/chromium/src/third_party@bacc4e1bcc117fffae9e8007434c1116a950e63b',
'src/third_party/boringssl/src': 'https://boringssl.googlesource.com/boringssl.git@02e6256b16b54319b1c01d4133ca3317e82b2dbb',
'src/third_party/catapult': 'https://chromium.googlesource.com/catapult.git@3b3f9e1e789dbed2726dcd3c97d9dcd080ca7f23',
'src/third_party/colorama/src': 'https://chromium.googlesource.com/external/colorama.git@799604a1041e9b3bc5d2789ecbd7e8db2e18e6b8',
'src/third_party/depot_tools': 'https://chromium.googlesource.com/chromium/tools/depot_tools.git@ebe839b6bfc3e9276b8d1e42a0d6e830bb04899e',
'src/third_party/ffmpeg': 'https://chromium.googlesource.com/chromium/third_party/ffmpeg.git@423f74fab02ff573b52abd542eb5dfdadaa05cf4',
'src/third_party/googletest/src': 'https://chromium.googlesource.com/external/github.com/google/googletest.git@247a3d8e5e5d403f7fcacdb8ccc71e5059f15daa',
'src/third_party/gtest-parallel': 'https://chromium.googlesource.com/external/github.com/google/gtest-parallel@180c2f52341c065fd4d8418a238375ab6c91b336',
'src/third_party/icu': 'https://chromium.googlesource.com/chromium/deps/icu.git@94d819fa3e7e71f3dd8210d428c213ddb6e2b336',
'src/third_party/jsoncpp/source': 'https://chromium.googlesource.com/external/github.com/open-source-parsers/jsoncpp.git@f572e8e42e22cfcf5ab0aea26574f408943edfa4',
'src/third_party/libFuzzer/src': 'https://chromium.googlesource.com/chromium/llvm-project/compiler-rt/lib/fuzzer.git@ba2c1cd6f87accb32b5dbce297387c56a2e53a2f',
'src/third_party/libjpeg_turbo': 'https://chromium.googlesource.com/chromium/deps/libjpeg_turbo.git@a1750dbc79a8792dde3d3f7d7d8ac28ba01ac9dd',
'src/third_party/libsrtp': 'https://chromium.googlesource.com/chromium/deps/libsrtp.git@1d45b8e599dc2db6ea3ae22dbc94a8c504652423',
'src/third_party/libvpx/source/libvpx': 'https://chromium.googlesource.com/webm/libvpx.git@a2127236ae4742f329e5571d76b84de08cd3b8ea',
'src/third_party/libyuv': 'https://chromium.googlesource.com/libyuv/libyuv.git@c67db6053495a2744511a43ba7b6ba3fa49b26a5',
'src/third_party/openh264/src': 'https://chromium.googlesource.com/external/github.com/cisco/openh264@a180c9d4d6f1a4830ca9eed9d159d54996bd63cb',
'src/third_party/openmax_dl': 'https://webrtc.googlesource.com/deps/third_party/openmax.git@b611996df3b8f6b151339d22c12c21f167009cb6',
'src/third_party/usrsctp/usrsctplib': 'https://chromium.googlesource.com/external/github.com/sctplab/usrsctp@0e076261b832121cf120ddc04aaff87ac3a34d30',
'src/third_party/yasm/source/patched-yasm': 'https://chromium.googlesource.com/chromium/deps/yasm/patched-yasm.git@b98114e18d8b9b84586b10d24353ab8616d4c5fc',
'src/tools': 'https://chromium.googlesource.com/chromium/src/tools@56fadf9c9eb4669df2478c511e672326a4b3fba0',
'src/tools/gyp': 'https://chromium.googlesource.com/external/gyp.git@d61a9397e668fa9843c4aa7da9e79460fe590bfb',
'src/tools/swarming_client': 'https://chromium.googlesource.com/infra/luci/client-py.git@4bd9152f8a975d57c972c071dfb4ddf668e02200',
'src/buildtools/clang_format/script': 'https://chromium.googlesource.com/chromium/llvm-project/cfe/tools/clang-format.git@0653eee0c81ea04715c635dd0885e8096ff6ba6d',
'src/buildtools/third_party/libc++/trunk': 'https://chromium.googlesource.com/chromium/llvm-project/libcxx.git@f56f1bba1ade4a408d403ff050d50e837bae47df',
'src/buildtools/third_party/libc++abi/trunk': 'https://chromium.googlesource.com/chromium/llvm-project/libcxxabi.git@05ba3281482304ae8de31123a594972a495da06d',
'src/buildtools/third_party/libunwind/trunk': 'https://chromium.googlesource.com/external/llvm.org/libunwind.git@fc0a910c25d5415dd72ba9451b7cba380e3cc1e7',
}
build한 결과 필요한 것은, 이하의 라이브러리
out/Release/obj/third_party/boringssl/libboringssl.a
out/Release/obj/rtc_base/librtc_base.a
out/Release/obj/rtc_base/librtc_base_generic.a
out/Release/obj/libwebrtc.a
그리고 boringssl의 asm 코드에서 생성 된 것.
이것은 lib*.a의 형태가 되지 않았기 때문에, ar 명령으로 archive로 했다.
$ cd out/Release/obj/third_party/boringssl
$ ar r libhogehoge.a boringssl_asm/*.o
뭐, 별로 libhogehoge.a일 필요는 없지만・・・
이것으로 필요한 라이브러리는 갖추어졌다.
실제로 적당한 프로그램을 짜 봅시다.
unity와 연동시켜 동작할 예정이므로, 라이브러리를 bundle로, 짜서 mono를 통해 실행하기로 하겠습니다.
번들 만들기 시작
xcode를 열고 Create a new Xcode project를 선택합니다.
여기서 선택하는 것은 MacOS에서 Bundle입니다.
우선 UnityWebrtcPlugin이라고 했습니다.
프로젝트 설정의 Build Settings에서 Per-configuration Build Products Path를 Products로 다시 씁니다.
mono 경유로 뭐든지 좋으니까 call 해 본다.
New File에서 cpp 파일 만들기
이름을 적절하게 Entry로 실행하면
Entry.cpp와 Entry.hpp가 가능하다.
그리고이 Entry.cpp를 이름 바꾸고 Entry.mm로 설정하십시오.
이제 Objective-c++로 프로그래밍이 가능하다.
적당히
#include "Entry.hpp"
#include <iostream>
using namespace std;
extern "C" {
void test()
{
cout << "test is called." << endl;
}
}
라는 코드를 만들어
빌드 실행
그러면 Project 디렉토리 아래에
Products/UnityWebrtcPlugin.bundle이 가능하다.
그런 다음 Project 디렉토리 아래에
mono라는 디렉토리 만들기
거기 test.cs를 만든다.
test.csusing System;
using System.Runtime.InteropServices;
public class Test {
static public void Main() {
Console.WriteLine("test is called.");
}
}
$ mcs test.cs
실행하면 test.exe가 완성됩니다.
$ mono test.exe
test is called.
이렇게 하면 실행할 수 있다.
다음으로 bundle의 함수를 call 해 본다.
using System;
using System.Runtime.InteropServices;
public class Test {
[DllImport("../Products/UnityWebrtcPlugin.bundle/Contents/MacOS/UnityWebrtcPlugin")]
static extern void test();
static public void Main() {
test();
}
}
이것을 같은 방법으로 mcs로 컴파일하고 mono에서 실행하면 ...
$ mono test.exe
test is called.
test()가 call되어 문자열이 표시된다.
Unity에서 call하는 경우
[DllImport("UnityWebrtcPlugin")]
그냥 지정 OK입니다.
샘플
htps : // 기주 b. 코 m / 타 k와 d / 우니 ty ぇ brtcP ぅ 긴 / 쓰레기 t / 24c66858623 엣 c98df5dc 7640285203432
webrtc를 조금 동작시켜 보자.
5개의 라이브러리를 Project 디렉토리에 복사합니다.
에서 Add Files to "UnityWebrtcPlugin"...에서 가져오면
Build Phases, Link Binary With Libraries에 포함된다.
그리고 framework도 몇 가지 필요하므로, 넣어 간다.
필요한 것은
CoreVideo
CoreMedia
AVFoundation
CoreGraphics
AudioToolbox
CoreAudio
Foundation
CFNetwork
Security
OpenGL
Metal
11개의 프레임워크
Header Search Path를 다시 작성하여 webrtc/src/의 디렉토리로 향한다.
우선 나는 ~/Documents/gn/webrtc/src를 향했습니다.
Preprocessor Macros를 설정합니다.
NOGUI=1
OPENSSL_IS_BORINGSSL=1
WEBRTC_POSIX=1
WEBRTC_MAC=1
이것만 필요
우선 코드도 갱신해, webrtc로 필요한 thread와 ssl 주위의 초기화만 해 보았습니다.
실행 결과는 다음과 같습니다.
$ mono test/exe
make is called
clean is called
処理おわり
실제로 프로그램을 조립해 나가는 것은
htps : // m / k와 d / ms / 76f0fc450745 e5 87f57
여기에서 해 보았습니다.
Reference
이 문제에 관하여(webrtc.org native를 사용하여 MacOS 프로그램), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/taktod/items/a8c87068265fff951c0f
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
htps : // ぇ brtc. 오 rg / 나치 ゔ ぇ 코코 / / ゔ ぇ p 면 t /
여기에 따라 ninja에서 build를 실시한다.
사용한 버전은 다음과 같습니다.
$ cat .gclient_entries
entries = {
'src': 'https://webrtc.googlesource.com/src.git',
'src/base': 'https://chromium.googlesource.com/chromium/src/base@1325ca683ab2b427aa27112cfff53614328a1781',
'src/build': 'https://chromium.googlesource.com/chromium/src/build@d9b1b8481806794959fae0ced886a212d9746057',
'src/buildtools': 'https://chromium.googlesource.com/chromium/buildtools.git@1be57dc4c2c68fa564ee258a3af0cf8003007edf',
'src/testing': 'https://chromium.googlesource.com/chromium/src/testing@8e923163dd2388b953418843ff9be4b7177023ce',
'src/third_party': 'https://chromium.googlesource.com/chromium/src/third_party@bacc4e1bcc117fffae9e8007434c1116a950e63b',
'src/third_party/boringssl/src': 'https://boringssl.googlesource.com/boringssl.git@02e6256b16b54319b1c01d4133ca3317e82b2dbb',
'src/third_party/catapult': 'https://chromium.googlesource.com/catapult.git@3b3f9e1e789dbed2726dcd3c97d9dcd080ca7f23',
'src/third_party/colorama/src': 'https://chromium.googlesource.com/external/colorama.git@799604a1041e9b3bc5d2789ecbd7e8db2e18e6b8',
'src/third_party/depot_tools': 'https://chromium.googlesource.com/chromium/tools/depot_tools.git@ebe839b6bfc3e9276b8d1e42a0d6e830bb04899e',
'src/third_party/ffmpeg': 'https://chromium.googlesource.com/chromium/third_party/ffmpeg.git@423f74fab02ff573b52abd542eb5dfdadaa05cf4',
'src/third_party/googletest/src': 'https://chromium.googlesource.com/external/github.com/google/googletest.git@247a3d8e5e5d403f7fcacdb8ccc71e5059f15daa',
'src/third_party/gtest-parallel': 'https://chromium.googlesource.com/external/github.com/google/gtest-parallel@180c2f52341c065fd4d8418a238375ab6c91b336',
'src/third_party/icu': 'https://chromium.googlesource.com/chromium/deps/icu.git@94d819fa3e7e71f3dd8210d428c213ddb6e2b336',
'src/third_party/jsoncpp/source': 'https://chromium.googlesource.com/external/github.com/open-source-parsers/jsoncpp.git@f572e8e42e22cfcf5ab0aea26574f408943edfa4',
'src/third_party/libFuzzer/src': 'https://chromium.googlesource.com/chromium/llvm-project/compiler-rt/lib/fuzzer.git@ba2c1cd6f87accb32b5dbce297387c56a2e53a2f',
'src/third_party/libjpeg_turbo': 'https://chromium.googlesource.com/chromium/deps/libjpeg_turbo.git@a1750dbc79a8792dde3d3f7d7d8ac28ba01ac9dd',
'src/third_party/libsrtp': 'https://chromium.googlesource.com/chromium/deps/libsrtp.git@1d45b8e599dc2db6ea3ae22dbc94a8c504652423',
'src/third_party/libvpx/source/libvpx': 'https://chromium.googlesource.com/webm/libvpx.git@a2127236ae4742f329e5571d76b84de08cd3b8ea',
'src/third_party/libyuv': 'https://chromium.googlesource.com/libyuv/libyuv.git@c67db6053495a2744511a43ba7b6ba3fa49b26a5',
'src/third_party/openh264/src': 'https://chromium.googlesource.com/external/github.com/cisco/openh264@a180c9d4d6f1a4830ca9eed9d159d54996bd63cb',
'src/third_party/openmax_dl': 'https://webrtc.googlesource.com/deps/third_party/openmax.git@b611996df3b8f6b151339d22c12c21f167009cb6',
'src/third_party/usrsctp/usrsctplib': 'https://chromium.googlesource.com/external/github.com/sctplab/usrsctp@0e076261b832121cf120ddc04aaff87ac3a34d30',
'src/third_party/yasm/source/patched-yasm': 'https://chromium.googlesource.com/chromium/deps/yasm/patched-yasm.git@b98114e18d8b9b84586b10d24353ab8616d4c5fc',
'src/tools': 'https://chromium.googlesource.com/chromium/src/tools@56fadf9c9eb4669df2478c511e672326a4b3fba0',
'src/tools/gyp': 'https://chromium.googlesource.com/external/gyp.git@d61a9397e668fa9843c4aa7da9e79460fe590bfb',
'src/tools/swarming_client': 'https://chromium.googlesource.com/infra/luci/client-py.git@4bd9152f8a975d57c972c071dfb4ddf668e02200',
'src/buildtools/clang_format/script': 'https://chromium.googlesource.com/chromium/llvm-project/cfe/tools/clang-format.git@0653eee0c81ea04715c635dd0885e8096ff6ba6d',
'src/buildtools/third_party/libc++/trunk': 'https://chromium.googlesource.com/chromium/llvm-project/libcxx.git@f56f1bba1ade4a408d403ff050d50e837bae47df',
'src/buildtools/third_party/libc++abi/trunk': 'https://chromium.googlesource.com/chromium/llvm-project/libcxxabi.git@05ba3281482304ae8de31123a594972a495da06d',
'src/buildtools/third_party/libunwind/trunk': 'https://chromium.googlesource.com/external/llvm.org/libunwind.git@fc0a910c25d5415dd72ba9451b7cba380e3cc1e7',
}
build한 결과 필요한 것은, 이하의 라이브러리
out/Release/obj/third_party/boringssl/libboringssl.a
out/Release/obj/rtc_base/librtc_base.a
out/Release/obj/rtc_base/librtc_base_generic.a
out/Release/obj/libwebrtc.a
그리고 boringssl의 asm 코드에서 생성 된 것.
이것은 lib*.a의 형태가 되지 않았기 때문에, ar 명령으로 archive로 했다.
$ cd out/Release/obj/third_party/boringssl
$ ar r libhogehoge.a boringssl_asm/*.o
뭐, 별로 libhogehoge.a일 필요는 없지만・・・
이것으로 필요한 라이브러리는 갖추어졌다.
실제로 적당한 프로그램을 짜 봅시다.
unity와 연동시켜 동작할 예정이므로, 라이브러리를 bundle로, 짜서 mono를 통해 실행하기로 하겠습니다.
번들 만들기 시작
xcode를 열고 Create a new Xcode project를 선택합니다.
여기서 선택하는 것은 MacOS에서 Bundle입니다.
우선 UnityWebrtcPlugin이라고 했습니다.
프로젝트 설정의 Build Settings에서 Per-configuration Build Products Path를 Products로 다시 씁니다.
mono 경유로 뭐든지 좋으니까 call 해 본다.
New File에서 cpp 파일 만들기
이름을 적절하게 Entry로 실행하면
Entry.cpp와 Entry.hpp가 가능하다.
그리고이 Entry.cpp를 이름 바꾸고 Entry.mm로 설정하십시오.
이제 Objective-c++로 프로그래밍이 가능하다.
적당히
#include "Entry.hpp"
#include <iostream>
using namespace std;
extern "C" {
void test()
{
cout << "test is called." << endl;
}
}
라는 코드를 만들어
빌드 실행
그러면 Project 디렉토리 아래에
Products/UnityWebrtcPlugin.bundle이 가능하다.
그런 다음 Project 디렉토리 아래에
mono라는 디렉토리 만들기
거기 test.cs를 만든다.
test.csusing System;
using System.Runtime.InteropServices;
public class Test {
static public void Main() {
Console.WriteLine("test is called.");
}
}
$ mcs test.cs
실행하면 test.exe가 완성됩니다.
$ mono test.exe
test is called.
이렇게 하면 실행할 수 있다.
다음으로 bundle의 함수를 call 해 본다.
using System;
using System.Runtime.InteropServices;
public class Test {
[DllImport("../Products/UnityWebrtcPlugin.bundle/Contents/MacOS/UnityWebrtcPlugin")]
static extern void test();
static public void Main() {
test();
}
}
이것을 같은 방법으로 mcs로 컴파일하고 mono에서 실행하면 ...
$ mono test.exe
test is called.
test()가 call되어 문자열이 표시된다.
Unity에서 call하는 경우
[DllImport("UnityWebrtcPlugin")]
그냥 지정 OK입니다.
샘플
htps : // 기주 b. 코 m / 타 k와 d / 우니 ty ぇ brtcP ぅ 긴 / 쓰레기 t / 24c66858623 엣 c98df5dc 7640285203432
webrtc를 조금 동작시켜 보자.
5개의 라이브러리를 Project 디렉토리에 복사합니다.
에서 Add Files to "UnityWebrtcPlugin"...에서 가져오면
Build Phases, Link Binary With Libraries에 포함된다.
그리고 framework도 몇 가지 필요하므로, 넣어 간다.
필요한 것은
CoreVideo
CoreMedia
AVFoundation
CoreGraphics
AudioToolbox
CoreAudio
Foundation
CFNetwork
Security
OpenGL
Metal
11개의 프레임워크
Header Search Path를 다시 작성하여 webrtc/src/의 디렉토리로 향한다.
우선 나는 ~/Documents/gn/webrtc/src를 향했습니다.
Preprocessor Macros를 설정합니다.
NOGUI=1
OPENSSL_IS_BORINGSSL=1
WEBRTC_POSIX=1
WEBRTC_MAC=1
이것만 필요
우선 코드도 갱신해, webrtc로 필요한 thread와 ssl 주위의 초기화만 해 보았습니다.
실행 결과는 다음과 같습니다.
$ mono test/exe
make is called
clean is called
処理おわり
실제로 프로그램을 조립해 나가는 것은
htps : // m / k와 d / ms / 76f0fc450745 e5 87f57
여기에서 해 보았습니다.
Reference
이 문제에 관하여(webrtc.org native를 사용하여 MacOS 프로그램), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/taktod/items/a8c87068265fff951c0f
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
xcode를 열고 Create a new Xcode project를 선택합니다.
여기서 선택하는 것은 MacOS에서 Bundle입니다.
우선 UnityWebrtcPlugin이라고 했습니다.
프로젝트 설정의 Build Settings에서 Per-configuration Build Products Path를 Products로 다시 씁니다.
mono 경유로 뭐든지 좋으니까 call 해 본다.
New File에서 cpp 파일 만들기
이름을 적절하게 Entry로 실행하면
Entry.cpp와 Entry.hpp가 가능하다.
그리고이 Entry.cpp를 이름 바꾸고 Entry.mm로 설정하십시오.
이제 Objective-c++로 프로그래밍이 가능하다.
적당히
#include "Entry.hpp"
#include <iostream>
using namespace std;
extern "C" {
void test()
{
cout << "test is called." << endl;
}
}
라는 코드를 만들어
빌드 실행
그러면 Project 디렉토리 아래에
Products/UnityWebrtcPlugin.bundle이 가능하다.
그런 다음 Project 디렉토리 아래에
mono라는 디렉토리 만들기
거기 test.cs를 만든다.
test.cs
using System;
using System.Runtime.InteropServices;
public class Test {
static public void Main() {
Console.WriteLine("test is called.");
}
}
$ mcs test.cs
실행하면 test.exe가 완성됩니다.
$ mono test.exe
test is called.
이렇게 하면 실행할 수 있다.
다음으로 bundle의 함수를 call 해 본다.
using System;
using System.Runtime.InteropServices;
public class Test {
[DllImport("../Products/UnityWebrtcPlugin.bundle/Contents/MacOS/UnityWebrtcPlugin")]
static extern void test();
static public void Main() {
test();
}
}
이것을 같은 방법으로 mcs로 컴파일하고 mono에서 실행하면 ...
$ mono test.exe
test is called.
test()가 call되어 문자열이 표시된다.
Unity에서 call하는 경우
[DllImport("UnityWebrtcPlugin")]
그냥 지정 OK입니다.
샘플
htps : // 기주 b. 코 m / 타 k와 d / 우니 ty ぇ brtcP ぅ 긴 / 쓰레기 t / 24c66858623 엣 c98df5dc 7640285203432
webrtc를 조금 동작시켜 보자.
5개의 라이브러리를 Project 디렉토리에 복사합니다.
에서 Add Files to "UnityWebrtcPlugin"...에서 가져오면
Build Phases, Link Binary With Libraries에 포함된다.
그리고 framework도 몇 가지 필요하므로, 넣어 간다.
필요한 것은
CoreVideo
CoreMedia
AVFoundation
CoreGraphics
AudioToolbox
CoreAudio
Foundation
CFNetwork
Security
OpenGL
Metal
11개의 프레임워크
Header Search Path를 다시 작성하여 webrtc/src/의 디렉토리로 향한다.
우선 나는 ~/Documents/gn/webrtc/src를 향했습니다.
Preprocessor Macros를 설정합니다.
NOGUI=1
OPENSSL_IS_BORINGSSL=1
WEBRTC_POSIX=1
WEBRTC_MAC=1
이것만 필요
우선 코드도 갱신해, webrtc로 필요한 thread와 ssl 주위의 초기화만 해 보았습니다.
실행 결과는 다음과 같습니다.
$ mono test/exe
make is called
clean is called
処理おわり
실제로 프로그램을 조립해 나가는 것은
htps : // m / k와 d / ms / 76f0fc450745 e5 87f57
여기에서 해 보았습니다.
Reference
이 문제에 관하여(webrtc.org native를 사용하여 MacOS 프로그램), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/taktod/items/a8c87068265fff951c0f텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)