GitHub Copilot Extensions とは?外部ツール連携で広がる開発オートメーション
開発現場では、コードエディタだけでなく、データベース管理ツール、CI/CD パイプライン、クラウドサービスなど、数多くのツールを日常的に使っています。それらを統合し、AI がシームレスにアクセスできるようになったら、どれほど開発が効率化されるでしょうか。
GitHub Copilot Extensions は、まさにそのような未来を実現する仕組みです。GitHub Copilot に外部サービスやツールを連携させることで、コードの自動生成にとどまらず、データベースクエリの実行、チケット管理、デプロイ作業まで、AI アシスタントが幅広い業務をサポートしてくれます。
本記事では、GitHub Copilot Extensions の基本から活用方法、カスタム拡張の作り方まで、初心者にもわかりやすく解説します。
背景
GitHub Copilot の進化
GitHub Copilot は 2021 年に登場して以来、AI によるコード補完ツールとして急速に普及してきました。当初は関数やクラスの自動生成が中心でしたが、2023 年後半から GitHub Copilot Chat が導入され、対話形式での開発支援が可能になりました。
しかし、開発業務はコードを書くだけではありません。データベースの確認、API のテスト、チケットシステムへの記録、クラウドリソースのデプロイなど、多岐にわたる作業が発生します。
外部ツールとの連携ニーズ
従来の GitHub Copilot は、エディタ内のコンテキストに基づいてコードを生成する仕組みでした。しかし、実際の開発では以下のような場面で外部ツールへのアクセスが必要になります。
- データベースのスキーマ情報を確認しながらクエリを書く
- Jira や Linear などのチケット管理システムと連携する
- Docker コンテナの状態を確認しながらデバッグする
- クラウドサービスの設定を確認しながらインフラコードを書く
こうしたニーズに応えるため、GitHub は 2024 年に GitHub Copilot Extensions を発表しました。この機能により、サードパーティのツールやサービスを GitHub Copilot に統合し、AI アシスタントが外部システムにアクセスできるようになったのです。
以下の図は、GitHub Copilot がどのように進化してきたかを示しています。
mermaidflowchart LR
v1["GitHub Copilot<br/>初期版<br/>(2021)"] -->|進化| v2["GitHub Copilot Chat<br/>(2023)"]
v2 -->|拡張| v3["GitHub Copilot Extensions<br/>(2024)"]
v1 -.->|機能| f1["コード補完"]
v2 -.->|機能| f2["対話形式<br/>コード生成"]
v3 -.->|機能| f3["外部ツール<br/>連携"]
この図からわかるように、GitHub Copilot は単なるコード補完ツールから、対話型 AI を経て、外部ツールと連携できる統合開発アシスタントへと進化してきました。
図で理解できる要点:
- 2021 年の初期版から 2024 年の Extensions まで段階的に機能拡張
- 各バージョンで新たな機能が追加され、開発支援の範囲が拡大
- Extensions により外部システムとの統合が可能に
課題
開発ツールの分断
現代の開発環境では、多数のツールが使われています。エディタ、ターミナル、ブラウザ、チケット管理システム、監視ツールなど、それぞれが独立して動作しているため、開発者はツール間を頻繁に切り替える必要があります。
この分断は以下のような問題を引き起こします。
コンテキストスイッチのコスト
エディタでコードを書いている最中に、データベースクライアントを開いてスキーマを確認し、再びエディタに戻る。このような作業を 1 日に何度も繰り返すと、集中力が途切れ、生産性が低下してしまいます。
情報の取得に時間がかかる
外部ツールから情報を取得するには、まずそのツールを起動し、ログインし、必要な情報を探す必要があります。たとえば Jira でチケット情報を確認するには、ブラウザを開き、検索し、詳細を読む必要があるでしょう。
手動での連携作業
コードをデプロイした後、チケットシステムに手動でステータスを更新したり、ドキュメントに変更内容を記録したりする作業は、自動化が難しく、ヒューマンエラーの原因にもなります。
以下の表は、従来の開発環境における主な課題をまとめたものです。
| # | 課題 | 具体例 | 影響 |
|---|---|---|---|
| 1 | ツール間の切り替え | エディタ ↔ データベースクライアント ↔ ブラウザ | 集中力の低下、時間のロス |
| 2 | 情報取得の手間 | API ドキュメント、チケット詳細の確認 | 開発速度の低下 |
| 3 | 手動での連携作業 | デプロイ後のチケット更新、ドキュメント記録 | ヒューマンエラー、作業漏れ |
| 4 | AI の限定的なコンテキスト | エディタ内の情報のみ | 不正確なコード生成 |
AI アシスタントの制約
従来の GitHub Copilot は、エディタ内のコードやコメントをコンテキストとして利用していました。しかし、外部システムの情報にはアクセスできないため、以下のような制約がありました。
- 最新のデータベーススキーマを反映したクエリを生成できない
- 実際のチケット情報に基づいた機能実装ができない
- デプロイ環境の設定を考慮したコードを書けない
これらの制約により、AI が生成するコードは、実際の開発環境と乖離することが少なくありませんでした。
解決策
GitHub Copilot Extensions の仕組み
GitHub Copilot Extensions は、GitHub Copilot に外部ツールやサービスを連携させるための拡張機能プラットフォームです。開発者は、GitHub Marketplace から公開されている拡張機能をインストールするだけで、すぐに利用できます。
拡張機能は、GitHub Copilot Chat の会話の中で @ メンションとして呼び出されます。たとえば、@docker と入力すれば Docker 関連の操作が、@sentry と入力すれば Sentry のエラー情報にアクセスできるのです。
以下の図は、GitHub Copilot Extensions の基本的なアーキテクチャを示しています。
mermaidflowchart TB
user["開発者"] -->|"@extension コマンド"| copilot["GitHub Copilot Chat"]
copilot -->|API 呼び出し| extension["Extension<br/>サーバー"]
extension -->|認証・リクエスト| external["外部サービス<br/>(Docker, Sentry, など)"]
external -->|レスポンス| extension
extension -->|結果を整形| copilot
copilot -->|回答| user
style extension fill:#e1f5ff
style external fill:#fff4e1
この図から、以下のような処理フローが理解できます。
図で理解できる要点:
- 開発者が
@extension形式でコマンドを入力 - GitHub Copilot が拡張機能サーバーに API 呼び出し
- 拡張機能が外部サービスと通信して情報を取得
- 結果が開発者に返される
主要な機能
GitHub Copilot Extensions は、以下のような機能を提供します。
外部サービスとの認証連携
拡張機能は OAuth などの標準的な認証方式を使って、外部サービスへの安全なアクセスを実現します。初回利用時に認証を行えば、以降はシームレスにサービスを利用できます。
コンテキストの拡張
エディタ内のコードだけでなく、外部サービスから取得した情報を GitHub Copilot のコンテキストに含めることができます。これにより、より正確で実用的なコード生成が可能になります。
アクション実行
情報の取得だけでなく、外部サービスに対してアクションを実行することもできます。たとえば、チケットの作成、デプロイの実行、データベースクエリの実行などが可能です。
以下の表は、GitHub Copilot Extensions の主要な機能をまとめたものです。
| # | 機能 | 説明 | 利用例 |
|---|---|---|---|
| 1 | 外部サービス連携 | API 経由で外部ツールにアクセス | データベース、チケットシステム、クラウドサービス |
| 2 | 認証管理 | OAuth などによる安全な認証 | GitHub、Google、各種 SaaS サービス |
| 3 | コンテキスト拡張 | 外部情報を AI のコンテキストに追加 | スキーマ情報、チケット詳細、ログ情報 |
| 4 | アクション実行 | 外部サービスへの操作を実行 | デプロイ、チケット作成、クエリ実行 |
| 5 | リアルタイム情報 | 最新の状態を取得 | コンテナステータス、エラーログ、メトリクス |
拡張機能の種類
GitHub Copilot Extensions には、大きく分けて 2 種類があります。
公式拡張機能
GitHub や主要なツールベンダーが提供する拡張機能です。以下のようなものがあります。
- @docker:Docker コンテナの管理とデバッグ
- @github:GitHub リポジトリ、Issues、Pull Requests の操作
- @sentry:エラー監視とデバッグ
- @azure:Azure リソースの管理
- @datadog:監視データの取得
カスタム拡張機能
開発者が独自に作成できる拡張機能です。社内ツールや特定のワークフローに対応した拡張を作成し、チームで共有することができます。
具体例
公式拡張機能の使用例
実際に GitHub Copilot Extensions を使った開発の流れを見ていきましょう。
Docker 拡張機能でコンテナをデバッグ
開発中にアプリケーションがエラーを起こした場合、Docker 拡張機能を使ってコンテナの状態を確認できます。
GitHub Copilot Chat で以下のように入力します。
typescript// GitHub Copilot Chat での入力例
@docker コンテナのステータスを確認して
すると、GitHub Copilot が Docker 拡張機能を呼び出し、実行中のコンテナ一覧とそれぞれのステータスを表示してくれます。
typescript// レスポンス例(GitHub Copilot が返す情報)
/*
実行中のコンテナ:
1. web-app (running) - ポート 3000:3000
2. postgres-db (running) - ポート 5432:5432
3. redis-cache (exited) - エラーで停止
redis-cache コンテナがエラーで停止しています。
ログを確認しますか?
*/
さらに詳しくログを確認したい場合は、以下のように続けられます。
typescript// 続きの入力
@docker redis-cache のログを表示して
このように、エディタを離れることなく、Docker コンテナの状態確認とデバッグが可能になります。
以下の図は、Docker 拡張機能を使った場合の処理フローです。
mermaidsequenceDiagram
participant dev as 開発者
participant chat as GitHub Copilot Chat
participant ext as Docker Extension
participant docker as Docker Daemon
dev->>chat: @docker コンテナのステータスを確認
chat->>ext: ステータス取得リクエスト
ext->>docker: docker ps コマンド実行
docker-->>ext: コンテナ一覧を返す
ext-->>chat: 整形された結果
chat-->>dev: わかりやすく表示
dev->>chat: @docker redis-cache のログを表示
chat->>ext: ログ取得リクエスト
ext->>docker: docker logs コマンド実行
docker-->>ext: ログデータ
ext-->>chat: エラー箇所を強調
chat-->>dev: 問題点を説明
図で理解できる要点:
- 開発者と Docker Daemon の間に拡張機能が介在
- GitHub Copilot がコマンドを解釈し、適切な API を呼び出し
- 結果をわかりやすく整形して返す
Sentry 拡張機能でエラーを調査
本番環境でエラーが発生した場合、Sentry 拡張機能を使って即座に調査できます。
typescript// GitHub Copilot Chat での入力例
@sentry 最新のエラーを確認して
GitHub Copilot は Sentry API にアクセスし、最新のエラー情報を取得します。
typescript// レスポンス例
/*
最新のエラー (30分前に発生):
Error: TypeError: Cannot read property 'name' of undefined
発生場所: src/users/profile.ts:45
影響ユーザー数: 127 人
発生頻度: 過去1時間で 45 回
スタックトレース:
at getUserProfile (profile.ts:45)
at handleRequest (api.ts:23)
...
このエラーは user オブジェクトが null の場合に発生しています。
修正方法を提案しますか?
*/
さらに、修正コードの提案も受けられます。
typescript// 修正提案を依頼
修正コードを提案して;
typescript// 修正前のコード
export function getUserProfile(userId: string) {
const user = findUserById(userId);
// user が null の場合エラーが発生
return {
name: user.name,
email: user.email,
};
}
typescript// 修正後のコード(GitHub Copilot の提案)
export function getUserProfile(userId: string) {
const user = findUserById(userId);
// null チェックを追加
if (!user) {
throw new Error(`User not found: ${userId}`);
}
return {
name: user.name,
email: user.email,
};
}
このように、エラーの発見から原因の特定、修正コードの提案まで、一連の流れをシームレスに行えます。
カスタム拡張機能の作成
独自の拡張機能を作成することで、社内ツールや特定のワークフローに対応できます。ここでは、簡単なカスタム拡張機能の作成方法を紹介します。
拡張機能の基本構造
GitHub Copilot Extensions は、GitHub App として実装されます。基本的な構成は以下のとおりです。
typescript// package.json の例
{
"name": "my-copilot-extension",
"version": "1.0.0",
"description": "Custom GitHub Copilot Extension",
"main": "dist/index.js",
"scripts": {
"build": "tsc",
"start": "node dist/index.js"
},
"dependencies": {
"@octokit/rest": "^20.0.0",
"express": "^4.18.0"
}
}
エントリーポイントの実装
Express を使って、GitHub Copilot からのリクエストを受け取るサーバーを立ち上げます。
typescript// src/index.ts - サーバーのセットアップ
import express from 'express';
import { handleCopilotRequest } from './handler';
const app = express();
const PORT = process.env.PORT || 3000;
// JSON リクエストを解析
app.use(express.json());
typescript// src/index.ts - エンドポイントの定義
// GitHub Copilot からのリクエストを処理
app.post('/api/copilot', async (req, res) => {
try {
const result = await handleCopilotRequest(req.body);
res.json(result);
} catch (error) {
console.error('Error:', error);
res
.status(500)
.json({ error: 'Internal server error' });
}
});
typescript// src/index.ts - サーバー起動
app.listen(PORT, () => {
console.log(`Extension server running on port ${PORT}`);
});
リクエストハンドラーの実装
GitHub Copilot からのリクエストを解析し、適切な処理を実行します。
typescript// src/handler.ts - 型定義
interface CopilotRequest {
// ユーザーの入力メッセージ
message: string;
// 会話のコンテキスト
context?: {
files?: string[];
code?: string;
};
// 認証トークン
token: string;
}
typescript// src/handler.ts - リクエスト処理のメイン関数
export async function handleCopilotRequest(
request: CopilotRequest
): Promise<any> {
const { message, context, token } = request;
// メッセージから意図を解析
const intent = parseIntent(message);
// 意図に応じた処理を実行
switch (intent.action) {
case 'query':
return await executeQuery(intent.params, token);
case 'create':
return await createResource(intent.params, token);
default:
return { error: 'Unknown action' };
}
}
typescript// src/handler.ts - 意図の解析
function parseIntent(message: string) {
// シンプルなキーワードマッチング
// 実際はより高度な NLP を使うことも可能
if (
message.includes('確認') ||
message.includes('取得')
) {
return {
action: 'query',
params: extractParams(message),
};
}
if (
message.includes('作成') ||
message.includes('追加')
) {
return {
action: 'create',
params: extractParams(message),
};
}
return { action: 'unknown', params: {} };
}
外部サービスとの連携
実際に外部 API を呼び出して、情報を取得したり操作を実行したりします。
typescript// src/services/external-api.ts - API クライアントのセットアップ
import axios from 'axios';
const API_BASE_URL = process.env.API_BASE_URL;
export class ExternalAPIClient {
private token: string;
constructor(token: string) {
this.token = token;
}
typescript// src/services/external-api.ts - データ取得メソッド
async fetchData(query: string): Promise<any> {
try {
const response = await axios.get(
`${API_BASE_URL}/data`,
{
params: { q: query },
headers: {
'Authorization': `Bearer ${this.token}`,
'Content-Type': 'application/json'
}
}
);
return response.data;
} catch (error) {
throw new Error(`Failed to fetch data: ${error.message}`);
}
}
}
typescript// src/services/external-api.ts - データ作成メソッド
async createResource(data: any): Promise<any> {
try {
const response = await axios.post(
`${API_BASE_URL}/resources`,
data,
{
headers: {
'Authorization': `Bearer ${this.token}`,
'Content-Type': 'application/json'
}
}
);
return response.data;
} catch (error) {
throw new Error(`Failed to create resource: ${error.message}`);
}
}
}
レスポンスの整形
取得したデータを、GitHub Copilot が理解しやすい形式に整形します。
typescript// src/formatter.ts - レスポンスの整形関数
export function formatResponse(
data: any,
intent: string
): string {
// データの種類に応じて整形
if (intent === 'query') {
return formatQueryResult(data);
}
if (intent === 'create') {
return formatCreateResult(data);
}
return JSON.stringify(data);
}
typescript// src/formatter.ts - クエリ結果の整形
function formatQueryResult(data: any): string {
const items = data.items || [];
if (items.length === 0) {
return '該当するデータが見つかりませんでした。';
}
// 表形式で整形
let result = `${items.length} 件のデータが見つかりました:\n\n`;
items.forEach((item: any, index: number) => {
result += `${index + 1}. ${item.name}\n`;
result += ` ID: ${item.id}\n`;
result += ` ステータス: ${item.status}\n\n`;
});
return result;
}
typescript// src/formatter.ts - 作成結果の整形
function formatCreateResult(data: any): string {
return `リソースを作成しました:
ID: ${data.id}
名前: ${data.name}
作成日時: ${data.created_at}
URL: ${data.url}
正常に作成されました。`;
}
デプロイと登録
拡張機能を GitHub App として登録し、GitHub Copilot に認識させます。
bash# ビルド
yarn build
# デプロイ(例: Vercel へのデプロイ)
vercel deploy --prod
typescript// GitHub App の設定(manifest.json の例)
{
"name": "My Custom Extension",
"description": "Custom extension for GitHub Copilot",
"url": "https://your-extension.vercel.app",
"permissions": {
"contents": "read",
"issues": "write"
},
"events": ["copilot_chat"]
}
以下の図は、カスタム拡張機能の全体像を示しています。
mermaidflowchart TB
subgraph client["クライアント側"]
copilot["GitHub Copilot Chat"]
end
subgraph extension["拡張機能サーバー"]
entry["エントリーポイント<br/>(Express)"]
handler["リクエストハンドラー"]
formatter["レスポンス整形"]
end
subgraph external["外部システム"]
api["外部 API"]
db[("データベース")]
end
copilot -->|"POST /api/copilot"| entry
entry --> handler
handler -->|API 呼び出し| api
api -->|データ取得| db
db -->|結果| api
api -->|レスポンス| handler
handler --> formatter
formatter -->|整形済みデータ| copilot
style extension fill:#e1f5ff
style external fill:#fff4e1
図で理解できる要点:
- Express サーバーが GitHub Copilot からのリクエストを受け取る
- ハンドラーが外部 API を呼び出してデータを取得
- フォーマッターが結果を整形して返す
- すべて非同期で処理される
よくあるエラーと対処法
カスタム拡張機能を開発する際に遭遇しやすいエラーと、その解決方法を紹介します。
認証エラー
エラーコード: Error 401: Unauthorized
bashError: Request failed with status code 401
at createError (node_modules/axios/lib/core/createError.js:16)
at settle (node_modules/axios/lib/core/settle.js:17)
発生条件:
- 認証トークンが無効または期限切れ
- 認証ヘッダーの形式が間違っている
解決方法:
- トークンの有効性を確認する
- Authorization ヘッダーの形式を確認する(
Bearerプレフィックスの有無など) - トークンのスコープ(権限)が適切か確認する
typescript// 正しい認証ヘッダーの例
headers: {
'Authorization': `Bearer ${token}`, // Bearer プレフィックスを忘れずに
'Content-Type': 'application/json'
}
レート制限エラー
エラーコード: Error 429: Too Many Requests
bashError: API rate limit exceeded
Response headers: {
'X-RateLimit-Limit': '100',
'X-RateLimit-Remaining': '0',
'X-RateLimit-Reset': '1640000000'
}
発生条件:
- 短時間に大量のリクエストを送信した
- API のレート制限に達した
解決方法:
- リトライロジックを実装する
- キャッシュを活用して API 呼び出しを減らす
- バックオフ戦略を採用する
typescript// リトライロジックの実装例
async function fetchWithRetry(
url: string,
options: any,
maxRetries: number = 3
): Promise<any> {
for (let i = 0; i < maxRetries; i++) {
try {
return await axios.get(url, options);
} catch (error) {
// レート制限エラーの場合
if (error.response?.status === 429) {
const resetTime =
error.response.headers['x-ratelimit-reset'];
const waitTime = resetTime * 1000 - Date.now();
// リセット時刻まで待機
await new Promise((resolve) =>
setTimeout(resolve, waitTime)
);
continue;
}
throw error;
}
}
throw new Error('Max retries exceeded');
}
タイムアウトエラー
エラーコード: Error ETIMEDOUT
bashError: timeout of 5000ms exceeded
at createError (node_modules/axios/lib/core/createError.js:16)
at Timeout._onTimeout (node_modules/axios/lib/adapters/http.js:282)
発生条件:
- 外部 API のレスポンスが遅い
- ネットワークの問題
- タイムアウト設定が短すぎる
解決方法:
- タイムアウト時間を延長する
- 非同期処理を活用する
- ユーザーに進行状況を通知する
typescript// タイムアウト設定の調整
const response = await axios.get(url, {
timeout: 30000, // 30秒に延長
headers: {
/* ... */
},
});
以下の表は、よくあるエラーとその対処法をまとめたものです。
| # | エラーコード | 原因 | 対処法 |
|---|---|---|---|
| 1 | Error 401: Unauthorized | 認証トークンの問題 | トークンの有効性、形式、スコープを確認 |
| 2 | Error 403: Forbidden | 権限不足 | API の権限設定を確認、必要な権限を付与 |
| 3 | Error 429: Too Many Requests | レート制限超過 | リトライロジック、キャッシュ、バックオフ戦略を実装 |
| 4 | Error 500: Internal Server Error | サーバーエラー | ログを確認、API プロバイダーに問い合わせ |
| 5 | Error ETIMEDOUT | タイムアウト | タイムアウト時間を延長、非同期処理を活用 |
まとめ
GitHub Copilot Extensions は、AI アシスタントと外部ツールを連携させることで、開発オートメーションの新たな可能性を開きます。コードの自動生成にとどまらず、データベースの確認、チケット管理、デプロイ作業まで、エディタ内で完結できるようになりました。
本記事では、GitHub Copilot Extensions の基本概念から、公式拡張機能の使い方、カスタム拡張機能の作成方法まで解説しました。特に、以下のポイントが重要です。
活用のポイント:
- 公式拡張機能で、Docker、Sentry、GitHub などの主要ツールとすぐに連携できる
@メンションで直感的に拡張機能を呼び出せる- カスタム拡張機能を作成して、社内ツールや独自のワークフローに対応可能
- Express や Axios などの一般的な技術スタックで実装できる
導入時の注意点:
- 認証管理とセキュリティを適切に設計する
- レート制限やタイムアウトなどのエラーハンドリングを実装する
- レスポンスをわかりやすく整形して、AI が正確に理解できるようにする
GitHub Copilot Extensions を活用することで、ツール間の切り替えによる集中力の低下や、手動作業によるヒューマンエラーを大幅に削減できます。開発チームの生産性を向上させる強力なツールとして、ぜひ導入を検討してみてください。
今後も GitHub Copilot Extensions のエコシステムは拡大し続けるでしょう。新しい拡張機能が次々と登場し、開発体験はさらに進化していくはずです。ぜひ、この変化の波に乗って、より効率的な開発環境を構築してください。
関連リンク
articleGitHub Copilot Extensions とは?外部ツール連携で広がる開発オートメーション
articleGitHub Copilot セキュア運用チェックリスト:権限・ポリシー・ログ・教育の定着
articleGitHub Copilot と設計ガイドラインの同期:Conventional Commits/ADR/Rulebook 連携
articleGitHub Copilot でリファクタ促進プロンプト集:命名・抽象化・分割・削除の誘導文
articleGitHub Copilot Enterprise 初期構築:SSO/SCIM・ポリシー・配布ロールアウト設計
articleGitHub Copilot Workspace と Cursor/Cline の比較検証:仕様駆動の自動化能力はどこまで?
articlegpt-oss 推論パラメータ早見表:temperature・top_p・repetition_penalty...その他まとめ
articleLangChain を使わない判断基準:素の API/関数呼び出しで十分なケースと見極めポイント
articleJotai エコシステム最前線:公式&コミュニティ拡張の地図と選び方
articleGPT-5 監査可能な生成系:プロンプト/ツール実行/出力のトレーサビリティ設計
articleFlutter の描画性能を検証:リスト 1 万件・画像大量・アニメ多用の実測レポート
articleJest が得意/不得意な領域を整理:単体・契約・統合・E2E の住み分け最新指針
blogiPhone 17シリーズの発表!全モデルiPhone 16から進化したポイントを見やすく整理
blogGoogleストアから訂正案内!Pixel 10ポイント有効期限「1年」表示は誤りだった
blog【2025年8月】Googleストア「ストアポイント」は1年表記はミス?2年ルールとの整合性を検証
blogGoogleストアの注文キャンセルはなぜ起きる?Pixel 10購入前に知るべき注意点
blogPixcel 10シリーズの発表!全モデル Pixcel 9 から進化したポイントを見やすく整理
blogフロントエンドエンジニアの成長戦略:コーチングで最速スキルアップする方法
review今の自分に満足していますか?『持たざる者の逆襲 まだ何者でもない君へ』溝口勇児
reviewついに語られた業界の裏側!『フジテレビの正体』堀江貴文が描くテレビ局の本当の姿
review愛する勇気を持てば人生が変わる!『幸せになる勇気』岸見一郎・古賀史健のアドラー実践編で真の幸福を手に入れる
review週末を変えれば年収も変わる!『世界の一流は「休日」に何をしているのか』越川慎司の一流週末メソッド
review新しい自分に会いに行こう!『自分の変え方』村岡大樹の認知科学コーチングで人生リセット
review科学革命から AI 時代へ!『サピエンス全史 下巻』ユヴァル・ノア・ハラリが予見する人類の未来