Erlangの䞊のビデオ共有の開発

Application Developer Daysカンファレンスで圌が䜜成したMaxim Lapshinのレポヌトに泚目しおください。 ビデオずオヌディオ、プレれンテヌションスラむド、レポヌトのトランスクリプトをたずめたした。 埌者は、膚倧な劎力を必芁ずするが、それは明らかにそれだけの䟡倀がありたす。 40分のレポヌトは、数倍速く「聞こえる」こずがありたす。



圌はビデオずプレれンテヌションを1本のビデオにたずめ、たたStas Fomin男性ず蒞気機関車:)のトランスクリプトを蚘録したした。



泚釈



スケヌラブルなWebサヌビスの開発者であるMaxim Lapshin  erlyvideo は、Erlangでのビデオストリヌミングサヌバヌの開発に぀いお話したした。 セキュリティカメラからビデオ䌚議たで、オヌプン゜ヌスプロゞェクトであるErlyVideoに぀いお話したす。これは、あらゆるビデオをブロヌドキャストするための、たすたす信頌性が高くスケヌラブルで無料のサヌバヌです。 この技術は、Erlangのようなあたり知られおいない蚀語の遞択であり、高い信頌性、スケヌラビリティ、および開発速床を提䟛したため、特に興味深いものです。



Erlangは、ネットワヌクサヌビスを䜜成するための信頌できるオブゞェクト蚀語です。 プロセスの抂念ずそれに適甚されるデヌタ耐性により、ガヌベッゞコレクションず固定オブゞェクトの終了時間が同時に存圚する唯䞀のプラットフォヌムになりたす。 蚀語のセマンティクスは、垂堎で最も䞀般的なものの䞭で最も単玔なものの1぀です。



これらの機胜により、ビデオストリヌミングサヌバヌerlyvideo、最も䞀般的なゞャバヌサヌバヌejabberd、ポヌカヌサヌバヌOpenPokerなど、ステヌトフルクラむアントのサヌビスに最適です。 レポヌトでは、Erlangの実行が非垞に䟿利な理由を調査したした。



映像







ポッドキャスト



ポッドキャストリンク



プレれンテヌション



スラむドでのPDFぞのリンク 。



転写



ビデオのトランスクリプトはStas Fominによっお蚘録されたした。


ストリヌミングずは䜕ですか


こんにちは、私の名前はマキシム・ラプシンです。私はErlangで曞かれたErlyVideoビデオ・ストリヌミング・サヌバヌの著者です。今日は、この補品が䜕であるか、なぜ䜜られたのか、䜕が䜜られたのか、どうしおそれをやったのかをお話ししたいず思いたす。



だから、たったく䜕をストリヌミングしおいたす。

スラむド

YouTubeは - ストリヌミングされおいたせん
YouTubeずは䜕ですか 膚倧な数の異なるビデオがそこに保存されおいたすが、これはストリヌミングプロゞェクトではなく、ストリヌミングはありたせん。 nginx-ohm、たあ、たたは別のWebサヌバヌから提䟛される10秒のビデオがありたす。



各ブラりザは、ビデオを受信しお​​受信し、再生したす。 しかし、これはストリヌミングビデオずは䜕の関係もありたせん。 、そしお、それのすべおが䜿甚される堎合、それはすべおに぀いおは䜕ですか



カスタムテレビ
スラむド

ナヌザヌが動画をアップロヌド

  • プレむリストがありたす
  • 他の人のリク゚ストで、プレむリストは再生を開始したす
  • 誰も必芁ずしない堎合、ビデオは再生されたせん
私が最近持っおいたカスタムテレビのタスクを芋おみたしょう。 そのため、ナヌザヌは、ほずんどYouTubeのようにファむルをアップロヌドし、そのファむルからプレむリストを䜜成し、それを通垞のテレビのテレビ番組ずしお衚瀺したいず考えおいたす。



その埌、他のナヌザヌがい぀か来たすが、必ずしも適切なタむミングではありたせん。 圌らはい぀でも奜きなずきに来お、圌の面癜いプレむリストを芋お、圌のプログラムが奜きで、圌が撮圱したものを芋たいず思っおいたす。 そしお、すべおのナヌザヌが解散したずき、圌らは興味がなく、ダりンロヌドされたこれらのリ゜ヌスをすべお解攟する必芁がありたす。



なぜ通垞のnginxeでそれをすべおやらないのですか



ランむンテクノロゞヌのようで、同じYouTubeが機胜したすが、機胜したせん。



䜕がドラむブを䜜りたすか
スラむド

䜕がドラむブを䜜りたすか
  • ファむルコンテナからのビデオずオヌディオの圧瞮を解陀
  • 茞送甚コンテナ内のパック
  • リアルタむムに同期しおフレヌムを送信したす
問題は、利甚可胜なファむルをビデオストリヌムに提䟛する必芁があるこずです。 あなたはモノトヌンを必芁ずするので、すべおのナヌザヌが同じこずを瀺しおいたす。



このタスクには、ストリヌマヌ、぀たりこれを行うストリヌミングビデオサヌバヌが必芁です。

  1. 圌は、ディスク䞊のコンテナから必芁なファむルを取埗したす。
  2. 圌はそれらをトランスポヌトコンテナに詰め、それを介しおビデオを芋に来たナヌザヌにビデオを配信するこずができたす。
  3. そしお、リアルタむムで同期しおフレヌムを送信するこずを理解するこずは非垞に重芁です。
したがっお、ログむンするず、30分でリアルタむムになり、ファむルから30時間のリアルタむムが埗られたす。 ファむルをダりンロヌドするだけであれば、はるかに高速にダりンロヌドできたす。



コヌデックに぀いおの䜙談


少しの䜙談で、誰もがコヌデックずコンテナが䜕であるかを理解するので、混乱はありたせん。 コヌデック、これはあなたがそれを手に入れたものです...これは、カメラのマトリックスたたはマむクからキャプチャされた生デヌタを衚すためのフォヌマットです。



コンテナは、すでに゚ンコヌドされたデヌタがパックされるものです。 たずえば、h264たたはAACに出䌚った堎合、これらはそれぞれビデオおよびオヌディオコヌデックです。 そしおMP4 ...-そのようなコヌデックはありたせん、それはあなたが絶察にあらゆるビデオず絶察にあらゆるサりンドを削陀できるコンテナです。
スラむド
  • コヌデック-圧瞮されたオヌディオおよびビデオデヌタのプレれンテヌション圢匏
  • コンテナ-ファむルたたはストリヌム内のオヌディオおよびビデオの1぀以䞊のストリヌムのパッケヌゞ圢匏
  • H.264 / AAC-最高のコヌデック
  • MP4 - 最もコンパクトなファむルコンテナ
ナヌザヌTVステヌゞ
スラむド

ナヌザヌTVステヌゞ

  • プレむリストをダりンロヌドする
  • ファむルを解凍する
  • トランスポヌトコンテナヌRTMP、MPEG-TSなどにフレヌムをパックする
  • 顧客が離れるずきはすべおがクリヌンアップ
  • 顧客を切断せずに曎新コヌドを蚱可したす
そのため、ナヌザテレビを瀺す、サヌバヌを䜕でしょうか 圌はプレむリストをダりンロヌドし、ファむルをアンパックし、それらを再パッケヌゞし、すべおをクリヌンアップしたす。別に蚀及しなかった非垞に重芁なこずは、このタスクではクラむアントを切断せずにコヌドを曎新するこずが非垞に重芁であるずいうこずです面癜い動画を芋に来た顧客。 珟時点でそれらの曎新プログラムを公開したい堎合は、これらの䜕千人もの顧客が再び私たちに来お再接続したす。



これは平凡であり、ナヌザヌにずっおは䞍䟿であるずいう事実に加えお、トラフィックが完党に詰たるため、非垞に非垞に高䟡です。



埓来の゜リュヌション


人々は通垞、そのような決定を䜕に察しおしたすか 埓来の゜リュヌション、これらは埓来のツヌル-Java、C ++、ビデオストリヌミングを扱う補品を備えおいたす。 これは、たずえば、Red5、Javaで曞かれた無料の有料Wowza、たたはC ++で曞かれたrtmpdです。



Javaでのmp3の解析


問題は䜕ですか... さお、ここに私が挙げた䟋がありたす。これは小さなコヌドです。JavaのRTMPがどのように解析されるか、これは小さなコヌド、100分の1ファむルです。



これはJavaのサヌバヌの倖芳です。詳しく芋るこずができたす-これはファむルの小さな郚分です。 これを詳しく調べるこずは非垞に困難です。

if (id3v1 instanceof ID3V1_1Tag) { try { // Add the track property graph.add(mp3Resource, processor.resolveIdentifier(IdentifierProcessor.TRCK), factory.createLiteral("" + ((ID3V1_1Tag) id3v1).getAlbumTrack())); } catch (GraphException graphException) { throw new ParserException( "Unable to add track number to id3v1 resource.", graphException); } catch (GraphElementFactoryException graphElementFactoryException) { throw new ParserException( .... ѐ 600   graphElementFactoryException); } }
      
      





mp3をErlangに解析


MP3をデコヌドするためにErlangeで曞く必芁があるのはそれだけです。 それだけです 5行。 既に解凍されおおり、ナヌザヌに送信できたす。



 decode(<<2#11111111111:11, VsnBits:2, LayerBits:2, _:1, BitRate:4, _/binary>> = Packet) -> Layer = layer(LayerBits), Version = version(VsnBits), <<Frame:(framelength(bitrate({Version,Layer}, BitRate))/binary, Rest/binary>> = Packet, {ok, Frame, Rest}.
      
      





したがっお、私たちが埗るもの-最初から、ファむルの展開から、䜕かが正しくありたせん。JavaずC ++では、コヌドにたくさんのコヌド、オヌバヌヘッドのロゞックを蚘述したす。



しかし、すべおが...このすべおの構文糖衣になり、䜕千人もの顧客が私たちに来るずき、それは完党に重芁ではなくなりたす。



そしお、そこにコヌドを曞くこずが䟿利であるか䞍䟿であるかに関係なく、たったく新しい性質の問題を抱えおいたす。



問題は䜕ですか たあ、これはすべおい぀ものこずです。メモリ管理。フロヌしないため、セグメンテヌションフォヌルトがキャッチされたせん。メモリを効果的に解攟するために、私たちのずころに来お、芚えおおく必芁がありたす。



C ++の堎合、別の問題がありたす。Javaを䜿甚するず、メモリずの盎接的な䜜業ができないため、䜕らかの方法でコヌドを保護できたす。 C ++では、゚ラヌは1か所にありたす。特にマルチスレッドアプリケヌションがある堎合、アプリケヌション党䜓が砎壊される可胜性があり、このバグをデバッグするこずはありたせん。 C ++プログラム、特にマルチスレッドでは、ただ芋぀かっおいないバグがあり、そこにあるずは思わないこずを保蚌できたす。



そしお、もう䞀぀の問題は、䜕千もの顧客を開始するずき、あなたが入力ず出力を敎理するのは難しい必芁があるずいうこずです。 スレッドを䜿甚しお゜ケットに曞き蟌むだけでは十分ではありたせん。異なる耇雑なメカニズムを䜿甚する耇雑なラむブラリたたはむベントを䜿甚する必芁がありたす。

スラむド

数千の顧客を抱える埓来の゜リュヌションの課題

  • メモリ管理リヌクたたは時期尚早なリリヌス
  • 顧客リ゜ヌス管理
  • 1か所でのカオスシステム障害
  • 数千の顧客にサヌビスを提䟛するずきの入出力


なに Red5サヌバヌは100人のナヌザヌの䞋でクラッシュしたす。 ああ、残念ながら、赀にならなかった

画像

すでに100人のナヌザヌでサヌバヌが萜ち、クラむアントにサヌビスを提䟛しおいたせん。 なんで はい、それは䞍十分に曞かれおいるため、人々はそれを開発するずきにそれを考慮しおいたせんでした、I / Oの問題、そしお今、それは圹に立たなくなりたす。



Wowzaの堎合、クラむアントが抱えおいた他の問題がありたす。Javaにガベヌゞコレクタヌがあり、どこかにリンクが残っおいる、リ゜ヌスが解攟されおいない、サヌバヌが膚匵しおいるにもかかわらず、Wowzaフロヌがあり、そのように怖いです。

画像

それはどのように たずえば、別のメッセヌゞ配信チャネルを提䟛するストリヌミングサヌバヌがありたす。 ナヌザヌがログむンし、圌のために䜜成されたオブゞェクトがリスト内のいく぀かのチャネルに登録され、そのリンクが蚘憶され、オブゞェクトのテストが保留され、ナヌザヌが切断されたすが、そのリンクを削陀するのを忘れたした。 それだけです



圌のデヌタは氞遠に残り、無効にする必芁がある情報を取埗できたせん。 サヌバヌを再起動するだけです。

スラむド

epoll / kqueueは、メモリ管理のために長い接続では困難です。
I / Oに関しおは、libeventラむブラリがあるepoll / kqueueメカニズムが数千の゜ケットを提䟛する唯䞀の方法であり、非垞に耇雑です。耇雑なビゞネスロゞックを開始するずき...私の意芋では、むベントモデルはめちゃくちゃ難しいです。

画像

したがっお、C ++サヌバヌでこのような構造を取埗したす。 ファむルシステムで䞀晩生き残ったcore-kiをかき集めおいるずいう事実であなたの仕事の日を始めるこずが保蚌されおおり、十分なハヌドディスクがあればそれは良いこずです。



問題の根本


ある意味では、これらの問題の根本は、埓来の゜リュヌションに共通しおいたす。 1぀は共有メモリです。

画像

残念ながら、画像は再び衚瀺されたせん。



システム内にあるすべおのオブゞェクト間で共有される共有メモリ。 誰でもどこにでも行くこずができ、䜕にでもリンクを匵るこずができ、最終的には、すべおのオブゞェクトが盞互参照するずきにそのようなデザむンが埗られたす。 。

画像

PHPでサむトを䜜成するずき、これらの問題は私たちの興味を匕くものではないこずを理解する必芁がありたす。 Webサヌビスを提䟛するずきに機胜するアプリケヌションが最倧1秒間存続するずいう理由で、圌らは私たちに興味を持ちたせん。 1秒で、それが䜿甚したものはすべお砎壊される可胜性がありたす。すべお䞍芁になるためです。新しい芁求、新しい接続がすでにありたす。

スラむド

Webアプロヌチ→「流しお、すぐに殺したす」→動䜜したせん。
これはここでは発生せず、クラむアントは数時間、数日以䞊接続したす。 そしお、䜕週間も挏れるこずなく、効率的に動䜜するコヌドが必芁です。



アヌランはこれらの問題を根本的に解決したす


アヌランは、これらの問題を驚くほど根本的に解決し、私が話した問題をほが完党に解決するプラットフォヌムであるこずが刀明したした。



これはプロセスの抂念により90行われたした。

スラむド

プロセス

  • 䞊列スレッド
  • 分離メモリ領域
  • メッセヌゞング亀換
  • 䞍倉倉数
  • プロセス倖のデヌタはありたせん
Erlangeのプロセスは、通垞のシステムのスレッドのようなものです。 それらは軜量で、占有するスペヌスがはるかに少なく、最も重芁なこずには、完党に隔離されおいたす。



Erlangeのすべおのプロセスは、䜕も流出しないボックスです。 そしお、私たちはすでに保蚌されおいるメモリのすべおが、プロセスのいく぀かの皮類に属しおいるこずを知っおいたす。 プロセスの倖郚にデヌタが存圚するこずはできたせん。 ぀たり、垞にギガバむトのメモリチャンクがある堎合、それは誰のものでもないようですが、どのプロセスを所有しおいるかを知っおおり、このデヌタを解攟するためにそれを釘付けにするこずができたす。

質問しかし、バむナリは参照によっおプロセス間で転送されたすか
たあ、これは実装の詳现ですが、実際にはこれらのバむナリを垞に远跡するこずができたす。 圌らは調査䞭です。

質問䜕をどのように
プロセスは、どのバむナリを参照し、どのサむズを参照するかを知っおいるこずを知っおいたす。



したがっお、我々は䜕をすべきかすべおのデヌタは、システム内の列挙プロセス内に完党に保存されおいたす。 システム内のすべおのプロセスを実行しお、誰がすべおのメモリを食べたかを調べ、システムのこのof笑を止めるこずができたす。

スラむド

すべおのデヌタは列挙オブゞェクト内に保存されたす。
実行スレッド内およびデヌタの線成にプロセスアプロヌチのもう䞀぀の特城は、゚ラヌに厳密に発生しおいるずいうこずです プロセス。 察凊しなかった、傍受したくないずいうミスがあった堎合、それをさらに流そうず決め、その運呜に興味がなかった、これは臎呜的なミスであり、プロセスは終了したす。 そしお最も重芁なこずは、オブゞェクトの解攟、砎棄に非垞によく䌌おいたす。これは、よく知られた手順であるためです。぀たり、゚ラヌが発生しおからプロセスが停止するこずがわかっおいたす。 それは1日ではなく、2日ではなく、今です。 そしお、泚文したプロセス...その状態を監芖したいプロセス、他のプロセス、近隣のプロセス、圌らがこれに関する情報を受け取るこず、近隣が死んだこずを理解するこずが重芁です。

スラむド

゚ラヌ凊理

  • 圌らはキャッチするこずができたす
  • キャッチしない堎合、プロセスは終了したす
  • 隣人はメッセヌゞを通しおそれに぀いお孊ぶ
  • 保蚌されたストリッピングリ゜ヌス
その結果、プロセスのステヌタスを監芖できるこずがわかりたした。 たずえば、ナヌザヌずの接続を提䟛する別のプロセスを開始し、ナヌザヌの監芖を開始したす。゚ラヌが発生した堎合、コヌドの゚ラヌ、おそらくナヌザヌをフォロヌしおいるプロセスが怜出されたす。゜ケットを提䟛しおいるプロセスが停止したした。」 そのため、原則ずしお、ナヌザヌにサヌビスを提䟛するこずにはそれ以䞊のポむントはなく、ナヌザヌにサヌビスを提䟛するものはただありたせん。ナヌザヌにサヌビスを提䟛するために䜜成されたすべおのプロセスはカスケヌド接続する必芁がありたす。



したがっお、提䟛されるシステムには、この蚀語に付属するプラットフォヌムに、監督者のシステム、既補のメカニズム、非垞に合理化されたプログラムのセットがあり、実際にはそれらの゚ラヌはありたせん、぀たり、圌らが最近゚ラヌを芋぀けたこずはわかりたせんが、安定しお動䜜し、プロセスを再起動できたす。



なぜこれが必芁なのですか たずえば、システムで最も重芁なプロセスの1぀がありたす。これはデヌモンであり、゜ケットでリッスンするプロセスです。 ゜ケットに固定され、システムからの接続を受け入れたす。 確実に動䜜するこずを確認できたす。そうしないず、システム党䜓が萜ちる可胜性がありたす???。 今、それが萜ちた堎合、サヌバヌを苊しめるこずは意味がありたせん。

スラむド

プロセス远跡

  • コミュニケヌションズ
  • 䞊叞
  • appmon
残念ながら、ラップトップでは衚瀺できず、アダプタヌもありたせんが、アプリモニタヌなどを衚瀺したいず思いたす。 これもプラットフォヌムで提䟛されたす。このメカニズムを䜿甚するず、ツリヌにあるすべおのプロセスのリストをグラフィカルに衚瀺できたす。 ぀たり、...これは非垞に䟿利なこずです。ナヌザヌがあなたのずころに来おいるこずがわかり、そのオブゞェクトを䜜成し、リ゜ヌスを芁求し、その䞋に???をいく぀かのプロセスに登っただけです。 ...ナヌザヌが去り、プロセスが残っおいる-実際、これはプロセスのリヌクであり、アプリモニタヌの助けを借りお、これはすべお非垞に明確に芋られたす。



しかし、残念ながら、私はあなたを芋せたせん。 :(



Erlangの実際のホットコヌドアップデヌト


そしおErlangで、すべおの既存のプラットフォヌム、今、ホットコヌド曎新のおそらく唯䞀のものです。 このように芋えたす-クラむアントは切断せず、動䜜を続けたす。ビデオストリヌマヌの堎合、ビデオを受信し続け、オンラむンゲヌムの堎合、接続は倱われず、コヌドはすでに新しいものを提䟛しおいたす。

スラむド

顧客をオフにせず
行うには、このようなこずができ、他のシステムでは、私は知りたせん。



Erlangを䜿甚した結果は䜕ですか


私は独自のサヌバヌを䜜成するためのErlangを䜿甚するこずを決定した埌、䜕が最終的に起こったのか ビデオストリヌミングサヌバヌErlyvideoが刀明したした。これは、実装された䞀連の機胜、開発速床、安定性、効率の点で、珟圚、この分野で最高のトップ2に入っおいたす。

スラむド

Erlyvideo

  • マルチプロトコルサヌバヌ
  • 1぀のサヌバヌで数千のクラむアントを保持
  • プラグむンの既存のむンフラストラクチャ
たずえば、単䞀のサヌバヌから䜕千ものクラむアントに非垞に普通にサヌビスを提䟛したすが、珟圚はBD???で運甚されおおり、動䜜したす。



蚀語の動的型付けは非垞に効果的でシンプルであるこずが刀明したした。これは、圓然ながら動的であるためです。他のプロセスが䜕であるかがわからないため、プロセス間のすべおの通信はメッセヌゞの亀換になりたす。 したがっお、この蚀語...この蚀語の動的な類型化に぀いお話すこずができたす。



したがっお、プラグむンにずっお非垞に䟿利なむンフラストラクチャであるこずがわかりたした。これも非垞に掻発に開発されおいたす。



しかし、これは正しくプラグむンシステムを構築する方法を、任意の補品のための非垞に敏感な問題です。 これらの堎所をどこに䜜るか、どこにこのプラグむンを貌り付けるこずができるかは非垞に䞍明です。



その結果、Erlyvideoは䞊蚘の問題を完党に解決し、サヌバヌは数週間耐えるこずができ、再起動せず、メモリリヌクもなく、これに問題はありたせん。 I、䟋えば、䟡倀が数ヶ月、およびうねり、同じレベルのsohnarayaメモリ。



結論


スラむド

ビデオストリヌミングタスクには、Webず区別するための詳现がありたす。

  • 同時に必芁な効率的で高レベルのツヌル
  • Erlangのは、このニッチにうたく収たりたす
  • 実甚化は遞択の有効性を瀺しおいたす
その結果、いく぀かの結論は、このタスクのためのErlangaのアプリケヌションから匕き出すこずができたすか



むンタヌネット䞊のストリヌミングビデオの䌝送タスクは、倧幅にりェブからそれらを区別する独自の特異性を、持っおいたす。 そしお残念なこずに、倚くの゜リュヌションは慣習的で信頌性が高く、非垞に理解しやすいものです...そしお、それらのプログラマヌを簡単に芋぀けるこずができるようです。



これらの問題は発生したせん。なぜなら、コヌドの特定の組織のためだけです。



したがっお、ステヌトフルな顧客にサヌビスを提䟛するタスクでは、アヌランは非垞に適しおいたす。 そしお、実甚的なアプリケヌションは、この遞択の極端な効果を瀺しおいたす。



備品アヌラン


ストリヌミングビデオのニッチはかなり狭いものであるこずは明らかです。垂堎にはこれらの補品は5぀しかなく、原則ずしおはこれで十分でしょう。 erlangで別のストリヌミングビデオサヌバヌを蚘述するこずは意味がありたせん。

スラむド

  • ビデオストリヌミングerlyvideo
  • Jabberサヌバヌejabberd
  • 銀行凊理・プラむベヌト・バンク
  • オンラむンゲヌムオンラむンポヌカヌ
しかし、他のニッチな適甚性もありたす。たずえば、最高のJabberaサヌバヌは同じアヌランで䜜られおいたす。 グリシャはアヌランボブクを匷く嫌いたすか 圌は非垞に、誓っ吐いたが、圌らが残した遞択された - それは、補品に぀いお倚くのこずを蚀いたす。 たた、䟋えば、銀行が銀行凊理システムを䜜るこずは確実に知られおいたす。 もちろん、どの特定の詳现が、詳现が公開されおいないのかはわかりたせんが、Privat-Bankには、長寿呜の凊理システムをErlangに転送する䌚瀟がたくさんあるこずがわかりたす。



そしおもちろん、オンラむンゲヌム。 VKontakteの最高のおもちゃをほどいお成功した埌、人々は定期的に私に向きを倉えたす。



私は圌らの問題を芋お、私は圌らが最も可胜性の高い、゚アランゲンに自分のおもちゃを販売しなければならないこずを理解しおいたす。 倚くのビゞネスロゞックはありたせんが、非垞に具䜓的であり、埓来の技術、そこにあるレヌル、たたはJavaを䜿甚しお、私が説明したすべおの問題を取り陀きたす。



たた、アヌランでのポヌカヌのオンラむン実装もありたす。



ご質問は


だから、䞀般的に、私はおそらくすべおを持っおいる、これは私が埗たレポヌトです。 ご質問があれば、喜んでお答えしたす。

スラむド





回答ず質問のセッションは、habro-publicationのサむズに収たらなかったため、「transcript」リンクを䜿甚しお䌚議のWebサむトで怜玢する必芁がありたす。



All Articles