プロジェクトのどの部分をソースコード管理に含める必要がありますか?


54

仲間の開発者が新しいDrupalプロジェクトの作業を開始し、システム管理者は「更新を簡単にスクリプト化できるようにする」ため、sites / defaultサブディレクトリのみをソース管理に配置することを提案しました。このやや疑わしい主張を別にすれば、別の疑問が生じます。どのファイルをソース管理下に置くべきでしょうか?また、いくつかの大きなファイルを除外する必要がある状況はありますか?

私の意見では、プロジェクトのツリー全体を制御する必要があり、これはDrupalプロジェクト、レール、またはその他のすべてに当てはまります。これは簡単なように思えます。作成するカスタムコードの場合と同様に、フレームワークのバージョン管理が明らかに必要です。

とはいえ、これについて他の意見を聞きたいと思います。すべてを制御下に置いていないという議論はありますか?


2
最終的な表現を生成するもの(ドキュメントを含む)は、ストレージが実現可能である限り、バージョン管理下にある必要があります。ここでは、コード生成がバージョン管理と疑わしく混同されているように聞こえます。そこでは、バージョン管理したものから簡単にスクリプトを作成する(読む:生成する)という主張を確認します。
MrGomez

回答:


71

ソース管理に含める必要のある最小限のものは、プロジェクトの実行バージョンを再作成するために必要なすべてのファイルです。これには、データベーススキーマをセットアップおよび変更するためのDDLファイルも含まれており、正しい順序でもあります。もちろん、プロジェクトのビルドと実行に必要なツールや、ソース管理の他のファイル(ソース管理のJavaファイルから生成されたJavaDocファイルなど)から自動的に派生/生成できるものはすべて除外します。


1
@EdWoodcock:そのとおりです。正しい順序を取得するのは大変なことですが、場合によっては、データベースの特定の状態を再作成したり、テスト時に特定の変更を適用したい場合があります。プロジェクトによって異なることがわかりました。
FrustratedWithFormsDesigner

1
要点は、そのレベルに必要なレベルまたはプラグマティズムです。
エドジェームズ

3
@JayBazuzi:ワークステーションのセットアップガイド(ソース管理)では、必要なツールと依存関係、およびツールのセットアップ方法と入手方法について概説する必要があります。使用可能なツールキットを維持すること重要ですが、ソース管理の目的ではありません。あなたがあれば私は考え本当に、インストーラファイル/の.msiと、いくつかの命令ファイルを追加することができますしたかったが、それは5月の職場では実現できない場合があります。Visual Studio Pro 2010またはIBM RAD、XMLSpyなどをソース管理システムにチェックインしますか?多くの職場では、これらのツールの展開を管理しています。
FrustratedWithFormsDesigner

2
@artistoex:それは髪を分割しています。一般的に、ビルドボックスには、開発ボックスと同じライブラリがあると想定されています。2つが異なる場合、ITマネージャーに何か問題があります。(理想的には)必要なのは、ソースコードだけです。一部のプロジェクトはこれを適用できませんが、ほとんどの場合は適用されるはずです。
マイクS

1
@mike私はそれを意味しました。実際にそれを提案したのは、XPに関する本のケント・ベックだったと思います。そんなに悪い考えではありません。すべてのビルドファクターをほぼ100%再構築できます。また、プロジェクトの過程で変化する可能性が最も高い環境を忘れないでください。
artistoex

29

太陽の下にあるほぼすべてのものをソース管理に入れるのが最善です。

  • コード

  • 図書館

  • 資源

  • ビルド/デプロイスクリプト

  • データベースの作成および更新スクリプト

  • 特定のドキュメント

  • 環境固有の構成ファイル

ソース管理に入れてはならない唯一のものは、プロジェクトのビルドアーティファクトです。


5
「特定のドキュメント」が特定のツールに依存していないことを確認してください。SunOSバージョンのFrameのようなものを使用してドキュメントを作成する多くのプロジェクトに遭遇しました。それらはすべての「.mif」ファイルをチェックインしましたが、結果の.psまたは.pdfファイルはチェックインしませんでした。SunOSとFrameが歴史のゴミ箱に追いやられた今、多くのデザインドキュメントは大切な紙のコピーとしてのみ存在しています。
ブルースエディガー

2
@BruceEdigerその場合、個人的に出力とツール固有の情報の両方が必要です。ツールが消えても、少なくとも静的な電子コピーが残っています:)
maple_shaft

ここでの大きなプロセス会社の利点の1つは、ソースがvcsになり、生成されたものが構成管理システムに入らなければならないため、ツールが機能しなくなっても、結果を制御できます
jk。

使用しているコンパイラの特定のバージョンはどうですか?さて、なぜOS全体ではないのですか?
wnoise

18

私はそう言うでしょう。

  • ビルドの実行に必要なファイルはすべてバージョン管理に入ります
  • ビルドによって生成された(可能性のある)ファイルは

ツールインストールパッケージなどの大きなバイナリをトランクの外のどこかに配置する傾向がありますが、バージョン管理下にある必要があります。


15

また、すべてのデータベースコードをソース管理にも配置することを忘れないでください!これには、元の作成スクリプト、テーブルを変更するスクリプト(使用するソフトウェアのバージョンによってマークされているため、アプリケーションの任意のバージョンに対してデータベースの任意のバージョンを再作成できます)、およびルックアップテーブルに入力するスクリプトが含まれます。


15

苦労した経験から、ほとんどすべてがソース管理に属していることがわかりました。(ここでの私のコメントは、プロプライエタリなハードウェア上に埋め込まれた/テレコムシステム用に開発された10年半の色で、プロプライエタリで、時には見つけにくいツールもあります。)

ここでの答えのいくつかは、「ソース管理にバイナリを入れないでください」と言っています。それは間違っている。サードパーティのコードが多く、ベンダーのバイナリライブラリが多数ある製品で作業している場合は、バイナリライブラリチェックインします。そうしないと、ある時点でアップグレードを行うことになり、トラブルに直面するからです。ビルドマシンに最新バージョンがないため、ビルドが中断します。誰かが、新しい男にインストールする古いCDを提供します。プロジェクトwikiには、インストールするバージョンに関する古い指示があります。さらに悪いことに、特定の問題を解決するためにベンダーと緊密に協力する必要あり、1週間で5セットのライブラリを送信する場合は、どのバイナリのセットがどの動作を示したかを追跡できます。ソース管理システムは、まさにその問題を解決するツールです。

ここでの答えのいくつかは、「ツールチェーンをソース管理に入れないでください」と言っています。間違っているとは言いませんが、堅実な構成管理(CM)システムがない限り、ツールチェーンをソース管理に入れる のが最善です。繰り返しますが、上記のアップグレードの問題を考慮してください。さらに悪いことに、私は、雇われたときにツールチェーンの4つの異なるフレーバーが浮かんでいるプロジェクトに取り組みました- それらはすべてアクティブに使用されています!(ビルドを機能させることができた後)最初にしたことの1つは、ツールチェーンをソース管理下に置くことでした。(堅実なCMシステムのアイデアは、期待を超えるものでした。)

また、プロジェクトごとに異なるツールチェーンが必要な場合はどうなりますか?適切な事例:数年後、プロジェクトの1つがベンダーからアップグレードされ、すべてのMakefileが壊れました。彼らはGNU makeの新しいバージョンに依存していたことが判明しました。だから私たちは皆アップグレードしました。おっと、別のプロジェクトのMakefileがすべて壊れました。レッスン:GNU makeの両方のバージョンをコミットし、プロジェクトチェックアウトに付属するバージョンを実行します。

または、他のすべてが手に負えない場所で作業している場合、「ねえ、新しい男が今日始めている、コンパイラのCDはどこにあるの?」「ダンノ、ジャックが辞めてから彼らを見たことがない、彼はCDの守護者だった。」「うーん、2階から上に移動する前にそうではなかったのですか?」「たぶん彼らは箱か何かの中にいるでしょう。」また、ツールは3年前のものなので、その古いCDをベンダーから入手する見込みはありません。

すべてのビルドスクリプトはソース管理に属します。すべて!環境変数に至るまで。ビルドマシンは、プロジェクトのルートで1つのスクリプトを実行することにより、プロジェクトのビルドを実行できる必要があります。(./build合理的な標準です。./configure; makeほぼ同様です。)スクリプトは必要に応じて環境を設定し、製品をビルドするツール(make、antなど)を起動する必要があります。

仕事が多すぎると思うなら、そうではありません。実際、大量の作業を節約できます。時間の初めに一度ファイルをコミットし、その後、アップグレードするたびにコミットします。一人のオオカミが自分のマシンをアップグレードし、いくつかのツールの最新バージョンに依存する多数のソースコードをコミットして、他の人のビルドを壊すことはできません。新しい開発者を雇うとき、プロジェクトをチェックアウトして実行するように彼らに伝えることができます./build。バージョン1.8に多くのパフォーマンスチューニングがあり、コード、コンパイラフラグ、および環境変数を微調整する場合、コードが本当に必要なため、新しいコンパイラフラグがバージョン1.7パッチビルドに誤って適用されないようにする必要があります。それらに伴う変化、またはいくつかの毛深い競合状態が見られます。

何よりも、いつかはお尻を救います:月曜日に製品のバージョン3.0.2を出荷すると想像してください。やったー 火曜日の朝、VIPの顧客がサポートホットラインに電話し、18か月前に出荷したバージョン2.2.6のこの超臨界で緊急のバグについて苦情を申し立てます。そして、あなたはまだそれをサポートする必要があり、バグは新しいコードで修正されたことを確認できるまでアップグレードを拒否し、あなたを踊らせるのに十分な大きさです。2つの並列ユニバースがあります。

  • ソース管理にライブラリ、ツールチェーン、ビルドスクリプトがなく、堅実なCMシステムがない宇宙では...正しいバージョンのコードをチェックアウトできますが、ビルドしようとすると、あらゆる種類のエラーが発生します。5月にツールをアップグレードしましたか?いいえ、それはライブラリでした。わかりました、古いライブラリに戻ります-待って、2つのアップグレードがありましたか?ああ、それは少し良く見えます。しかし今、この奇妙なリンカのクラッシュはおなじみに見えます。ああ、それは古いライブラリが新しいツールチェーンで動作しなかったからです。だからアップグレードする必要がありましたよね?(残りの努力の苦しみをspareしまない。2週間かかり、最後には誰も幸せではない。あなたも、経営者も、顧客もそうではない。)

  • すべてがソース管理内にあるユニバースでは、2.2.6タグをチェックアウトし、1時間程度でデバッグビルドを準備し、1、2日かけて「VIPバグ」を再現し、原因を突き止め、修正します。現在のリリース、およびアップグレードするように顧客を説得します。ストレスが多いが、ヘアラインが3cm高い他の宇宙ほど悪くはない。

そうは言っても、あなたはそれをやりすぎます:

  • 「ゴールドコピー」がある標準OSをインストールする必要があります。おそらくREADMEで、それを文書化している将来の世代は、バージョン2.2.6およびそれ以前のが唯一のRHEL 5.3および2.3.0で構築された以降のみのUbuntu 11.04上に構築されたことを知っているように、ソース管理に。この方法でツールチェーンを管理する方が簡単な場合は、信頼できるシステムであることを確認してください。
  • プロジェクトのドキュメントは、ソース管理システムで管理するのが面倒です。プロジェクトドキュメントは常にコード自体よりも先にあり、現在のバージョンのコードを作成中に次のバージョンのドキュメントを作成することは珍しくありません。特に、すべてのプロジェクトドキュメントが、差分やマージができないバイナリドキュメントである場合。
  • ビルドで使用されるすべてのバージョンを制御するシステムがある場合は、それを使用してください!ビルドマシンを含む全員が同じツールセットからプルできるように、チーム全体で簡単に同期できるようにしてください。(Debianのpbuilderやpythonのvirtualenvの責任ある使用法のようなシステムを考えています。)

交換が困難なハードウェアをチェックインすることを忘れないでください。ある会社は、ビルドツールを実行したCPU(HPPA?68040?)がなくなったため、ビルドを失いました。
hotpaw2

1
「CMシステム」とは何ですか?
ボードー

1
ほとんどの場合、バイナリ自体をコミットするのではなく、バイナリとバージョンを文書化します。はい-あなたの場合、バイナリを入手するのは難しく、他の方法でスタッシングする方法はありませんでした。しかし、一般的には、すべての依存関係と、(dev VMなどの)設定方法をより軽量な同等物として機能させる方法を文書化すると感じています。スクリプトを作成することで複製が改善されますが、最終的には全員が出荷する必要があります。
-Iiridayn

ツールチェーンを配置し、ソース管理にアーティファクトを構築するためのアドバイスによるダウン投票。はい、それらの管理ソリューションが不十分な場合、必要になることがありますが、決して望ましくありません。また、PHPのような一般的なOSSツールはいつでも利用できます(消滅する出版社は1つもないため)。したがって、この質問の場合は絶対に必要ではありません。
Marnen Laibow-Koser

13

ソース管理下に置いていないのは、簡単に再生成できるファイルまたは開発者固有のファイルだけです。これは、ソースコード、ソース管理下のファイルの読み取り/解析から生成されるドキュメント、およびIDE固有のファイルで構成される実行可能ファイルとバイナリを意味します。それ以外はすべてバージョン管理に入り、適切に管理されます。


7

ソース管理のユースケースは次のとおりです。すべての開発者のマシンとすべての展開マシンが流星に見舞われた場合はどうなりますか?回復は、できるだけチェックアウトとビルドに近いものにする必要があります。(それがあまりにもばかげている場合は、「新しい開発者を雇う」こともできます。)

言い換えれば、OS、アプリ、ツール以外はすべてVCSにあるべきであり、特定のツールバイナリバージョンに依存する可能性のある組み込みシステムでは、VCSにツールが保存されているのを見ました!

不完全なソース管理は、コンサルティングの際に見られる最も一般的なリスクの1つです。新しい開発者の雇用や新しいマシンのセットアップに関連するあらゆる種類の摩擦があります。継続的インテグレーションと継続的デリバリーの概念に加えて、「継続的開発」の感覚が必要です。IT担当者は、開発者が終了する前にコードを確認できるように、新しい開発マシンまたは展開マシンを基本的に自動的にセットアップできます彼らの最初のコーヒーは?


1
これは、複数のマシンからの作業が簡単であることも意味します。レポジトリを引っ張るだけで準備完了です。
スペンサーラスブン

流星の参照については+1、それは物事をうまくまとめています。
マフィニスタ

誰かが(たとえば)rev制御下にある完全なツールチェーンを備えたJavaプロジェクトの例を指して、簡単にチェックアウトして使用できるようにできますか?
アンデルソイ

@andersojチェックアウトboxen.github.comを
ラリー・オブライエン

6

プロジェクトに貢献し、変更を追跡するもの。

バイナリデータをうまく処理できないscmを使用している場合、例外には画像などの大きなバイナリブロブが含まれる場合があります。


2

Drupalはgitを使用するため、gitの用語を使用します。各モジュールのサブリポジトリを使用して、drupalの公式リポジトリからモジュールの更新を取得し、個々のデプロイの構造を維持します。そうすることで、すべてをソース管理下に置くという利点を失うことなく、スクリプト作成の利点を得ることができます。


1

以下を除くすべてをソース管理下に置く必要があります。

  • 構成ファイル(各開発者および/または各環境(開発、テスト、実稼働)で異なる構成オプションが含まれている場合)
  • ファイルシステムのキャッシュを使用している場合は、キャッシュファイル
  • ログファイル(テキストファイルにログを記録する場合)
  • キャッシュファイルやログファイルが好きなものはすべて生成されたコンテンツです
  • (非常に)変更される可能性が低い大きなバイナリファイル(バージョン管理システムによっては気に入らない場合がありますが、hgまたはgitを使用している場合はあまり気にしません)

そのように考えてください:チームのすべての新しいメンバーは、プロジェクトの作業コピー(構成アイテムを除く)をチェックアウトできる必要があります。

また、データベーススキーマの変更(すべてのスキーマ変更の単純なSQLダンプ)をバージョン管理下に置くことも忘れないでください。プロジェクトに意味がある場合は、ユーザーとAPIのドキュメントを含めることができます。


@maple_shaftは、コメント内の環境設定ファイルに関する最初のステートメントで重要な問題を提起します。私の答えは、Drupalまたは汎用CMSプロジェクトに関する質問の詳細に対するものであることを明確にしたいと思います。このようなシナリオでは、通常、ローカルデータベースと運用データベースがあり、1つの環境構成オプションはこれらのデータベースへの資格情報(および同様の資格情報)です。これらはソース管理下にないことをお勧めします。これにより、いくつかのセキュリティ上の懸念が生じます。

しかし、より典型的な開発ワークフローでは、maple_shaftに同意します。環境の構成オプションは、あらゆる環境のワンステップビルドおよびデプロイを可能にするために、ソース管理下にある必要があります。


3
-1ソース管理に属していない構成ファイルに関するステートメントに強く同意します。おそらく開発者固有の構成ファイルはありますが、環境のワンステップビルドおよびデプロイを可能にする場合は、環境固有の構成ファイルが必要です。
maple_shaft

2
@maple_shaft質問(drupalプロジェクトまたはgereric CMS Webプロジェクト)のコンテキストでは、「あらゆる環境のワンステップビルドおよびデプロイ」は非常にありそうもないシナリオです(本番データベースの資格情報をすべてに含めますか?)。バージョン管理下に置くべきものに関する一般的なガイドラインを提供するのではなく、質問に答えています。-しかし、あなたのdownvoteは大歓迎です:)
yannis

オープンソースのようにソースコードリポジトリが公開されている状況や、金融機関のように、データベースの資格情報がソース管理に属していないなど、セキュリティが非常に懸念される状況で見ることができます。その上、ソース管理はパスワードで保護され、特定のユーザーセットに制限される必要があります。そのため、このシナリオでは、ソース管理のデータベース資格情報が主な関心事ではありません。あなたは私に下票が厳しいように見えることを指摘したこと、あなたがあなたの答えを編集する場合、私はそれを削除することができます。
maple_shaft

@maple_shaft downvoteについては心配しないでください(質問を編集しましたが、必要に応じて自由に残してください)。パスワードで保護されたバージョン管理について:最近、管理チームのメンバーからラップトップが盗まれたという状況に対処しなければなりませんでした。それは彼の側からの大きなスナフでした(ラップトップはパスワードで保護されていませんでしたが、私が実際に開示することのできない他のいくつかの詳細)。その経験から構築して、すべてをvcsから削除しました。
ヤンニス

@maple_shaftそして、私は妄想を提唱しているように見えるかもしれませんが、私たちは今、同様のスナフから資格情報に関連するものを保護するために極端に行きます。
ヤンニス

1

自動ビルドが生成するものすべてソース管理に含まれませ。ビルド中に変更を必要としないものすべて、ソース管理に含まれます。とても簡単です。

たとえば、以下はソース管理には含まれません。

  • 生成されたコード
  • 生成されたバイナリ
  • ビルドによって作成されたもの
  • サービス、プロセス、Webアプリケーションによって実行時に作成されるもの

ソース管理で行われること:

  • 何でも人間が作成されます
  • 別の人またはグループによって作成されたもの(ソース管理が配布されているサードパーティの社内ライブラリ、またはオープンソースプロジェクトのバイナリなど)。
  • データベースのようなものを作成するスクリプトおよびその他のソース(つまり、すべてのDBAがAWOLに移行した場合にdbを再作成する方法)。

これらの経験則は、ソース管理にあるものはすべて人間によって変更される可能性があり、それが存在する理由を理解するために誰かの貴重な時間がかかる可能性があるという概念に基づいています。


1

作業する必要があり、変更できるものは、何らかの方法でバージョン管理する必要があります。しかし、2つの独立したシステムがそれを追跡する必要はほとんどありません。

通常、信頼できる方法で生成されたものはすべてソースバージョンにアタッチできます。したがって、生成されたソース、システムから別のシステムに渡されないバイナリなど、独立して追跡する必要はありません。

おそらく誰も気にしない(しかし、あなたは確実に知らない)ビルドログやその他のものは、通常、それを生成している人(jenkinsなど)によって最もよく追跡されます。

あるシステムから別のシステムに渡されるビルド製品は追跡する必要がありますが、Mavenリポジトリはそれを行うための良い方法です-ソース管理が提供する管理レベルは必要ありません。多くの場合、成果物は同じカテゴリに属します。

残っているものは何でも(そしてこの時点で、ソースファイルとビルドサーバーの構成以外はほとんどないはずです)、ソース管理に入ります。


0

私の答えはとても簡単です。バイナリではありません。含意では、他のほとんどすべて。

(ただし、データベースのバックアップやスキーマの移行、ユーザーデータは間違いありません。)


スキーマの移行は絶対にソース管理で行います。そうすれば、コードが期待するDBスキーマを知ることができます。
Marnen Laibow-Koser

0

ソース管理は変更追跡メカニズムです。誰が何をいつ変更したかを知りたいときに使用します。

ソース管理は無料ではありません。ワークフローが複雑になり、新しい同僚のトレーニングが必要になります。コストとメリットを比較検討してください。

たとえば、データベースを制御するのは難しい場合があります。以前は、定義をテキストファイルに手動で保存してからソース管理に追加する必要があったシステムがありました。これには多くの時間がかかり、信頼性も低くなりました。信頼性が低いため、新しいデータベースをセットアップしたり、いつ変更されたのかを確認したりすることはできませんでした。しかし、マネージャーは「すべてのものをソース管理する必要がある」と考えたため、何時間も無駄にしました。

ソース管理は魔法ではありません。試してみてください。ただし、コストを相殺するのに十分な価値が追加されない場合は放棄してください。


2
真剣ですか?ソース管理は、新しい同僚のためのトレーニングを必要とするので悪いですか?実際に、ソース管理の使用方法がわからず、学習したくない人と長期的に仕事をしたいと言っているのですか?個人的にはハンバーガーをひっくり返したいです。
ザック

Hehe私はソース管理に反対しているのではなく、すべてにソース管理を盲目的に使用することに反対しています。ソース管理に非常に複雑なワークフローがあり、それが付加価値をもたらさない場合、私はそれを使用したくないと思います。
アンドマー

2
私のポイントは、あなたが何かのためにそれを使用しているだけでも(咳のソースコード)、同僚はすでにそれを使用する方法を知っている必要があるので、他の何かのためにそれを使用することでオーバーヘッドを増やすべきではありません。
ザック

0

ソース管理に入れないもの:

  • 秘密鍵とパスワード
  • SDKは同じディレクトリですが、SDKにパッチを作成すると、アプリごとではなくフレームワークごとになるため、別のプロジェクトにする必要があります
  • などのサードパーティライブラリ。移行からの残り物、バックアップ、コンパイルされたコード、他のライセンス下のコード(おそらく)

ですからhg addremove、SDKが更新されるときにたまに新しいクローンを作成するので、私はインスタンスを作成しません。また、SDkが更新されるたびに完全なバックアップを作成し、リポジトリから複製された新しいバージョンが適切であることを確認します。


0

あなたの懸念に対処する次の本を強くお勧めします:

継続的デリバリー:ビルド、テスト、展開の自動化による信頼性の高いソフトウェアリリース。具体的には、第2章では、ソース管理に配置する項目について説明します。これは、かなりの数の人が言っているように、ビルドの結果として生成されるコンテンツを除いてほとんどすべてです。

プロジェクトをビルドするために必要なツールをバージョン管理に入れないことを支持しているため、@ FrustratedWithFormsDesignerが提供する受け入れられた回答の 1つに同意しません。ソース管理(ビルドされるコードに隣接)のどこかに、プロジェクトをビルドするビルドスクリプトと、コマンドラインからのみ実行されるビルドスクリプトを配置する必要があります。彼が意味するツール、IDE、およびエディターが、プロジェクトをビルドするためにまったく必要ない場合。これらは開発者向けのアクティブ/ラピッド開発に適しており、このタイプの環境のセットアップもスクリプト化するか、SCMの別のセクションまたは何らかのタイプのバイナリ管理サーバーからダウンロードできます。このようなIDEのセットアップは可能な限り自動化する必要があります。

また、@ Yannis Rizosがソース管理で環境の構成を配置することについて述べていることにも同意しません。理由は、スクリプトのみを使用して任意の環境を自由に再構築できるはずであり、ソース管理の構成設定がないと管理できないことです。また、この情報をソース管理に入れずにさまざまな環境の構成がどのように進化したかについての履歴もありません。現在、本番環境の設定は機密であるか、企業がこれらをバージョン管理に配置したくない場合があります。そのため、2番目のオプションは、バージョン管理に配置して履歴を保持し、このリポジトリに制限付きアクセスを許可することです。


-1

すべてのコードをバージョン管理し、すべての構成とユーザーデータを保持します。drupalに特化するには、filesとsettings.phpを除くすべてをバージョン管理する必要があります

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