先日は、

 

9日の記事

 

にて二進数などについて書きました。情報iでは、数学に関連した物も登場しますが、その中では論理演算やn進数など情報iが必修科目になる前から高校の数学で学ぶ内容も含まれていますから、情報Iのカリキュラムを受けてみると、コンピューターは数学の応用技術である事が確認できるのではないかな?と思います。

 

 基本的にコンピューターも電気で動いているので二進数で制御が出来るのですが、元々、電気で動く計算機から進化した物ですから、この概念は電気工作にも使用できます。高校の物理では、電気工作で使用するパーツについても学習しますが、この中でトランスやトランジスタやダイオードなどが登場しますが、これを組み合わせて使うと色々な挙動になりますが、ダイオードを組み合わせてブリッジを作ると、AC-DCコンバーターになりますし、トランジスタはスイッチや増幅器として使用できますから、小さな電流を大きくすることもできますし、回路内で電気の流れをコントロールする事ができますから、回路内で条件分岐を実装する事もできます。こうした判定を実装できるので、トランジスタで論理演算回路を組むことが出来るのですが、先日も触れましたが、論理演算回路を使うと計算が出来るので、トランジスタを組み合わせると条件分岐と計算も行えるようになりますし、NOT回路を3つ繋いで信号を回帰させるとタイマー回路のように信号のオンとオフを繰り返す回路を作る事もできます。

 

 ただし、DCの閉回路内でこの方式にすると煩い上にノイズも出るので、同じことをする場合だと、PWM制御をしてコントロールをしたほうが良さそうな気がしますが、マイコン制御をするとこうした制御もコードでタイミングを計る事が出来るようになります。PWM制御用のパーツはロータリーエンコーダーなどのボリューム抵抗で抵抗値を変更してデューティー比をコントロールできるものもありますから、DC電源で動く電動ドライバーの回転数をロータリーエンコーダーで減衰させて低速にしたり、通常の速度まで上げることが出来るようになっています。

 

 この仕組みを見ると、モーターで動作するタイヤで動く物の速度もデューティー比でコントロールできることがイメージできると思いますが、車の場合だと、モーターに繋がった電源があり、電源からの供給される電圧が一定であったとしてもデューティー比をコントロールする事で、平均電圧を変更できるので、速度を落とす事が出来ます。この状態変化を任意のコントローラーで制御するようにすれば、モーターの回転数を操作に追従させることが出来るようになります。

 

 コンピューターの処理は電気工作の知識を拡張した物に内ますが、判断をする為のトランジスタも数十億個も使用されているので、個人が作る電気工作の規模とは全く異なる物に泣ていますが、基本的な出来の法則は同じなので、それをどう言った処理によって管理し演算処理やハードウェアの制御をしているのかが違うだけです。

 

 コンピューターも電気工作で作るような回路を制御する事もできますが、PCのような汎用性のある物と特化した動作をする物だと構造が違うので、PCで使用するようなプロセッサを持ちなくても和っとパフォーマンスの高い状態で管理する事が出来ます。

 

 

P Cとマイクロコントローラー      

 

 

 STEAM学習では、PCとマイコンの双方を触る事になると思いますが、電気工作を制御するイメージがあるのがローレベルで動作するマイコンで、OS上で様々な管理が出来るのがPCになります。こうしたハードウェアについても触れる機会があると思いますが、二者の違いは、据え置き式の家庭用ゲーム機の仕様を見るとイメージしやすいと思いますが、家庭用ゲーム機には、

 

    ゲーム機本体

    コントローラー

 

があります。このハードウェアの仕様ですが、PLAYSTATION 3やXbox 360辺りの時代には、主記憶装置だけで動く訳ではなく、補助記憶装置としてSATA HDDが実装されており、OSが実装されているので、OSでハードウェアや処理を管理する仕組みになっていました。それ以降はそう言った仕様になっていますが、用意されたカスタムOS上で動作するようなしようになっており、OSの区画は実装されているストレージ内に用意されており、OSに準じたファイルシステムでファイルの管理が行われています。

 

 その為、1980年代のゲーム機のようにマイクロコントローラーと電気工作で動きそうな物とは構造が異なるので、現在の家電やゲーム機はPCと同じようにOS上でソフトウェアが動く仕組みで、データも内蔵の補助記憶装置(USB接続のHDDやSSDなどの外部ストレージでも保存できます。)で管理できる仕様になっています。

 

 これに対してコントローラーは基本的にマイコンで操作するような状態にしたほうが消費電力を抑えることが出来るので、機能が増えたとしても、PCのように汎用OSを入れて電力が上がるような構造で運用する事はありません。その為、ゲーム機の場合、

 

    OSで管理されているPCのような構造の物

    ローレベルで動作している物

 

の2つが通信を行って操作が成立しています。とは言っても、家電にはIrDAプロトコルを使ったリモコンが用意されていますから、マイコン同士で通信をしている構造ですし、近年のクロモの家電(テレビやレコーダーなどの家電)については、OSを実装しているので、本体自体がPCと同じ構造で、リモコンはマイコン制御の電気工作と同じ構造になっています。

 

 つまり、種類で言うと本体側がRasperry PIのようなシングルボードコンピューターと同じ処理の方法になっていて、リモコン側は、Micro:bitやM5 Stackなどのワンボードマイコンと同じようなにOSのないハードウェアレベルでの処理がが用いられています。

 

 とは言っても、かなり昔から家電ではリアルタイムOSが採用されている事例があり、純国産のTronなども使用されている物も存在していますから、汎用OSではないリアルタイムOSの実装が可能な状態になっているので、マイクロコントローラーだからOSが乗らないという訳ではありませんが、ハードウェアの管理の種類で言うと前述のような状態になっています。

 

 ゲーム機はメーカーで実装している物が異なるので、AMDのSoCを実装したPLAYSTATION 5とXbox Series XでもOSが異なるのですが、SIEの場合、PS3の時代からFree BSDベースのOSを開発して実装しているのですが、マイクロソフトの場合、自社開発のOSがありますから、ゲーム機にもWINDOWSベースのOSが採用されています。その為、ライブラリについてもOS準拠の物が採用されています。

 

 Switchはスマートフォンで使用されているCoretxのカスタムチップが使用されており、結構前のアーキテクチャになりますが、Tegra K1のカスタムチップが採用されており、OSには、PlayStation 5と同じくFree BSDベースのOSが実装されています。

 

 マイコンとOSの乘った環境だと、処理の階層が異なるので、ファームウェアと同じ階層にコードを配置して実行するマイコンでは、ローレベルで動くので高速に動作しますが、OSを仲介すると、I/Oまでの間にさまざまな階層が入るのでその分だけラグが出ます。この中にはネットワークで使用するTCPなども含まれていますが、アプリケーションそのものがOS上で動いているので、記録したスケッチがそのまま動作するマイコンとは異なります。その為、マイコンとシングルボードコンピューターでは動作の構造そのものが異なる訳です。通信についても階層が存在するのですが、これについては

 

 ■ ネットワーク

 

の中で触れていますが、OSの下の層に通信の層が存在するので、ハードウェアの制御もOS経由で行うので、ラグが出てしまう訳です。その為、OSが実装されている場合だと、通常の物理層との通信でもマイコンのようにはいきませんから、マイコンで制御している接点の情報の取得とかのようにラグの少ない物を得ようとすると少し難しいですし、簡素なアナログデータの取得をする際にラグが出てほしくない場合だと、取得をマイコンで行って、通信でそのデータをシングルボードコンピューターに送るという方法もあります。ちなみに、シングルボードコンピューターとワンボードマイコンの場合、BLEが使用できるのでそう言った通信もできるようになっていますが、目的によって使い分けることになります。

 

 

 想化                

 

 コンピューターの構造は、電気工作の延長線上ですから、こうした基礎分野の学習をする際には二値論理を使った装置の仕組みを学習する事になります。その場合、論理回路が必ず登場する訳ですが、この構造だけでも、ラッチを使ったメモリー(と言うよりも、クロックと連動して動くフリップロップを使うことになります。)や記録の際にメモリーアドレスや記録するデータを管理するレジスタを使って記録先の読み書きを制御したり、二進数と十進数の変換を十六進数経由で行い処理をするようなデコード処理をするデコーダなどを実装して、入出力と内部のデータの記録を行う事になります。そして、この際に演算をする場合には加算器やそれを応用した回路を実装する事になりますが、演算を行う計算機の場合、入出力と記憶が必要になるので、表示と入力のデバイス制御と演算の辞めの装置の考え方を知る必要があります。この演算処理に対して判定などを実装する事でさらに複雑な事が出来るようになりますが、コンピューターの場合、様々な演算が行えるような機能があり、演算においても一次元のアレイの処理に対応しているスカラ演算や二次元に対応しているベクター演算などが行える演算器も用意されていますが、AI関連だとベクターではなく三次元のデータになるので、テンソル(英語読みだとテンサー)の計算をする回路を実装した物もあります。

 

 現在は様々な機能が実装されているので2000年代初頭のような構造とは異なり、ヘテロジニアスコアの構造になっているので、Scoket 478のPentium 4の時代辺りまでのようにICHが存在せずFBSも遅くノースブリッジとサウスブリッジで動いているような時代とは全く異なる構造になっていますが、実装されている演算器やキャッシュやコアの管理に至るまで全く異なる処理の方法が用いられています。

 

 基礎部分は電気工作の延長ですが、最新のアーキテクチャでは処理の方法がメーカーによって異なるアプローチを用いているので、製品レベルの応用分野になるとかなり複雑な事が行われています。

 

 

■ コンピューターと処理        

 

 初期のコンピューターは、現在と比較すると文明レベルが低すぎるので、出来る事が少なく、前の世紀のCPUに至っては、マイコンとして使用されているArduinoよりも遅い物すらあります。

 

 また、Micro:bitやM5 Stackのような製品だとそれ以上の性能がありますが、基本的に 【 メモリーが1GB詰めたらハイエンドな仕様 】 だった時代な前の世紀になります。ここまで酷いと作業中にメモリーが足りなくなる場合もありますから、前の世紀のコンピューターではOS上で仮想メモリーを指定してメモリー不足を解消するような仕組みが用意されていました。この仕様は、Linux環境だとスワップ領域になりますが、WINDOWS環境の場合だと、 【 仮想メモリー 】 という名称になっていますが、行っていること自体は同じです。

 

 このように別の物を使って別の処理を行えるような機能は昔から存在しているのですが、20世紀末辺りから個人でも仮想化が使用できるようになります。

 

 

■ 仮想化               

 

 PCの場合、OS上でアプリケーションを動作させて動かす仕組みなので、基本的に、PCやタブレットやスマーフトフォンというのは、 【 カテゴリーの名前 】 でしかなく、基本的な構造としては、 【 OS上でアプリケーションを動かす仕様 】 なので、仕組みとしてはPCと同じものになっています。その為、目的によって使用しているアーキテクチャが異なり、使用しているOSも異なる訳ですが、スマートフォンなどのアーキテクチャの場合、手で持って操作するハードウェアですから、データセンターのブレードサーバのCPUのように熱量を抑えてもバッテリー駆動が不可能な物だとどうしようもありませんから、バッテリー駆動が出来る物が使用されています。

 

 この場合だと、家電に近い物を使う事になるので、超省電力で動作するCISCか、マイコンとかと同じ簡素な命令の実行が得意なRISCを使う事になります。その為、x86アーキテクチャでもモバイル製品が作れない訳ではありませんが、あまり速度が出ない端末が多かったので現在のような仕様になっています。

 

 基本的にOS上でアプリケーションを動かしているのでハードウェアをそのまま操作する仕組みとは異なるのですが、処理の方法も異なり、x86アーキテクチャの多くの製品では通常のコアで電力管理をして処理を行っていますが、モバイル製品だと、コア数が多くても、ハイパフォーマンス用と省電力用のSoCが2つ入っており、処理の負荷の違いによってハイパフォーマンス用と省電力用に処理を振り分けています。この仕様になっているので、ゲームのように常にハイパフォーマンス用のSoCに負荷がかかるような物の場合だと、消費電力が高くなりますが、放置をしている場合だと、重たい処理は発生していないので、サスペンドが入らない場合だと、省電力のSoCで動作します。Intelの第12世代のCore Inside製品も同様の構造になっていますが、CPU側に制御を行うITD(Intel Thread Director)が用意されていて、高負荷な処理をする為に使用するPコアと省電力なEコアに折る仕様になっています。基本的にはOS上で処理をしているのですが、処理の割り当ての基準をCPUに実装されたITDで行う仕組みになっています。(処理が遅い場合だと、タスクマネージャーで使用しているプロセスの優先度を上げると、Pコアが効き始めるので、挙動的にPコアが効いてほしいのに、Eコアだけで無駄に頑張っている場合だと、優先度の変更をするだけで改善する場合があります。)

 

 Ryzenはこうした構造になっていませんから、コアのコントロールを行う事で省電力やスレッド管理を行ているのですが、モバイルのSoCとPCのCPUでは全く異なる仕様になっている部分があります。それが、SMTです。

 

 

■ SMT                

 

 SMT(Simultaneous Multi-Threading)は、同時マルチスレッディングになりますが、単一のCPUで疑似的に対照型マルチプロセッシング(SMP)環境を使用できる機能になります。

 

 この機能は、Socket 478のPentium 4(Prescottコア)で実装されたのですが、xxEGHzと言う表記の物がそれに該当します。その後、Core MAのようにネイティブコアの時代になりますが、IntrelのCore InsideシリーズやAMDのRyzenシリーズでは、標準機能としてこのSMTの機能が実装されています。これも論理コアなので、存在しないコアを使える機能になっていますが、この機能を使う事で、1つのコアで2コア分のプロセスを扱う事が出来るようになっています。

 

 PCを使うと、CPU使用率が高くなると他の作業が出来なくなりますが、2004年辺りまでは、PCがシングルコアのシングルスレッドなので、そう言った状態になっていました。ただし、STMの登場でその状態もなくなり、2ソケットの製品のようにフォアグラウンドとバックグラウンドでの作業が出来るようになりました。その後、メニーコアの時代が訪れ、Intelは4コアの製品をリリースし、AMDやPhenome IIで6コア製品をリリースし始めます。その後、AMD FXと言うワットパフォーマンスがあまり良くない製品が登場するので、Phenome IIが良かっただけに何が起きたのか解らないような状態になっていたのですが、現在では、Ryzenと言ういい製品が出ています。この時のAMD FXが8コア製品ですが、ネイティブコア数を増やしてメニーコアの製品を出して行ったのはAMDでしたが、Intelは、Prescottコアで使用していたSTMを解禁し、Core Insiderシリーズで投入する事でスレッド数を増やす事に成功します。これ以降にメニーコア時代の到来し現在に至る訳ですが、この中で、AMDもSTMを実装し論理コアを実装したRyzenも登場しますから、現在はSTMによるコア数を増やした状態で使用できるようになっています。

 

 PCでは、UEFI BIOSによって色々な設定ができますが、このSTMについてもオンとオフの設定が可能になっています。

 

 あと、AlderLakeの場合性能が落ちますが、使用するPコアとEコアの数を減らす事もできます。オーバークロックやブートの順番の指定などでも使用する機能になりますが、こうした設定もできるようになっています。

 

 

■ 仮想マシン             

 

 PCを使う際にOSで実行ファイルが異なりますが、これは、アーキテクチャごとに命令セットが異なるためで、この違いによってアーキテクチャによって異なるファイルが出来上がります。その為、そう言った問題を解消する場合、別のOSの入った環境を用意する必要が出てきます。この場合の対応方法としては、

 

    別のマシンを用意する

    クロスコンパイルを行う

 

と言う方法がありますが、これとは別に、仮想化で仮想マシンを作って開発環境を追加して使用するという方法があります。

 

 

■ エミュレーターと仮想化       

 

 PCは、OS上でソフトウェアを動かす仕様になっていますが、この構造はハードウェアレベルで挙動の制御がされているのではなく、OSの階層よりも下に様々な層があり、そこでデバイスや通信などのI/Oの処理が行われているのですが、ソフトウェアについては、ハードウェアから遠いアプリケーション層で動作するようになっています。この層をアプリケーションレイヤーとも言いますが、OS上で異なるOSのソフトを動作させるように機能を用意したツールがありますが、こう言ったツールはアプリケーションレイヤーソフトとも言います。開発をする時に実機の動作をするソフトを使用したり、仮想化環境を使いますが、OSよりも上の層で、ハードウェアの設定が出来ない状態で、ライブラリの指定などを行って開発用のOSと同じ挙動で動作させる仕様の物がアプリケーションレイヤーソフトになります。こうしたツールの別名はエミュレーターと言いますが、WINDOWSノアプリケーションを動作させることが出来るWINEとかもアプリケーションレイヤーツールになります。

 

 仮想化は、ソフトでアーキテクチャを寄せてライブラリを指定して動作するような詩雲の物ではなく、PCの中に仮想のPCを用意してその仮想マシンに対してOSをインストールして動かす仕様になっています。その為、

 

    スレッド数

    メモリー搭載量

    ストレージの区画

    VRAMの容量

 

が多いほうが仮想マシンの代数を増やしやすくなりますし、用意できる仮想マシンのスペックを高くできます。また、仮想化環境では、 【 ホストマシン 】 + 【 ゲストマシン 】 のように元々動いているOSと、別のプロセスで動作している仮想マシンのスレッドやメモリー消費などが増えたとしても高負荷になりにくくすることができます。

 

 その為、仮想化を扱う場合にはハードウェアのスペックを高くしておいた方が仮想マシンの構成の自由度が高くできますし、同時に起動できる仮想マシンの数を増やす事もできます。

 

 この仮想化もQ-EMUのようにOS上で動作するホスト型と、KVMやXENのようなローレベルに近い場所で動作するハイパーバイザー型が存在しますが、目的の物だけを動作させるために使用するコンテナ型もハイパーバイザー型のようにローレベルの場所に仮想化環境が出来る仕様になっています。

 

 

■ 仮想マシンと仕様          

  

 仮想マシンについては、GPUの設定があまり強力にならないものもあるので、CPUとメモリーとストレージの設定が行えてVRAMの容量が少ない状態で運用する事になる物もあります。

 

 前述のように仮想化は 【 PCをPCの中に作る 】 ソフトになりますから、PCの構成を見て、メインのOSと仮想マシン上の処理の負荷が高くなり過ぎないように仮想マシンのスペックを調整して 【 指定した構成の仮想マシン 】 を作ります。すると、仮想化環境上に新規作成をしたPCが追加されるので、このPCにOSのインストールをする事になります。

 

 インストールをすると、そのOSの起動が出来るようになりますが、WINDOWSの場合、インサイダーで配布されているプレビュー版以外だとOSの場合ライセンスが必要なのと、MAC OSの場合、MAC以外にインストールするとライセンス違反になるので、そう言った影響がない物を選ぼうとすると必然的に、

 

    Linux

    Free BSD

    Android

    Chrome OS

 

のようなライセンスの問題が出ず無料で使用できる物を使用する事になります。こうした条件から、仮想マシンだとLinuxで試すとコストを抑えることが出来るのですが、インサイダープレビューで新しいOSのプレビュー版を使うという方法もあるので、コードを書いて実行した時に次期バージョンではどう言った挙動になるのかも事前に調べることもできます。

 

 仮想化を使うとPCで使用している物とは異なるOSを使用できるので、異なるアーキテクチャのコンパイル環境を実装できるようになります。その為、コンパイル型言語を使ってコーディングをする場合にも、仮想マシンのOS上でビルドとデバッグが出来るので、挙動の確認や実際のテストを行う事もできます。

 

 仮想化は、プロセスを消費して動くソフトウェアなので、基本的に、仮想マシンで指定したコア数やメモリーは常に消費する事になります。つまり、その分だけマシンの負荷が上昇している事になりますが、仮想マシンはPCの機能の一部でPCを作っている状態なので、PC単独で動作させるよりも速度が出ません。

 

 その為、別のOSをインストールしても適正に動作するようであれば、ブートローダーを使ってOSを切り替えるようにすると、PCの構成通りのコア数とメモリー搭載量で動作するので、仮想マシンで動作させる時よりもハイスペックな構成の状態で動作させることができます。
 

 

■ WINDOWSと仮想化          

 

 WINDOWSでは、7以降に仮想化環境が付いてきたのですが、Profeshonal以上の製品でXPモードが実装されたので、マイクロソフトが提供していたホスト型のVirtual PCと言うツールにXPのライセンスの付いた仮想マシンが入った状態の物が販売されていました。(現在はXPモードは使えないので、後方互換用のオプションでソフトウェアを実行する事になります。)

 

 そして、10では、Pro版とEducation EditionでHyper-Vが使用できるようになっているので、ハイパーバイザー型の仮想化環境を使用できるようになっています。その為、OSのエディションによっては、最初から仮想化のクライアントを使えるようになっています。基本的に、WINDOWS 10では、全てのエディションにHyper-Vが入っているのですが、この機能を使用してLinuxを動かせるWSL2と言う物があります。

 

 その為、サーバOSみたいにCUIで操作してコマンドを使って作業が出来る環境を構築できるようになっているのですが、設定を行った後にストアにあるLinux OSのイメージをインストールするとWSLでそのOSを使えるようになります。

 

 

■ Virtual Box              

 

 オラクルが無償で提供している仮想化環境にVirtual Boxがありますが、多機能なので問題なく動くとかなり使えます。

 

 NATでのネットワークも組めますし、ネットワークの設定もできるので、PCのスペックを高くしておくとかなり色々な事が出来ます。

 

 

■ プログラミング言語と仮想化     

 

 プログラミング具を行う際にコンパイル型言語を使った場合、アーキテクチャ依存が発生するので開発閑居が異なると、書いたコードの内容のように 【 単なるテキストファイルの状態 】 だとやり取りができますが、違う環境でコンパイルをしていくような作業が発生すると対象としたハードウェア用のコンパイルが出来ないので、弊害が出てしまいます。

 

 これは、【 アーキテクチャ依存 】 が存在する為ですが、コンパイル型言語がインタプリタ型言語のように実行環境が存在し、そのアーキテクチャに準じたバイナリを実行する形にすれば、OSに関係なく動作する物を作る事ができます。その為、この仕様にするとコンパイルを行う環境のOSがバラバラでも同時進行で開発が行えるようになります。

 

 こうした言語が20世紀に登場したのですが、その言語が、マインクラフトでも使用されているJAVAになります。マインクラフトは現在は、2つのエディションが存在していて、RENDER DRAGONと言うゲームエンジンを使った統合版と、昔からあるPC版でLinuxでも動作するJAVA版がありますが、この開発に使用されているのがJAVAになります。JAVAはコンパイル型言語になりますが、 【 JAVA VM 】 と言う仮想マシンで動作するバイナリを作って実行しています。その為、使用している命令セットは端末で使用されている命令セットではなく、JAVA VMの上で動作する物が用意されています。

 

 通常のコンパイル型言語の場合、コンパイラが用意されているので、コードを書いてコンパイラでビルドを行うと実行ファイルが作れるのですが、前述のようにJAVAはJAVA VM上で動作するので 

 

    実行環境  : JRE

    コンパイラ : JDK

 

を使う事になります。仮想マシンで実行するスタイルのプログラミング言語はマイクロソフトが提供している.NETも同様なので、C#やVB.netもJAVAと同様に仮想マシンの命令セットで動作する物を作って実行する仕様になっています。

 

 ただし、.NETを使うとビルド後のファイルは.exeになるのでネイティブのコンパイルのように見えますが、実はそうではなく、.exeの実行ファイル内に仮想化環境とバイナリがあるので、実行できるようになっています。JAVAのようにコンパイル済みのファイルと実行環境が別にならずに一つに固まった状態で出力されます。

 

 ちなみに、WINDOWS 環境だとXP SP3の段階で.NETでの開発が行える.NET Frameworkが入っているので、現在も標準機能として

 

    C#

    VB.NET

    J#

 

のコンパイラが用意されています。

 

 

 

■ クロスプラットフォーム開発     

 

 仮想化を使うと開発時にアーキテクチャ依存がなくなりますが、1つのコードで異なるアーキテクチャで動作するようにする場合には、クロスプラットフォーム開発を行う事になります。

 

 この分野だと、Xamarinが有名ですが、開発の終了のアナウンスがあったので、今後は使われなくなると思いますが、それ以外だと、

 

    Flurtter

    React Native

 

などがあります。そして。先日マイクロソフトから

  

    .NET MAUI

 

の発表があったので、今後はXamalinの入れ替わるのかもしれません。シェアを見るとFlutterが高いのですが、

 

    React Native : JavaScriptに向いている

    .NET MAUI  : C#に向いている

 

ので目的で使い分けた方がいいかもしれませんが、こうした環境を使うと、

 

    WINDOWS

    MAC

    iOS

    Android

 

のような異なるプラットフォームに対してクロスプラットフォームなソフトウェアを提供する際に1つのコードを描けばその対象に合ったコンパイルが出来るようになるので開発コストを抑えることが出来ます。