「Android アプリケーション基本」の版間の差分
ナビゲーションに移動
検索に移動
(ページの作成:「==Android アプリケーション基本== [Android] *http://developer.android.com/guide/topics/fundamentals.html ===基本=== ====ソースコードとパッケ…」) |
|||
(同じ利用者による、間の3版が非表示) | |||
1行目: | 1行目: | ||
− | ==Android アプリケーション基本== | + | ==[[Android アプリケーション基本]]== |
− | [Android] | + | [[Android]] | |
*http://developer.android.com/guide/topics/fundamentals.html | *http://developer.android.com/guide/topics/fundamentals.html | ||
6行目: | 6行目: | ||
====ソースコードとパッケージ==== | ====ソースコードとパッケージ==== | ||
− | *Android アプリケーションは、Java で書かれます。 | + | *[[Android]] アプリケーションは、Java で書かれます。 |
*コンパイルされたJavaコード(および必要な、データおよびリソースファイルも一緒に)は [http://developer.android.com/guide/developing/tools/aapt.html aapt ツール]により .apk という拡張子の Android パッケージとしてアーカイブされます。 | *コンパイルされたJavaコード(および必要な、データおよびリソースファイルも一緒に)は [http://developer.android.com/guide/developing/tools/aapt.html aapt ツール]により .apk という拡張子の Android パッケージとしてアーカイブされます。 | ||
*このファイルは、モバイルデバイスへアプリケーションを配布し、インストールするための乗り物となります。 | *このファイルは、モバイルデバイスへアプリケーションを配布し、インストールするための乗り物となります。 | ||
14行目: | 14行目: | ||
====アプリケーションはどのように動くのか==== | ====アプリケーションはどのように動くのか==== | ||
=====プロセスの起動とシャットダウン===== | =====プロセスの起動とシャットダウン===== | ||
− | * | + | *デフォルトでは、どのアプリケーションも、自分自身の[[Linux]] プロセスで起動されます。 |
− | *Android は、アプリケーションコードの実行が必要な時にプロセスを開始します。 | + | *[[Android]] は、アプリケーションコードの実行が必要な時にプロセスを開始します。 |
*アプリケーションが、不要になり、他のアプリケーションがリソースを必要としたときにシャットダウンされます。 | *アプリケーションが、不要になり、他のアプリケーションがリソースを必要としたときにシャットダウンされます。 | ||
22行目: | 22行目: | ||
=====ユーザーとパーミッション===== | =====ユーザーとパーミッション===== | ||
− | * | + | *デフォルトでは、どのアプリケーションもユニークな[[Linux]] ユーザーIDに結びつけられます。 |
*パーミッションも設定されるため、アプリケーションのファイルは、結局ユーザーであるアプリケーション自身からのみ参照できます。 | *パーミッションも設定されるため、アプリケーションのファイルは、結局ユーザーであるアプリケーション自身からのみ参照できます。 | ||
*しかし、パーミッションを他のアプリケーションにエクスポートする方法も存在します。 | *しかし、パーミッションを他のアプリケーションにエクスポートする方法も存在します。 | ||
29行目: | 29行目: | ||
*2つのアプリケーションで同じユーザーIDを共有することが可能。 | *2つのアプリケーションで同じユーザーIDを共有することが可能。 | ||
*この場合、お互いのファイルを参照することが可能になる。 | *この場合、お互いのファイルを参照することが可能になる。 | ||
− | * | + | *システムリソースを節約するために、同じIDをもつアプリケーションを同じ[[Linux]]プロセスに配置して、同じVMを供給することができる。 |
===アプリケーション コンポーネント=== | ===アプリケーション コンポーネント=== | ||
====他のアプリケーションの利用==== | ====他のアプリケーションの利用==== | ||
− | *Android の主要な機能は、あるアプリケーションが他のアプリケーションの要素を(許されていれば)活用できること。 | + | *[[Android]] の主要な機能は、あるアプリケーションが他のアプリケーションの要素を(許されていれば)活用できること。 |
*たとえば、あなたのアプリケーションがイメージのスクロールリストを表示する必要があり、他のアプリケーションが適切に開発されたスクローラーをもっており、他から利用できるようにしている場合、あなたは、自分で開発するよりも、そのスクローラーを呼び出すことができる。 | *たとえば、あなたのアプリケーションがイメージのスクロールリストを表示する必要があり、他のアプリケーションが適切に開発されたスクローラーをもっており、他から利用できるようにしている場合、あなたは、自分で開発するよりも、そのスクローラーを呼び出すことができる。 | ||
− | * | + | *アプリケーションは、他のアプリケーションや[[リンク]]とコードを合併させない。 |
*それよりは、他のアプリケーションの一部を必要に応じて、かなりシンプルに開始できる。 | *それよりは、他のアプリケーションの一部を必要に応じて、かなりシンプルに開始できる。 | ||
====コンポーネント==== | ====コンポーネント==== | ||
− | * | + | *システムは、アプリケーションの一部を必要に応じてプロセスを開始でき、[[Java]]オブジェクトをインスタンス化できる必要がある。 |
− | * | + | *なので、アプリケーションはその他多くのシステムと異なっている、[[Android]] アプリケーションは、ひとつのエントリーポイント(main()関数のような)を持たない。 |
*そうではなく、それらは、次の4つの本質的なコンポーネントを持っており、システムは必要に応じてインスタンス化して起動する。 | *そうではなく、それらは、次の4つの本質的なコンポーネントを持っており、システムは必要に応じてインスタンス化して起動する。 | ||
− | ==== | + | ====Acti[[vi]]ty==== |
=====概要===== | =====概要===== | ||
*アクティビティ は ユーザーが行えることを、一箇所に集中することを試みるビジュアルユーザーインターフェース を表現する。 | *アクティビティ は ユーザーが行えることを、一箇所に集中することを試みるビジュアルユーザーインターフェース を表現する。 | ||
55行目: | 55行目: | ||
=====アクティビティとは?===== | =====アクティビティとは?===== | ||
− | *あるアプリケーションはただひとつ、またはいくつかの | + | *あるアプリケーションはただひとつ、またはいくつかの Acti[[vi]]ty から構成される。 |
*アクティビティをいくつ使うべきかなどはもちろんアプリケーションの設計によるが、典型的には、アクティビティのうちひとつが最初のアクティビティとしてマークされ、アプリケーションが起動したときにユーザーに表示される。 | *アクティビティをいくつ使うべきかなどはもちろんアプリケーションの設計によるが、典型的には、アクティビティのうちひとつが最初のアクティビティとしてマークされ、アプリケーションが起動したときにユーザーに表示される。 | ||
*ひとつのアクティビティを他へ移動することは、現在のアクティビティを完了させ、次を起動させること。 | *ひとつのアクティビティを他へ移動することは、現在のアクティビティを完了させ、次を起動させること。 | ||
71行目: | 71行目: | ||
*ビューは、アクティビティとユーザの意思疎通が行われる場所 | *ビューは、アクティビティとユーザの意思疎通が行われる場所 | ||
*例えば、ビューが小さなイメージを表示し、ユーザーがそのイメージをタップすることで、アクションを開始する。 | *例えば、ビューが小さなイメージを表示し、ユーザーがそのイメージをタップすることで、アクションを開始する。 | ||
− | *Android は数多くの既製のビューを持っている。ボタン、テキスト、スクロールバー、メニュー、チェックボックスなど | + | *[[Android]] は数多くの既製のビューを持っている。ボタン、テキスト、スクロールバー、メニュー、チェックボックスなど |
*ビューの階層は、アクティビティのウィンドウに、[http://developer.android.com/reference/android/app/Activity.html#setContentView(android.view.View) Activity.setContentView]により置かれる。 | *ビューの階層は、アクティビティのウィンドウに、[http://developer.android.com/reference/android/app/Activity.html#setContentView(android.view.View) Activity.setContentView]により置かれる。 | ||
*Content View は View オブジェクトのルート。[http://developer.android.com/guide/topics/ui/index.html さらなる情報] | *Content View は View オブジェクトのルート。[http://developer.android.com/guide/topics/ui/index.html さらなる情報] | ||
− | ==== | + | ====Ser[[vi]]ce==== |
=====サービスとは?===== | =====サービスとは?===== | ||
*サービスは、ビジュアルなユーザーインターフェースを持たず、バックグラウンドで不定期に起動される。 | *サービスは、ビジュアルなユーザーインターフェースを持たず、バックグラウンドで不定期に起動される。 | ||
94行目: | 94行目: | ||
*なので、それらは、他のコンポーネント、ユーザーインターフェースをブロックすることはない。しばしば、他のスレッドを時間のかかるタスクのために呼び出す。 | *なので、それらは、他のコンポーネント、ユーザーインターフェースをブロックすることはない。しばしば、他のスレッドを時間のかかるタスクのために呼び出す。 | ||
− | ====Broadcast | + | ====Broadcast [[R]]eceiver==== |
*ブロードキャストレシーバーは、ブロードキャストの受信と再送信以外なにもしないコンポーネント | *ブロードキャストレシーバーは、ブロードキャストの受信と再送信以外なにもしないコンポーネント | ||
− | * | + | *多くのブロードキャストはシステムコードから送信される。例えば、タイムゾーンの変更通知、バッテリーの低下、写真がとられた、ユーザーが[[言語]]設定を変えた。など |
*アプリケーションも、ブロードキャストをはじめられる。例えば、なにがしかのデータのデバイスへのダウンロードが完了し、利用可能になったことを、他のアプリケーションに知らせる。 | *アプリケーションも、ブロードキャストをはじめられる。例えば、なにがしかのデータのデバイスへのダウンロードが完了し、利用可能になったことを、他のアプリケーションに知らせる。 | ||
*アプリケーションは、重要と考えれば、いくつでもどんな通知にも対応するようブロードキャストレシーバーをもつことができる。 | *アプリケーションは、重要と考えれば、いくつでもどんな通知にも対応するようブロードキャストレシーバーをもつことができる。 | ||
− | * | + | *すべてのブロードキャストレシーバーは、Broadcast[[R]]eciever基底クラスを継承する。 |
*ブロードキャストレシーバーはユーザーインターフェースを表示しない。 | *ブロードキャストレシーバーはユーザーインターフェースを表示しない。 | ||
*しかしながら、受け取った情報へのレスポンスとして、アクティビティを起動することがある。もしくは、NotificatonManager を使って、ユーザーに通知する。 | *しかしながら、受け取った情報へのレスポンスとして、アクティビティを起動することがある。もしくは、NotificatonManager を使って、ユーザーに通知する。 | ||
105行目: | 105行目: | ||
*典型的には永続的なアイコンをユーザーがメッセージを受け取れるようにステータスバーに配置する | *典型的には永続的なアイコンをユーザーがメッセージを受け取れるようにステータスバーに配置する | ||
− | ====Content | + | ====Content pro[[vi]]ders==== |
*コンテントプロバイダーは他のアプリケーションから利用できるように特定のアプリケーションのデータを作成する。 | *コンテントプロバイダーは他のアプリケーションから利用できるように特定のアプリケーションのデータを作成する。 | ||
− | * | + | *データは[[SQL]]iteデータベースなど、ファイルシステムに保存できる。 |
− | * | + | *コンテントプロバイダーは、ContentoPro[[vi]]der 基底クラスを継承し、他のアプリケーションが受け取り保存できるデータ型を制御する標準的なメソッドを実装する |
*しかしながら、アプリケーションは、これらのメソッドを直接呼び出さない。 | *しかしながら、アプリケーションは、これらのメソッドを直接呼び出さない。 | ||
− | * | + | *その代わり、Content[[R]]esolver オブジェクトを 利用し変わりに呼び出す。 |
− | *ContentResolver | + | *ContentResolver はどんなコンテントプロバイダーにも通信できる。プロバイダーと協力してプロセス間の[[コミュニケーション]]を管理する。 |
===コンポーネントを活性化する インテント=== | ===コンポーネントを活性化する インテント=== | ||
118行目: | 118行目: | ||
*ほかの3つのコンポーネント ー アクティビティ、サービス、ブロードキャストレシーバー ー は インテント非同期メッセージにより活性化される。 | *ほかの3つのコンポーネント ー アクティビティ、サービス、ブロードキャストレシーバー ー は インテント非同期メッセージにより活性化される。 | ||
*インテントは、[http://developer.android.com/reference/android/content/Intent.html Intent オブジェクト]であり、メッセージ内容を保持する。 | *インテントは、[http://developer.android.com/reference/android/content/Intent.html Intent オブジェクト]であり、メッセージ内容を保持する。 | ||
− | * | + | *アクティビティとサービスの為に、とりわけ、インテントはリクエストされたアクションを命名し、操作対象となるデータのU[[R]]Iを特定する。 |
*例えば、インテントはイメージをユーザーに提示またはユーザーにテキストを編集させるアクティビティへリクエストを運ぶ | *例えば、インテントはイメージをユーザーに提示またはユーザーにテキストを編集させるアクティビティへリクエストを運ぶ | ||
*ブロードキャストレシーバーには、インテントオブジェクトは通知されたアクションに命名する。 | *ブロードキャストレシーバーには、インテントオブジェクトは通知されたアクションに命名する。 | ||
130行目: | 130行目: | ||
*応答アクティビティは、自身の[http://developer.android.com/reference/android/app/Activity.html#getIntent() getIntent()] メソッドにより起動された初期インテントを見ることができる。 | *応答アクティビティは、自身の[http://developer.android.com/reference/android/app/Activity.html#getIntent() getIntent()] メソッドにより起動された初期インテントを見ることができる。 | ||
*Android は アクティビティの[http://developer.android.com/reference/android/app/Activity.html#onNewIntent(android.content.Intent) onNewIntent()] メソッドをそれをつづくインテントに渡すために呼び出す。 | *Android は アクティビティの[http://developer.android.com/reference/android/app/Activity.html#onNewIntent(android.content.Intent) onNewIntent()] メソッドをそれをつづくインテントに渡すために呼び出す。 | ||
− | * | + | *一つのアクティビティはしばしば次を開始する。アクティビティから結果が変えることが想定される場合、startActi[[vi]]ty() の代わりに、startActi[[vi]]tyForResult() により開始する。 |
*例えば、ユーザーが写真を選択することでアクティビティが開始され、選択された写真を結果として受け取ることが想定される場合。 | *例えば、ユーザーが写真を選択することでアクティビティが開始され、選択された写真を結果として受け取ることが想定される場合。 | ||
*結果はアクティビティの [http://developer.android.com/reference/android/app/Activity.html onActivityResult()]メソッドから、インテントオブジェクトとしてかえってくる。 | *結果はアクティビティの [http://developer.android.com/reference/android/app/Activity.html onActivityResult()]メソッドから、インテントオブジェクトとしてかえってくる。 |
2020年2月16日 (日) 04:21時点における最新版
Android アプリケーション基本
Android |
基本
ソースコードとパッケージ
- Android アプリケーションは、Java で書かれます。
- コンパイルされたJavaコード(および必要な、データおよびリソースファイルも一緒に)は aapt ツールにより .apk という拡張子の Android パッケージとしてアーカイブされます。
- このファイルは、モバイルデバイスへアプリケーションを配布し、インストールするための乗り物となります。
- ユーザーは、デバイスへこのファイルをダウンロードします。
- すべてのコードは一つの .apkファイルに含まれ、これが1つのアプリケーションと見なされます。
アプリケーションはどのように動くのか
プロセスの起動とシャットダウン
- デフォルトでは、どのアプリケーションも、自分自身のLinux プロセスで起動されます。
- Android は、アプリケーションコードの実行が必要な時にプロセスを開始します。
- アプリケーションが、不要になり、他のアプリケーションがリソースを必要としたときにシャットダウンされます。
仮想マシン
- すべてのプロセスが独自に仮想マシン(VM)を持ちます。なので、アプリケーションコードは、他のアプリケーションから隔離されて実行されます。
ユーザーとパーミッション
- デフォルトでは、どのアプリケーションもユニークなLinux ユーザーIDに結びつけられます。
- パーミッションも設定されるため、アプリケーションのファイルは、結局ユーザーであるアプリケーション自身からのみ参照できます。
- しかし、パーミッションを他のアプリケーションにエクスポートする方法も存在します。
ユーザーIDの共有
- 2つのアプリケーションで同じユーザーIDを共有することが可能。
- この場合、お互いのファイルを参照することが可能になる。
- システムリソースを節約するために、同じIDをもつアプリケーションを同じLinuxプロセスに配置して、同じVMを供給することができる。
アプリケーション コンポーネント
他のアプリケーションの利用
- Android の主要な機能は、あるアプリケーションが他のアプリケーションの要素を(許されていれば)活用できること。
- たとえば、あなたのアプリケーションがイメージのスクロールリストを表示する必要があり、他のアプリケーションが適切に開発されたスクローラーをもっており、他から利用できるようにしている場合、あなたは、自分で開発するよりも、そのスクローラーを呼び出すことができる。
- アプリケーションは、他のアプリケーションやリンクとコードを合併させない。
- それよりは、他のアプリケーションの一部を必要に応じて、かなりシンプルに開始できる。
コンポーネント
- システムは、アプリケーションの一部を必要に応じてプロセスを開始でき、Javaオブジェクトをインスタンス化できる必要がある。
- なので、アプリケーションはその他多くのシステムと異なっている、Android アプリケーションは、ひとつのエントリーポイント(main()関数のような)を持たない。
- そうではなく、それらは、次の4つの本質的なコンポーネントを持っており、システムは必要に応じてインスタンス化して起動する。
Activity
概要
- アクティビティ は ユーザーが行えることを、一箇所に集中することを試みるビジュアルユーザーインターフェース を表現する。
- たとえば、アクティビティは ユーザーが選択できるメニューアイテムのリストを表現すし、写真をキャプションとともに表示する。
- テキストメッセージングアプリケーションは、おそらく、メッセージを送信するために、リストの内容を表示する、ひとつのアクティビティを持つ。
- 2つめの選択された連絡先へメッセージを記入するアクティビティ、そして、他の古いメッセージをレビューする、設定を変更するアクティビティ。
- それぞれのアクティビティは、他から独立しているにもかかわらず、それらは凝集度の高いユーザーインターフェースとして一緒に働く。
- それらは Activity 基底クラスのサブクラスとして実装される。
アクティビティとは?
- あるアプリケーションはただひとつ、またはいくつかの Activity から構成される。
- アクティビティをいくつ使うべきかなどはもちろんアプリケーションの設計によるが、典型的には、アクティビティのうちひとつが最初のアクティビティとしてマークされ、アプリケーションが起動したときにユーザーに表示される。
- ひとつのアクティビティを他へ移動することは、現在のアクティビティを完了させ、次を起動させること。
Windowについて
- どのアクティビティも描画用のデフォルトのウィンドウをあたえられている。
- 通常は、ウィンドウはスクリーンいっぱいにひろがっている。しかしスクリーンより小さく、ウィンドウの最前面にフロートさせることもできる。
- あるアクティビティは、追加のウィンドウを利用可能。例えば、ユーザーの応答を得るポップアップダイアログ、または、重要な情報をユーザーに伝えるウィンドウなど
Widgetについて
- ウィンドウのビジュアルな内容は、Viewクラスから派生したオブジェクトにより提供される。
- どのビューもウィンドウ内の特定の矩形スペースをコントロールする。
- 親のビューは子供のレイアウトを含み、体系化している。
- 末端のビュー(階層の最下層)は矩形にコントロールしユーザーのアクションに反応して描画を行う。
- ビューは、アクティビティとユーザの意思疎通が行われる場所
- 例えば、ビューが小さなイメージを表示し、ユーザーがそのイメージをタップすることで、アクションを開始する。
- Android は数多くの既製のビューを持っている。ボタン、テキスト、スクロールバー、メニュー、チェックボックスなど
- ビューの階層は、アクティビティのウィンドウに、Activity.setContentViewにより置かれる。
- Content View は View オブジェクトのルート。さらなる情報
Service
サービスとは?
- サービスは、ビジュアルなユーザーインターフェースを持たず、バックグラウンドで不定期に起動される。
- 例えば、ユーザーが何かを行っているときにバックグラウンドで音楽を再生する、ネットワーク越しのデータの取得やなんらかの計算、必要となったときに結果を提供できるようにしておく。
- すべてのサービスは、Service 基底クラスを継承している。
- 上記例にて、メディアプレーヤーがプレイリストから曲を再生することをあげた。プレーヤーアプリケーションは、おそらく、ユーザーに曲を選択させてそれを再生するなど1つ以上のアクティビティ、を持つだろう。
- しかしながら、音楽がアクティビティにより音楽自身を再生することはできない。
- なぜなら、ユーザーはプレイヤーから去った後も音楽が再生され続け、何か別なことが始まるのを期待している。
- 音楽を再生したままで、メディアアプレイヤーのアクティビティはサービスをバックグラウンドで走らせることができる。
- システムは音楽再生サービスをそれを開始したアクティビティが、スクリーンから消えても行い続ける。
- 実行中のサービスに接続(バインド)できる。(そしてそのサービスが開始されていなければ、開始する)
- 接続中、公開されているサービスインターフェースを通してサービスと通信できる
- この音楽サービスでは、インターフェースは一時停止、巻き戻し、停止、再開をユーザーに許すだろう
- アクティビティや他のコンポーネント、サービスはアプリケーションプロセスのメインスレッドで実行される
- なので、それらは、他のコンポーネント、ユーザーインターフェースをブロックすることはない。しばしば、他のスレッドを時間のかかるタスクのために呼び出す。
Broadcast Receiver
- ブロードキャストレシーバーは、ブロードキャストの受信と再送信以外なにもしないコンポーネント
- 多くのブロードキャストはシステムコードから送信される。例えば、タイムゾーンの変更通知、バッテリーの低下、写真がとられた、ユーザーが言語設定を変えた。など
- アプリケーションも、ブロードキャストをはじめられる。例えば、なにがしかのデータのデバイスへのダウンロードが完了し、利用可能になったことを、他のアプリケーションに知らせる。
- アプリケーションは、重要と考えれば、いくつでもどんな通知にも対応するようブロードキャストレシーバーをもつことができる。
- すべてのブロードキャストレシーバーは、BroadcastReciever基底クラスを継承する。
- ブロードキャストレシーバーはユーザーインターフェースを表示しない。
- しかしながら、受け取った情報へのレスポンスとして、アクティビティを起動することがある。もしくは、NotificatonManager を使って、ユーザーに通知する。
- 通知は、いろいろな方法でユーザーの注意をひくことができる。バックライトのフラッシュ、デバイスを振動させる、音をならす。など
- 典型的には永続的なアイコンをユーザーがメッセージを受け取れるようにステータスバーに配置する
Content providers
- コンテントプロバイダーは他のアプリケーションから利用できるように特定のアプリケーションのデータを作成する。
- データはSQLiteデータベースなど、ファイルシステムに保存できる。
- コンテントプロバイダーは、ContentoProvider 基底クラスを継承し、他のアプリケーションが受け取り保存できるデータ型を制御する標準的なメソッドを実装する
- しかしながら、アプリケーションは、これらのメソッドを直接呼び出さない。
- その代わり、ContentResolver オブジェクトを 利用し変わりに呼び出す。
- ContentResolver はどんなコンテントプロバイダーにも通信できる。プロバイダーと協力してプロセス間のコミュニケーションを管理する。
コンポーネントを活性化する インテント
- コンテントリゾルバからのリクエスト対象とされたとき、コンテントプロバイダーは活性化され
- ほかの3つのコンポーネント ー アクティビティ、サービス、ブロードキャストレシーバー ー は インテント非同期メッセージにより活性化される。
- インテントは、Intent オブジェクトであり、メッセージ内容を保持する。
- アクティビティとサービスの為に、とりわけ、インテントはリクエストされたアクションを命名し、操作対象となるデータのURIを特定する。
- 例えば、インテントはイメージをユーザーに提示またはユーザーにテキストを編集させるアクティビティへリクエストを運ぶ
- ブロードキャストレシーバーには、インテントオブジェクトは通知されたアクションに命名する。
- 例えば、カメラボタンが押されたことを、関係者に通知する。
- それぞれのコンポーネントをアクティベートするために別々のメソッドがある
アクティビティとインテント
- インテントオブジェクトをContext.startActivity|http://developer.android.com/reference/android/content/Context.html#startActivity(android.content.Intent)、または、[Activity.startActivityForResult()] に渡すことによりアクティビティは起動される。
- 応答アクティビティは、自身のgetIntent() メソッドにより起動された初期インテントを見ることができる。
- Android は アクティビティのonNewIntent() メソッドをそれをつづくインテントに渡すために呼び出す。
- 一つのアクティビティはしばしば次を開始する。アクティビティから結果が変えることが想定される場合、startActivity() の代わりに、startActivityForResult() により開始する。
- 例えば、ユーザーが写真を選択することでアクティビティが開始され、選択された写真を結果として受け取ることが想定される場合。
- 結果はアクティビティの onActivityResult()メソッドから、インテントオブジェクトとしてかえってくる。
© 2006 矢木浩人