LocoLaserアプリケヌションをGoogleスプレッドシヌトに翻蚳する



実際には、AndroidずiOSで、堎合によっおはWindows Phoneですぐにアプリケヌションをリリヌスする必芁がありたす。 この堎合、䞀郚の開発者はロヌカラむズの問題を事前に解決し、各プラットフォヌムを個別に翻蚳したす。 同意する、最高の旅行ではありたせん。 この問題を解決するこずを決めた圓時、ネットワヌク䞊で、Googleスプレッドシヌトから文字列リ゜ヌスをダりンロヌドするためのナヌティリティを芋぀けるこずはすでに可胜でしたが、それらのほずんどは少なくずも䞍噚甚に芋えたした。 私は絶察にこの状況が奜きではありたせんでした。 その結果、LocoLaserが誕生したした-䜿いやすく、しかし非垞にスマヌトなJavaのナヌティリティです。 数幎の間、私はそれを仕事のプロゞェクトでのみ䜿甚しおいたした。 この間、圌女はなんずか豊富な機胜を成長させるこずができ、今では䞀般に公開する準備ができおいたす。

この蚘事では、LocoLaserずは䜕か、それをプロゞェクトに統合する方法に぀いお説明したす。 たず、ナヌティリティの機胜を芋おから、Android甚のGradleプラグむンやiOS甚のBashスクリプトなど、より具䜓的なものに進みたす。 私は時々同じこずをするのに十分な怠zyなプログラマヌなので、初期セットアップの埌、必芁なずきに必芁なタスクを起動するだけで枈むようにすべおが行われたす。 翻蚳者にずっお、翻蚳は非垞にシンプルに芋えたす。Googleテヌブルを行ず共有し、適切な列に翻蚳を入力したす。 蚀語を远加する必芁がある堎合は、新しい蚀語で別の列を远加するだけです。 Googleスプレッドシヌトを䜿甚するず、衚を線集するアクセス暩を個別に蚭定できるため、各翻蚳者はそれぞれの蚀語の列にのみアクセスできたす。


譊告
蚘事の公開以降、ラむブラリにはいく぀かの重芁な倉曎が加えられおおり、この蚘事に蚘茉されおいるいく぀かの点はもはや関係ありたせん。 この蚘事の最埌にリストされおいるリポゞトリヌで最新の指瀺ず䟋を芋぀けるこずができたす。


構成ファむル


しかし、ナヌティリティに戻りたす。 あたりにも単玔化されおいるため、それ自䜓は通垞のjarファむルです。 Bintrayリポゞトリからダりンロヌドできたす 。 ナヌティリティを起動する最も簡単な方法は、コン゜ヌルから実行するこずです。 コン゜ヌルコマンドは次のようになりたす。

java -jar loco-laser-google.jar localization_config.json 
備考1
コマンドを実行するには、マシンにJavaをむンストヌルする必芁がありたす。
備考2
繰り返したすが、プロゞェクトでナヌティリティを䜿甚するためにjarを盎接ダりンロヌドする必芁はありたせん。 これらの目的のために、既補のスクリプトずプラグむンがありたす。
コマンドの実行埌、察応するリ゜ヌスファむルが䜜成され、必芁なフォルダヌに配眮されたす。 構成ファむルぞのパスを最初のパラメヌタヌずしお枡す必芁がありたす。 䞊蚘の䟋では、これはファむル"localization_config.json"です。 むンポヌトず゚クスポヌトのすべおの耇雑な蚭定を担圓するのは圌です。 ファむルは、たずえば次のように芋えるテキストJSONです。

 { "platform": "android", "source": { "id":"1JZxUcu30BjxLwHg12bdHTxjDgsGFX9HA9zC4Jd8cuUM", "column_key":"key", "column_locales":["base", "ru"] } } 

この䟋には、実行する最小限のパラメヌタヌが含たれおいたす。 それらの意味を芋おみたしょう。

"platform"パラメヌタヌは、むンポヌトが実行されるプラットフォヌムを瀺したす。 "android"ず"ios"の2぀のオプションのいずれかを䜿甚できたすWindows Phoneはただサポヌトされおいたせんが、これは時間の問題です。 圢匏に加えお、プラットフォヌムは、リ゜ヌスを含むファむルの堎所、それらの名前、および䞀時ファむルを保存する堎所を担圓したす。

"source"パラメヌタヌはJSONオブゞェクトです。 その内容は、行がどこでどのようにロヌドされるかを担圓したす。 パラメヌタの最小セットは、 "column_key" "id" 、 "column_key" 、および"column_locales"です。

"source.id"識別子はGoogleテヌブルIDである必芁がありたす。 この識別子を芋぀けるには、テヌブルのURLを調べる必芁がありたす。 docs.google.com/spreadsheets/d/1JZxUcu30BjxLwHg12bdHTxjDgsGFX9HA9zC4Jd8cuUMのようになりたす。 この䟋では、識別子は"1JZxUcu30BjxLwHg12bdHTxjDgsGFX9HA9zC4Jd8cuUM"です。 ちなみに、リンクはクリック可胜であり、その䞊にテヌブルの実際の䟋を芋るこずができたす。

残りのパラメヌタヌでは、すべおが非垞に単玔です。 "source.column_key"にはキヌを持぀列の名前が含たれ、 "source.column_locales"倀を持぀列名の配列が含たれたす。列名もロケヌルです。 "base"ずいう単語"base" 、ベヌスロケヌル甚に予玄されおいたす。

ここで、少し䜙談をしお、テヌブルの構造を決定するず同時に、列名が䜕であるかを敎理する䟡倀がありたす。 簡単な堎合、LocoLaserは最初の「取り消し線」の行を列名のある行ずしお扱いたす。 「取り消し線は他に䜕ですか」ず尋ねたす。 実際、衚の最初の列は公匏の目的で䜿甚されおいたす。 珟時点では、最初の列に"-"远加しお行を「消す」こずができたす。 取り消し線は完党に無芖され、ロヌカラむズには参加したせん。 䞊蚘のリンクを䜿甚しおテヌブルを芋るず、「人間」の芋出しを持぀最初の行が「取り消し線」であり、テヌブルの装食芁玠にすぎないこずがわかりたす。 たた、リ゜ヌスを䜿甚しお行を「削陀」するこずもできたす。たずえば、行がどこでも䜿甚されおいない堎合でも、削陀するのは残念です。



パラメヌタの党リスト


䞊蚘のパラメヌタは、ナヌティリティが機胜するのに十分です。 ただし、他にもありたす。 それぞれを詳现に説明するのではなく、衚の圢匏で完党なリストのみを提䟛したす。

出所
パラメヌタ皮類説明
idひもGoogleスプレッドシヌトのスプレッドシヌトID。 テヌブルURLにはこの識別子が含たれおいたすhttps://docs.google.com/spreadsheets/d/*sheet_id*。 必須です。
column_keyひもキヌ列の名前。 必須です。
column_locales文字列配列倀を持぀列名の配列。列名もロケヌルです。 基本ロケヌルの堎合、 "base"ずいう名前の列を䜿甚したす。 必須です。
column_quantityひも定量的な倀を持぀列の名前。 テヌブル内のセルには、次のいずれかの倀が含たれおいる必芁がありたす zero 、 one 、 two 、 few 、 many 、 other 。 空の文字列はその他ずしお扱われたす。 オプションのパラメヌタヌ。 デフォルトでは、定量倀は䜿甚されたせん。
column_commentひもコメント列の名前。 オプションのパラメヌタヌ。 デフォルトでは、コメントはリ゜ヌスファむルに曞き蟌たれたせん。
worksheet_titleひもGoogle Sheetテヌブル内のシヌトの名前。 オプションのパラメヌタヌ。 デフォルトでは、最初のシヌトが䜿甚されたす。
credential_fileひもOAuth認蚌の資栌情報を含むファむルぞのパス。 盞察パスを䜿甚する堎合、ファむルぞのパスは䜜業ディレクトリに盞察的です。 オプションのパラメヌタヌ。
typeひもデヌタ゜ヌスのタむプ。 "googlesheet"必芁が"googlesheet"たす。 オプションのパラメヌタヌ。 ただし、構成ファむルずナヌティリティが同じ゜ヌスタむプで機胜しおいるこずを確認する堎合は、そのタむプを指定する必芁がありたす。
プラットフォヌム
前に蚀ったように、プラットフォヌムはそれに固有のいく぀かのパラメヌタヌを蚭定したす。 䞊蚘のようにプラットフォヌムを文字列ずしおではなく、JSONオブゞェクトずしお定矩するず、これらのパラメヌタヌを倉曎できたす。 このオブゞェクトの可胜なプロパティのリストは次のずおりです。
パラメヌタ皮類説明
typeひもプラットフォヌムのタむプ。 可胜な倀は、 "android"たたは"ios"です。 必須です。
res_nameひも拡匵子なしのリ゜ヌスファむル名。 拡匵子は、ファむルの皮類に応じお遞択されたす。 オプションのパラメヌタヌ。
デフォルト倀
Android- "strings"
iOS- "Localizable"
res_dirひもリ゜ヌスディレクトリぞのパス。 オプションのパラメヌタヌ。
デフォルト倀
Android- "./src/main/res/"
iOS- "./"
temp_dirひも䞀時ファむルを保存するディレクトリぞのパス。 オプションのパラメヌタヌ。
デフォルト倀
Android- "./build/tmp/"
iOS- "../DerivedData/LocoLaserTemp/"
重芁
すべおの盞察パスは、䜜業ディレクトリに盞察的です。 デフォルトでは、構成ファむルのディレクトリが䜜業ディレクトリずしお䜿甚されたす。
その他のパラメヌタヌ
構成には、プラットフォヌムず゜ヌスに加えお、さらにいく぀かのパラメヌタヌが含たれる堎合がありたす。 それらはすべお結果に倧きく圱響したす。
パラメヌタ皮類説明
work_dirひも䜜業フォルダヌぞのパス。 すべおの盞察パスは、このフォルダヌに盞察的です。 デフォルトは構成ファむルのディレクトリです。
force_importブヌル倀ナヌティリティは、最埌の実行時のリ゜ヌスの状態を蚘憶し、䞍必芁な必芁なしにむンポヌトを開始しないようにしたす。 これを無芖しお垞に完党にむンポヌトするには、 force_importをtrueに蚭定しtrue 。 デフォルト倀はfalseです。
conflict_strategyひもプラットフォヌムリ゜ヌスずGoogleスプレッドシヌトのリ゜ヌスを組み合わせる際の競合を解決する方法を定矩したす。 3぀のオプションがありたす。
  • remove_platformロヌカルプラットフォヌムリ゜ヌスを削陀しお、Googleスプレッドシヌトのリ゜ヌスに完党に眮き換えたす。
  • keep_new_platformプラットフォヌム行がGoogleシヌトにない堎合は保存したす。
  • export_new_platform新しいプラットフォヌム行を保存し、Google export_new_platformシヌトにアップロヌドしたす。
デフォルト倀はkeep_new_platformです。
duplicate_commentsブヌル倀duplicate_comments = false堎合、このコメントがロヌカラむズされた文字列ず等しい堎合、コメントはリ゜ヌスファむルに远加されたせん。 デフォルト倀はfalseです。
delay長い次のロヌカラむズたでの最小時間を定矩する分単䜍の時間。 ロヌカリれヌションは、delayパラメヌタヌで指定されおいるよりも頻繁に実行されたせん。 force_import䜿甚されるforce_import遅延は無芖されたす。

duplicate_commentsパラメヌタヌは、基本ロケヌルをコメントずしお䜿甚する堎合に特に圹立ちたす。 この堎合、ロヌカラむズされたリ゜ヌスには垞にベヌス蚀語通垞は英語のテキスト付きのコメントがあり、ベヌスリ゜ヌスにはコメントがありたせん。この堎合、これらは文字列の倀を繰り返し、䜙分です。

duplicate_comments = falseのAndroidリ゜ヌスの䟋
/values/strings.xml
 <?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">LocoLaser example</string> <string name="screen_main_app_description">This is example application of how to use the LocoLaser.</string> <string name="screen_main_plural_example_title">Plural string examples</string> </resources> 
/values-ru/strings.xml
 <?xml version="1.0" encoding="utf-8"?> <resources> /* LocoLaser example */ <string name="app_name">LocoLaser </string> /* This is example application of how to use the LocoLaser. */ <string name="screen_main_app_description">     LocoLaser.</string> /* Plural string examples */ <string name="screen_main_plural_example_title"> Plural </string> </resources> 
カスタマむズされたlocalization_config.jsonの蚭定䟋
 { "platform": { "type":"android", "res_name":"strings_intro" }, "source": { "type":"googlesheet", "id":"1JZxUcu30BjxLwHg12bdHTxjDgsGFX9HA9zC4Jd8cuUM", "column_key":"key", "column_locales":["base", "ru"], "column_comment":"base", “worksheet_title”:”Strings intro” }, "force_import":true, "conflict_strategy":”keep_new_platform”, "delay":60, } 

コン゜ヌル匕数


コン゜ヌルからロヌカラむザヌを起動するず、いく぀かの構成パラメヌタヌを倉曎できたす。 これを行うには、適切な匕数を远加したす。 重芁構成ファむルぞのパスは垞に最初に指定されたす。 残りの匕数の順序は重芁ではありたせん。
匕数説明
--forceたたは--fフラグ。 "force_import = true"蚭定し"force_import = true"
-cs *string conflict strategy*"conflict_strategy"プロパティをオヌバヌラむドしたす
-delay *long delay*"delay"プロパティをオヌバヌラむドしたす

コマンド䟋

 java -jar loco-laser-google.jar localization_config.json --f -cs keep_new_platform 

AndroidおよびGradleプラグむン


AndroidでLocoLaserを䜿甚する堎合は、特別なGradleプラグむンを䜿甚する必芁がありたす。 圌は、プロゞェクトにいく぀かのタスクを远加し、 「ロヌカリれヌション」グルヌプに統合したした。 プラグむンの接続には、「クラシック」ず「代替」の2぀のオプションがありたす。

プラグむンを接続する叀兞的な方法
ルヌトプロゞェクトの"build.gradle"ファむルを開き、次の行を远加したす。
 buildscript { repositories { maven { url "https://plugins.gradle.org/m2/" } } dependencies { classpath "gradle.plugin.ru.pocketbyte.locolaser:plugin:1.0.1" } } 

その埌、アプリケヌションモゞュヌルのファむル"build.gradle"開き、ファむルの先頭に1行远加したす。

 apply plugin: "ru.pocketbyte.locolaser" 

プラグむンを接続する代替方法
この方法は、Gradleバヌゞョン2.1以降のプロゞェクトに適しおおり、いわゆる「むンキュベヌション」機胜を䜿甚したすご自身の責任で䜿甚しおください、Gradleチヌムは譊告しおいたす。 ルヌト"build.gradle"䜕かを曞く必芁はありたせん。 必芁な"build.gradle"モゞュヌルを開き、ファむルの䞀番䞊に次の行を远加したす

 plugins { id "ru.pocketbyte.locolaser" version "1.0.1" } 

ここでも、行が䞀番䞊にあるこずに泚意しおください。 圌女の前には他に䜕も眮かないでください。 そうでない堎合、プロゞェクトは同期されたせん。

䞊蚘のいずれかの方法でプラグむンを接続した埌、同じファむルに次の䟝存関係を远加したす。

 dependencies { ... localize 'ru.pocketbyte.locolaser:locolaser-mobile-googlesheet:1.1.+' } 

これで、構成ファむルをアプリケヌションモゞュヌルのフォルダヌに配眮するだけで、䜜業を開始できたす。 デフォルトでは、プラグむンは蚭定ファむルずしお"localize_config.json"ずいうファむルを䜿甚したす。 プロゞェクトが同期されるず、 「ロヌカリれヌション」グルヌプがタスクのGradleリストに衚瀺されたす。これには3぀のタスクが含たれおいたす。



localize-暙準パラメヌタヌでLocoLaserを開始したす。
localizeForce - "--force" --force "--force"フラグを䜿甚しおLocoLaserを起動したす。
localizeExportNew-フラグ"--force"および"conflict_strategy" = "export_new_platform"たす。

すべおのビルドでロヌカラむズを開始する堎合は、 preBuildタスクに䟝存関係を远加したす。

 afterEvaluate { preBuild.dependsOn project.tasks.localize } 

GitHubのAndroidプロゞェクトの䟋 github.com/PocketByte/locolaser-android-example
Gradleプラグむンを䜿甚。 ロヌカリれヌションはビルドプロセスに組み蟌たれおいたす。

iOSアプリケヌションのロヌカラむズ


Androidずは異なり、iOSにはGradleのような匷力なビルドシステムがないため、回避策を䜿甚する必芁がありたす。倚くの回避策があり、iOSむデオロギヌに完党に適合するからです。 構成ファむルを゜ヌスフォルダヌに保存するこずをお勧めしたす。通垞、このフォルダヌの名前はプロゞェクトの名前ず䞀臎したすこれがデフォルト倀を䜿甚できる唯䞀の堎所です。

したがっお、構成ファむルを䜜成し、゜ヌスフォルダヌに配眮したした。 䜿い方は ナヌティリティのアヌティファクトはリモヌトMavenリポゞトリにあるため、䟝存関係管理システムをシミュレヌトするbashスクリプトを䜜成する方法を詊したした。 ここにありたす

localize.command
 GROUP="ru/pocketbyte/locolaser" ARTIFACT="locolaser-mobile-googlesheet" VERSION="1.1.1" CONFIG_FILE="localization_config.json" cd "`dirname \"$0\"`" ARTIFACTS_DIR="../DerivedData/LocoLaserTemp/artifacts/$GROUP/" mkdir -p $ARTIFACTS_DIR ARTIFACT_FILE="$ARTIFACTS_DIR$ARTIFACT-$VERSION.jar" if [ -f $ARTIFACT_FILE ] then echo "Artifact already downloaded" else ARTIFACT_URL="https://bintray.com/pocketbyte/maven/download_file?file_path=$GROUP/$ARTIFACT/$VERSION/$ARTIFACT-$VERSION.jar" echo "Loading: $ARTIFACT_URL" curl -L -o $ARTIFACT_FILE $ARTIFACT_URL if [ $? -eq 0 ] then echo "Artifact downloaded" else exit $? fi fi java -jar $ARTIFACT_FILE $CONFIG_FILE 

このスクリプトは、リモヌトMavenリポゞトリヌからjarファむルをダりンロヌドし、 "../DerivedData/LocoLaserTemp/artifacts/"フォルダヌに配眮しおから実行するために起動したす。 構成ファむルずしお、Androidのように"localize_config.json"ずいう名前のファむル"localize_config.json"されたす。 決定は非垞に倱瀌です。䜿甚するアヌティファクトのバヌゞョンを正確に瀺す必芁がありたす。 ただし、タスクに完党に察応しおおり、jarプロゞェクトにナヌティリティファむルを保存する必芁はありたせん。 盞察パスから掚枬できるように、スクリプトは構成ファむルず同じフォルダヌに保存する必芁がありたす。 私のプロゞェクトには、 localize.command 、 localizeForce.command 、およびlocalizeExportNew.commandのようなスクリプトがいく぀かありたす。 これらのコマンドはすべお、䞊蚘のGradleプラグむンのタスクを繰り返したす。

すべおのビルドでロヌカラむズを実行する堎合は、適切なRun scripを远加したす。



実行スクリプトは、 タヌゲットの䟝存関係フェヌズの盎埌に実行する必芁がありたす。 これは重芁です。たずえば、 バンドルリ゜ヌスのコピヌフェヌズの埌に新しい行がむンポヌトされるず、次のビルドでのみ目的の結果が遅れお衚瀺されるためです。

GitHubのiOSプロゞェクトの䟋 github.com/PocketByte/locolaser-ios-example
䜿甚されたbashスクリプト。 ロヌカリれヌションはビルドプロセスに組み蟌たれおいたす。

Windows Phoneおよびその他のプラットフォヌム


残念ながら、このプラットフォヌムでの開発の経隓はたったくありたせん。珟圚働いおいる組織では、Windows Phoneアプリケヌションの開発は長い間行われおいたせん。 この蚘事をWindows Phoneハブに投皿したこずを心からおizeび申し䞊げたす。 ただし、Windows Phone開発者の泚意を匕くためのより良い方法は芋぀かりたせんでした。 あなたが豊富な経隓を持぀Windows Phone開発者であり、このトピックに぀いお教えおほしいこずがあれば、私に連絡しおください。 たた、読者の1人が他のプラットフォヌムやサヌビスでLocoLaserを䜿甚するこずに぀いお考えおいるなら、曞くこずをためらわないでください。私は提案を受け入れたす。

資栌蚌明ファむル


Googleスプレッドシヌトにアクセスするには、OAuth認蚌を行う必芁がありたす。 パラメヌタヌ"source.credential_file"構成ファむルに蚭定されおいない堎合、ロヌカラむザヌが起動するず、Google認蚌ペヌゞのあるブラりザヌが自動的に開きたす。 認蚌に成功するず、ナヌティリティは䜜業を続行したす。 次回、このテヌブルにログむンする必芁はありたせん。

䞊蚘のアプロヌチはナヌザヌの介入を必芁ずするため、ロヌカラむズプロセスが自動的に行われる状況には適しおいたせん。 プロセスが垞に自動的に実行されるようにするには、 credential_file指定する必芁がありcredential_file 。 資栌情報ファむルずしおは、Googleサヌビスアカりントファむルが適しおいたす。 Google Developers Consoleで䜜成するには、次を実行する必芁がありたす。

  1. アプリケヌション甚にただ䜜成されおいない堎合は、新しいプロゞェクトを䜜成したす。
  2. サヌビスアカりントのリストを開きたす 。 プロゞェクトを遞択するように求められたら、アプリケヌションのプロゞェクトを遞択したす。
  3. [ サヌビスアカりントの䜜成]をクリックしたす 。
  4. [ サヌビスアカりントの䜜成]りィンドりで、新しいサヌビスアカりントの名前を入力し、[ 新しい秘密キヌの䜜成]フラグを有効にしお、JSONキヌタむプを遞択したす。 アカりントの圹割を遞択する必芁はありたせん。 䜜成をクリックしたす 。

サヌビスアカりントが䜜成され、その埌、秘密キヌファむルが自動的にダりンロヌドされたす。 このファむルぞのパスは、パラメヌタヌ"source.credential_file"ずしお指定する必芁がありたす。 サヌビスアカりントがGoogleスプレッドシヌトにアクセスできるようにするには、以前に䜜成したサヌビスアカりントず共有する必芁がありたす。 共有する堎合、サヌビスアカりント識別子を電子メヌルずしお指定したす。 この識別子は、サヌビスアカりントのリストで確認するか、ダりンロヌドしたキヌファむルで確認できたす。

サヌビスキヌファむルの䟋
 { "type": "service_account", "project_id": "myapp-1086", "private_key_id": "b67c2edcc47c7053c035d8681c8eb7e9f4d90c09", "private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDJUV49mSQB2NSO\nw+tfQWq4pP63U4t7W8V6O6E7FABbYS5N4g35nRzVEj5NciqI27shHSKVrsl7U5ji\nM0IIA+vi+dgHXwHfCPhS9d85xZ73fuqFaj29iru+pTq9tuNieLDl60L04oCc1qQKBgQDLsMMnX2r9qkQw01H5L2WRB9R6er+bO4DE\n8Ecpripfd/e7qq89WcGu1H8S+3Jy49dBmN709vPvVcsGQx8mDdYdm4P0WPkKbgTo\nt12OA07uiY6Zn54rW5CXrjdoscPXB94AS2ps4M3/xY5hHTxwtS8yJxoUgTVEfgNB\nDwzNrZSCVEMCoBAIYl6rWGITgNaR0+FLuP+kjZw\nHsLdkU8173J3nhuYhxo7N90BhO08lquIQ7bJAoGBAKLz\nVRxRdFlcdlMNK34K0dkVh4E4Y8K+9oQWqQeKIrHfWpuSr8CH5q+Dpek8qVGKPnFm\n567XRUzJuLLYzbl2xj1HZWf8KbeTTnALKYg8Jz\nxXXvLlZl2OJ8Frr9ry1DEszPkwWwTQJg5bRG7Z//QfpyEZ2PUvpCNVVpeRuMmUhv\nu5rSLa0G+C97/XIGz/O/1ME9WXU6ZNRwwDkSDw6L7AIrXY8V+8pIRL9e0ks4Uw/A\n6ACYrlYMYYAIl79MNrUrizvF5KwxLiohHJ5KVpThGuRZDaidCPp9BL/h8tfhXPel\nwQot9dM8P4CmQNR/fMpytQSVk7vv95B2JHrt6QmIsQKBgQD9BJ8gfZUVhlxtuaWO\nMKl1PjiD+YKhz4rmIZUKM84xphsGYUBhH29s1zb98u9vlEnlx3bGUtDakNnjTDQp\nagQv22+6STL+0s1haOxyfbi1jIzXvzh47yij6+v7WEIdNj45WV9kpcFTi2oUXURt\nEi3WskYTijYGbDNQmpG2kmY\nDz0KdeTFJxsnFstTT/VozEGvNIHf+8PhKv0123dBFuqSgBD5SFHDp3tQ2IzC81Jm\n5FJLldk3Hw1QRh6+WiEJBTX6nFU4DB5tVXKhbPOvhqYwI/CUYWWbVBQCQgqURcyr\nUdRxAHyDrxKhNrmXXKAEwR0rDz2uGTQCfJ0Zyk/Z1E7iDl/SDfYSSD70wAgGblH2\nAAIQzeoPAgMBAAECggEAb7Trswhft3qmb1V9LEzzN+OtxvHfqqKAkFO4Ijz1+b6R\n3/t4P7KTRhOqaHTZ7zjlu/kbsKzc9casRY+lqybp4/c4jNaGBklG6Vmu96E9wKBgEFPsRe88v/UaAV213Jlw0hdYE9I19yW6z7OSl+Q0dflDbLO5cRs\nTeHlh+9zhzThLVYf79vvwrO4klXm9Mv/7sa/uQ54GK7IkXVklSxUoZpThoOme5hT\n+8ScgJSnyqEpwFQjaslbNBUxtpc9IA2bseP1S7aCVDfZtEp7rHqOFZTvSgol5YD/AoGAdIMNKvg0IiS2xcIEbyHa\nPTNrUfpHeJk/P+Frr1cmDHhGe1l0FWNg9EDlhItAW5EP15ubZPdWQRrV7RuydJlc\ngWesc2RLPIG8+so1TpG1F62+tsQ9lGSF5imiew1x7sQ3H0VIpGtSfTvSMep6fuE7\niuSVbY0UnpxGnqzo9TBAYS4=\n-----END PRIVATE KEY-----\n", "client_email": "localizator@myapp-1086.iam.gserviceaccount.com", "client_id": "704739729071909788554", "auth_uri": "https://accounts.google.com/o/oauth2/auth", "token_uri": "https://accounts.google.com/o/oauth2/token", "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/localizator%40myapp-1086.iam.gserviceaccount.com" } KEYを----- \ nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDJUV49mSQB2NSO \ NW + tfQWq4pP63U4t7W8V6O6E7FABbYS5N4g35nRzVEj5NciqI27shHSKVrsl7U5ji \ nM0IIA + VI + dgHXwHfCPhS9d85xZ73fuqFaj29iru + pTq9tuNieLDl60L04oCc1qQKBgQDLsMMnX2r9qkQw01H5L2WRB9R6er + bO4DE \ n8Ecpripfd / e7qq89WcGu1H8S + 3Jy49dBmN709vPvVcsGQx8mDdYdm4P0WPkKbgTo \ nt12OA07uiY6Zn54rW5CXrjdoscPXB94AS2ps4M3 / xY5hHTxwtS8yJxoUgTVEfgNB \ nDwzNrZSCVEMCoBAIYl6rWGITgNaR0 + FLUP + kjZw { "type": "service_account", "project_id": "myapp-1086", "private_key_id": "b67c2edcc47c7053c035d8681c8eb7e9f4d90c09", "private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDJUV49mSQB2NSO\nw+tfQWq4pP63U4t7W8V6O6E7FABbYS5N4g35nRzVEj5NciqI27shHSKVrsl7U5ji\nM0IIA+vi+dgHXwHfCPhS9d85xZ73fuqFaj29iru+pTq9tuNieLDl60L04oCc1qQKBgQDLsMMnX2r9qkQw01H5L2WRB9R6er+bO4DE\n8Ecpripfd/e7qq89WcGu1H8S+3Jy49dBmN709vPvVcsGQx8mDdYdm4P0WPkKbgTo\nt12OA07uiY6Zn54rW5CXrjdoscPXB94AS2ps4M3/xY5hHTxwtS8yJxoUgTVEfgNB\nDwzNrZSCVEMCoBAIYl6rWGITgNaR0+FLuP+kjZw\nHsLdkU8173J3nhuYhxo7N90BhO08lquIQ7bJAoGBAKLz\nVRxRdFlcdlMNK34K0dkVh4E4Y8K+9oQWqQeKIrHfWpuSr8CH5q+Dpek8qVGKPnFm\n567XRUzJuLLYzbl2xj1HZWf8KbeTTnALKYg8Jz\nxXXvLlZl2OJ8Frr9ry1DEszPkwWwTQJg5bRG7Z//QfpyEZ2PUvpCNVVpeRuMmUhv\nu5rSLa0G+C97/XIGz/O/1ME9WXU6ZNRwwDkSDw6L7AIrXY8V+8pIRL9e0ks4Uw/A\n6ACYrlYMYYAIl79MNrUrizvF5KwxLiohHJ5KVpThGuRZDaidCPp9BL/h8tfhXPel\nwQot9dM8P4CmQNR/fMpytQSVk7vv95B2JHrt6QmIsQKBgQD9BJ8gfZUVhlxtuaWO\nMKl1PjiD+YKhz4rmIZUKM84xphsGYUBhH29s1zb98u9vlEnlx3bGUtDakNnjTDQp\nagQv22+6STL+0s1haOxyfbi1jIzXvzh47yij6+v7WEIdNj45WV9kpcFTi2oUXURt\nEi3WskYTijYGbDNQmpG2kmY\nDz0KdeTFJxsnFstTT/VozEGvNIHf+8PhKv0123dBFuqSgBD5SFHDp3tQ2IzC81Jm\n5FJLldk3Hw1QRh6+WiEJBTX6nFU4DB5tVXKhbPOvhqYwI/CUYWWbVBQCQgqURcyr\nUdRxAHyDrxKhNrmXXKAEwR0rDz2uGTQCfJ0Zyk/Z1E7iDl/SDfYSSD70wAgGblH2\nAAIQzeoPAgMBAAECggEAb7Trswhft3qmb1V9LEzzN+OtxvHfqqKAkFO4Ijz1+b6R\n3/t4P7KTRhOqaHTZ7zjlu/kbsKzc9casRY+lqybp4/c4jNaGBklG6Vmu96E9wKBgEFPsRe88v/UaAV213Jlw0hdYE9I19yW6z7OSl+Q0dflDbLO5cRs\nTeHlh+9zhzThLVYf79vvwrO4klXm9Mv/7sa/uQ54GK7IkXVklSxUoZpThoOme5hT\n+8ScgJSnyqEpwFQjaslbNBUxtpc9IA2bseP1S7aCVDfZtEp7rHqOFZTvSgol5YD/AoGAdIMNKvg0IiS2xcIEbyHa\nPTNrUfpHeJk/P+Frr1cmDHhGe1l0FWNg9EDlhItAW5EP15ubZPdWQRrV7RuydJlc\ngWesc2RLPIG8+so1TpG1F62+tsQ9lGSF5imiew1x7sQ3H0VIpGtSfTvSMep6fuE7\niuSVbY0UnpxGnqzo9TBAYS4=\n-----END PRIVATE KEY-----\n", "client_email": "localizator@myapp-1086.iam.gserviceaccount.com", "client_id": "704739729071909788554", "auth_uri": "https://accounts.google.com/o/oauth2/auth", "token_uri": "https://accounts.google.com/o/oauth2/token", "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/localizator%40myapp-1086.iam.gserviceaccount.com" } \ n567XRUzJuLLYzbl2xj1HZWf8KbeTTnALKYg8Jz \ nxXXvLlZl2OJ8Frr9ry1DEszPkwWwTQJg5bRG7Z // QfpyEZ2PUvpCNVVpeRuMmUhv \ nu5rSLa0G + C97 / XIGz / O / 1ME9WXU6ZNRwwDkSDw6L7AIrXY8V + 8pIRL9e0ks4Uw / A \ n6ACYrlYMYYAIl79MNrUrizvF5KwxLiohHJ5KVpThGuRZDaidCPp9BL / h8tfhXPel \ nwQot9dM8P4CmQNR / fMpytQSVk7vv95B2JHrt6QmIsQKBgQD9BJ8gfZUVhlxtuaWO \ nMKl1PjiD + YKhz4rmIZUKM84xphsGYUBhH29s1zb98u9vlEnlx3bGUtDakNnjTDQp \ nagQv22 + 6STL + 0s1haOxyfbi1jIzXvzh47yij6 + v7WEIdNj45WV9kpcFTi2oUXURt \ { "type": "service_account", "project_id": "myapp-1086", "private_key_id": "b67c2edcc47c7053c035d8681c8eb7e9f4d90c09", "private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDJUV49mSQB2NSO\nw+tfQWq4pP63U4t7W8V6O6E7FABbYS5N4g35nRzVEj5NciqI27shHSKVrsl7U5ji\nM0IIA+vi+dgHXwHfCPhS9d85xZ73fuqFaj29iru+pTq9tuNieLDl60L04oCc1qQKBgQDLsMMnX2r9qkQw01H5L2WRB9R6er+bO4DE\n8Ecpripfd/e7qq89WcGu1H8S+3Jy49dBmN709vPvVcsGQx8mDdYdm4P0WPkKbgTo\nt12OA07uiY6Zn54rW5CXrjdoscPXB94AS2ps4M3/xY5hHTxwtS8yJxoUgTVEfgNB\nDwzNrZSCVEMCoBAIYl6rWGITgNaR0+FLuP+kjZw\nHsLdkU8173J3nhuYhxo7N90BhO08lquIQ7bJAoGBAKLz\nVRxRdFlcdlMNK34K0dkVh4E4Y8K+9oQWqQeKIrHfWpuSr8CH5q+Dpek8qVGKPnFm\n567XRUzJuLLYzbl2xj1HZWf8KbeTTnALKYg8Jz\nxXXvLlZl2OJ8Frr9ry1DEszPkwWwTQJg5bRG7Z//QfpyEZ2PUvpCNVVpeRuMmUhv\nu5rSLa0G+C97/XIGz/O/1ME9WXU6ZNRwwDkSDw6L7AIrXY8V+8pIRL9e0ks4Uw/A\n6ACYrlYMYYAIl79MNrUrizvF5KwxLiohHJ5KVpThGuRZDaidCPp9BL/h8tfhXPel\nwQot9dM8P4CmQNR/fMpytQSVk7vv95B2JHrt6QmIsQKBgQD9BJ8gfZUVhlxtuaWO\nMKl1PjiD+YKhz4rmIZUKM84xphsGYUBhH29s1zb98u9vlEnlx3bGUtDakNnjTDQp\nagQv22+6STL+0s1haOxyfbi1jIzXvzh47yij6+v7WEIdNj45WV9kpcFTi2oUXURt\nEi3WskYTijYGbDNQmpG2kmY\nDz0KdeTFJxsnFstTT/VozEGvNIHf+8PhKv0123dBFuqSgBD5SFHDp3tQ2IzC81Jm\n5FJLldk3Hw1QRh6+WiEJBTX6nFU4DB5tVXKhbPOvhqYwI/CUYWWbVBQCQgqURcyr\nUdRxAHyDrxKhNrmXXKAEwR0rDz2uGTQCfJ0Zyk/Z1E7iDl/SDfYSSD70wAgGblH2\nAAIQzeoPAgMBAAECggEAb7Trswhft3qmb1V9LEzzN+OtxvHfqqKAkFO4Ijz1+b6R\n3/t4P7KTRhOqaHTZ7zjlu/kbsKzc9casRY+lqybp4/c4jNaGBklG6Vmu96E9wKBgEFPsRe88v/UaAV213Jlw0hdYE9I19yW6z7OSl+Q0dflDbLO5cRs\nTeHlh+9zhzThLVYf79vvwrO4klXm9Mv/7sa/uQ54GK7IkXVklSxUoZpThoOme5hT\n+8ScgJSnyqEpwFQjaslbNBUxtpc9IA2bseP1S7aCVDfZtEp7rHqOFZTvSgol5YD/AoGAdIMNKvg0IiS2xcIEbyHa\nPTNrUfpHeJk/P+Frr1cmDHhGe1l0FWNg9EDlhItAW5EP15ubZPdWQRrV7RuydJlc\ngWesc2RLPIG8+so1TpG1F62+tsQ9lGSF5imiew1x7sQ3H0VIpGtSfTvSMep6fuE7\niuSVbY0UnpxGnqzo9TBAYS4=\n-----END PRIVATE KEY-----\n", "client_email": "localizator@myapp-1086.iam.gserviceaccount.com", "client_id": "704739729071909788554", "auth_uri": "https://accounts.google.com/o/oauth2/auth", "token_uri": "https://accounts.google.com/o/oauth2/token", "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/localizator%40myapp-1086.iam.gserviceaccount.com" } n5FJLldk3Hw1QRh6 + WiEJBTX6nFU4DB5tVXKhbPOvhqYwI / CUYWWbVBQCQgqURcyr \ nUdRxAHyDrxKhNrmXXKAEwR0rDz2uGTQCfJ0Zyk / Z1E7iDl / SDfYSSD70wAgGblH2 \ nAAIQzeoPAgMBAAECggEAb7Trswhft3qmb1V9LEzzN + OtxvHfqqKAkFO4Ijz1 + B6R \ N3 / t4P7KTRhOqaHTZ7zjlu / kbsKzc9casRY + lqybp4 / c4jNaGBklG6Vmu96E9wKBgEFPsRe88v / UaAV213Jlw0hdYE9I19yW6z7OSl + Q0dflDbLO5cRs \ nTeHlh + 9zhzThLVYf79vvwrO4klXm9Mv / 7sa / uQ54GK7IkXVklSxUoZpThoOme5hT \ N + { "type": "service_account", "project_id": "myapp-1086", "private_key_id": "b67c2edcc47c7053c035d8681c8eb7e9f4d90c09", "private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDJUV49mSQB2NSO\nw+tfQWq4pP63U4t7W8V6O6E7FABbYS5N4g35nRzVEj5NciqI27shHSKVrsl7U5ji\nM0IIA+vi+dgHXwHfCPhS9d85xZ73fuqFaj29iru+pTq9tuNieLDl60L04oCc1qQKBgQDLsMMnX2r9qkQw01H5L2WRB9R6er+bO4DE\n8Ecpripfd/e7qq89WcGu1H8S+3Jy49dBmN709vPvVcsGQx8mDdYdm4P0WPkKbgTo\nt12OA07uiY6Zn54rW5CXrjdoscPXB94AS2ps4M3/xY5hHTxwtS8yJxoUgTVEfgNB\nDwzNrZSCVEMCoBAIYl6rWGITgNaR0+FLuP+kjZw\nHsLdkU8173J3nhuYhxo7N90BhO08lquIQ7bJAoGBAKLz\nVRxRdFlcdlMNK34K0dkVh4E4Y8K+9oQWqQeKIrHfWpuSr8CH5q+Dpek8qVGKPnFm\n567XRUzJuLLYzbl2xj1HZWf8KbeTTnALKYg8Jz\nxXXvLlZl2OJ8Frr9ry1DEszPkwWwTQJg5bRG7Z//QfpyEZ2PUvpCNVVpeRuMmUhv\nu5rSLa0G+C97/XIGz/O/1ME9WXU6ZNRwwDkSDw6L7AIrXY8V+8pIRL9e0ks4Uw/A\n6ACYrlYMYYAIl79MNrUrizvF5KwxLiohHJ5KVpThGuRZDaidCPp9BL/h8tfhXPel\nwQot9dM8P4CmQNR/fMpytQSVk7vv95B2JHrt6QmIsQKBgQD9BJ8gfZUVhlxtuaWO\nMKl1PjiD+YKhz4rmIZUKM84xphsGYUBhH29s1zb98u9vlEnlx3bGUtDakNnjTDQp\nagQv22+6STL+0s1haOxyfbi1jIzXvzh47yij6+v7WEIdNj45WV9kpcFTi2oUXURt\nEi3WskYTijYGbDNQmpG2kmY\nDz0KdeTFJxsnFstTT/VozEGvNIHf+8PhKv0123dBFuqSgBD5SFHDp3tQ2IzC81Jm\n5FJLldk3Hw1QRh6+WiEJBTX6nFU4DB5tVXKhbPOvhqYwI/CUYWWbVBQCQgqURcyr\nUdRxAHyDrxKhNrmXXKAEwR0rDz2uGTQCfJ0Zyk/Z1E7iDl/SDfYSSD70wAgGblH2\nAAIQzeoPAgMBAAECggEAb7Trswhft3qmb1V9LEzzN+OtxvHfqqKAkFO4Ijz1+b6R\n3/t4P7KTRhOqaHTZ7zjlu/kbsKzc9casRY+lqybp4/c4jNaGBklG6Vmu96E9wKBgEFPsRe88v/UaAV213Jlw0hdYE9I19yW6z7OSl+Q0dflDbLO5cRs\nTeHlh+9zhzThLVYf79vvwrO4klXm9Mv/7sa/uQ54GK7IkXVklSxUoZpThoOme5hT\n+8ScgJSnyqEpwFQjaslbNBUxtpc9IA2bseP1S7aCVDfZtEp7rHqOFZTvSgol5YD/AoGAdIMNKvg0IiS2xcIEbyHa\nPTNrUfpHeJk/P+Frr1cmDHhGe1l0FWNg9EDlhItAW5EP15ubZPdWQRrV7RuydJlc\ngWesc2RLPIG8+so1TpG1F62+tsQ9lGSF5imiew1x7sQ3H0VIpGtSfTvSMep6fuE7\niuSVbY0UnpxGnqzo9TBAYS4=\n-----END PRIVATE KEY-----\n", "client_email": "localizator@myapp-1086.iam.gserviceaccount.com", "client_id": "704739729071909788554", "auth_uri": "https://accounts.google.com/o/oauth2/auth", "token_uri": "https://accounts.google.com/o/oauth2/token", "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/localizator%40myapp-1086.iam.gserviceaccount.com" } Frr1cmDHhGe1l0FWNg9EDlhItAW5EP15ubZPdWQRrV7RuydJlc \ ngWesc2RLPIG8 + so1TpG1F62 + tsQ9lGSF5imiew1x7sQ3H0VIpGtSfTvSMep6fuE7 \ niuSVbY0UnpxGnqzo9TBAYS4 = \ N ----- END PRIVATE KEY ----- \ n」は、 { "type": "service_account", "project_id": "myapp-1086", "private_key_id": "b67c2edcc47c7053c035d8681c8eb7e9f4d90c09", "private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDJUV49mSQB2NSO\nw+tfQWq4pP63U4t7W8V6O6E7FABbYS5N4g35nRzVEj5NciqI27shHSKVrsl7U5ji\nM0IIA+vi+dgHXwHfCPhS9d85xZ73fuqFaj29iru+pTq9tuNieLDl60L04oCc1qQKBgQDLsMMnX2r9qkQw01H5L2WRB9R6er+bO4DE\n8Ecpripfd/e7qq89WcGu1H8S+3Jy49dBmN709vPvVcsGQx8mDdYdm4P0WPkKbgTo\nt12OA07uiY6Zn54rW5CXrjdoscPXB94AS2ps4M3/xY5hHTxwtS8yJxoUgTVEfgNB\nDwzNrZSCVEMCoBAIYl6rWGITgNaR0+FLuP+kjZw\nHsLdkU8173J3nhuYhxo7N90BhO08lquIQ7bJAoGBAKLz\nVRxRdFlcdlMNK34K0dkVh4E4Y8K+9oQWqQeKIrHfWpuSr8CH5q+Dpek8qVGKPnFm\n567XRUzJuLLYzbl2xj1HZWf8KbeTTnALKYg8Jz\nxXXvLlZl2OJ8Frr9ry1DEszPkwWwTQJg5bRG7Z//QfpyEZ2PUvpCNVVpeRuMmUhv\nu5rSLa0G+C97/XIGz/O/1ME9WXU6ZNRwwDkSDw6L7AIrXY8V+8pIRL9e0ks4Uw/A\n6ACYrlYMYYAIl79MNrUrizvF5KwxLiohHJ5KVpThGuRZDaidCPp9BL/h8tfhXPel\nwQot9dM8P4CmQNR/fMpytQSVk7vv95B2JHrt6QmIsQKBgQD9BJ8gfZUVhlxtuaWO\nMKl1PjiD+YKhz4rmIZUKM84xphsGYUBhH29s1zb98u9vlEnlx3bGUtDakNnjTDQp\nagQv22+6STL+0s1haOxyfbi1jIzXvzh47yij6+v7WEIdNj45WV9kpcFTi2oUXURt\nEi3WskYTijYGbDNQmpG2kmY\nDz0KdeTFJxsnFstTT/VozEGvNIHf+8PhKv0123dBFuqSgBD5SFHDp3tQ2IzC81Jm\n5FJLldk3Hw1QRh6+WiEJBTX6nFU4DB5tVXKhbPOvhqYwI/CUYWWbVBQCQgqURcyr\nUdRxAHyDrxKhNrmXXKAEwR0rDz2uGTQCfJ0Zyk/Z1E7iDl/SDfYSSD70wAgGblH2\nAAIQzeoPAgMBAAECggEAb7Trswhft3qmb1V9LEzzN+OtxvHfqqKAkFO4Ijz1+b6R\n3/t4P7KTRhOqaHTZ7zjlu/kbsKzc9casRY+lqybp4/c4jNaGBklG6Vmu96E9wKBgEFPsRe88v/UaAV213Jlw0hdYE9I19yW6z7OSl+Q0dflDbLO5cRs\nTeHlh+9zhzThLVYf79vvwrO4klXm9Mv/7sa/uQ54GK7IkXVklSxUoZpThoOme5hT\n+8ScgJSnyqEpwFQjaslbNBUxtpc9IA2bseP1S7aCVDfZtEp7rHqOFZTvSgol5YD/AoGAdIMNKvg0IiS2xcIEbyHa\nPTNrUfpHeJk/P+Frr1cmDHhGe1l0FWNg9EDlhItAW5EP15ubZPdWQRrV7RuydJlc\ngWesc2RLPIG8+so1TpG1F62+tsQ9lGSF5imiew1x7sQ3H0VIpGtSfTvSMep6fuE7\niuSVbY0UnpxGnqzo9TBAYS4=\n-----END PRIVATE KEY-----\n", "client_email": "localizator@myapp-1086.iam.gserviceaccount.com", "client_id": "704739729071909788554", "auth_uri": "https://accounts.google.com/o/oauth2/auth", "token_uri": "https://accounts.google.com/o/oauth2/token", "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/localizator%40myapp-1086.iam.gserviceaccount.com" } 

"client_email" -これはアカりント識別子です。

おわりに


繰り返しになりたすが、ナヌティリティアヌキテクチャは、簡単に拡匵たたは補完できるように蚭蚈されおおり、゜ヌスずプラットフォヌムが独立しお動䜜するこずに泚意しおください。 たずえば、必芁に応じお、゜ヌスのリストを補足し、これに適したAPIを備えたデヌタベヌスたたはWebサヌビスを゜ヌスずしお䜿甚できたす。 そのため、Googleスプレッドシヌトに光が集たらず、「グヌグル察策」の支持者は適切な解決策を芋぀けるこずができたす。

たた、この蚘事の執筆に協力しおくれたInnaFoenixにも感謝したす。 それがなければ、蚘事はそれほどわかりやすく、理解できたせん。 むンナ、アドバむスやコメントをありがずう。

これで終わりたす。 時間をかけお私の創造に慣れおくれおありがずう。 コメントであなたの意芋、提案、批刀を埗るこずができおうれしいです。 そしお、䞊矢印たたは䞋矢印を抌すこずを忘れないでください。それは私にずっお非垞に重芁です。Habrコミュニティが私の仕事をどのように受け入れたかを知りたいです。

゜ヌスぞのリンク

→ GitHubのLocoLaser゜ヌスコヌド
→ GitHubのGradleプラグむンの゜ヌスコヌド
→ Androidの䟋
→ iOSの䟋

→ Bintrayぞのリンク
→ サンプル衚

Source: https://habr.com/ru/post/J323318/


All Articles