多数のHTMLテンプレートファイルを含む大規模なMeteorアプリを構築するためのベストプラクティスは何ですか?[閉まっている]


165

すべての例(リーダーボード、ワードプレイなど)では、1つのHTMLテンプレートファイルがあります。ベストプラクティスの例として使用できる、さまざまなHTMLテンプレートファイルを含む大きなオープンソースのMeteorプロジェクトはありますか?大規模なアプリが必要とするすべてを1つのテンプレートファイルにまとめるのは実用的ではないようです。


流星は新しいものです、これに関連するベストプラクティスは見つかりませんでした。これについてのギルドラインも期待しています
newlife

10
マニュアルでアプリケーションの構造化に関する部分を読みましたか?HTMLファイルのスキャンと連結についての説明があります。
zwippie 2012

1
Meteor公式ガイドは非常にクールなファイル構造を提案しています。ここをチェックしてください:guide.meteor.com/structure.html#javascript-structure
Waqas

回答:


16

全部まとめて!ドキュメントから:

> HTML files in a Meteor application are treated quite a bit differently
> from a server-side framework. Meteor scans all the HTML files in your
> directory for three top-level elements: <head>, <body>, and
> <template>. The head and body sections are seperately concatenated
> into a single head and body, which are transmitted to the client on
> initial page load.
> 
> Template sections, on the other hand, are converted into JavaScript
> functions, available under the Template namespace. It's a really
> convenient way to ship HTML templates to the client. See the templates
> section for more.

29
しかし、これはポスターの関心事です。しこりは問題ありませんが、Asanaで何が起こるかを確認できます。1MBを超えるクライアントコードをダウンロードする際には、ロード画面が必要です。それは多くのサイトでは受け入れられません。メイン画面の読み込み後に、部分的な読み込みの一部を実行できないかどうかを確認しますが、今は疑問があります。少し分解する機能になる必要があると思います。
デイブ・サンダース

36
この答えはグーグルのナンバーワンの結果ですが、それは確かに時代遅れです。その他、私のような将来の訪問者。下を見て!
Kloar 2014

1.1.0.2以降、ブラウザのキャッシュを削除してハードリロードすると、デモのシンプルなtodoアプリが1.7MBのファイルを転送します。これは、世の中にある多くのユースケースでは受け入れられません。:/アセットがキャッシュされると物事は大幅に改善されますが、最初のロードではかなり残酷です。
ジェイソンキム

アイデア:webpackを使用し、物事のバンドルを作成し、必要に応じて遅延ロードします。
trusktr 2015年

はい、アサナはロードに時間がかかります。Asanaは、ユーザーが2014年に1億7,500万のタスクを作成した、非常によくできた反応的なアプリでもあります。より速く読み込まれるアプリが常に優れているとは限りません。スマートフォンでもアプリが起動するまで少し時間がかかります。人々はそれに慣れるでしょう。
Max Hodges

274

非公式の流星のよくある質問と同様に、大規模なアプリを構築する方法もほぼ説明されていると思います。

ファイルはどこに置くべきですか?

流星のサンプルアプリは非常にシンプルであり、洞察をあまり提供しません。これを行うための最良の方法についての私の現在の考えは次のとおりです(提案/改善は大歓迎です!)

lib/                       # <- any common code for client/server.
lib/environment.js         # <- general configuration
lib/methods.js             # <- Meteor.method definitions
lib/external               # <- common code from someone else
## Note that js files in lib folders are loaded before other js files.

collections/               # <- definitions of collections and methods on them (could be models/)

client/lib                 # <- client specific libraries (also loaded first)
client/lib/environment.js  # <- configuration of any client side packages
client/lib/helpers         # <- any helpers (handlebars or otherwise) that are used often in view files

client/application.js      # <- subscriptions, basic Meteor.startup code.
client/index.html          # <- toplevel html
client/index.js            # <- and its JS
client/views/<page>.html   # <- the templates specific to a single page
client/views/<page>.js     # <- and the JS to hook it up
client/views/<type>/       # <- if you find you have a lot of views of the same object type
client/stylesheets/        # <- css / styl / less files

server/publications.js     # <- Meteor.publish definitions
server/lib/environment.js  # <- configuration of server side packages

public/                    # <- static files, such as images, that are served directly.

tests/                     # <- unit test files (won't be loaded on client or server)

大規模なアプリケーションの場合、個別の機能は、同じパターンを使用して編成されたサブディレクトリに分割できます。ここでの考え方は、最終的には機能モジュールが個別のスマートパッケージに分解され、理想的には共有されるというものです。

feature-foo/               # <- all functionality related to feature 'foo'
feature-foo/lib/           # <- common code
feature-foo/models/        # <- model definitions
feature-foo/client/        # <- files only sent to the client
feature-foo/server/        # <- files only available on the server

詳細:非公式の流星に関するFAQ


12
私見これは受け入れられた答えよりも優れています。今からやってみます。
hakan 2013

17
0.6.0以降、この混乱を回避し、スマートパッケージから完全にアプリを実行する方がはるかに良いでしょう。このブログ投稿でもう少し詳しく説明します:matb33.me/2013/09/05/meteor-project-structure.html
matb33

1
誰がどこに置くべきmobile-config.jsか手掛かりがありますか?
デュード

1
回答とunofficial-faqへのリンクをありがとう(私は流星界では新しい)、「他の人からの一般的なコード」とはどういう意味ですか?ありがとう!
Cohars、2015

3
流星1.3に関しては、これはES6モジュールのインポートのために古くなっていると思います。アプリケーション構造に関する流星ガイドの記事を参照してください:guide.meteor.com/structure.html
Samuel

36

私はyagooarに同意しますが、代わりに:

client / application.js

使用する:

client / main.js

main。*ファイルは最後にロードされます。これは、ロード順の問題がないことを確認するのに役立ちます。詳細については、Meteorのドキュメントhttp://docs.meteor.com/#structuringyourappを参照してください。


26

Meteorは、ほとんどどのような方法でもアプリを構築できるように設計されています。そのため、構造が気に入らない場合は、ファイルを新しいディレクトリに移動するか、1つのファイルを複数の部分に分割して、Meteorにほとんど同じようにすることができます。メインのドキュメントページhttp://docs.meteor.com/で指定されているクライアント、サーバー、パブリックディレクトリの特別な扱いに注意してください。

すべてを1つのHTMLの塗りつぶしにまとめるだけでは、ベストプラクティスとしては明らかになりません。

これが可能な構造の例です:私のアプリの1つ、ディスカッションフォーラムで、モジュールまたは「ページタイプ」(ホーム、フォーラム、トピック、コメント)で整理し、それぞれに.css、.html、および.jsファイルを置きますページを1つのディレクトリにまとめて入力します。また、共通の.cssおよび.jsコードを含む「ベース」モジュールと、ルーターに応じて{{renderPage}}を使用して他のモジュールの1つをレンダリングするマスターテンプレートもあります。

my_app/
    lib/
        router.js
    client/
        base/
            base.html
            base.js
            base.css
        home/
            home.html
            home.js
            home.css
        forum/
            forum.html
            forum.js
            forum.css
        topic/
            topic.html
            topic.js
            topic.css
        comment/
            comment.html
            comment.js
            comment.css

機能別に整理することもできます

my_app/
    lib/
        router.js
    templates/
        base.html
        home.html
        forum.html
        topic.html
        comment.html
    js/
        base.js
        home.js
        forum.js
        topic.js
        comment.js
    css/
        base.css
        home.css
        forum.css
        topic.css
        comment.css

私はいくつかのより具体的なベストプラクティス構造と命名規則が浮かび上がることを願っています。


2
これが私のお気に入りの答えです。Meteorの私の好きな点の1つは、自分に合った方法でファイルを構造化できることです。
CaptSaltyJack 2015年

私はこの答えが好きです。私はそれを最初の方法で行ってきました。
Sung Cho

関連するものは互いに近接している必要があります。私の答えはあなたのようなものですが、逆です。
Max Hodges 2015


「トピック」のような機能名で複数のファイルに名前を付けることには価値がありません。ここで、機能名を「カテゴリ」に変更する場合は、複数のファイル名を変更する必要があります。「トピック」と呼ばれる単一のフォルダーの下にそれらを整理し、それらに総称的に名前を付けます。events.js、views.html、styles、css、routes.jsなど。詳細については、私の回答を参照してください。
Max Hodges

14

このトピックについてグーグルするすべての人のために:

em新しい流星のAppを談合とき(EventedMindすることにより、鉄のルータの背後にある男)コマンドラインツールは非常に有用です。それは素晴らしいファイル/フォルダー構造を作成します。すでにアプリに取り組んでいて、それを再編成したい場合は、で新しいプロジェクトをセットアップするだけで、emそれをインスピレーションに使用できます。

参照:https : //github.com/EventedMind/em

そしてここ:https : //stackoverflow.com/questions/17509551/what-is-the-best-way-to-organize-templates-in-meteor-js


4
注:これはiron-cli(同じ作者)に置き換えられました。参照:github.com/iron-meteor/iron-cli
j0e

はい、「em」は同じツールであるiron-cliに名前が変更されました。
ミカエルリルバンク、2015

11

Discover Meteor Bookのファイル構造は本当に良いものであり、しっかりとしたスタートです。

/app: 
 /client
   main.html
   main.js
 /server 
 /public
 /lib
 /collections
  • / serverディレクトリ内のコードはサーバー上でのみ実行されます。
  • / clientディレクトリのコードは、クライアントでのみ実行されます。
  • それ以外はすべてクライアントとサーバーの両方で実行されます。
  • / lib内のファイルは、何よりも先にロードされます。
  • main。*ファイルは他のすべての後にロードされます。
  • 静的アセット(フォント、画像など)は/ publicディレクトリにあります。

10

パッケージを作成する

もちろん、すべてがこのアプローチに当てはまるわけではありませんが、大きなアプリでは、分離できる機能がたくさんあります。分離可能で再利用可能なものはすべてパッケージに収まり、他の回答で述べたように、残りは通常のディレクトリ構造になります。オーバーヘッドを回避するためにパッケージを作成しない場合でも、モジュール方式でコードを構造化することをお勧めします(これらの提案を参照)

Meteorでは、ファイルの読み込み方法(読み込み順序、クライアント/サーバー/両方)とパッケージがエクスポートする内容をきめ細かく制御できます。

特に、関連ファイル間でロジックを共有する簡単な方法がとても便利だと思います。たとえば、util関数をいくつか作成し、別のファイルで使用したいとします。あなたは単にそれを「グローバル」(なしvar)にし、Meteorはそれをパッケージの名前空間にラップするので、グローバル名前空間を汚染しません

これが公式のドキュメントです


6

meteorjsのコーディングからしばらく経ってから、かなり複雑なオンラインゲームの構築に専念できる時間があるので、私は幸せです。アプリの構造は私の最初の懸念事項の1つであり、機能的に異なるパッケージを緩やかに結合できるアプリを構造化するパッケージのみの方法を支持する優れたプログラマーが何人かいるようです。このアプローチには他にも利点があり、アプローチを説明する2つの非常に優れた記事がここにあります。

http://www.matb33.me/2013/09/05/meteor-project-structure.html http://www.manuel-schoebel.com/blog/meteorjs-package-only-app-structure-with-mediator -パターン


6

私たちには大きなプロジェクトがあります(おそらく、1.5年間フルタイムで開発されていたため、これまでに誰もが構築した最大のMeteorプロジェクトの1つです)。各ビューで同じファイル名のセットを使用します。非常に一貫性があり、探しているものにすばやく移動できます。

  • events.js
  • helpers.js
  • templates.html
  • routes.js
  • styles.less

プロジェクトでは次のようになります。

       ├──consolidationRequests
       │├──events.js
       │├──helpers.js
       │├──routers.js
       │└──templates.html
       ├──customerSpoof
       │└──routers.js
       ├──ダッシュボード
       │├──events.js
       │├──helpers.js
       │├──onDestroyed.js
       │├──onRendered.js
       │├──routers.js
       │└──templates.html
       ├──emailVerification
       │├──events.js
       │├──helpers.js
       │├──routers.js
       │└──templates.html
       ├──ローディング
       │├──styles.css
       │└──templates.html
       ├──メールボックス
       │├──autoform.js
       │├──consolidationRequestConfirmation
       ││├──events.js
       ││├──helpers.js
       ││├──onCreated.js
       ││├──onRendered.js
       ││└──templates.html
       │├──events.js
       │├──helpers.js

関連するテンプレートは、同じファイルに一緒に格納されるだけです。view/order/checkout/templates.htmlここに折りたたまれた表示の内容:

<template name="orderCheckout"></template>

<template name="paymentPanel"></template>

<template name="orderCheckoutSummary"></template>

<template name="paypalReturnOrderCheckout"></template>

多くのパーツでビューが複雑になる場合は、サブフォルダーを使用します。

       ├──カート
       │├──addItem
       ││├──autoform.js
       ││├──events.js
       ││├──helpers.js
       ││├──onRendered.js
       ││├──routers.js
       ││├──styles.less
       ││└──templates.html
       │├──チェックアウト
       ││├──autoform.js
       ││├──events.js
       ││├──helpers.js
       ││├──onRendered.js
       ││├──routers.js
       ││└──templates.html
       │└──表示
       │├──autoform.js
       │├──deleteItem
       ││├──events.js
       ││├──helpers.js
       ││└──templates.html
       │├──editItem
       ││├──autoform.js
       ││├──events.js
       ││├──helpers.js
       ││└──templates.html
       │├──events.js
       │├──helpers.js
       │├──onDestroyed.js
       │├──onRendered.js
       │├──routers.js
       │├──styles.less
       │└──templates.html

また、Meteor開発用の非常に強力で柔軟なエディターであるWebStormを使用して開発します。コードを検索して整理し、生産的に作業する際に非常に役立ちます。 Webstormビュー

リクエストに応じて詳細を共有させていただきます。


3
この回答を改善できると思われる場合は、コメントの追加を検討してください。
Max Hodges 2015

素晴らしいポスト。質問:流星でのこの時間のすべての後、あなたはまだそれをeコマースのような大規模なプロジェクトに勧めますか?または、LoopBackやHappiのように、より「自律性」を高めるフレームワークの使用を検討してください。
リコ

私たちはMeteorを愛し、その中ですべての新しい開発を行います。残念ながら、LoopBackやHappiについて十分に理解していません。
Max Hodges 2015年

1
LoopBacksはエンドツーエンドのREST APIに焦点を当てているため、従来のWeb開発フレームワーク(RoRなど)のように聞こえます。RoRはREST APIを正しく使用しましたが、Meteorはリアルタイムで正しく使用できると感じています。
Max Hodges 2015年

フィードバックをお寄せいただきありがとうございます。機能のためにサーバー側も編成しましたか?
Liko、2015年

5

iron-cli scaffolding CLIを使用します。物事は非常に簡単になります。

https://github.com/iron-meteor/iron-cli

インストールしたら。iron create my-app新しいプロジェクトを作成するために使用します。次の構造が作成されます。既存のプロジェクトでもこれを使用できます。iron migrateプロジェクトディレクトリで使用します。

my-app/    
 .iron/    
   config.json    
 bin/    
 build/    
 config/    
   development/    
     env.sh    
     settings.json    
 app/    
   client/    
     collections/    
     lib/    
     stylesheets/    
     templates/    
     head.html    
   lib/    
     collections/    
     controllers/    
     methods.js    
     routes.js    
   packages/    
   private/    
   public/    
   server/    
     collections/    
     controllers/    
     lib/    
     methods.js    
     publish.js    
     bootstrap.js

このリンクで質問に答えることができますが、回答の重要な部分をここに含め、参照用のリンクを提供することをお勧めします。リンクされたページが変更されると、リンクのみの回答が無効になる可能性があります。
user2314737 2015

@ user2314737シャウトアウトして、回答者が投稿を編集したことを伝えます。現在、問題に必要な重要なデータが含まれています。
Kyll、2015

4

私はマットアイアンボイラープレート形式に従っています。これには、すでにアイアンルーターとモデル(Collection2)が含まれています。下記参照 :

client/                 # Client folder
    compatibility/      # Libraries which create a global variable
    config/             # Configuration files (on the client)
    lib/                # Library files that get executed first
    startup/            # Javascript files on Meteor.startup()
    stylesheets         # LESS files
    modules/            # Meant for components, such as form and more(*)
    views/              # Contains all views(*)
        common/         # General purpose html templates
model/                  # Model files, for each Meteor.Collection(*)
private/                # Private files
public/                 # Public files
routes/                 # All routes(*)
server/                 # Server folder
    fixtures/           # Meteor.Collection fixtures defined
    lib/                # Server side library folder
    publications/       # Collection publications(*)
    startup/            # On server startup
meteor-boilerplate      # Command line tool

3

アプリの構造化にはさまざまなアプローチがあります。たとえば、ルーターとさまざまなページテンプレートがあり、各ページテンプレートの内部に多くのページパーツがある場合などは、上位から下位のセマンティクスに応じて構造化します。

例えば:

client
  views
    common
      header
        header.html
        header.js
        header.css
      footer
        footer.html
        footer.js
        footer.css
    pages
      mainPage
        mainPage.html
        mainPage.js
        mainPage.css
        articles
          articles.html
          articles.js
          articles.css
        news
          news.html
          news.js
          news.css
     ...

もちろん、別のページでニューステンプレートを使用できるので、ニューステンプレートをcommonフォルダーに置くこともできます。

私はあなたが快適にアプリを構成するのが最善だと思います。

私はここに小さなアプリを書きました:http : //gold.meteor.com そしてそれはとても小さいので、私は1つのhtmlファイルと1つのtemplate.jsファイルのみを使用します。

少しお役に立てば幸いです


「articles」のような機能名で複数のファイルに名前を付けることには価値がありません。ここで、機能名を「投稿」に変更する場合は、ファイル名を変更する必要があります。「articles」と呼ばれる単一のフォルダーの下にそれらを整理し、「events.js」、views.html、styles、cssなどの名前を付けます。詳細については、私の回答を参照してください。
Max Hodges

3

Evented Mindには、Meteorプロジェクトの設定と呼ばれる新しいクラスがあり、これに対処するだけでなく、プロジェクトの構成と開発環境の設定についても説明します。

クラスのアプリケーション構造のビデオから:Meteorは、アプリケーションの構造についてはあまり強い意見を持っていませんが、いくつかのルールがあります。

1)ロード順-Meteorは最初にファイルディレクトリの最も深い場所に移動し、ファイルをアルファベット順に処理します。

2)クライアントとサーバーはMeteorが認識する特別なフォルダーです

構造は次のようになります。

both/
    collections/
        todos.js
    controllers/
        todos_controller.js
    views/
        todos.css
        todos.html
        todos.js
    app.js - includes routes
client/
    collections/
    views/
        app.js
server/
    collections/
    views/
        app.js
packages/
public/

todos_controllerはRouteControllerを拡張したもので、Iron Routerに付属しています。

上記のemツールも現在大きなアップデートを取得中であり、https//github.com/EventedMind/emではるかに改善されて利用可能になるはずです


/ server / views /内のビューは何ですか?
stefcud 2016年

「todos」のような機能名で複数のファイルに名前を付けることには価値がありません。ここで、機能名を「タスク」に変更する場合は、5つのファイル名を変更する必要があります。"todos"と呼ばれる単一のフォルダーの下にそれらを整理し、 "events.js"、views.html、styles、cssなどの名前を付けます。詳細については、私の回答を参照してください。
Max Hodges

1

また、よく考えられたアーキテクチャを通じてアプリを拡張およびスケーリングするためのベストプラクティスも探しています。上記のプラクティスはすべて、中小規模のアプリで機能しますが、大きなチームで作業すると失敗します。私が試したいくつかの方法があります:

1)テンプレートをスケーリングして再利用するために、私はこの戦略に従いました:https : //github.com/aldeed/meteor-autoform。著者は、コンポーネントとフィールドの設計に関して非常に優れたアイデアを持っています。コミュニティがほぼすべてのケースをカバーする36個のパッケージを開発し、開発段階でTypeScriptを使用してタイプセーフにすることができるため、現在実装しています。

<template name="autoForm">
  {{#unless afDestroyUpdateForm this.id}}
  {{! afDestroyUpdateForm is a workaround for sticky input attributes}}
  {{! See https://github.com/meteor/meteor/issues/2431 }}
  <form {{atts}}>
    {{> Template.contentBlock ..}}
  </form>
  {{/unless}}
</template>

ここでそれを行う方法についての優れたブログ記事です:http://blog.east5th.co/2015/01/13/custom-block-helpers-and-meteor-composability/だけでなく、ここに:のhttp:// meteorpedia .com / read / Blaze_Notes

2)これはとても有望に見えますが、最近更新されていません。というコーヒースクリプトで書かれたパッケージです。MeteorのBlazeコンポーネント(https://github.com/peerlibrary/meteor-blaze-components)は、Meteorアプリで再利用する必要がある複雑なUI要素を簡単に開発するためのシステムです。CoffeeScript、vanilla JavaScript、ES6で使用できます。最良のことは、コンポーネントがOOPであることです。以下はその例の1つです。

class ExampleComponent extends BlazeComponent {
  onCreated() {
    this.counter = new ReactiveVar(0);
  }

  events() {
    return [{
      'click .increment': this.onClick
    }];
  }

  onClick(event) {
    this.counter.set(this.counter.get() + 1);
  }

  customHelper() {
    if (this.counter.get() > 10) {
      return "Too many times";
    }
    else if (this.counter.get() === 10) {
      return "Just enough";
    }
    else {
      return "Click more";
    }
  }
}

ExampleComponent.register('ExampleComponent');

{{> ExampleComponent }}

3)どこでいつ問題が発生するかを教えてくれるタイプとトランスパイラーが好きです。TypeScriptを使用してMeteorを操作していて、次のリポジトリを見つけました。https//github.com/dataflows/meteor-typescript-utils作成者がMVCアプローチを実行しようとしたようです。

class MainTemplateContext extends MainTemplateData {
    @MeteorTemplate.event("click #heybutton")
    buttonClick(event: Meteor.Event, template: Blaze.Template): void {
        // ...
    }

    @MeteorTemplate.helper
    clicksCount(): number {
        // ...
    }
}

class MainTemplate extends MeteorTemplate.Base<MainTemplateData> {
    constructor() {
        super("MainTemplate", new MainTemplateContext());
    }

    rendered(): void {
        // ...
    }
}

MeteorTemplate.register(new MainTemplate());

<template name="MainTemplate">
    <p>
        <input type="text" placeholder="Say your name..." id="name">
        <input type="button" value="Hey!" id="heybutton">
    </p>
    <p>
        Clicks count: {{ clicksCount }}
    </p>

    <p>
        <ul>
            {{#each clicks }}
                <li> {{ name }} at <a href="{{pathFor 'SingleClick' clickId=_id}}">{{ time }}</a></li>
            {{/each}}
        </ul>
    </p>
</template>

残念ながら、このプロジェクトは維持または積極的に開発されていません。

4)すでに述べたように、パッケージを使用してスケーリングできます。それには、優れた抽象的な考え方が必要です。それは望遠鏡で動作するようです:https//github.com/TelescopeJS/Telescope

5)meteor-template-extension –テンプレートヘルパー、イベントハンドラー、テンプレート間のフックをコピーするさまざまな方法を提供し、コードの再利用を可能にします。欠点は、すべてのコピーを開発者が何度も何度も行う必要があることです。これは、コードベースが大きくなると問題になります。さらに、明確に定義されたAPIコミュニティがなければ、コンポーネントを構築して共有することはできません

6)フローコンポーネント – API設計ではフローコンポーネントがReactに近く、Blazeコンポーネントはデータコンテキストやテンプレートヘルパーなどの使い慣れた概念を維持しています。一方、フローコンポーネントは引き続きテンプレートベースのイベントハンドラーを使用しますが、Blazeコンポーネントはそれらをクラスメソッドにして、継承による拡張やオーバーライドを容易にします。一般に、BlazeコンポーネントはよりOOP指向であるようです。フローコンポーネントはまだ正式にリリースされていません(#5および#6のテキストクレジットhttps://github.com/peerlibrary/meteor-blaze-components#javascript-and-es6-support

2番と3番もある程度慣れる必要がありますが、時間の経過とともに開発速度が向上します。4つ目は、コンポーネントをビルドおよびテストして、コードをより安定させることです。3番目には、Typescriptの完全な型安全性という利点があります。これは、不十分なドキュメントを使用してチームで開発する場合に非常に役立ちます。しかし、私は現在TypeScriptに2番を移植しています。GScriptを使用していないときにMeteorで動作させるためにコンパイラーパッケージを調整する必要がないからです。

Meteorを操作する正しい方法を見つけるのは依然として困難です。あなたはそれを自分で理解する必要があります。そうしないと、うまく整理されたフォルダ構造になってしまいますが、すべてがどこにあるのか手掛かりがありません。ハッピーコーディング。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.