Android의 새로운 Google 로그인
새로운 Google Play 서비스 8.3을 사용하여 사용자 토큰 ID를 얻으려고하는데 문서화 된대로 서버 ID를 전달합니다.
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken(getString(R.string.server_client_id))
.requestEmail()
.build();
하지만 여전히 아래와 같이 성공적이지 않은 결과를 얻고 있습니다.
{statusCode=unknown status code: 12501, resolution=null}
여기에 문서화 GoogleSignInStatusCodes
사용자가 로그인을 취소했습니다. 즉, 사용자가 계정 선택 또는 OAuth 동의와 같은 일부 로그인 해결을 취소했습니다.
상수 값 : 12501
이미 계정을 선택했기 때문에 그것은 내 경우가 아닙니다. 그 이유가 무엇인지 아십니까?
나는 똑같은 문제가 있었고 해결책을 찾았습니다.
여기에있는 문서를 따르는 경우 : https://developers.google.com/identity/sign-in/android/start-integrating
첫 번째 단계에서는 구성 파일 (OAuth 2.0 클라이언트 ID를 생성하여 google-services.json에 삽입)을 생성하도록 지시합니다.
그런 다음 나중에 OAuth 2.0 클라이언트 ID를 만드는 것에 대해 다시 말하지만 이번에는 웹 애플리케이션을 위해해야한다고 말합니다.
그리고 이것은 혼란스러운 부분입니다! (적어도 나를 위해) 나는 안드로이드 OAuth를 위해 생성 된 클라이언트 ID를 취하고 웹 애플리케이션을 위해 새로운 것을 생성하지 않았기 때문에 (문서가 중복되거나 무언가라고 생각했습니다)
그것이 말했듯이, 이것은 이것 뿐이며 requestIdToken 또는 requestServerAuthCode 메소드의 매개 변수로 사용해야하는 유일한 것 입니다.
이 메서드에서 Android OAuth ID를 사용하는 것은 잊어 버리세요. 그러면 항상 추악한 상태 코드 응답 12501을 받게됩니다.
주요 문제는 문서가 이것에 대해 약간 혼란 스럽다는 것입니다. 또는 두 개의 OAuth ID를 만들어야한다는 사실이 조금 이상하기 때문일 수 있습니다.
요약하자면 Android 용과 웹 애플리케이션 용으로 각각 하나씩 두 개의 OAuth ID가 필요하며 각 ID를 올바른 위치에 설정해야합니다.
나는 이것으로 어려움을 겪고 있었고 거의 일주일을 낭비했습니다.
이것이 내가 일한 방법입니다.
- AndroidStudio에서 프로젝트 가져 오기
- 프로젝트에 대한 디버그 키 저장소를 만듭니다.
- 디버그 키 저장소를 사용하여 프로젝트에 대한 SHA1 서명을 만듭니다.
- SHA1 서명을 사용하여 Google 개발자 콘솔에서 Google 로그인에 앱을 등록합니다.
- 거기에 Google 구성 파일을 생성하십시오. (Android Studio의 앱 폴더에 넣으십시오)
- Android 프로젝트에서 OAuth 2.0 자격 증명의 웹 클라이언트 ID를 사용합니다.
- 이제 Android Studio에서 프로젝트의 디버그 빌드 (APK)를 생성합니다.
- 시스템에 기기를 마운트-> 서명 된이 APK 디버그 버전을 복사하여 설치합니다.
마지막 세 단계 6, 7 및 8 은 실제로 처리해야하는 것입니다. 프로젝트를 직접 실행하면 APK가 실제로 디버그 키 저장소로 서명되지 않고 Google에서 전혀 인식하지 못합니다.
동일한 문제가 발생했습니다. 연구 솔루션 후 server_client_id에 잘못된 값이 포함되어 있거나 google_services.json에 키 저장소에 등록 된 client_id와 함께 oauth_client가 포함되지 않았다는 것이 재개되었습니다.
requestIdToken(getString(R.string.server_client_id))
R.string.server_client_id
웹 애플리케이션에 OAuth 2.0 클라이언트 ID를 사용합니다 . google_services.json에서 Android 용 OAuth 클라이언트 ID 사용
일반적으로 2 개의 키 저장소를 사용합니다. 1 개는 디버그 키 저장소를 사용하고 1 개는 게시 용으로 서명 된 키 저장소를 사용합니다. 따라서 디버그 및 게시 모드에서 필요한 경우 Android 용 OAuth 클라이언트 ID를 두 번 등록합니다. 1 개는 디버그 키 저장소의 SHA1을 사용하고 1 개는 게시를 위해 서명 된 키 저장소에서 사용합니다.
내 google_services.json의 작은 예
"oauth_client": [
{
"client_id": "xxx-client-id.com",
"client_type": 1,
"android_info": {
"package_name": "com.app.android",
"certificate_hash": "xxxhash"
}
},
{
"client_id": "yyy.client-id.com",
"client_type": 1,
"android_info": {
"package_name": "com.app.android",
"certificate_hash": "yyyhash"
}
}
],
동일한 문제가 발생했습니다. Android 애플리케이션 유형의 클라이언트 ID를 생성했기 때문입니다.
대신 삭제하고 웹 애플리케이션 유형의 클라이언트 ID를 생성하여이 문제를 제거했습니다.
이 문제를 해결하는 방법을 알아보세요 ... 내 앱의 디버그 버전을 실행하는 동안이 오류가 발생했습니다 ... 문제를 해결하려면 개발자 콘솔과 google-services에서 디버그 앱에 대한 자격 증명을 추가하세요. .json.
이것은 나를 위해 그것을 고쳤습니다!
나는 같은 문제가 있었고 다음 해결책으로 해결했습니다.
- 여기에 설명 된대로 구성 파일 (google-services.json)을 만들고 / app 프로젝트 디렉토리에 배치합니다.
- (다른 답변에서 언급했듯이) 웹 응용 프로그램 클라이언트 ID를 사용하여
requestIdToken
방법. - [내 주요 문제] 아래와 같이 디버그 모드에서 작업한다면 앱에 서명하세요.
signingConfigs { release { storeFile file("myreleasekey.keystore") storePassword "password" keyAlias "MyReleaseKey" keyPassword "password" } } buildTypes { release { ... } debug { ... signingConfig signingConfigs.release } }
이제 알았습니다.
따라서 먼저 다음과 같은 상위 답변을 따라야합니다.
- Google Developers Console에서 웹 애플리케이션 용 OAuth 클라이언트 ID를 만들고 사용합니다
requestIdToken()
(상태 코드 12501 제거). - 프로덕션 해시 키용 Android OAuth 클라이언트 ID를 만든 경우 디버그 해시 키용 새 Android OAuth 클라이언트 ID를 만들고이를 google-services.json에 통합합니다. (상태 코드 12500 제거)
더 이상 유효 그리고 여기 마지막 부분은 온다 : 3. 호출 할 수 없습니다 requestIdToken()
와 requestEmail()
한 번에. 적어도 제 경우에는 Result: Status{statusCode=INTERNAL_ERROR, resolution=null}
을 삭제하여 제거 했습니다 requestEmail()
.
행운을 빕니다 ...
제 경우에는 디버그 SHA-1이 유효한 OAuth Android 클라이언트로 추가되었는지도 확인해야했습니다.
웹 애플리케이션 을 Android 애플리케이션이 아닌 server_client_id로 사용
나는 같은 문제가 있었고 server_client_id
잘못된 값이 포함 되었을 때 12501 코드가 반환되었음을 알았습니다 .
자세한 메시지가없고이 오류 코드의 문서가 다소 열악하기 때문에 귀하의 문제가 저와 동일한 원인인지 알 수 없습니다.
내 애플리케이션은 이 예제의 Android 코드 (클래스 IdTokenActivity)를 기반으로 합니다. 작동하려면 Google 로그인 을 내 앱 에 통합 해야했습니다 .
- Google 로그인이 활성화 된 생성 된 json 구성 파일
- 내 gradle 파일에 Google 플러그인 및 종속성 추가
- 이 앱에 대한 OAuth 클라이언트 ID를 생성하고 내 프로젝트에 다음과 같이 저장했습니다.
server_client_id
APK가 디버그 모드입니까? 서명 된 APK에서만 작동한다고 생각합니다.
- 모호한 Google 문서를 따르십시오.
- google-services.json을 프로젝트 디렉토리에 넣습니다.
Gradle을 https://stackoverflow.com/a/35216421/5886475 로 설정하십시오.
string.xml에 server_client_id를 설정하십시오. Android 클라이언트가 아닌 웹 클라이언트 ID입니다.
내가 가진 문제는 잘못된 별칭으로 생성 한 SHA-1입니다. 별칭 은 androiddebugkey 여야 합니다. 그래서 내 google-service.json 파일에 Android OAuth ID를 넣었습니다 . 웹 클라이언트 ID를 requestIdToken ()에 넣었습니다 . 그리고 내 특정한 경우에는 androiddebugkey 별칭을 사용하여 SHA-1을 생성했습니다 .
google-services.json :
"oauth_client": [
{
"client_id": "ANDROID OAUTH ID-.....apps.googleusercontent.com",
"client_type": 1,
"android_info": {
"package_name": "br.com.packagename",
"certificate_hash": "SHA-1 HASH"
}
},{
"client_id": "WEB CLIEND ID......apps.googleusercontent.com",
"client_type": 3
}
]
서명 부분 :
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken("WEB CLIEND ID......apps.googleusercontent.com")
.requestEmail()
.build();
대신에 R.string.server_client_id
, 단지 사용 R.string.default_web_client_id
.
google-services.json 파일을 앱에 복사 하면이 문자열 값이 자동으로 생성됩니다. google-services.json에서 string.xml로 키를 복사 할 필요가 없습니다.
이 문제는 Android Studio에서 Firebase 지원을 클릭하여 해결했는데, 이는 Firebase가 아닌 사용자에게는 해당되지 않을 수 있습니다.
- 메뉴 도구-> Firebase로 이동합니다.
- 앱을 Firebase에 연결을 클릭하면 연결이 성공하면 녹색으로 연결됨으로 표시됩니다.
- 앱에 Firebase 인증 추가 버튼을 클릭하면 녹색으로 바뀝니다.
참고 : 여기에 방대한 답변 목록이 있으면 확실히 한 가지를 확인할 수 있습니다. Google은 문서를 업데이트하고 바보 증거를 유지해야합니다.
위의 옵션 중 어느 것도 작동하지 않으면 app build.gradle의 applicationId가 패키지 이름과 동일한 지 확인하십시오.
먼저 릴리스 sha1 키가 올바른지 확인하십시오. 그러나 여전히 작동하지 않고 Google Play 서비스 8.4.0 (즉, 'com.google.android.gms : play-services : 8.4.0'컴파일)을 사용하는 경우 GoogleSignInOption 개체를 수정하여 문제를 해결할 수 있습니다. 대신에:
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestEmail()
.requestIdToken("YOUR_WEB_API_ID.apps.googleusercontent.com")
.build();
다음을 사용해야합니다.
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestScopes(new Scope(Scopes.PLUS_LOGIN))
.requestScopes(new Scope(Scopes.PLUS_ME))
.requestEmail()
.build();
그러면 statusCode = INTERNAL_ERROR OR statusCode = Error 12501 OR statusCode = Error 12500을 반환하는 오류가 해결됩니다. 그러면이 gso 객체를 사용하여 아래와 같이 GoogleApiClient를 만들 수 있습니다.
mGoogleApiClient = new GoogleApiClient.Builder(this)
.enableAutoManage(this, this)
.addApi(Auth.GOOGLE_SIGN_IN_API,gso)
// .addApi(Plus.API, null)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
// .addScope(Plus.SCOPE_PLUS_LOGIN)
.build();
이유는 모르지만 Android 스튜디오의 SHA1이 자동으로 변경되므로이 오류가 발생합니다. 이 문제를 해결하기 위해 내 Android 스튜디오의 새 SHA1로 내 firebase 프로젝트 설정의 SHA1을 업데이트하고 다시 작동하기 시작했습니다.
필자의 경우 Google API 콘솔Client ID for Android
에 대한 내 자격 증명에는 출시 서명 된 APK 의 SHA-1 만 포함되어 있습니다. Android Studio는 기본 디버그 키 저장소 를 사용하여 디버그 빌드에 서명했으며이 경우 디버그 키 저장소 SHA-1이 Android 클라이언트 SHA-1 온라인과 일치 하지 않았습니다 . 내 솔루션은 릴리스 키 저장소로 디버그 빌드에 간단히 서명하는 것입니다.
Android 스튜디오에서 Build/Edit Build Types...
디버그 빌드 유형을 선택하고 Signing Config가 릴리스 인증서로 설정되어 있는지 확인합니다.
나는 동일한 문제와 오류 12501이 있었고 위의 것 중 아무것도 작동하지 않습니다.
내 문제는 나를 위해 생성 된 Google 기본 웹 API 를 사용하는 것입니다. 내 웹 API를 만든 후 오류가 사라지고 정상적으로 작동했습니다!
다음은 작업 단계입니다.
- 먼저 SHA1 디버그 키를 만들고 Firebase 콘솔에 추가했습니다 . 여기 에서 SHA1을 생성 합니다 .
- 여기 에서 웹 API와 Android OAuth 2.0 클라이언트 ID를 모두 만듭니다.
- Firebase 콘솔
google-service.json
에서 생성 되어 앱 폴더에 저장됩니다. - 이 코드를 넣어
GoogleSignnOption
이렇게 :
gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN).requestIdToken
("put the web app client Id that get from the link in developer console ")
.requestEmail().build();
팁 1 : Android 및 웹 앱 클라이언트 ID를 모두 만들어야 작동한다는 것을 알았습니다.
: 2 팁 당신이 구글에서 사용자를 얻을 수있는 나 같은이란 당신이 경우하지만 당신은 할 수 없습니다 AuthWithGoogle
및 결과의 의지 fail
에서 auth.signInWithCredential(credential)
당신은 진정한 반환에 대한 몇 가지 프록시를 사용했다.
이것은 github에서 FireBaseAuthDemo의 전체 소스입니다.
희망이 가득 차
당신이 사용하는 경우 디버그 키 스토어를 프로젝트를 빌드, 당신의 SHA-1 지문 추가 할 필요 하게 debug.keystore을 에 중포 기지 콘솔 .
- 당신에 중포 기지 콘솔 , 당신의 프로젝트를 엽니 다
- 매개 변수로 이동합니다. 일반 탭
- 이 페이지의 끝에 지문 SHA-1 을 추가하는 필드가 있습니다.
- 콘솔 필드에 SHA-1을 붙여 넣습니다.
debug.keystore의 SHA-1을 얻으려면 다음을 수행하십시오.
Mac / Linux :
keytool -exportcert -list -v -alias androiddebugkey -keystore ~/.android/debug.keystore
Windows :
keytool -exportcert -list -v -alias androiddebugkey -keystore %USERPROFILE%\.android\debug.keystore
https://developers.google.com/android/guides/client-auth
그게 다야 !
앱 자동 서명에 대한 Google의 안내를 따른 후에도이 문제가 발생했습니다 . 이 방법을 사용하여 앱에 서명하는 경우 생성 된 키 저장소 지문을 API 자격 증명에 포함해야합니다.
프로젝트 브라우저에서 앱을 마우스 오른쪽 버튼으로 클릭하고 모듈 설정 열기를 선택합니다.
.jks
내 프로젝트의 /app
디렉토리에 파일 을 넣는 것이 덜 혼란 스럽습니다 . 어쨌든이 줄을 실행하십시오.
keytool -list -v -keystore /home/user/keystores/android.jks
암호를 입력하라는 메시지가 표시됩니다. 그것이인지 Key Password
또는 Store Password
내 것이 동일하기 때문에 확실하지 않습니다 . : |
콘솔은 인증서 지문을 뱉어냅니다. SHA1 하나를 가져 와서 Google API 개발자 콘솔 에서 API 자격 증명에 입력합니다 . OAuth 2.0 client IDs
실제로 앱에서 해당 client_id를 사용하지 않더라도 Android 클라이언트에 대해 입력 해야합니다. Android 용 다른 API를 사용하는 경우 아래의 적절한 키 자격 증명 API keys
에도 동일한 SHA1을 입력합니다 .
여기 새로운 것이 있습니다. 6 시간 동안 회사 Google Apps 도메인의 ID로 에뮬레이터에 로그인하려고했지만 아무 소용이 없었고 12501 오류가 발생했습니다. 직감으로 개인 Gmail ID를 사용해 보았는데 효과가있었습니다. 회사 ID로 전화를 시도해도 마찬가지입니다. 에뮬레이터에 회사 ID가 로그인 할 수있는 적절한 모바일 장치 관리 설정이없는 것으로 나타났습니다.
따라서이 회사 ID로 에뮬레이터에서 테스트하려면 Google Play Store를 설치 한 다음 MDM 소프트웨어를 설치하고 구성해야합니다.
이 오류에 대한 이상한 경험에서,이 오류를 제거하려면 휴대 전화를 재부팅해야한다고 말할 수 있습니다. :) Google Admin을 통해 할당 된 기기 정책이있는 G Suite 계정을 사용하여 Google 로그인을 구현했습니다. . 따라서 처음 로그인 할 때 Device Policy 앱을 설치해야했습니다. 이후의 모든 단계가 완료된 후 12501 오류가 발생했습니다. 같은 시간에 같은 앱이 다른 휴대폰에서 제대로 작동했습니다. 그래서 재부팅 만 도움이되었습니다. 하지만 도움이
이 질문에 이미 많은 찬성 답변이 있지만 논리를 이해하는 데 어려움을 겪었습니다. 그래서 나는 내 연구를 생각해 냈습니다.
- 올바른 패키지 이름 및 서명 인증서 지문 SHA-1 https://developers.google.com/mobile/add?platform=android&cntapi=signin을 사용하여 앱 만들기
- Google 로그인 활성화
- 구성 파일을 생성하십시오.
SHA-1을 얻으려면 터미널에서 다음을 실행하십시오.
keytool -exportcert -keystore path-to-debug-or-production-keystore -list -v
약 OAuth 2.0 client IDs
- 웹용 OAuth (앱 내에서로 사용됨
server_client_id
) - Android 용 OAuth (올바른 패키지 이름 및 서명 인증서 지문 SHA-1을 사용하여 생성해야 함 ).
디버그 및 릴리스를 위해 다른 키 저장소를 사용하는 경우
OAuth 2.0 client IDs
각 패키지 이름 및 SHA-1을 사용하여 별도로 만들어야합니다 .
OAuth 2.0 client IDs
여기 https://console.developers.google.com/apis/credentials?project=를 만들거나 편집 할 수 있습니다.
- 앱으로 이동합니다.
- Android 용 OAuth가 이미있는 경우 이름을 클릭하고 패키지 이름 및 SHA-1을 확인합니다 .
키 저장소 세부 정보를 전역 (프로젝트 내부가 아닌 로컬)에 저장하고 아래와 같이 gradle.properties
가져 와서 디버그 및 릴리스에 동일한 키 저장소를 사용할 수 있습니다 build.gradle
.
def key_alias = ""
def key_password = ""
def store_file = ""
def store_password = ""
try {
key_alias = YOUR_KEY_ALIAS
key_password = YOUR_KEY_PASSWORD
store_file = YOUR_KEYSTORE_PATH
store_password = YOUR_KEYSTORE_PASSWORD
} catch (Exception exception) {
throw new IllegalStateException('Failed to find key store details. Social Login is disabled');
}
android {
signingConfigs {
config {
keyAlias key_alias
keyPassword key_password
storeFile file(store_file)
storePassword store_password
}
}
buildTypes {
debug {
signingConfig signingConfigs.config
// ...
}
release {
signingConfig signingConfigs.config
// ...
}
}
}
아래 스 니펫을 사용할 수 있습니다.
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE_GOOGLE_SIGN_IN) {
GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
if (result.isSuccess()) {
// ...
} else if (result.getStatus().getStatusCode() == CommonStatusCodes.NETWORK_ERROR) {
// No internet connection
} else if (result.getStatus().getStatusCode() == CommonStatusCodes.DEVELOPER_ERROR) {
// Wrong server OAuth key(server_client_id)
} else if (result.getStatus().getStatusCode() == 12501) {
// Wrong app signing-certificate fingerprint SHA1
} else {
Log.e("Google sign in error", result.getStatus().toString());
}
}
}
참고 : 구성 파일을 생성 할 때 Google 로그인 만 사용하도록 설정 한 경우
google-servies.json
프로젝트에 파일 을 추가 할 필요가 없습니다 (파일 생성시 필요한 구성 단계가 수행됨).
다음 단계를 따르십시오.
Clone the following project https://github.com/googlesamples/google-services
Follow the guide at https://developers.google.com/identity/sign-in/android/start
Use Web client (auto created by Google Service) and add it in requestIdToken(...)
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestEmail() .requestIdToken("YOUR_WEB_API_ID.apps.googleusercontent.com") .build();
Make sure you are using the same keystore used which is added to Google project. For instance, if you have used the following command to generate SHA-1 key
keytool -exportcert -list -v -alias androiddebugkey -keystore ~/.android/debug.keystore
Then add the following code in app/build.gradle file inside android { ... } [Solved my problem]
signingConfigs { debug { storeFile file("/home/ashwin/.android/debug.keystore") storePassword "android" keyAlias "androiddebugkey" keyPassword "android" } } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } debug { signingConfig signingConfigs.debug } }
Note: Your keyPassword and keyAlias should be the same used during generation of SHA-1 certificate.
1.Specify signingConfigs in your gradle file
signingConfigs {
config {
keyAlias 'appalias'
keyPassword 'hunter123'
storePassword 'hunter123'
storeFile file('path/to/keystore.jks')
}
}
2.Go to Build Types in Project Structure (in Android Studio) and specify signingConfigs to "config"
Now clean your project and build again. It should work.
If the above doesn't work then below is your last resort.
Try step one and build and check. If it's not working go to next step and try to build again.
- Build a signed apk (With remember password checked).
- Before signing check the filename of the keystore file and the one yo give in while signing the apk (in android studio).
- Install the signed apk in your device.
- Wait for five minutes.
- Try singing in to google. If still 12501 is coming wait five more minutes. While doing that hit gradle sync.
- Try again. It should work.
Since the app requests Google sign in from web view we need to create web application auth client id v2.0
Go to Google API Credentials
Choose your Android project from Top Left corner
Click on Create Credentials --> OAuth Client Id --> Choose Web Application
Click Ok
Now , if you have synced Android Studio with Firebase (logged in) just rebuild the project Otherwise Download updated google-services.json file and replace the existing one.
It should work fine.
I have same problem too, Was resolved as follows:
I was made to delete the SHA1 previously thought and create and set new SHA1.
generate new
google-services.json
and set into my app directoryI was use exactly google developer codes
my
result.isSucces()
returned true after running the project
as summary, delete old sha1 and create new sha1 and download new google-services.json
I was facing the same 12501 status
error. This is due to SHA-1 mismatch of release APK and debug APK.
- 서명 된 APK를 만듭니다. APK에 서명하려면 SHA-1 생성에 사용한 키 저장소의 기존 경로를 선택합니다. 예 :
/.android/debug.keystore
- 별칭 이름 제공 : androiddebugkey
- storepass 및 keypass : android.
참고 URL : https://stackoverflow.com/questions/33583326/new-google-sign-in-android
'development' 카테고리의 다른 글
Linux bash / shell에서 이미지를 base64로 인코딩하는 방법 (0) | 2020.10.11 |
---|---|
Ubuntu : OpenJDK 8-패키지를 찾을 수 없음 (0) | 2020.10.11 |
dataTable에 값이 있는지 확인 하시겠습니까? (0) | 2020.10.11 |
gnuplot : 여러 입력 파일의 데이터를 단일 그래프로 플로팅 (0) | 2020.10.11 |
예외 또는 반환 코드를 선호하는 이유는 무엇입니까? (0) | 2020.10.11 |