Grow with AppMaster Grow with AppMaster.
Become our partner arrow ico

GoでCLIアプリケーションを書く

GoでCLIアプリケーションを書く

GoとCLIアプリケーションの紹介

Golangとしても知られるGoは、Googleによって設計されたオープンソースのプログラミング言語です。シンプルさ、安全性、パフォーマンスに重点を置いており、コマンドラインインターフェイス(CLI)アプリケーションの構築に最適です。CLIアプリケーションは、ユーザーがテキストベースのインターフェイスを介して対話できるツールで、一般的にシステム管理、自動化、スクリプト作業に使用されます。GoはCLI開発に適しています:

  1. シンプルさ:Goの構文は理解しやすく書きやすいため、開発者はCLIアプリケーションを迅速に構築し、保守することができます。
  2. パフォーマンス:Goはコンパイルされ、静的に型付けされた言語です。つまり、最適化されたバイナリファイルが生成されるため、高速で効率的なCLIアプリケーションが得られます。
  3. 並行処理のサポート:Go には、ゴルーチンやチャネルなどの組み込みの並行処理プリミティブが備わっているため、シームレスな並行処理が可能になり、最終的に CLI アプリケーションが高速化され、応答性が向上します。
  4. 静的バイナリ コンパイル:Go はアプリケーションを単一のスタンドアロン バイナリ(外部依存関係のないバイナリ)にコンパイルするため、CLI アプリケーションの配布と展開が容易になります。
  5. 強力な標準ライブラリ:Go の標準ライブラリには多数の組み込みパッケージが用意されており、ファイル、ネットワーク、コマンドライン引数の処理など、一般的な CLI 開発タスクが簡素化されます。

この記事では、環境のセットアップ、アプリケーションの構造化から、コマンドライン引数の処理、サードパーティ パッケージの活用まで、Go を使用した CLI アプリケーションの開発の要点を学びます。

はじめにGo のインストールと環境のセットアップ

Goを使ってCLIアプリケーションを書き始める前に、まずGoプログラミング言語をシステムにインストールする必要があります。

  1. 公式のGoダウンロード・ページにアクセスし、お使いのプラットフォーム(Windows、macOS、Linux)に適したバイナリ・パッケージを選択し、インストール手順に従ってください。
  2. インストールが完了したら、ターミナルでgo versionを実行して、Goが正しくインストールされていることを確認します。このコマンドを実行すると、インストールされているGoのバージョンが表示されるはずです。
  3. Goワークスペース(Goプロジェクトと依存関係が保存される場所)の場所を決めるGOPATH、Goインストール・ディレクトリを指すGOROOTなど、Goに必要な環境変数を設定します。
  4. goコマンドがシステムのPATH変数に入っていることを確認してください。これにより、どのディレクトリからでもGoコマンドを実行できるようになります。

Goがインストールされ、環境が設定されたら、最初のCLIアプリケーションのビルドを開始する準備ができました。

CLIアプリケーションの構造化パッケージとモジュール

CLIアプリケーションを適切に構造化することは、保守性と拡張性に不可欠です。Goでは、パッケージとモジュールによってコードを構成します。

パッケージ:パッケージは、コードを整理して区分けするGoの方法です。パッケージは、同じディレクトリにある1つ以上のソースファイル(拡張子は.go)で構成されます。パッケージ内の各ファイルは、ファイルの先頭でpackageキーワードで指定されたパッケージ名を宣言する必要があります。典型的なGo CLIアプリケーションには、少なくとも2つのパッケージがあります:

  1. main:main:これはアプリケーションのエントリー・ポイントのデフォルト・パッケージです。main()関数が存在し、CLIアプリケーションの起点となります。CLI固有のロジックやコマンドは、すべてmainパッケージ内に置く必要があります。
  2. internalまたはpkg:これらのパッケージには、CLIロジックから分離された再利用可能なコードが含まれています。プロジェクト内の自分のGoコードによってのみインポートされるべきコードにはinternalを、どのGoプロジェクトからもインポート可能なコードにはpkgを使うことができます。

モジュール:モジュールは、Goアプリケーションの依存関係とバージョン管理を行う手段です。Go 1.11 で導入されたモジュールにより、開発者はパッケージの依存関係を宣言し、必要なバージョンを指定できます。新しいGoモジュールを作成するには、プロジェクトのルート・ディレクトリに移動して、次のコマンドを実行します:

go mod init your.module.name

このコマンドはルート・ディレクトリにgo.modファイルを作成します。go.modファイルにはプロジェクトの依存関係がリストされ、go.sumファイルには各依存関係のチェックサムが格納されます。パッケージをインポートしたり、サードパーティのライブラリを使用したりすると、Goは自動的にgo.modファイルとgo.sumファイルに依存関係を記録します。

Golang Modules

画像ソースGoプログラミング言語

パッケージとモジュールを効果的に使用することで、Go CLI アプリケーションのクリーンで効率的なコード構造を維持できます。

コマンドライン引数とフラグ

コマンドライン引数とフラグは CLI アプリケーションに不可欠なコンポーネントで、ユーザーがアプリケーションの動作を制御したり、必要な入力を提供したりできるようにします。Goでは、標準ライブラリのflagパッケージとos.Argsパッケージを使って、コマンドライン引数とフラグを扱うことができます。

os.Argsの使用

os.Argsパッケージはコマンドライン引数への直接アクセスを提供します。これは文字列のスライスで、os.Args[0]は実行中のプログラムの名前で、残りのエントリーはプログラムに渡された引数を表します。

以下はos.Argsの使用例です:

package main import ( "fmt" "os" ) func main() { argCount := len(os.Args) fmt.Printf("Number of arguments: %dn", argCount) fmt.Println("Arguments:", os.Args) } プログラムを実行する。

プログラムを実行すると、引数の数とリストが表示されます。

flagパッケージの使用

flagパッケージは、コマンドライン・フラグを扱う、より洗練された柔軟な方法です。様々なデータ型のフラグを定義し、入力を便利に解析することができます。

以下は、flagパッケージの使用例です:

package main import ( "flag" "fmt" ) func main() { var ( name string age int height float64 ) flag.StringVar(&name, "name", "John Doe", "Your name") flag.IntVar(&age, "age", 21, "Your age") flag.Float64Var(&height, "height", 180.0, "あなたの身長(cm)") flag.Parse() fmt.Printf("Name: %sn", name) fmt.Printf("Age: %dn", age) fmt.Printf("Height: %.1fn", height) }.

フラグを定義したら、flag.Parse()を呼び出して、指定されたコマンドライン入力を解析し、定義された変数を投入する。これで、アプリケーション全体でこれらの変数を使用できるようになります。

コマンドとサブコマンドの作成

複雑なCLIアプリケーションの場合、コマンドやサブコマンドを作成して、機能やオプションを整理したいと思うかもしれません。Goでコマンドやサブコマンドを扱うための人気のあるサードパーティ・パッケージのひとつに、github.com/spf13/cobraがあります。

Cobraを始める

始めるには、Cobraパッケージをインストールする必要があります:

go get -u github.com/spf13/cobra/cobra

インストールしたら、Cobraを使って新しいCLIアプリケーションを作成できる:

cobra init my-cli --pkg-name=my-cli

このコマンドは、CobraベースのCLIアプリケーションに必要な構造とファイルを含むmy-cliという名前の新しいディレクトリを作成します。

コマンドの定義

Cobraベースのアプリケーションでは、cobra.Commandのインスタンスを定義することでコマンドを作成します。各コマンドはUseフィールド(コマンドがどのように使用されるかを示す)、Shortフィールド(短い説明を提供する)、Longフィールド(より詳細な説明を提供する)を持ちます。

さらに、各コマンドにはコマンドのロジックを実行する関数を含むRunフィールドが必要です。この関数は、コマンドのフラグと引数を取り込むためのクロージャとして定義することが多いでしょう。

以下は簡単な "greet "コマンドの例である:

greetCmd := &cobra.Command{ Use: "greet", Short: "Greet someone", Long: "このコマンドはカスタマイズ可能なメッセージで誰かに挨拶します。", Run: func(cmd *cobra.Command, args []string) { // 挨拶コマンドのロジック }, }.

サブコマンドを作成するには、別のcobra.Commandインスタンスを定義し、AddCommandメソッドを使用して親コマンドの子として追加します。例えば、"greet "コマンドの下に "goodbye "サブコマンドを作成することができます:

goodbyeCmd := &cobra.Command{ Use: "goodbye", Short: "Say goodbye to someone", Long: "This subcommand says goodbye to someone in a specific language.", Run: func(cmd *cobra.Command, args []string) { // サヨナラサブコマンドのロジック }, } greetCmd.AddCommand(goodbyeCmd)

対話型プロンプトとユーザー入力

対話型プロンプトは、一連の質問を通してユーザーを誘導し、その回答に基づいて入力を収集することで、CLIアプリケーションのユーザーエクスペリエンスを向上させることができます。Goでインタラクティブなプロンプトを扱うための人気のあるサードパーティ製パッケージの1つがgithub.com/AlecAivazis/survey/v2です。

サーベイを始める

まず、Survey パッケージをインストールする必要があります:

go get -u github.com/AlecAivazis/survey/v2

インタラクティブなプロンプトに Survey を使用する

Survey には、InputSelectMultiSelectConfirm などの定義済みのプロンプトタイプが用意されています。プロンプトを作成するには、目的のプロンプトタイプをインスタンス化し、survey.Ask関数を呼び出します。

package main import ( "fmt" "github.com/AlecAivazis/survey/v2" ) func main() { var name string namePrompt := &survey.Input{ Message:"What's your name?", } err := survey.Ask([]*survey.Question{{ Name:    "name", Prompt: namePrompt, Validate: survey.Required, }}, &name) if err != nil { fmt.Println("Error:", err) return } } fmt.Printf("Hello, %s!♪", name) }.

このコードスニペットは、Survey の入力プロンプトを使用して名前を収集し、挨拶メッセージを表示する例を示しています。Validateフィールドを設定することで、ユーザー入力のカスタム検証ロジックを実装することができます。

外部ライブラリとの連携

多くの CLI アプリケーションでは、機能を強化し、開発プロセスを合理化するために外部ライブラリを利用するのが一般的です。Goは、開発者が外部ライブラリとシームレスに連携できるよう、依存関係の管理にモダンで効率的なアプローチを提供します。Go 1.11 で導入された Go モジュールにより、プロジェクト内でパッケージの依存関係を宣言し、必要なパッケージのダウンロード、ビルド、インストールのプロセスを自動化できます。CLIアプリケーションで外部ライブラリを管理するには、以下の手順に従ってください:

  1. Goモジュールを初期化します:CLIアプリケーションのルート・ディレクトリで、go mod init <module-name>コマンドを実行しますこのコマンドを実行すると、プロジェクト・ディレクトリにgo.modという名前の新しいファイルが作成されます。
  2. 外部ライブラリの追加外部ライブラリをインポートしたい場合は、ソースコードに必要なimport文を追加してください。初めてプロジェクトをビルドまたは実行するときに、Goは自動的に必要なバージョンのライブラリをダウンロードしてインストールし、go.modと go.sumファイルを更新します。
  3. ライブラリの更新:外部ライブラリを更新するには、go get -uコマンドの後にパッケージ名を続けます。これでパッケージが最新版に更新され、go.modファイルの変更が反映されます。
  4. 未使用ライブラリの削除: go.modファイルから未使用のライブラリをクリーンアップするには、go mod tidyコマンドを実行します。これにより、開発中に不要になったライブラリや古くなったライブラリが削除されます。

Goモジュールを使用すると、外部ライブラリを使用する際にいくつかの利点があります。例えば、コードの読みやすさを促進し、依存関係の管理を簡素化することで、より保守しやすくモジュール化されたCLIアプリケーションを作ることができます。

エラー処理とロギング

適切なエラー処理とロギングは、CLIアプリケーションの堅牢性を確保するために非常に重要です。Goは、エラーとログを扱うための非常に実用的で人間工学的なアプローチを提供します。Goでエラーを処理するには、標準のerrorsパッケージを使用します。CLIアプリケーションでエラーを扱う際のベストプラクティスをいくつか紹介します:

  • パニックの代わりにエラーを返す:アプリケーションをパニックに陥らせてクラッシュさせるのではなく、関数からエラーを返して適切に処理しましょう。これにより、CLIアプリケーションの制御フローと回復メカニズムが改善されます。
  • カスタム・エラー・タイプの使用: errors.New関数を使用するか、errorインタフェースを実装して、独自のエラー・タイプを作成します。カスタム・エラー・タイプを使用することで、エラー発生時に何が問題だったのか、より具体的な情報を伝えることができます。
  • エラーを発生源の近くで処理する:可能な限り、エラーは発生源に近いところで処理しましょう。そうすることで、コードをシンプルに保つことができ、複雑な状況でのエラー処理に関する推論が容易になります。

ロギングについては、Go標準ライブラリはシンプルで柔軟なロギング・インターフェースを提供するlogパッケージを提供しています。このパッケージを使って、異なる重大度レベルのメッセージをログに記録したり、出力対象をカスタマイズしたりすることができます。より高度なロギング機能については、人気のあるgithub.com/sirupsen/logrusパッケージで構造化ロギングを使用することを検討してください。CLIアプリケーションで効果的なロギングを行うためのヒントは以下の通りです:

  • 適切なロギング・レベルを選択する:重要なエラー、警告、通常の情報メッセージを区別するためにロギングレベルを使用する。これは、ログをより実用的なものにし、問題をより効率的に特定するのに役立ちます。
  • ログメッセージにコンテキストを含める:変数値や関数名など、ロギング時に関連するコンテキストを提供する。これにより、トラブルシューティング時に問題を追跡しやすくなります。
  • 構造化ロギングを考慮する:構造化ロギングを使用して、JSONのような機械可読形式でログメッセージを出力します。これは、集中型ロギングシステム、ログ集約、分析ツールに特に便利です。

CLIアプリケーションのテストとベンチマーク

品質保証は、信頼性の高いCLIアプリケーションを開発するために不可欠なもう一つの側面です。テストとベンチマークのためのGoの組み込みサポートにより、効果的なユニットテストを記述し、CLIアプリケーションのパフォーマンスを測定することができます。Go のテストパッケージでは、単体テストを記述し、並行して実行し、テストカバレッジレポートを生成できます。以下のテクニックを使用して、テストプラクティスを強化しましょう:

  • テスト関数を作成する:テスト関数を作成する:CLI アプリケーション・コンポーネントのテスト関数を作成し、TestMyFunction のようにTest をプレフィックスにつけます。これらの関数は、テスト対象のソースファイルと一緒に、別の_test.goファイルに置きます。
  • テストテーブルを使う:テストテーブル (テーブル駆動テストとも呼ばれます) を使用して、 ひとつのテスト関数で複数の入出力の組み合わせをテストします。この方法はテストコードを単純化し、保守性を高めます。
  • テストの並列実行:テスト関数の中でt.Parallel()関数を活用し、 テストを並行して実行しましょう。これにより、特にリソースを大量に消費するテストを扱う場合に、 テストスイートの実行を高速化することができます。
  • テストカバレッジレポートの作成: go test -coverコマンドを使用して、コードカバレッジレポートを作成します。これにより、より徹底的なテストが必要なコードの領域を特定し、より高いテストカバレッジを確保することができます。

CLI アプリケーション・コンポーネントのパフォーマンスを測定するために、Go は同じテスト・パッケージでベンチマークをサポートしています。ベンチマークは次のように使用します:

  • ベンチマーク関数を作成します:ベンチマーク関数を作成します。BenchmarkMyFunction のように、関数の前にBenchmark を付けます。これらの関数は、関連するテスト関数を含む同じ_test.goファイルに置きます。
  • testing.Bパラメータを使用します:ベンチマークしたいコードを、testing.Bパラメータで制御されたループ内で実行します(例:for i := 0; i < b.N; i++ { ... })。 testing.Bパラメータは、統計的に有意な測定を達成するために、testingパッケージによって自動的に調整されます。
  • ベンチマーク結果を分析する: go test -benchコマンドを使用してベンチマークを実行し、結果を分析します。これにより、CLIアプリケーションの最適化が必要な領域を特定し、パフォーマンス向上の影響を測定することができます。

結論として、外部ライブラリの適切な管理、エラー処理、ロギング、テスト、ベンチマークは、信頼性が高く効率的な CLI アプリケーションを作成するために不可欠です。この記事で概説したさまざまなツール、テクニック、ベストプラクティスを活用することで、GoベースのCLIアプリケーションが高い品質と卓越性を達成できるようになります。さらに、GoのパワーとAppMasterのような汎用性の高いプラットフォームを組み合わせることで、ソフトウェア開発プロセスを大幅に迅速化し、優れた結果を得ることができます。

CLIアプリケーションの展開と配布

Goでコマンドラインインターフェイス(CLI)アプリケーションの開発が完了したら、最後のステップは、ユーザがアクセスして利用できるようにデプロイして配布することです。Goプログラミング言語とそのビルド・ツールチェーンにより、スタンドアロンで静的にリンクされた実行ファイルを作成することができます。

実行ファイルのビルド

Go CLIアプリケーションをビルドするには、go buildコマンドに続いてターゲット・パッケージまたはファイルを指定します:

go build ./path/to/your/package。

または

go build main.go

このコマンドは、現在のプラットフォーム(Windows、macOS、Linuxなど)用の実行可能なバイナリファイルをビルドし、現在の作業ディレクトリに配置します。デフォルトでは、バイナリーファイルの名前はパッケージ名または拡張子を除いたソースファイル名(例:main)と一致します。

しかし、-oフラグと環境変数を使うことで、出力バイナリファイル名を指定したり、異なるプラットフォームをターゲットにしたりすることができる:

GOOS=linux GOARCH=amd64 go build -o カスタム名 ./path/to/your/package

上記の例では、GOOSと GOARCH環境変数を設定して、AMD64アーキテクチャーのLinuxをターゲットにするようGoビルド・プロセスに指示し、出力バイナリ・ファイル名をcustom-nameに設定しています。

異なるプラットフォーム向けのクロスコンパイル

Goはクロスコンパイルを簡素化するので、複雑なビルド設定をしなくても、さまざまなプラットフォーム用の実行可能ファイルをすばやく作成できます。Go CLI アプリケーションを複数のプラットフォーム用にクロスコンパイルするには、GOOSGOARCH環境変数を適宜設定します。次の例は、Windows、macOS、Linux 用の Go CLI アプリケーションをクロスコンパイルする方法を示しています:

# Windows 64 ビットの場合 GOOS=windows GOARCH=amd64 go build -o mycli-windows.exe ./path/to/package # macOS 64 ビットの場合 GOOS=darwin GOARCH=amd64 go build -o mycli-macos ./path/to/package # Linux 64 ビットの場合 GOOS=linux GOARCH=amd64 go build -o mycli-linux ./path/to/package

CLIアプリケーションの配布

プロジェクトのウェブサイトや README ドキュメントで直接ダウンロードできるオプションを提供することで、Go CLI 実行可能バイナリファイルを配布できます。また、パッケージングシステム、リポジトリ、パッケージマネージャを使用して、プラットフォーム固有のパッケージとして配布することもできます。よく使われるパッケージ管理システムには次のようなものがあります:

  • Homebrew- macOS と Linux 用のパッケージマネージャで、パッケージのインストールと管理をユーザフレンドリな構文で行えます。
  • APT (Debian ベースのシステム)- Ubuntu のような Debian ベースの Linux ディストリビューション用のパッケージマネージャ。
  • RPM (Red Hat ベースのシステム)- Fedora のような Red Hat ベースの Linux ディストリビューション向けパッケージマネージャ。

最終的な感想とリソース

Goを使って強力なCLIアプリケーションを作成することは、楽しくやりがいのあるプロセスです。シンプルさ、パフォーマンス、バイナリ配布の利点から、Go はこの目的に理想的なプログラミング言語です。Go CLI アプリケーションの開発を続ける際には、知識を広げ、スキルを向上させるために、追加のリソースを調べることを検討してください:

  • 公式 Go ドキュメント - Go プログラミング言語とその標準ライブラリに関する包括的なガイドです。
  • Go Learning Resources - チュートリアル、書籍、コースなど、Go 学習リソースの広範なリストです。
  • Awesome Go - トピック別に分類された Go パッケージ、ライブラリ、リソースの厳選リスト。
  • Go by Example - Go の実践的なアプローチで、さまざまな Go 機能について簡潔な例と説明があります。

さらに、AppMaster.io のような、バックエンドのプログラミング言語として Go (golang) を使用するno-code プラットフォームも検討してみてください。AppMaster.ioは直感的なドラッグ&ドロップのインターフェイスを提供し、コードを1行も書かずにウェブ、モバイル、バックエンドのアプリケーションを開発できます。Go とAppMaster.io のようなno-code プラットフォームの両方を理解することで、将来さらに洗練されたソフトウェアソリューションを開発するための十分な準備が整います。

Go CLIアプリケーションでAppMaster.ioのようなフレームワークを使用できますか?

AppMaster.io は、主にウェブとモバイル・アプリケーション開発に向けたノーコード・プラットフォームだが、AppMaster で生成されたバックエンド・アプリケーションは、プログラミング言語としてGo(golang)を使用している。これは、Goの多用途性と、さまざまなソフトウェア開発の文脈での適用可能性を示している。

Goでコマンドライン引数やフラグを扱うには?

Goの標準ライブラリには、コマンドライン引数とフラグを扱うためのflagパッケージとos.Argsパッケージが用意されている。flagパッケージを使うとフラグを定義したり解析したりでき、os.Argsを使うとコマンドライン引数に直接アクセスできます。

Go CLIアプリケーションで外部ライブラリを扱うには?

Go 1.11で導入されたGoモジュールを使って外部ライブラリを管理できます。モジュールを使用すると、パッケージの依存関係を宣言し、Goツールチェーンが必要なパッケージを自動的にダウンロード、ビルド、インストールします。

GoでCLIアプリケーションをテストし、ベンチマークを取るには?

Goは、testingパッケージを通じて、ビルトインのテストとベンチマークサポートを提供します。これにより、効果的なユニットテストを記述し、それらを並行して実行し、CLIアプリケーションコンポーネントのパフォーマンスを測定することができます。

CLIアプリケーション開発において、Goはどのような利点があるのだろうか?

Goは、CLIアプリケーション開発において、シンプルさ、強力なパフォーマンス、並行処理の優れたサポートなど、いくつかの利点を提供する。この言語は習得が容易で、効率的でスケーラブルなアプリケーションを構築するための強力なツールを提供している。

Goをシステムにインストールする方法を教えてください。

Golangの公式ウェブサイトから、あなたのプラットフォームに適したバイナリパッケージをダウンロードすれば、Goを簡単にインストールできます。インストール手順に従って、必要な環境変数(GOPATHやGOROOTなど)を設定してください。

Go CLIアプリケーションでコマンドやサブコマンドを作成するにはどうすればよいですか?

複雑なCLIアプリケーションでは、github.com/spf13/cobraのようなサードパーティ・パッケージを使用して、コマンドやサブコマンドを作成することができる。Cobraパッケージは、コマンドを操作するための直感的なAPIを提供し、コマンドライン補完やヘルプドキュメント生成などの高度な機能をサポートしています。

Go CLI アプリケーションでエラーとログを処理するにはどうすればよいですか?

Goでは、errorsパッケージを使ってエラー・インスタンスを作成・管理できる。ロギングについては、標準ライブラリにlogパッケージがあり、さまざまなロギングレベルとカスタマイズ可能な出力ターゲットをサポートしています。github.com/sirupsen/logrus のようなパッケージで構造化ロギングを使用すると、ロギング機能が強化されます。

Go CLI アプリケーションのデプロイと配布のプロセスは?

Go CLIアプリケーションをデプロイして配布するには、go buildコマンドを使ってビルドします。バイナリをダウンロードできるようにするか、Homebrew や APT のようなパッケージ管理システムで配布します。

関連記事

遠隔医療プラットフォームが診療収益を増大させる方法
遠隔医療プラットフォームが診療収益を増大させる方法
遠隔医療プラットフォームが、患者へのアクセスを強化し、運用コストを削減し、ケアを改善することで、診療収益をどのように高めることができるかをご覧ください。
オンライン教育における LMS の役割: e ラーニングの変革
オンライン教育における LMS の役割: e ラーニングの変革
学習管理システム (LMS) がアクセシビリティ、エンゲージメント、教育効果を高めることでオンライン教育をどのように変革しているかを探ります。
遠隔医療プラットフォームを選択する際に注目すべき主な機能
遠隔医療プラットフォームを選択する際に注目すべき主な機能
セキュリティから統合まで、遠隔医療プラットフォームの重要な機能を確認し、シームレスで効率的な遠隔医療の提供を実現します。
無料で始めましょう
これを自分で試してみませんか?

AppMaster の能力を理解する最善の方法は、自分の目で確かめることです。無料サブスクリプションで数分で独自のアプリケーションを作成

あなたのアイデアを生き生きとさせる