yoshikwsuguru’s blog

初心者のためのVSCodeで天気アプリを作成する方法(1):バックエンド設計とAPIテスト

天気アプリを作成することは、API統合、ウェブ開発、テストの基礎を学ぶための素晴らしいプロジェクトです。このガイドでは、Visual Studio CodeVSCodeでシンプルな天気アプリを作成するプロセスと、APIリクエストがスムーズに動作することを確認するためのテスト方法を説明します。このチュートリアルは、初心者にも分かりやすいように詳細に解説しています。それでは、始めましょう!

前提条件

始める前に、以下のものをインストールしてください:

Visual Studio CodeVSCode): 複数のプログラミング言語をサポートするコードエディタです。

VScode

Node.jsとnpm: JavaScriptを使用し、必要なライブラリをインストールするために必要です。

nd

EchoAPI for VS Code APIをテストし、デバッグするためのツールです。

EchoAPI for VS Code

ステップ1:VSCodeでプロジェクトをセットアップする

1.1 新しいディレクトリを作成する

天気アプリを作成するフォルダを作成します。

  • VSCodeを開く。
  • ターミナルを開く(Ctrl + \ または ターミナル > 新しいターミナルを選択)。
  • 以下のコマンドを実行して、新しいフォルダを作成し、移動します:
mkdir weather-app
cd weather-app

1.2 Node.jsプロジェクトを初期化する
Node.jsをセットアップして、プロジェクトとその依存関係を管理します。

ターミナルで以下を実行します:

npm init -y

terminal
これにより、プロジェクトのライブラリや設定を追跡するためのpackage.jsonファイルが作成されます。

1.3 必要なパッケージをインストールする
アプリを動作させるためにいくつかのツールが必要です。以下のコマンドを実行してインストールします:

npm install express axios dotenv

各パッケージの役割は以下の通りです:

express: シンプルなウェブサーバーを作成するのに役立ちます。
axios: 外部API(天気サービスなど)にリクエストを送ることができます。
dotenv: APIキーを安全に保存・管理します。

ステップ2:天気APIキーを取得する

リアルタイムの天気データを取得するには、天気サービスからAPIキーが必要です。

2.1 天気APIにサインアップする

OpenWeatherMap(https://openweathermap.org/)にアクセスして、無料アカウントにサインアップします。

image.png

登録後、天気データを取得するためのパスワードのようなAPIキーが手に入ります。

2.2 APIキーを安全に保存する
APIキーを安全に保管するため、.envファイルに保存します(ここに秘密のキーを安全に保存できます)。

ターミナルで以下を実行して、.envファイルを作成します:

touch .env

.envファイル内に、以下のようにAPIキーを追加します:

API

WEATHER_API_KEY=your_api_key_here

your_api_key_hereは、OpenWeatherMapから取得した実際のキーに置き換えてください。

ステップ3:天気アプリを作成する

それでは、アプリ自体を作成しましょう!

3.1 アプリのエントリーポイントを作成する

ターミナルでapp.jsという新しいファイルを作成します。これが私たちのコードを書くメインファイルになります。

touch app.js

3.2 サーバーコードを書く

VSCodeでapp.jsを開き、以下のコードを貼り付けます:

require('dotenv').config();
const express = require('express');
const axios = require('axios');
const app = express();

const PORT = 3000;

app.get('/weather', async (req, res) => {
    const city = req.query.city || 'London'; // デフォルトの都市はロンドン
    const apiKey = process.env.WEATHER_API_KEY;
    const url = `https://api.openweathermap.org/data/2.5/weather?q=${city}&appid=${apiKey}&units=metric`;

    try {
        const response = await axios.get(url);
        const data = response.data;
        res.json({
            temperature: data.main.temp,
            weather: data.weather[0].description,
            city: data.name
        });
    } catch (error) {
        res.status(500).json({ error: '天気データの取得に失敗しました' });
    }
});

app.listen(PORT, () => {
    console.log(`サーバーは http://localhost:${PORT} で実行中です`);
});

3.3 コードの解説:

dotenv:

  • require('dotenv').config();の行は、.envファイルから環境変数を読み込み、process.envに格納します。
  • ここでは、APIキー(WEATHER_API_KEY)を安全に保存するために使用します。
  • これにより、APIキーなどの機密情報をメインコードから外に出し、プロジェクトをより安全に保つことができます。

/weatherルート:

  • これは、 /weather エンドポイントでリクエストを待ち受けるExpressのGETルートを定義します。
  • クエリ文字列から都市パラメータを受け入れます(req.query.city)。例えば、/weather?city=New%20Yorkにアクセスすると、ニューヨークの天気データを取得します。
  • リクエストに都市が指定されていない場合、デフォルトでロンドンを使用します(const city = req.query.city || 'London')。
  • APIのURLは、都市名と.envから読み込んだAPIキーを使って構築されます。

axios:

  • AxiosはHTTPリクエストを行うために使用されます。この場合、OpenWeatherMap APIに天気データを取得するためのGETリクエストを送ります。
  • 使用されるURLは、https://api.openweathermap.org/data/2.5/weather?q=${city}&appid=${apiKey}&units=metricです。ここで、${city}はユーザーがリクエストした都市名で、${apiKey}.envファイルからのAPIキーです。
  • OpenWeatherMapからの応答には詳細な天気情報が含まれています。私たちは、温度(data.main.temp)、天気の説明(data.weather[0].description)、都市名(data.name)といった特定のデータを抽出しています。

エラーハンドリング:

  • コードはtry...catchブロックでラップされており、APIリクエストやネットワークの失敗などの潜在的なエラーを処理します。
  • エラーが発生した場合、アプリは500ステータスコードとエラーメッセージ(天気データの取得に失敗しました)で応答します。これは、デバッグやユーザーが問題が発生した

ことを理解するのに役立ちます。

Expressサーバー:

  • サーバーはポート3000で待機するように設定されています(const PORT = 3000;)。
  • サーバーが起動すると、コンソールにメッセージが表示されます:サーバーは http://localhost:${PORT} で実行中です
  • これにより、サーバーが起動してリクエストを処理できることが確認できます。

3.4 アプリをローカルでテストする

アプリの動作を確認するために、ターミナルで以下のコマンドを実行します:

node app.js

次に、ウェブブラウザを開いて、以下のURLにアクセスします:

http://localhost:3000/weather?city=New%20York

Test Your App Locally

ニューヨークの天気データが表示されるはずです。都市が指定されていない場合、デフォルトでロンドンのデータが表示されます。

ステップ4:EchoAPIを使用したAPIテスト

4.1 EchoAPIとは?

EchoAPIは、アプリ全体を実行したりブラウザを開いたりせずにAPIをテストできる素晴らしいツールです。リクエストをシミュレートし、アプリがどのように応答するかを確認できます—すべてVSCode内で行えます!しかも無料です!

4.2 VSCodeにEchoAPIをインストールする

EchoAPIは様々な方法で使用できます:

Install EchoAPI in VSCode

EchoAPI for VS Codeをインストールすると、VSCode内で簡単に天気APIをテストできます。

4.3 EchoAPIを使用して天気アプリをテストする

アプリがどのように機能するかをテストしてみましょう:

VSCodeEchoAPIを開きます。

GETリクエストを作成し、以下のURLを入力します:

http://localhost:3000/weather?city=New%20York

Testing Your Weather App with EchoAPI

リクエストを送信する:
EchoAPIは、天気アプリからの応答を表示します。応答は以下のようになります:

Testing Your Weather App with EchoAPI2

無効な都市名を入力して、どのような結果になるかもテストできます:

http://localhost:3000/weather?city=UnknownCity

これにより、エラーメッセージが返されるはずです:

Testing Your Weather App with EchoAPI3

4.4 EchoAPIを使用したテストの自動化

EchoAPIではテストを自動化できます。スクリプトを書くことで、天気データが正しいかどうかを自動的にチェックできます。これにより、アプリが期待通りに動作することを確認できます。詳細については、['VSCodeで天気アプリを作成する方法(2):ポストレスポンスの自動テスト']を参照してください。

結論

おめでとうございます!🎉 あなたは、VSCodeを使用してシンプルな天気アプリをゼロから構築し、EchoAPIで成功裏にテストしました。以下は、あなたが学んだことの要約です:

  • Node.jsプロジェクトの設定と必要な依存関係のインストール。
  • 外部天気APIをアプリに統合する方法。
  • Expressを使用してウェブサーバーを構築するためのクリーンで構造化されたコードを書くこと。
  • EchoAPIを使用してAPIエンドポイントをテストする方法。
  • このプロジェクトは、API統合、テスト、ウェブアプリ開発における確固たる基盤を提供します。これらは初心者の開発者にとって重要なスキルです。さらに進めて、天気予報やフロントエンドインターフェースの追加など、新しい機能を追加して、無限の可能性を探ってみてください!

楽しいコーディングを🎉。

SQLクエリを最適化してデータベースのパフォーマンスを向上させる方法

バイキングにいると想像してください。すべてが美味しそうに見えます。しかし、皿を持って必要なものを取る代わりに、あちこちから食べ物を積み上げて、混乱を引き起こし、自分を遅くしてしまいます。その結果?過剰になり、非効率的です。

SQLクエリが最適化されていないときに起こることはまさにこれです!不要なデータをたくさん読み込んで、すべてを遅くし、データベースに混乱を招きます。

しかし、心配しないでください!バイキングで自分をうまくペース配分する方法を学ぶように、SQLクエリを最適化することで、すべてがスムーズに運行できます。データベースのパフォーマンスをこれまで以上に速くする方法を見ていきましょう—そして混乱を避けましょう!

SQL.jpg

スリムに保つ:必要なものだけを選択

お店で買い物をしていて、レジの人が「店のすべてを欲しいですか、それとも必要なものだけですか?」と聞いたら、馬鹿げていると思いますよね?それが、SQL" SELECT * "を使うときに起こることです。必要のないカラムまで要求しているので、パフォーマンスが遅くなる原因になります。

代わりに:

SELECT CustomerName, Email FROM Customers;

必要なカラムだけを選択することで、クエリが処理するデータを減らしています。

プロのようにフィルタリング:WHEREを使って検索を絞る

WHERE句をデータベースのGPSだと思ってください。必要なものに直接ナビゲートするのに役立ちます。フィルタが具体的であればあるほど、データベースが行うべき作業が少なくなります。

例:カリフォルニアの顧客だけが必要な場合、全員を検索させるのは無駄です。

SELECT CustomerName, Email FROM Customers WHERE State = 'California';

これで、プールを絞り込むことができ、検索が速くなります。

ジョイン:うまくやれば天国のマッチ

テーブルを結合することはSQLでは一般的な作業ですが、効率の悪いジョインはパフォーマンスを遅くする原因になります。テーブルを結合するときは、常にインデックスが付けられたカラムで結合し、結合前に各テーブルで処理されるデータを制限しましょう。

良いジョインの例:

SELECT Orders.OrderID, Customers.CustomerName 
FROM Orders
INNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID
WHERE Customers.State = 'California';

ここでは、OrdersテーブルとCustomersテーブルをCustomerIDで結合し、WHERE句を使って結合が処理する行数を制限しています。その結果?はるかに速いクエリになります。

インデックス:秘密のスーパーパワー

データベースのインデックスは、本の索引のようなものです。探しているものを見つけるためにすべてのページをめくるのではなく、直接目的の場所にジャンプできます。正しく使用すれば、インデックスはクエリのパフォーマンスを大幅に向上させ、データベースが行をより効率的に特定するのを助けます。

インデックスの使い方:

WHERE句で頻繁に使用するカラムにインデックスを作成する。

WHERE句でデータをフィルタリングすると、データベースは行を検索して一致するデータを見つける必要があります。WHERE句で使用されるカラムにインデックスを作成すると、データベースはテーブル全体をスキャンするのではなく、関連する行に直接ジャンプできます。

例: 顧客のテーブルがあり、州に基づいて顧客を検索することが多いとします。

SELECT * FROM Customers WHERE State = 'California';

Stateカラムにインデックスを追加することで、クエリははるかに速く実行できます。

CREATE INDEX idx_state ON Customers(State);

これで、州で顧客をフィルタリングするたびに、データベースはこのインデックスを使用して検索を高速化します。

ジョイン(ON句)で使用されるカラムにインデックスを作成する。

ジョインは、関連するカラムに基づいて複数のテーブルからデータを結合し、これらのカラムはインデックスの恩恵を受けることができます。ON句を使用してテーブルを結合するときに、結合に関与するカラムにインデックスを作成すると、パフォーマンスが大幅に向上します。

例: OrdersテーブルとCustomersテーブルの2つのテーブルがあり、CustomerIDに基づいて頻繁にジョインします。

SELECT Orders.OrderID, Customers.CustomerName
FROM Orders
JOIN Customers ON Orders.CustomerID = Customers.CustomerID;

両方のテーブルのCustomerIDにインデックスを作成することで、このジョインをより速くできます。

CREATE INDEX idx_customer_id_orders ON Orders(CustomerID);
CREATE INDEX idx_customer_id_customers ON Customers(CustomerID);

これにより、データベースは両方のテーブルで顧客IDを一致させるためにフルテーブルスキャンを行う必要がなくなります。インデックスを使用して、迅速に一致する行を見つけることができます。

インデックスを使用するタイミング
頻繁に検索、フィルタ、またはソートするカラムにインデックスを使用する(WHERE, ORDER BY)。
ジョイン操作の外部キーにインデックスを付けてパフォーマンスを向上させる。
オーバーインデクシングに注意しすぎて、インデックスが多すぎるとINSERTUPDATE、およびDELETE操作が遅くなることがあります。

N+1クエリ問題を回避:クエリをバッチ処理する

N+1クエリ問題について話しましょう—これは「千の切り傷」による死のようなものです。これは、単一のクエリの後に、最初のクエリの結果ごとに複数の他のクエリが続くときに発生します。これにより、数百または数千の追加クエリが発生する可能性があります!

悪い例:

SELECT CustomerID FROM Customers;
-- その後、各顧客ごとに:
SELECT * FROM Orders WHERE CustomerID = ?;

これにより、数百の個別クエリが生成される可能性があります。代わりに、クエリをバッチ処理してすべてのデータを一度に処理しましょう。

最適化されたバージョン:

SELECT Customers.CustomerID, Orders.OrderID 
FROM Customers
JOIN Orders ON Customers.CustomerID = Orders.CustomerID;

これで、数百ではなく、1つのクエリを実行するだけです!

行を制限:ページングと結果の制限

大量のデータを取得するクエリを実行する場合、LIMITやページング技術を使用して小さなチャンクに分けるのが良いアイデアです。すべての電話帳を要求していると想像してみてください。必要なのは最初の10件だけ—馬鹿げていると思いませんか?

例:LIMITを使った場合:

SELECT CustomerName FROM Customers LIMIT 10;

このアプローチでは、同時に10件のレコードだけを取得し、一度にあまりにも多くのデータでシステムが詰まらないようにします。

実行計画を理解する

クエリを実行するとき、データベースが何を考えているかを知りたいですか?EXPLAINまたは**EXPL

AIN ANALYZE**を使用してください。これらのコマンドは、クエリの実行計画を明らかにし、データベースがリクエストをどのように処理するかを示します。これは、改善できるポイントを見つけるために、ボンネットの下を覗くようなものです。

例:

EXPLAIN SELECT CustomerName FROM Customers WHERE State = 'California';

結果に「フルテーブルスキャン」が含まれている場合、インデックスを追加するとクエリを高速化できる兆候です。

データベースの健康を保つ:定期的なメンテナンス

車がオイル交換を必要とするように、データベースも定期的なメンテナンスが必要です。VACUUMPostgreSQLの場合)やOPTIMIZE TABLEMySQLの場合)などのコマンドを使用して、デッド行をクリアし、データを再編成することで、すべてをスムーズに保ちます。

例:

OPTIMIZE TABLE Customers;

これにより、データベースがクリーンになり、データの断片化による遅延を防ぐことができます。

結論

SQLクエリの最適化は、頭痛の種である必要はありません。引き出すデータに注意を払い、インデックスを戦略的に使用し、EXPLAINのようなツールを活用することで、クエリを整え、データベースのパフォーマンスを向上させることができます。データベースをよく整理されたキッチンのように扱えば、すべてが簡単に見つかり、必要なものを探すために時間を無駄にすることはありません。信じてください、あなたのデータベース(そしてユーザー)も感謝するでしょう!