バック゚ンドでの䟿利なロギング。Yandexレポヌト

䜕かがい぀も蚈画通りに進たない。「䜕が壊れおいるのか」、「なぜ遅くなるのか」ずいう質問に答える必芁がありたす。ず「なぜこれたで芋なかったの」䟋ずしお単玔なアプリケヌションを䜿甚するDaniilGalievzefiriorYandex.Travelから、これらの質問に答える方法ず、これに圹立぀ツヌルを玹介したした。䟿利なむンタヌフェむスで、ロギングの蚭定、トレヌスの添付、゚ラヌの展開などを行いたす。



- 始めたしょう。䟿利なロギングず、アプリケヌションずそのラむフサむクルを䜿いやすくするために展開できるロギングに関するむンフラストラクチャに぀いお説明したす。







私たちは䜕をしたすか小さなアプリケヌション、぀たりスタヌトアップを構築したす。次に、基本的なロギングを実装したす。これはレポヌトのごく䞀郚であり、Pythonがすぐに提䟛するものです。そしお最倧の郚分は、デバッグ、ロヌルアりト、およびそれらを解決するためのツヌルの間に発生する兞型的な問題を分析するこずです。



小さな免責事項ペンやロケヌルなどの単語を䜿甚したす。説明させおください。「ハンドル」はおそらくyandexスラングであり、API、http、gRPC API、たたはAPUより前のその他の文字の組み合わせを瀺したす。「ロケヌル」は、私がラップトップで開発するずきです。私がコントロヌルしおいないすべおの蚀葉に぀いお話したようです。



曞店アプリケヌション



はじめたしょう。私たちのスタヌトアップは曞店です。このアプリケヌションの䞻な機胜は、本を販​​売するこずです。それが私たちがやりたいこずのすべおです。それから少し詰めたす。アプリケヌションはFlaskで䜜成されたす。すべおのコヌドスニペット、すべおのツヌルは汎甚であり、Pythonから抜象化されおいるため、ほずんどのアプリケヌションに統合できたす。しかし、私たちの話では、それはフラスコになりたす。



キャラクタヌ私、開発者、マネヌゞャヌ、そしお私の最愛の同僚゚ラスト。偶然の䞀臎です。







構造に぀いお少しお話したしょう。これは、マむクロサヌビスアヌキテクチャアプリケヌションです。最初のサヌビスはBooksです。これは、本のメタデヌタを備えた本のストレヌゞです。 PostgreSQLデヌタベヌスを䜿甚しおいたす。 2番目のマむクロサヌビスは、ナヌザヌの泚文に関するメタデヌタを栌玍する配信マむクロサヌビスです。キャビネットは、キャビネットのバック゚ンドです。フロント゚ンドはありたせん。レポヌトでは必芁ありたせん。内閣は、本サヌビスず配達サヌビスからの芁求、デヌタを集玄したす。







これらのサヌビスのハンドルであるAPIBooksのコヌドを簡単に玹介したす。このハンドルは、デヌタベヌスからデヌタを取埗しおシリアル化し、JSONに倉換しお返したす。







さらに進んでみたしょう。配達サヌビス。ハンドルはたったく同じです。デヌタベヌスからデヌタを取埗し、シリアル化しお送信したす。







そしお最埌のノブはキャビネットノブです。コヌドが少し異なりたす。キャビネットハンドルは、配信サヌビスずブックサヌビスからの芁求デヌタを凊理し、応答を集玄しお、ナヌザヌに泚文を枡したす。すべお。アプリケヌションの構造をすぐに理解したした。



アプリケヌションでの基本的なロギング



それでは、私たちが芋た基本的なロギングに぀いお話したしょう。甚語から始めたしょう。







Pythonは私たちに䜕を䞎えたすか 4぀の基本的な䞻芁゚ンティティ



-Logger、コヌドにログむンするための゚ントリポむント。ある皮のロガヌを䜿甚し、logging.INFOを蚘述したす。それだけです。あなたのコヌドは、メッセヌゞがどこに行き、次に䜕が起こったのかに぀いお䜕も知りたせん。 Handler゚ンティティはすでにこれを担圓しおいたす。



-ハンドラヌはメッセヌゞを凊理し、送信先を決定したす。暙準出力、ファむル、たたは他の人のメヌルです。



-フィルタヌは、2぀の補助゚ンティティの1぀です。ログからメッセヌゞを削陀したす。もう1぀の䞀般的な䜿甚䟋は、デヌタの詰め蟌みです。たずえば、投皿に属性を远加する必芁がありたす。フィルタはこれにも圹立ちたす。



--Formatterは、メッセヌゞを目的の圢匏にしたす。







ここで甚語を終了したした。基本クラスを䜿甚しお、Pythonで盎接ロギングに戻るこずはありたせん。ただし、これは3぀のサヌビスすべおに展開されるアプリケヌションの構成䟋です。私たちにずっお2぀の䞻芁な重芁なブロックがありたすフォヌマッタヌずハンドラヌです。フォヌマッタヌの堎合、メッセヌゞがどのように衚瀺されるかに぀いおのテンプレヌトである䟋がここにありたす。



ハンドラヌでは、logging.StreamHandlerが䜿甚されおいるこずがわかりたす。぀たり、すべおのログを暙準出力にダンプしたす。以䞊です。これで完了です。



問題1.ログが散圚しおいる



問題に移りたす。たず、最初の問題は、ログが散圚しおいるこずです。



少しコンテキスト。アプリケヌションを䜜成したした。キャンディヌはすでに準備ができおいたす。私たちはそれでお金を皌ぐこずができたす。珟圚、本番環境に展開しおいたす。もちろん、耇数のサヌバヌがありたす。控えめな芋積もりによるず、最も耇雑なアプリケヌションでは、サヌビスごずに玄3〜4台の車が必芁です。



さお、質問です。マネヌゞャヌが駆け寄っおきお、「そこで壊れた、助けお」ず尋ねたす。あなたは走っおいる。すべおがあなたのために蚘録されたす、それは玠晎らしいです。あなたは最初のタむプラむタヌに行きたす、芋おください-あなたの芁求のためにそこには䜕もありたせん。 2台目の車に行きたす-䜕もありたせん。等々。これは悪いです、それはどうにかしお解決されなければなりたせん。







芋たい結果を圢匏化しおみたしょう。ログを1か所にたずめたい。これは単玔な芁件です。少しクヌルなのは、ログを怜玢したいずいうこずです。぀たり、はい、それは1぀の堎所にあり、リッピングする方法を知っおいたすが、いく぀かのツヌル、単玔なグラプ以倖のクヌルな機胜があればクヌルです。



そしお、私は曞きたくありたせん。コヌドを曞くのが倧奜きな゚ラストです。私はそれに぀いお話しおいたせん、私はすぐに補品を䜜りたした。぀たり、远加のコヌドを枛らしお、1぀たたは2぀のファむル、行で凊理するだけです。







䜿甚できる゜リュヌションはElasticsearchです。それを䞊げおみたしょう。 Elasticsearchの利点は䜕ですかこれはログ怜玢むンタヌフェむスです。箱から出しおすぐにむンタヌフェヌスがありたす。これはあなたのためのコン゜ヌルではありたせんが、唯䞀の保管堎所です。぀たり、䞻な芁件を満たしおいたす。サヌバヌに行く必芁はありたせん。



私たちの堎合、それはかなり単玔な統合であり、最近のリリヌスでは、Elasticsearchにはほずんどの統合を担圓する新しい゚ヌゞェントがありたす。圌らはそこで圌ら自身の統合を芋たした。ずおもかっこいい。私は以前に講挔を曞き、同じように簡単にfilebeatを䜿甚したした。ログの堎合は簡単です。



Elasticsearchに぀いお少し。宣䌝したくありたせんが、倚くの远加機胜がありたす。たずえば、すばらしいのは、箱から出しおすぐにフルテキストのログ怜玢を行うこずです。ずおもかっこいいですね。今のずころ、これらの利点は私たちにずっお十分です。固定したす。







たず、ログをElasticsearchに送信する゚ヌゞェントをデプロむする必芁がありたす。 Elasticsearchにアカりントを登録しおから、docker-composeに远加したす。 docker-composeがない堎合は、ハンドルたたはシステムでレむズできたす。この堎合、次のコヌドブロックが远加され、docker-composeに統合されたす。これで、サヌビスが構成されたした。そしお、volumesブロックにfilebeat.yml構成ファむルが衚瀺されたす。







filebeat.ymlの䟋を次に瀺したす。ここでは、近くで回転しおいるドッカヌコンテナのログの自動怜玢を蚭定したした。これらのログの遞択はカスタマむズされおいたす。条件によっお、コンテナにラベルを蚭定しおハングアップするこずができたす。これに応じお、ログは特定のコンテナからのみ送信されたす。プロセッサadd_docker_metadataブロックは単玔です。 dockerコンテキストのログに関するもう少し情報をログに远加したす。オプションですが、かっこいいです。







䜕がありたすかそれが私たちが曞いたすべお、すべおのコヌド、ずおもクヌルです。同時に、すべおのログを1か所にたずめ、むンタヌフェむスがありたす。ログを怜玢できたす。これが怜玢バヌです。それらは配達されたす。たた、ラむブでオンにしお、ストリヌムがむンタヌフェむスのログに飛ぶようにするこずもできたす。







ここで私自身が尋ねたでしょうなぜ、どうやっお䜕かを座屈させるのですかログ怜玢ずは䜕ですか、そこで䜕ができたすか



はい、このアプロヌチの箱から出しお、テキストログがある堎合、小さなギャグがありたす。たずえば、メッセヌゞナヌザヌなどのテキストでリク゚ストを蚭定できたす。これにより、usersサブストリングを持぀すべおのログが出力されたす。アスタリスク、他のほずんどのunixワむルドカヌドを䜿甚できたす。しかし、これだけでは䞍十分なようです。できるだけ早くNginxでりォヌムアップできるように、もっず難しくしたいず思いたす。







Elasticsearchから少し離れお、Elasticsearchではなく、別のアプロヌチでそれを実行しおみたしょう。構造ログに぀いお考えおみたしょう。これは、各ログ゚ントリが単なるテキスト行ではなく、サヌドパヌティシステムのいずれかが既補のオブゞェクトを取埗するためにシリアル化できる属性を持぀シリアル化されたオブゞェクトである堎合です。



これの利点は䜕ですか統䞀されたデヌタ圢匏です。はい、オブゞェクトは異なる属性を持぀こずができたすが、倖郚システムはJSONを読み取り、ある皮のオブゞェクトを受け取るこずができたす。



ある皮のタむピング。これにより、他のシステムずの統合が簡玠化されたす。デシリアラむザヌを䜜成する必芁がありたせん。そしお、デシリアラむザヌだけが別のポむントです。アプリケヌションで無䜜法なテキストを曞く必芁はありたせん。䟋「ナヌザヌは、そのようなIDスペシャリストを、そのような泚文で持っおきたした。」そしお、これはすべお毎回曞く必芁がありたす。



気になりたした。 「リク゚ストが届きたした」ず曞きたい。さらに「たあたあ、たあたあ、たあたあ」、非垞にシンプルで、非垞にITスタむル。







次ぞ移りたしょう。同意したしょう。JSON圢匏でログむンしたす。これは単玔な圢匏です。 Elasticsearchはすぐにサポヌトされたす。filebeatはシリアル化しおファむリングを詊みたす。それほど難しいこずではありたせん。たず、蚭定ファむルをpythonjsonloggerラむブラリからJSONFormatterフォヌマッタブロックに远加したす。ここに構成を保存したす。これは、システム内の別の堎所である可胜性がありたす。次に、format属性で、オブゞェクトに远加する属性を枡したす。



以䞋のブロックは、filebeat.ymlに远加される構成ブロックです。箱から出しお、JSONログを解析するためのfilebeatのむンタヌフェヌスがありたす。ずおもかっこいい。それがすべおです。このために他に䜕も曞く必芁はありたせん。そしお今、あなたのログはオブゞェクトのように芋えたす。







Elasticsearchで䜕を取埗したしたかむンタヌフェむスでは、ログが個別の属性を持぀オブゞェクトになっおいるこずがすぐにわかりたす。これにより、怜玢、フィルタヌの䜜成、耇雑なク゚リの実行を行うこずができたす。







たずめたしょう。これで、ログに構造ができたした。それらは䜿いやすく、むンテリゞェントなク゚リを曞くために䜿甚できたす。 Elasticsearchは、これらすべおの属性を解析するため、この構造を認識しおいたす。たた、Elasticsearchのむンタヌフェむスであるkibanaでは、Elasticsearchが提䟛する特殊なク゚リ蚀語を䜿甚しおこのようなログをフィルタリングできたす。



そしお、それはパドリングよりも簡単です。Grepはかなり耇雑でクヌルな蚀語を持っおいたす。曞くべきこずがたくさんありたす。キバナでは倚くのこずが簡単になりたす。これで敎理したした。



問題2.ブレヌキ



次の問題はブレヌキです。マむクロサヌビスアヌキテクチャでは、い぀でもどこでもブレヌキがありたす。







ここに少しコンテキストがありたす、私はあなたに話をしたす。私たちのプロゞェクトの䞻人公であるマネヌゞャヌが私に駆け寄っお来お、こう蚀いたす。ダヌニャ、救っお、助けお」



ただ䜕も知りたせん。Elasticsearchのログにアクセスしたす。しかし、実際に䜕が起こったのかをお話ししたしょう。







Erastが機胜を远加したした。本では、䜜者のIDではなく、圌の名前がむンタヌフェむスに衚瀺されるようになりたした。ずおもかっこいい。圌は次のコヌドでそれを行いたした。小さなコヌドで、耇雑なこずは䜕もありたせん。䜕がうたくいかない可胜性がありたすか



SQLAlchemyや他のORMでもこれを行うこずはできないず、蚓緎された目で蚀うこずができたす。ルヌプ内の小さなサブク゚リでデヌタベヌスに移動しないように、プリキャッシュなどを実行する必芁がありたす。䞍快な問題。そんな間違いは党然できないようです。



蚀っおおくけど。私は経隓がありたした。Djangoを䜿甚し、プロゞェクトにカスタムのプリキャッシュを実装したした。すべおが䜕幎もの間うたくいった。ある時点で、Erastず私は決めたした時代に遅れずに぀いおいきたしょう、Djangoを曎新しおください。圓然、Djangoはカスタムキャッシュに぀いお䜕も知らず、むンタヌフェむスが倉曎されたした。プリカシュは静かに萜ちた。これはテストでは怜出されたせんでした。同じ問題で、捕たえるのはもっず難しかったです。



どうしたのどうすれば問題の解決を手䌝うこずができたすか







ブレヌキを芋぀ける問題を解決し始める前に私がしたこずをお話ししたしょう。



私が最初にするこずはElasticsearchに行くこずです、私たちはすでにそれを持っおいたす、それは助けになりたす、サヌバヌの呚りを走る必芁はありたせん。キャビネットのログを探しお、ログに移動したす。長いク゚リが芋぀かりたした。私はそれをラップトップで再生し、それが抑制しおいるのはオフィスではないこずを確認したす。本を遅くしたす。



Booksのログに出くわし、問題のあるク゚リを芋぀けたした。実際、すでにそれがありたす。ラップトップでも同じように本を耇補したす。非垞に耇雑なコヌド-私は䜕も理解しおいたせん。デバッグを始めおいたす。タむミングをずるのはかなり難しいです。どうしお SQLAlchemyでこれを内郚的に決定するこずは非垞に困難です。私はカスタムタむムロガヌを䜜成し、問題をロヌカラむズしお修正したす。







それは私を傷぀けたした。難しい、䞍快。私は泣いた。問題を芋぀けるこのプロセスをより速く、より䟿利にしたいず思いたす。



問題を圢匏化したしょう。私たちのログは無関係なむベントのログであるため、速床が䜎䞋しおいるものをログで怜玢するこずは困難です。実行されたコヌドのブロック数を瀺すカスタムタむマヌを䜜成する必芁がありたす。さらに、倖郚システムのタむミングをログに蚘録する方法が明確ではありたせん。たずえば、ORMやリク゚ストラむブラリなどです。タむマヌを内郚たたは䜕らかのラッパヌに埋め蟌む必芁がありたすが、内郚で速床が䜎䞋する理由はわかりたせん。耇雑。







私が芋぀けた良い解決策はむ゚ヌガヌです。これはopentracingプロトコルの実装なので、トレヌスを実装したしょう。



む゚ヌガヌは䜕を䞎えたすかこれは、怜玢ク゚リを備えたナヌザヌフレンドリヌなむンタヌフェむスです。長いク゚リをフィルタリングするこずも、タグでフィルタリングするこずもできたす。リク゚ストの流れを芖芚的に衚珟した、ずおも矎しい写真です。少し埌でお芋せしたす。



タむミングは箱から出しおログアりトされたす。あなたは圌らず䜕もする必芁はありたせん。実行されおいるカスタムブロックの量を確認する必芁がある堎合は、Jaegerが提䟛するタむマヌでラップできたす。ずおも快適です。







むンタヌフェむスで問題を芋぀けお、そこでロヌカラむズするこずがどのように可胜であったかを芋おみたしょう。 Jaegerむンタヌフェヌスに入りたす。これが私たちのリク゚ストの様子です。アカりントたたは他のサヌビスのリク゚ストを怜玢できたす。長いク゚リはすぐにフィルタリングされたす。私たちは長いものに興味があり、ログから芋぀けるのは非垞に困難です。私たちは圌らのリストを取埗したす。







このク゚リに該圓するず、SQLサブク゚リの倧きな足がかりが衚瀺されたす。それらが時間内にどのように実行されたか、どのコヌドブロックが䜕を担圓したかを明確に確認できたす。ずおもかっこいい。さらに、私たちの問題の文脈では、これはログ党䜓ではありたせん。 2、3枚䞋にスラむドする倧きな足垃がただありたす。 Jaegerで問題をかなり迅速にロヌカラむズしたした。問題を解決した埌、む゚ヌガヌが提䟛するコンテキストは私たちに䜕を助けるこずができたすか







Jaegerログ、たずえば、SQLク゚リどのク゚リが繰り返されおいるかを確認できたす。ずおも速くおかっこいい。







私たちは問題を解決し、すぐにむ゚ヌガヌですべおが順調であるこずを確認したした。同じク゚リで、サブク゚リがないこずを確認したす。どうしお同じリク゚ストをチェックし、タむミングを確認するずしたす。Elasticsearchでリク゚ストが実行された時間を調べたす。次に、時間を確認したす。ただし、これはサブク゚リがなかったこずを保蚌するものではありたせん。そしお、ここで私たちはそれを芋る、かっこいい。







む゚ヌガヌを実装したしょう。倚くのコヌドは必芁ありたせん。 Flaskのopentracingの䟝存関係を远加したす。次に、実行しおいるコヌドに぀いお説明したす。



コヌドの最初のブロックは、Jaegerクラむアントのセットアップです。



次に、Flask、Django、たたは統合されおいるその他のフレヌムワヌクずの統合を蚭定したす。



install_all_patchesはコヌドの最埌の行であり、最も興味深いものです。MySQL、Postgres、リク゚ストラむブラリずやり取りするこずで、ほずんどの倖郚統合にパッチを適甚したす。これらすべおにパッチを適甚しおいるため、Jaegerむンタヌフェむスでは、SQLを䜿甚したすべおのク゚リず、必芁なサヌビスがどのサヌビスにアクセスしたかがすぐに衚瀺されたす。ずおもかっこいい。そしお、あなたは倚くを曞く必芁はありたせんでした。install_all_patchesを䜜成したした。魔法



䜕がありたすかこれで、ログからむベントを収集する必芁がなくなりたした。私が蚀ったように、ログは異なるむベントです。む゚ヌガヌでは、これはあなたがその構造を芋る䞀぀の倧きなむベントです。Jaegerを䜿甚するず、アプリケヌションのボトルネックを芋぀けるこずができたす。長いク゚リを怜玢するだけで、䜕が問題になっおいるのかを分析できたす。



問題3.゚ラヌ



最埌の問題ぱラヌです。はい、私は狡猟です。アプリケヌションの゚ラヌを取り陀くのは手䌝いたせんが、次に䜕ができるかを説明したす。







環境。次のように蚀うこずができたす。「Danya、゚ラヌをログに蚘録しおいたす。500件のアラヌトがあり、蚭定したした。なんでしょうログに蚘録し、ログに蚘録し、ログに蚘録しおデバッグしたす。



ログから゚ラヌの重芁性がわかりたせん。重芁性は䜕ですかここに、1぀のクヌルな゚ラヌず、デヌタベヌスぞの接続の゚ラヌがありたす。ベヌスがフロップしたした。この間違いはそれほど重芁ではないこずをすぐに確認したいず思いたす。時間がない堎合は無芖しお、より重芁な間違いを修正しおください。



゚ラヌ率は、それをデバッグするのに圹立぀コンテキストです。゚ラヌを远跡する方法は続けたしょう。1か月前にミスがありたしたが、今床は再び衚瀺されたす。すぐに解決策を芋぀けお修正するか、リリヌスの1぀ず倖芳を比范したいず思いたす。







これが良い䟋です。 Jaegerずの統合を芋たずき、APIを少し倉曎したした。アプリケヌションの応答の圢匏を倉曎したした。この゚ラヌが発生したした。しかし、なぜ私がキヌを持っおおらず、泚文オブゞェクトにたくさんあるのかは明確ではなく、私を助けるものは䜕もありたせん。同様に、ここで゚ラヌを確認し、それを再珟しお自分でキャッチしたす。







歩哚を実装したしょう。これは、同様の問題を解決し、゚ラヌのコンテキストを芋぀けるのに圹立぀バグトラッカヌです。歩哚開発者によっお維持されおいる暙準ラむブラリを利甚しおください。 4行のコヌドで、それをアプリケヌションに远加したす。すべお。







途䞭で䜕をしたしたかこれは、プロゞェクトごずにグルヌプ化しおフォロヌできる゚ラヌのあるダッシュボヌドです。゚ラヌログの膚倧なフットクロスは、同䞀の類䌌したものにグルヌプ化されたす。それらに関する統蚈が提䟛されたす。たた、むンタヌフェむスを䜿甚しおこれらの゚ラヌに察凊するこずもできたす。







私たちの䟋を芋おみたしょう。 KeyErrorに陥る。゚ラヌのコンテキスト、orderオブゞェクトに含たれおいたもの、存圚しなかったものがすぐにわかりたす。 Deliveryアプリケヌションが新しいデヌタ構造を提䟛しおくれたこずがすぐにわかりたす。キャビネットは単にこれの準備ができおいたせん。







私がリストしたもの以倖に歩哚は䜕を䞎えたすか正匏にしたしょう。



これは、それらを探すこずができる゚ラヌストアです。このための䟿利なツヌルがありたす。゚ラヌのグルヌプ化がありたす-プロゞェクトごず、類䌌性ごず。 Sentryは、さたざたなトラッカヌずの統合を提䟛したす。぀たり、間違いを監芖し、それらを凊理するこずができたす。タスクをコンテキストに远加するだけで、それだけです。これは開発に圹立ちたす。



゚ラヌ統蚈。繰り返したすが、これはリリヌスのロヌルアりトず比范するのは簡単です。セントリヌはこれであなたを助けたす。゚ラヌの暪で発生した同様のむベントも、゚ラヌの原因を芋぀けお理解するのに圹立ちたす。







たずめたしょう。シンプルでありながらニヌズを満たすアプリケヌションを䜜成したした。それはあなたがそのラむフサむクルでそれを開発し維持するのを助けたす。私たちは䜕をしたしたか 1぀のリポゞトリにログを収集したした。これは私たちに別の堎所でそれらを探さない機䌚を䞎えおくれたした。さらに、ログずサヌドパヌティの機胜であるツヌルで怜玢できるようになりたした。



統合トレヌス。これで、アプリケヌションのデヌタフロヌを芖芚的に監芖できたす。



たた、゚ラヌを凊理するための䟿利なツヌルを远加したした。どんなに頑匵っおも、アプリケヌションに含たれたす。しかし、私たちはそれらをより速くそしおより良く修正したす。



他に䜕を远加できたすかアプリケヌション自䜓の準備ができおおり、リンクがあり、それがどのように行われるかを確認できたす。すべおの統合はそこで発生したす。たずえば、Elasticsearchたたはトレヌスずの統合。入っお芋おください。



私がカバヌする時間がなかったもう䞀぀のクヌルなこずはrequests_idです。トレヌスで䜿甚されるtrace_idずほずんど違いはありたせん。しかし、私たちはrequests_idに責任があり、これが最も重芁な機胜です。マネヌゞャヌはrequests_idですぐに私たちのずころに来るこずができ、私たちは圌を探す必芁はありたせん。私たちはすぐに問題の解決を開始したす。ずおもかっこいい。



たた、実装したツヌルはオヌバヌヘッドであるこずを忘れないでください。これらは、すべおのアプリケヌションで察凊する必芁がある問題です。私たちのすべおの統合を無意識のうちに実装し、あなたの生掻を楜にしおから、抑制アプリケヌションをどうするかを考えるこずはできたせん。



芋おみな。それがあなたに圱響を䞎えないのなら、かっこいい。あなたはプラスを埗ただけで、ブレヌキの問題を解決したせん。これを忘れないでください。聞いおくれおありがずう。



All Articles