投稿

8月, 2026の投稿を表示しています

#16 Dartで学ぶ辞書型(マップ)の基本

Dartで名前と値の組み合わせを扱うには、`Map`という仕組みを使います。この記事では、Dartにおける辞書の使い方と、Flutterアプリ開発でもよく使う操作をあわせて解説します。 Mapを作ってみる var scores = {"太郎": 90, "次郎": 85}; 型を明示したい場合は、`Map<String, int>`のようにジェネリクスを使って書くこともできます。 Map<String, int> scores2 = {"太郎": 90, "次郎": 85}; 値を取り出す・追加する print(scores["太郎"]); scores["三郎"] = 78; 既に存在するキーに代入すると値が上書きされ、存在しないキーに代入すると新しい要素として追加されます。 キーが存在するか確認する if (scores.containsKey("三郎")) { print(scores["三郎"]); } 存在しない可能性があるキーへのアクセスは、`scores["四郎"] ?? 0`のように`??`演算子(null合体演算子)を組み合わせて、存在しなければデフォルト値を使う書き方もよく使われます。 キーを削除する scores.remove("三郎"); 指定したキーが存在しない場合でもエラーにはならず、何も起こりません。 全てのキーと値を順に処理する scores.forEach((name, score) { print("$name: $score"); }); `for`文とentriesを組み合わせて処理することもできます。 for (var entry in scores.entries) { print("${entry.key}: ${entry.value}"); } Dartならではの注意点 Dartの`Map`から存在しないキーを取り出そうとすると、例外が発生するのではなく`null`が返ります。Dart...

#25 Rubyで学ぶAI API(ChatGPT等)の呼び出し方の基本

ChatGPTのようなAI(人工知能)を、自分のプログラムから呼び出せたら便利だと思ったことはありませんか。実は難しい専用ソフトを使わなくても、Rubyの標準的な仕組みだけでAI APIを呼び出すことができます。この記事では、RubyからAI APIを利用する基本の流れを、初心者向けにやさしく解説します。 AI APIとは何か API(エーピーアイ、Application Programming Interfaceの略)とは、プログラム同士が機能をやり取りする窓口のような仕組みです。AI APIは、AIの会社が用意しているサーバーに「この質問に答えて」とお願いすると、AIが考えた答えを返してくれる仕組みです。自分のパソコンでAIモデルを動かす必要がないため、比較的手軽に使えるのが特徴です。 APIリクエストの基本の流れ AI APIを使うときの流れは、だいたいどのサービスでも共通しています。 APIキー(利用者を識別するための暗号のような文字列)を取得する HTTP通信(インターネット上でデータをやり取りする方法)を使って、質問文などのデータを送る AIからの返事(JSONというテキスト形式のデータ)を受け取る 受け取ったデータから、必要な部分だけを取り出して使う Rubyでこの通信を行うには、標準ライブラリの net/http を使う方法があります。ほかにも、 httparty や faraday といった外部のgem(Rubyの便利な拡張機能をまとめたパッケージ)を使う方法もあります。標準ライブラリだけでも十分動きますが、外部gemを使うとコードがすっきり書けることが多いです。 net/httpを使った送信の例 require 'net/http' require 'json' require 'uri' uri = URI('https://api.example.com/v1/chat') http = Net::HTTP.new(uri.host, uri.port) http.use_ssl = true request = Net::HTTP::Post.new(uri) request['Content-Type'] =...

#25 C++で学ぶAI API(ChatGPT等)の呼び出し方の基本

ChatGPTのようなAI(人工知能)が答えを返してくれる仕組みは、実はシンプルです。「API」と呼ばれる窓口にインターネット経由でお願い事(リクエスト)を送り、返事(レスポンス)を受け取っているだけなのです。この記事では、C++からAI APIを呼び出すための基本的な考え方と、最低限おさえておきたい注意点を初心者向けに解説します。 AI APIを呼び出すとはどういうことか API(エーピーアイ)とは「Application Programming Interface」の略で、プログラム同士がやり取りするための決まりごとのことです。ChatGPTを提供しているサービスなどでは、Webサイトの画面を使わなくても、決められた形式でデータを送るだけでAIに質問を投げかけることができます。そして、AIからの答えも同じように受け取れます。 このやり取りには、Webブラウザがサイトを表示するときと同じ「HTTP」という通信の仕組みが使われます。具体的には、質問文などをJSON(ジェイソン)という形式のテキストにまとめて送り、AIからの返事もJSON形式で返ってくる、という流れです。JSONは「キーと値のペア」を並べたシンプルなデータ形式で、多くのプログラミング言語で扱いやすいよう設計されています。 C++でHTTP通信をするにはlibcurlが定番 PythonやJavaScriptには標準でHTTP通信を行う機能が用意されていることが多いのですが、C++には標準機能としてのHTTP通信手段がありません。そこで広く使われているのが「libcurl」という外部ライブラリです。libcurlはコマンドラインツール「curl」の中身を担っているライブラリで、C言語向けに作られていますが、C++からもそのまま利用できます。 libcurlを使う場合、大まかな流れは次のようになります。 curl_easy_init() で通信の準備をする curl_easy_setopt() で送信先のURLや、送るデータ、認証情報などを設定する curl_easy_perform() で実際に通信を実行する 返ってきたレスポンス(応答)を受け取る curl_easy_cleanup() で後片付けをする C++では自分でメモリの確保・解放を管理する場面が多く、libcu...

#25 C#で学ぶAI API(ChatGPT等)の呼び出し方の基本

ChatGPTのような生成AIを、自分のプログラムから呼び出して使ってみたい――そんな興味を持つ人が増えています。実はC#からでも、比較的シンプルなコードでAI API(エーアイ エーピーアイ。AIの機能をインターネット経由で呼び出すための窓口のようなもの)を利用できます。この記事では、C#でAI APIを呼び出す際の基本的な流れと、押さえておきたい注意点を初心者向けに解説します。 AI APIって何をしているの? AI API(APIはApplication Programming Interfaceの略で、「プログラム同士が会話するための決まりごと」のことです)を使うと、自分のアプリからインターネットを通じて「この文章に返事をください」といったお願いを送れます。すると、AIが考えた答えを受け取ることができます。多くのAIサービスは、この仕組みをHTTP通信(Webサイトを見るときと同じ仕組みの通信)で提供しており、C#からも他の言語と同じように利用できます。 必要なもの 利用したいAIサービスのAPIキー(利用者を識別するための合言葉のような文字列) .NET SDK(C#のプログラムを動かすための開発環境) インターネット接続 C#でAPIを呼び出す基本の書き方 C#には HttpClient というクラス(通信機能をひとまとめにした部品)が標準で用意されており、これを使ってAI APIにリクエスト(要求)を送ります。大まかな流れは次の3ステップです。 送りたい内容(質問文など)をJSON形式(データをやり取りするための共通フォーマット)に変換する HttpClient でAPIのアドレスにリクエストを送る 返ってきたJSONを読み取り、必要な部分(AIの返答文)を取り出す コードのイメージは以下のようになります(実際のAPIキー・URL・モデル名は利用するAIサービスに合わせて読み替えてください)。 using System.Net.Http.Json; // apiKeyには事前に取得したAPIキーの文字列を入れておく var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "...

#25 Swiftで学ぶAI API(ChatGPT等)の呼び出し方の基本

SwiftアプリからAI API(ChatGPT等)を呼び出してみよう 最近は、アプリの中にChatGPTのような「AI(人工知能)」の機能を組み込む場面が増えてきました。実は、SwiftでもiPhoneアプリ(iOS)やMacアプリ(macOS)から、インターネット越しにAIサービスへ質問を送り、回答を受け取ることができます。この記事では、SwiftからAI APIを呼び出す基本的な流れと、初心者がつまずきやすいポイントを解説します。 そもそも「API」とは何か API(エーピーアイ、Application Programming Interfaceの略)とは、あるプログラムやサービスの機能を、外部のプログラムから利用できるようにした「窓口」のようなものです。ChatGPTのようなAIサービスの多くは、インターネット上に用意された窓口(APIエンドポイント)にデータを送ると、AIが処理した結果を返してくれる仕組みになっています。 この「データを送って結果を受け取る」やり取りは、Web APIと呼ばれる形式で行われることが多くあります。SwiftアプリからもHTTP通信(Webページの読み込みなどに使われる通信方式)を使ってやり取りします。 SwiftでHTTP通信を行う基本:URLSession Swiftで外部のサーバーと通信するときは、標準ライブラリに含まれる URLSession というクラスを使うのが基本です。URLSessionは、URLを指定して通信リクエストを送り、結果を受け取るための仕組みで、追加のライブラリをインストールしなくても使えます。 Swift 5.5以降では、 async/await という書き方が使えます。これを使うと、非同期処理(時間のかかる処理を待っている間も他の処理を止めない仕組み)をシンプルに書けるようになりました。以前は「完了したら呼ばれる関数(クロージャ)」を入れ子にして書く必要がありました。しかしasync/awaitのおかげで、あたかも上から下へ順番に処理が進むかのように読みやすいコードになります。JavaScriptのasync/awaitに近い感覚で書けるので、他言語の経験がある人にはなじみやすいはずです。 実際のコード例 以下は、AI API(ChatGPTのようなチャット形式の応答を返す...

#25 Javaで学ぶAI API(ChatGPT等)の呼び出し方の基本

はじめに ChatGPTのようなAI(人工知能)は、実は「API(エーピーアイ)」という仕組みを通じて、自分のプログラムから呼び出すことができます。APIとは「Application Programming Interface」の略で、あるサービスの機能を外部のプログラムから利用できるようにする「窓口」のようなものです。Javaは企業システムなどでよく使われる言語ですが、AI APIを呼び出す仕組みは意外とシンプルです。この記事では、JavaからAI APIを呼び出す基本の流れを、初めての人にもわかるように解説します。 AI APIを使う前に知っておきたいこと APIキーとは何か 多くのAIサービスは、誰でも自由に使えるわけではなく「APIキー」と呼ばれる文字列を発行しています。これは利用者を識別するための合言葉のようなもので、リクエスト(サービスへの依頼)に添えることで「誰がどれだけ利用したか」をサービス側が把握できる仕組みです。APIキーは家の鍵と同じくらい大切な情報です。コードに直接書いてGitHubなどに公開してしまうと、第三者に無断で使われてしまう恐れがあるため、環境変数(プログラムの外側で値を管理し、実行時に読み込む仕組み)などを使って管理するのが基本です。 JavaはHTTP通信の準備が少し多め PythonやJavaScriptでは、外部ライブラリなしでも比較的簡単にWeb通信ができる場合があります。一方Javaは「型(データの種類)」をきっちり指定する言語なので、通信内容やJSON(データをやり取りするための文字列形式)の扱いに一手間かかる印象があります。ただしJava11以降では java.net.http.HttpClient という通信用の機能が標準ライブラリに追加され、以前より簡潔にHTTP通信を書けるようになりました。今回はこの標準機能だけを使い、追加のライブラリなしでAI APIを呼び出す方法を紹介します。 HttpClientを使った呼び出し方の基本 HttpClient は、Webサービスにリクエストを送り、返ってきたレスポンス(応答)を受け取るためのJava標準の仕組みです。基本の書き方は次のようになります。 import java.net.URI; import java.net.http.HttpCl...

#25 Kotlinで学ぶAI API(ChatGPT等)の呼び出し方の基本

はじめに ChatGPTのようなAI(人工知能)が返してくれる文章を、自分の作ったアプリから呼び出してみたいと思ったことはありませんか。実はAI開発企業の多くは「API(エーピーアイ)」と呼ばれる仕組みを公開しています。これを使えば、自分のプログラムからAIに質問を送り、回答を受け取ることができます。APIとは、あるプログラムが別のプログラムの機能を呼び出すための「窓口」のようなものです。この記事では、Android開発などでも人気のプログラミング言語Kotlin(コトリン)を使って、AI APIを呼び出す基本の流れを解説します。 AI APIを呼び出す仕組みをざっくり理解する AI APIとのやり取りは、多くの場合「HTTP通信」で行われます。HTTP通信とは、Webブラウザがサーバーにページを要求するときと同じ仕組みで、プログラム同士がインターネット経由でデータをやり取りする方法です。手順を簡単にまとめると、次のようになります。 質問したい内容を「JSON」という形式のテキストにまとめる それをAPIの窓口(URL)に向けて送信する(これを「リクエスト」と呼びます) AI側が回答をJSON形式で返してくる(これを「レスポンス」と呼びます) 受け取ったJSONの中から、必要な文章部分だけを取り出す JSONとは、データを「キー」と「値」のペアで表す、多くのプログラミング言語で読み書きしやすいテキスト形式です。KotlinでもJSONを扱うためのライブラリ(便利な機能をまとめた部品)が用意されているので、難しく考える必要はありません。 Kotlinで通信する準備 Kotlinで外部のAPIと通信する場合、代表的な方法としてOkHttp(オーケーエイチティーティーピー)というライブラリを使う方法があります。OkHttpはHTTP通信を簡単に行うための定番ツールで、Android開発でも広く使われています。ビルドツール(プログラムの部品を管理する仕組み)であるGradleの設定ファイルに、次のように依存関係を追加します。 implementation("com.squareup.okhttp3:okhttp:4.12.0") これでOkHttpの機能がプロジェクト内で使えるようになります。 実際にリクエストを送るコ...

#25 Pythonで学ぶAI API(ChatGPT等)の呼び出し方の基本

はじめに ChatGPTのようなAI(人工知能)を、自分のPythonプログラムから呼び出せたら便利だと思ったことはありませんか。実は「API(エーピーアイ)」という仕組みを使えば、初心者でも数行のコードでAIに質問を投げて答えを受け取ることができます。APIとは「Application Programming Interface」の略で、簡単に言うと「あるサービスの機能を、プログラムから使わせてもらうための窓口」のことです。この記事では、PythonからAI APIを呼び出す基本的な流れを、初めての人にもわかるように解説します。 AI APIを使う前に知っておきたいこと APIキーとは何か 多くのAIサービスは、誰でも自由に使えるわけではなく「APIキー」と呼ばれる、いわば合言葉のような文字列を発行しています。このキーをリクエスト(サービスへの依頼)に添えることで、「あなたが誰で、どれだけ利用したか」をサービス側が把握できる仕組みです。APIキーは家の鍵のようなものなので、他人に見せたり、そのままコードに書いてSNSやGitHubに公開したりしないよう注意しましょう。 APIキーは環境変数で管理する APIキーをコードに直接書き込む(ハードコーディングと呼びます)のは避けたい書き方です。代わりによく使われるのが「環境変数」という、OS(パソコンの基本ソフト)側にこっそり値を保存しておく仕組みです。Pythonでは os という標準ライブラリ(あらかじめPythonに用意されている機能集)を使って、次のように環境変数からキーを読み込めます。 import os api_key = os.environ.get("OPENAI_API_KEY") この方法なら、コード自体にはキーが書かれないため、他の人とコードを共有しても安全です。環境変数の設定方法はOSによって異なります。多くの場合、ターミナル(コマンドを入力する画面)で1行コマンドを実行するか、 .env というファイルに書いて専用ライブラリで読み込む方法が使われます。 Pythonからの呼び出し方の基本 方法1: requestsライブラリを使う Pythonには requests という、Webサービスとやり取りするための定番の外部ライブラリ(標準では入ってお...

#25 JavaScriptで学ぶAI API(ChatGPT等)の呼び出し方の基本

はじめに ChatGPTのようなAI(人工知能)に、Webページやプログラムから直接質問を送りたいと思ったことはありませんか。実は「API(エーピーアイ)」という仕組みを使えば、JavaScriptからでもAIに文章を投げて、返ってきた答えを画面に表示することができます。APIとは「Application Programming Interface」の略です。あるサービスの機能を外部のプログラムから使わせてもらうための「窓口」のようなものです。この記事では、JavaScriptからAI APIを呼び出す基本の流れを、初めての人にもわかるように解説します。 AI APIを使う前に知っておきたいこと APIキーとは何か 多くのAIサービスは、誰でも自由に使えるわけではなく「APIキー」と呼ばれる文字列を発行しています。これはサービスを利用するための合言葉のようなもので、リクエスト(サービスへの依頼)に添えることで「誰がどれだけ利用したか」をサービス側が把握できる仕組みです。APIキーは家の鍵と同じくらい大切な情報なので、コードにそのまま書いてSNSやGitHubに公開したりしないよう注意しましょう。 ブラウザとNode.jsでの違い JavaScriptには大きく分けて、Webブラウザ上で動かす場合と、Node.js(サーバー側でJavaScriptを実行できる環境)で動かす場合があります。ここで気をつけたいのが、ブラウザのコードにAPIキーを直接書いてしまうと、Webページのソースを見れば誰でもキーを見られてしまうという点です。そのためAPIキーを使うAI API呼び出しは、基本的にNode.jsなどのサーバー側で行います。ブラウザからは、そのサーバーを経由してAIに問い合わせるという形にするのが安全とされています。 fetch APIを使った呼び出し方の基本 JavaScriptには fetch という、Webサービスと通信するための標準機能が最初から用意されています。Pythonなどでは外部ライブラリをインストールして通信を行うことが多いですが、JavaScriptでは fetch が言語やブラウザに組み込まれています。そのため、追加の準備なしにすぐ使い始められるのが特徴です(Node.jsの場合はバージョン18以降で標準対応しています)。基...

#25 TypeScriptで学ぶAI API(ChatGPT等)の呼び出し方の基本

はじめに 最近は、ChatGPTのようなAI(人工知能)が文章を生成してくれるサービスを、自分のプログラムから呼び出して使う機会が増えてきました。こうした「AI API」を使うと、自分で作ったアプリに「文章を要約する」「質問に答える」といったAIの機能を組み込むことができます。 API(エーピーアイ)とは、あるプログラムが別のプログラムの機能を呼び出すための「窓口」のようなものです。AI APIの場合、自分のプログラムからインターネット経由でAIサービスにリクエスト(依頼)を送り、その返事(レスポンス)を受け取って使います。 この記事では、TypeScriptからAI APIを呼び出す際の基本的な考え方を、実際に動かせる形ではなくサンプルコードとして紹介します。実在のAPIキー(利用者を識別するための秘密の文字列)は使わず、仕組みの理解に絞って解説します。 AI API呼び出しの基本の流れ AI APIの利用は、おおまかに次の3ステップで進みます。 APIに送るデータ(質問文など)を用意する fetchやaxiosといった仕組みでAPIにリクエストを送る 返ってきたレスポンスを受け取り、必要な部分だけ取り出して使う この一連のやり取りは、注文を紙に書いて店員に渡し、料理が出てくるのを待つイメージに近いです。TypeScriptでは、このやり取りを型(データの形を決める仕組み)を使って安全に書けるのが大きな特徴です。 fetchで呼び出す場合 ブラウザやNode.jsに標準で用意されている fetch 関数を使うと、追加のライブラリなしでAPIを呼び出せます。 async/await という書き方を使うと、非同期処理(時間のかかる処理を待つ仕組み)を上から下へ読める順序で書けます。「レスポンスが返ってくるまで待ってから次の処理に進む」という流れを、コードの見た目通りに表現できるのが利点です。 // レスポンスの型を先に定義しておく type ChatApiResponse = { choices: { message: { content: string; }; }[]; }; async function askAI(question: string): Promise<string>...

#25 Goで学ぶAI API(ChatGPT等)の呼び出し方の基本

はじめに ChatGPTのようなAI(人工知能)を使ったサービスは、プログラムから「API(エーピーアイ)」と呼ばれる窓口を通して呼び出すことができます。APIとは、あるプログラムが別のプログラムの機能を使うための「決められたやり取りのルール」のことです。難しく聞こえますが、実はやっていることはシンプルで、「インターネット越しにデータを送って、返ってきたデータを受け取る」だけです。 この記事では、Go言語を使ってAI APIのようなWebサービスを呼び出す際の「基本の型」を解説します。実際のサービスに接続するコードそのものというより、どんな流れで書けば良いのかという考え方を身につけることが目的です。 AI APIとのやり取りの流れ ChatGPTのようなAI APIの多くは、次のような流れで動いています。 「こう質問したい」という内容をJSON(Webでよく使われるデータの形式)にまとめる そのJSONをHTTP(インターネット通信の約束事)のPOSTリクエストとしてAPIのサーバーに送る サーバーがAIに問い合わせて、答えをJSONで返してくる 返ってきたJSONを読み取り、必要な部分(AIの回答文など)を取り出す つまり「JSONを作る → 送る → JSONを受け取って読む」という3ステップが基本の流れです。Goでこれをどう書くか、順番に見ていきましょう。 net/httpでPOSTリクエストを送る GoにはHTTP通信を行うための標準ライブラリ net/http が最初から用意されています。PythonのrequestsやJavaScriptのfetchのような外部ライブラリを別途インストールしなくても、標準機能だけでAPI通信ができるのがGoの特徴の一つです。 POSTリクエスト(サーバーにデータを送るタイプのリクエスト)を送る基本形は次のようになります。 req, err := http.NewRequest("POST", url, bytes.NewBuffer(jsonData)) if err != nil { log.Fatal(err) } req.Header.Set("Content-Type", "application/json") ...

#25 Rustで学ぶAI API(ChatGPT等)の呼び出し方の基本

ChatGPTのようなAI(人工知能)の機能を自分のアプリに組み込みたいとき、多くの場合は「AI API」と呼ばれる仕組みを使います。APIとは「Application Programming Interface」の略です。簡単に言えば、「あるサービスの機能を、プログラムから呼び出せるようにした窓口」のことです。この記事では、Rustから外部のAI APIをHTTPリクエストで呼び出す基本的な流れを、初心者向けに解説します。 AI APIを呼び出すとはどういうことか ChatGPTを提供するOpenAI社などは、インターネット経由でAIに質問を送り、回答を受け取れる「AI API」を公開しています。これはWebブラウザで検索するときのように、決まった宛先(URL)にデータを送信し、返ってきた結果を受け取る仕組みです。この「データを送って結果を受け取る」通信方式を、HTTPリクエストと呼びます。Rustのプログラムからこの通信を行うことで、自分のアプリの中でAIに質問し、回答を取得できるようになります。 reqwestクレートを使う Rustには標準でHTTP通信の機能は含まれていません。そこで使うのが「クレート」と呼ばれる外部ライブラリです。クレートはPythonのライブラリやJavaScriptのパッケージに近いもので、 Cargo.toml というファイルに追記するだけで簡単に導入できます。HTTP通信でよく使われるのが reqwest というクレートです。 Cargo.toml に次のように追記します(バージョン番号は執筆時点の例なので、実際に使う際は最新版を確認してください)。 [dependencies] reqwest = { version = "0.11", features = ["json"] } tokio = { version = "1", features = ["full"] } serde_json = "1.0" ここで tokio という見慣れないクレートも一緒に入れています。これは「非同期処理」と呼ばれる、通信の待ち時間の間に他の処理を進められる仕組みを扱うためのものです。ネットワーク通信は結果が返ってくるまで時間...

#20 JavaScriptで学ぶ関数の応用(デフォルト引数・可変長引数)の基本

JavaScriptで関数を使っていると、悩むことはありませんか。「引数を渡し忘れたらエラーになってしまう」「引数の数が決まっていないときはどうすればいいの?」といった場面です。今回は、そんな悩みを解決してくれる「デフォルト引数」と「可変長引数」という2つの機能を紹介します。どちらも関数をより柔軟に、読みやすく書くための仕組みです。 デフォルト引数とは 関数を呼び出すとき、引数(関数に渡す値)を省略すると、その値は undefined (値が定義されていないことを表す特別な値)になります。そのままだと計算に使ったときに意図しない結果になりがちです。 そこで便利なのが「デフォルト引数」です。これは、引数が渡されなかったときに自動で使われる初期値をあらかじめ設定しておく仕組みです。書き方はとてもシンプルで、引数名の後ろに = 初期値 を書くだけです。 function greet(name = "ゲスト") { console.log(`こんにちは、${name}さん`); } greet(); // こんにちは、ゲストさん greet("田中"); // こんにちは、田中さん このように、引数を省略した場合は自動的に「ゲスト」が使われます。以前は関数の中で if 文を使って「値が渡されていなければ初期値を代入する」という処理を書く必要がありましたが、デフォルト引数を使えば1行で済みます。 なお、デフォルト引数には固定の値だけでなく、他の変数を使った計算式や、別の関数の呼び出し結果を指定することもできます。この柔軟さはJavaScriptらしい特徴のひとつです。 可変長引数(残余引数)とは 次に紹介するのは「可変長引数」です。これは、関数に渡す引数の数が決まっていない場合に使う書き方です。例えば「合計を計算する関数」を作るとき、渡す数値が2個の場合も5個の場合もあり得ますよね。そんなときに便利なのが、引数名の前に ... (ドット3つ)を付ける「残余引数(rest parameters)」という書き方です。 function sum(...numbers) { return numbers.reduce((total, n) => total + n, 0); } co...

#20 Pythonで学ぶ関数の応用の基本

前回の記事では、Pythonの関数の基本と「デフォルト引数」(引数に既定値を設定できる機能)に軽く触れました。今回はそこから一歩進んで、デフォルト引数の注意点と、引数の数を自由に増やせる「可変長引数」という仕組みを詳しく見ていきます。これを使えると、より柔軟で読みやすい関数が書けるようになります。 デフォルト引数のおさらいと落とし穴 デフォルト引数とは、関数を呼び出すときに値を省略した場合に使われる、あらかじめ決めておいた値のことです。 def greet(name="ゲスト", times=1): for _ in range(times): print(f"こんにちは、{name}さん") greet() # こんにちは、ゲストさん(1回) greet("太郎", 3) # こんにちは、太郎さん(3回) ここで一つ、初心者がよくハマる注意点があります。デフォルト引数に「リスト」や「辞書」のような変更可能なデータ(専門用語で「ミュータブル」と呼びます)を指定すると、思わぬ不具合が起きることがあります。 def add_item(item, items=[]): items.append(item) return items print(add_item("りんご")) # ['りんご'] print(add_item("みかん")) # ['りんご', 'みかん'] ← 前回の結果が残っている! これは、デフォルト値の空リストが関数の定義時に一度だけ作られ、呼び出しのたびに使い回されるために起こります。対策として、デフォルト値には None を指定し、関数の中で新しいリストを作るのが定番のやり方です。 def add_item(item, items=None): if items is None: items = [] items.append(item) return items 可変長引数(*args)で引数の数を自由にする 「可変長引数」とは、呼び出し側が渡す引数の個数をあらかじめ決...

#19 Dartで学ぶテスト(単体テスト)の基本

Dartで関数を書いた後、それが正しく動くかをprintで確認するだけで済ませていませんか?この記事では、Dartで書いたコードを自動でチェックする「テスト」の基本を解説します。 なぜテストを書くのか コードを修正するたびに、関連する処理が壊れていないかを手作業で確認するのは大変です。テストを用意しておけば、コマンド一つで動作確認ができ、安心してコードを直せるようになります。特にFlutterアプリ開発では、画面を毎回操作して確認する手間を大きく減らせます。 test パッケージを使ったテストの書き方 Dartでは標準的な test パッケージがよく使われます。 pubspec.yaml の dev_dependencies に追加して導入します。 int add(int a, int b) { return a + b; } import 'package:test/test.dart'; void main() { test('2と3を足すと5になる', () { expect(add(2, 3), equals(5)); }); } test("名前", () { ... }) という形でテストケースを書き、 expect(実際の値, equals(期待値)) という書き方で「等しいはず」を宣言します。ターミナルで dart test を実行すると結果が一覧表示されます。 異常系もテストしておく 正しい入力だけでなく、境界値(0やマイナスの値など)を渡した時の挙動もテストしておくと安心です。 test('0同士を足すと0になる', () { expect(add(0, 0), equals(0)); }); テスト前後の共通処理をまとめる 複数のテストで共通する準備・後片付けの処理は、 setUp ・ tearDown を使ってまとめられます。 void main() { late Calculator calc; setUp(() { calc = Calculator(); }); test('初期値は0', () { expect(calc.value, equals(0));...

#19 Scalaで学ぶテスト(単体テスト)の基本

Scalaで関数を書いた後、それが正しく動くかをprintlnで確認するだけで済ませていませんか?この記事では、Scalaで書いたコードを自動でチェックする「テスト」の基本を解説します。 なぜテストを書くのか コードを修正するたびに、関連する処理が壊れていないかを手作業で確認するのは大変です。テストを用意しておけば、コマンド一つで動作確認ができ、安心してコードを直せるようになります。 ScalaTestを使ったテストの書き方 Scalaでは ScalaTest というテスト用ライブラリがよく使われます。 build.sbt に依存関係を追加して導入します。 object Calculator { def add(a: Int, b: Int): Int = a + b } import org.scalatest.funsuite.AnyFunSuite class CalculatorTest extends AnyFunSuite { test("2と3を足すと5になる") { assert(Calculator.add(2, 3) == 5) } } AnyFunSuite を継承したクラスを作り、 test("名前") { ... } という形でテストケースを書きます。 assert(条件) で「この条件が真であるはず」を宣言します。 sbt test を実行すると結果が一覧表示されます。 異常系もテストしておく 正しい入力だけでなく、境界値(0やマイナスの値など)を渡した時の挙動もテストしておくと安心です。 test("0同士を足すと0になる") { assert(Calculator.add(0, 0) == 0) } 例外の発生もテストする 特定の条件で例外が発生することを確認したい場合は assertThrows が使えます。 test("0で割ると例外が発生する") { assertThrows[ArithmeticException] { 10 / 0 } } Scalaならではの注意点 Scalaは関数型プログラミングの考え方を取り入れており、 Option という「値があるかもしれな...

#19 PHPで学ぶテスト(単体テスト)の基本

PHPで関数を書いた後、それが正しく動くかをブラウザで表示して確認するだけで済ませていませんか?この記事では、PHPで書いたコードを自動でチェックする「テスト」の基本を解説します。 なぜテストを書くのか コードを修正するたびに、関連する処理が壊れていないかを手作業で確認するのは大変です。テストを用意しておけば、コマンド一つで動作確認ができ、安心してコードを直せるようになります。 PHPUnitを使ったテストの書き方 PHPでは PHPUnit というテスト用ライブラリが定番です。Composerで composer require --dev phpunit/phpunit と導入できます。 function add($a, $b) { return $a + $b; } use PHPUnit\Framework\TestCase; class CalculatorTest extends TestCase { public function testAdd() { $this->assertEquals(5, add(2, 3)); } } TestCase を継承したクラスを作り、メソッド名を test から始めるのが決まりです。 assertEquals(期待値, 実際の値) という順番で書きます。ターミナルで ./vendor/bin/phpunit を実行すると結果が一覧表示されます。 異常系もテストしておく 正しい入力だけでなく、境界値(0やマイナスの値など)を渡した時の挙動もテストしておくと安心です。 public function testAddWithZero() { $this->assertEquals(0, add(0, 0)); } 例外の発生もテストする 特定の条件で例外が発生することを確認したい場合は expectException が使えます。 public function testDivideByZero() { $this->expectException(DivisionByZeroError::class); divide(10, 0); } テストメソッドの中で、実際に例外を発生させる処理より前...

#19 Rubyで学ぶテスト(単体テスト)の基本

Rubyでメソッドを書いた後、それが正しく動くかをirbやputsで確認するだけで済ませていませんか?この記事では、Rubyで書いたコードを自動でチェックする「テスト」の基本を解説します。 なぜテストを書くのか コードを修正するたびに、関連するメソッドが壊れていないかを手作業で確認するのは大変です。テストを用意しておけば、コマンド一つで動作確認ができ、安心してコードを直せるようになります。 RSpecを使ったテストの書き方 Rubyでは RSpec というテスト用ライブラリが定番です。 gem install rspec で導入できます。 def add(a, b) a + b end RSpec.describe "add" do it "2と3を足すと5になる" do expect(add(2, 3)).to eq(5) end end describe でテストの対象をまとめ、 it で個々のテストケースを書きます。 expect(実際の値).to eq(期待値) という書き方で「等しいはず」を宣言します。ターミナルで rspec と実行すると結果が一覧表示されます。 異常系もテストしておく 正しい入力だけでなく、境界値(0やマイナスの値など)を渡した時の挙動もテストしておくと安心です。 it "0同士を足すと0になる" do expect(add(0, 0)).to eq(0) end テスト前後の共通処理をまとめる 複数のテストで共通する準備・後片付けの処理は、 before ・ after を使ってまとめられます。 RSpec.describe "Calculator" do before do @calc = Calculator.new end it "初期値は0" do expect(@calc.value).to eq(0) end end 各テストの前に before の中身が実行されるため、同じ準備コードを毎回書く必要がなくなります。 Rubyならではの注意点 Rubyは柔軟な書き方ができる分、メソッドに想定外の型(文字列と数値を混ぜるなど)を渡...

#19 C++で学ぶテスト(単体テスト)の基本

C++で関数を書いた後、それが正しく動くかをprintf文で確認するだけで済ませていませんか?この記事では、C++で書いたコードを自動でチェックする「テスト」の基本を解説します。 なぜテストを書くのか コードを修正するたびに、関連する関数が壊れていないかを手作業で確認するのは大変です。テストを用意しておけば、コマンド一つで動作確認ができ、安心してコードを直せるようになります。C++は特に、ポインタやメモリ管理が絡む処理でバグが起きやすいため、テストの価値が高い言語です。 Catch2を使ったテストの書き方 C++では Catch2 というテスト用ライブラリがよく使われます。ヘッダーファイル1つを追加するだけで使い始められる手軽さが特徴です。 int add(int a, int b) { return a + b; } #define CATCH_CONFIG_MAIN #include "catch.hpp" TEST_CASE("2と3を足すと5になる") { REQUIRE(add(2, 3) == 5); } TEST_CASE というマクロでテストの名前を書き、 REQUIRE マクロで「この条件が真であるはず」を宣言します。コンパイルして実行すると、テストの結果が一覧表示されます。 複数パターンをまとめてテストする SECTION を使うと、1つのテストケースの中で複数のパターンを整理して書けます。 TEST_CASE("加算のテスト") { SECTION("正の数同士") { REQUIRE(add(2, 3) == 5); } SECTION("0を含む場合") { REQUIRE(add(0, 0) == 0); } } 例外の発生もテストする 特定の条件で例外が発生することを確認したい場合は REQUIRE_THROWS_AS が使えます。 TEST_CASE("0で割ると例外が発生する") { REQUIRE_THROWS_AS(divide(10, 0), std::runtime_error); }...

#19 C#で学ぶテスト(単体テスト)の基本

C#でクラスやメソッドを書いた後、それが正しく動くかをConsole.WriteLineで確認するだけで済ませていませんか?この記事では、C#で書いたコードを自動でチェックする「テスト」の基本を解説します。 なぜテストを書くのか コードを修正するたびに、関連するメソッドが壊れていないかを手作業で確認するのは大変です。テストを用意しておけば、コマンド一つで動作確認ができ、安心してコードを直せるようになります。 xUnitを使ったテストの書き方 C#では xUnit というテスト用ライブラリがよく使われます。.NET CLIで dotnet new xunit とするとテスト用プロジェクトが作られます。 public class Calculator { public int Add(int a, int b) { return a + b; } } using Xunit; public class CalculatorTests { [Fact] public void TestAdd() { var calc = new Calculator(); Assert.Equal(5, calc.Add(2, 3)); } } メソッドの上に [Fact] という目印(属性)を付けるだけでテストとして認識されます。 Assert.Equal(期待値, 実際の値) という順番で書きます。ターミナルで dotnet test を実行すると結果が一覧表示されます。 複数パターンをまとめてテストする [Theory] という目印を使うと、複数の入力パターンをまとめてテストできます。 [Theory] [InlineData(2, 3, 5)] [InlineData(0, 0, 0)] [InlineData(-1, 1, 0)] public void TestAddCases(int a, int b, int expected) { var calc = new Calculator(); Assert.Equal(expected, calc.Add(a, b)); } C#ならではの注意点 C#はnull許容参照型と...

#19 Swiftで学ぶテスト(単体テスト)の基本

Swiftで関数を書いた後、それが正しく動くかをprintで確認するだけで済ませていませんか?この記事では、Swiftで書いたコードを自動でチェックする「テスト」の基本を解説します。 なぜテストを書くのか コードを修正するたびに、関連する処理が壊れていないかを手作業で確認するのは大変です。テストを用意しておけば、コマンド一つで動作確認ができ、安心してコードを直せるようになります。特にアプリ開発では、画面を毎回操作して確認する手間を減らせます。 XCTestを使ったテストの書き方 Swiftでは標準の XCTest フレームワークがテストの定番です。Xcodeでプロジェクトを作る時に「テストを含める」を選ぶと自動で準備されます。 func add(_ a: Int, _ b: Int) -> Int { return a + b } import XCTest class CalculatorTests: XCTestCase { func testAdd() { XCTAssertEqual(add(2, 3), 5) } } クラスを XCTestCase を継承する形で作り、メソッド名を test から始めるのが決まりです。 XCTAssertEqual(実際の値, 期待値) という書き方で「等しいはず」を宣言します。 異常系もテストしておく 正しい入力だけでなく、境界値(0やマイナスの値など)を渡した時の挙動もテストしておくと安心です。 func testAddWithZero() { XCTAssertEqual(add(0, 0), 0) } テスト前後の共通処理をまとめる 複数のテストで共通する準備・後片付けの処理は、 setUp ・ tearDown というメソッドをオーバーライドしてまとめられます。 class CalculatorTests: XCTestCase { var calculator: Calculator! override func setUp() { calculator = Calculator() } } 各テストの前に setUp の中身が実行されるため、同じ準備コードを毎回書く必要がなくな...

#19 Kotlinで学ぶテスト(単体テスト)の基本

Kotlinで関数やクラスを書いた後、それが正しく動くかをmain関数で毎回手作業で確認していませんか?この記事では、Kotlinで書いたコードを自動でチェックする「テスト」の基本を解説します。 なぜテストを書くのか コードを修正するたびに、関連する処理が壊れていないかを手作業で確認するのは大変です。テストを用意しておけば、コマンド一つで動作確認ができ、安心してコードを直せるようになります。 kotlin.testを使ったテストの書き方 Kotlinでは標準の kotlin.test や、Javaでも使われる JUnit がよく使われます。 fun add(a: Int, b: Int): Int { return a + b } import kotlin.test.Test import kotlin.test.assertEquals class CalculatorTest { @Test fun testAdd() { assertEquals(5, add(2, 3)) } } 関数の上に @Test という目印(アノテーション)を付けるだけでテストとして認識されます。 assertEquals(期待値, 実際の値) という順番で書きます。 異常系もテストしておく 正しい入力だけでなく、境界値(0やマイナスの値など)を渡した時の挙動もテストしておくと安心です。 @Test fun testAddWithZero() { assertEquals(0, add(0, 0)) } 例外の発生もテストする 特定の条件で例外が発生することを確認したい場合は assertFailsWith が使えます。 @Test fun testDivideByZero() { assertFailsWith { divide(10, 0) } } 「エラーが起きるべき場面で、実際にエラーが起きるか」を確認しておくことで、意図しない仕様変更に気づきやすくなります。 Kotlinならではの注意点 Kotlinはnull安全という仕組みがあり、 null を許容する型( String? など)を扱う関数では、 null を渡した時の挙動もテストしてお...

#19 Javaで学ぶテスト(単体テスト)の基本

Javaでクラスやメソッドを書いた後、それが正しく動くかをmainメソッドで毎回手作業で確認していませんか?この記事では、Javaで書いたコードを自動でチェックする「テスト」の基本を解説します。 なぜテストを書くのか コードを修正するたびに、関連するメソッドが壊れていないかを手作業で確認するのは大変です。テストを用意しておけば、コマンド一つで動作確認ができ、安心してコードを直せるようになります。 JUnitを使ったテストの書き方 Javaでは JUnit というテスト用ライブラリが定番です。Mavenを使っている場合は pom.xml に依存関係を追加して導入します。 public class Calculator { public int add(int a, int b) { return a + b; } } import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; class CalculatorTest { @Test void testAdd() { Calculator calc = new Calculator(); assertEquals(5, calc.add(2, 3)); } } メソッドの上に @Test という目印(アノテーション)を付けるだけでテストとして認識されます。 assertEquals(期待値, 実際の値) という順番で書くのが決まりです。 異常系もテストしておく 正しい入力だけでなく、境界値(0やマイナスの値など)を渡した時の挙動もテストしておくと安心です。 @Test void testAddWithZero() { Calculator calc = new Calculator(); assertEquals(0, calc.add(0, 0)); } Javaならではの注意点 Javaは静的型付け言語なので、コンパイル時に多くの型ミスは防げますが、ビジネスロジック(計算結果や条件分岐)の正しさまでは保証してくれません。また、 assertEqual...

#19 Goで学ぶテスト(単体テスト)の基本

Goはシンプルな文法が魅力ですが、書いたコードが正しく動くかどうかは別問題です。この記事では、Goで書いたコードを自動でチェックする「テスト」の基本を解説します。 なぜテストを書くのか コードを修正するたびに、関連する機能が壊れていないかを手作業で確認するのは大変です。テストを用意しておけば、コマンド一つで動作確認ができ、安心してコードを直せるようになります。 Go標準のテスト機能 Goには追加のライブラリを入れなくても使える testing パッケージが標準で備わっています。テスト対象のファイルと同じディレクトリに、名前の末尾が _test.go のファイルを作ります。 // add.go package main func add(a int, b int) int { return a + b } // add_test.go package main import "testing" func TestAdd(t *testing.T) { result := add(2, 3) if result != 5 { t.Errorf("add(2, 3) = %d; want 5", result) } } テスト関数の名前は Test から始める決まりです。ターミナルで go test と実行すると、 _test.go 内の Test から始まる関数がすべて自動で実行されます。 複数パターンをまとめてテストする Goでは、複数の入力パターンをスライス(配列のようなもの)にまとめて、まとめてテストする書き方(テーブル駆動テスト)がよく使われます。 func TestAddCases(t *testing.T) { cases := []struct{ a, b, want int }{ {2, 3, 5}, {0, 0, 0}, {-1, 1, 0}, } for _, c := range cases { if got := add(c.a, c.b); got != c.want { t.Errorf("add(%d,...

#19 Rustで学ぶテスト(単体テスト)の基本

Rustはコンパイル時に多くのミスを防いでくれますが、「計算結果やロジックが正しいか」はコンパイラでは分かりません。この記事では、Rustで書いたコードを自動でチェックする「テスト」の基本を解説します。 なぜテストを書くのか コンパイラは型の不一致やメモリ安全性の問題を見つけてくれますが、「意図した計算結果になっているか」までは保証しません。テストを用意しておけば、修正のたびにコマンド一つで動作確認ができます。 Rust標準のテスト機能 Rustには追加のライブラリを入れなくても使えるテスト機能が標準で備わっています。関数の上に #[test] という目印(属性)を付けるだけです。 fn add(a: i32, b: i32) -> i32 { a + b } #[test] fn test_add() { assert_eq!(add(2, 3), 5); } assert_eq! は「左右の値が等しいはず」を宣言するマクロです。ターミナルで cargo test と実行するだけで、 #[test] が付いた関数がすべて自動で実行されます。 テスト専用モジュールにまとめる 実際のプロジェクトでは、テストを #[cfg(test)] という目印を付けたモジュールにまとめるのが一般的です。 #[cfg(test)] mod tests { use super::*; #[test] fn test_add_negative() { assert_eq!(add(-1, 1), 0); } } #[cfg(test)] を付けると、通常のビルドではこのコードが含まれず、 cargo test 実行時だけコンパイルされます。 パニックすることを確認するテスト 特定の条件で意図的にパニック(異常終了)することを確認したい場合は、 #[should_panic] という属性を使います。 #[test] #[should_panic] fn test_divide_by_zero() { divide(10, 0); } 「異常な入力で確実に停止すること」を保証しておきたい関数のテストに使われます。 Rustならではの注意点 Rustは所有権という仕組みが...

#19 TypeScriptで学ぶテスト(単体テスト)の基本

型があるから安心、と思っていても、実際の処理内容(計算結果や条件分岐)が正しいかどうかは型だけでは保証できません。この記事では、TypeScriptで書いたコードを自動でチェックする「テスト」の基本を解説します。 なぜテストを書くのか TypeScriptの型チェックは「引数の型が合っているか」までは保証してくれますが、「計算結果が正しいか」は別の話です。テストを用意しておけば、修正のたびにコマンド一つで動作確認ができ、安心してコードを直せるようになります。 一番簡単なテストの考え方 テストの基本は「入力を渡して、期待した出力が返ってくるか確認する」ことです。 function add(a: number, b: number): number { return a + b; } if (add(2, 3) !== 5) { throw new Error("add(2, 3)が5になりません"); } Jestを使ったテストの書き方 TypeScriptでは ts-jest を組み合わせた Jest がよく使われます。 npm install --save-dev jest ts-jest @types/jest で導入できます。 function add(a: number, b: number): number { return a + b; } test("2と3を足すと5になる", () => { expect(add(2, 3)).toBe(5); }); 設定ファイルで ts-jest を有効にしておけば、型チェックを保ったままテストコードも書けます。ターミナルで npx jest を実行すると結果が一覧表示されます。 異常系もテストしておく 正しい入力だけでなく、境界値(0やマイナスの値など)を渡した時の挙動もテストしておくと安心です。 test("0同士を足すと0になる", () => { expect(add(0, 0)).toBe(0); }); 例外の発生もテストする 特定の条件で例外が発生することを確認したい場合は toThrow が使えます。 test("0で割ると例外が発生する", ...

#19 JavaScriptで学ぶテスト(単体テスト)の基本

書いた関数が期待通りに動くかを、ブラウザやコンソールで毎回手作業で確かめていませんか?この記事では、JavaScriptで書いたコードを自動でチェックする「テスト」の基本を解説します。 なぜテストを書くのか コードを修正するたびに、関連する機能が壊れていないかを手作業で確認するのは大変です。テストを用意しておけば、コマンド一つで「壊れていないか」を数秒で確認できます。最初は手間に感じますが、後から安心して機能を追加・修正できるようになります。 一番簡単なテストの考え方 テストの基本は「入力を渡して、期待した出力が返ってくるか確認する」ことです。まずは考え方をコードで見てみましょう。 function add(a, b) { return a + b; } if (add(2, 3) !== 5) { throw new Error("add(2, 3)が5になりません"); } これでも簡易的なテストになりますが、実際の開発では次に紹介する専用のツールを使うのが一般的です。 Jestを使ったテストの書き方 JavaScriptでは Jest というテスト用ライブラリがよく使われます。 npm install --save-dev jest で導入できます。 function add(a, b) { return a + b; } test("2と3を足すと5になる", () => { expect(add(2, 3)).toBe(5); }); ターミナルで npx jest と実行すると、 test() で書かれたテストがすべて自動で実行され、結果が一覧表示されます。 expect().toBe() という書き方で「この値になるはず」を宣言します。 異常系もテストしておく 正しい入力だけでなく、想定外の値(0やマイナスの値など)を渡した時の挙動もテストしておくと安心です。 test("0同士を足すと0になる", () => { expect(add(0, 0)).toBe(0); }); JavaScriptならではの注意点 JavaScriptは非同期処理(通信結果を待ってから処理するなど)が多い言語です。非同期の処理をテストす...

#19 Pythonで学ぶテスト(単体テスト)の基本

プログラムが「思った通りに動いているか」を確認する作業を、毎回手作業でやるのは大変です。この記事では、Pythonで書いたコードが正しく動くかを自動でチェックする「テスト」の基本を解説します。 なぜテストを書くのか コードを修正するたびに、関係する機能が壊れていないかを人力で全部確認するのは現実的ではありません。テストを書いておけば、修正のたびに実行するだけで「壊れていないか」が数秒で分かります。最初は面倒に感じますが、後から安心してコードを直せるようになる投資だと考えてください。 一番簡単なテストの書き方 Pythonには標準で assert という文があります。これは「この条件が正しいはずだ」と宣言するもので、条件が偽だとエラーになります。 def add(a, b): return a + b assert add(2, 3) == 5 これだけでも簡易的なテストになりますが、実際の開発では次に紹介する専用のツールを使うのが一般的です。 pytestを使ったテストの書き方 Pythonでは pytest という外部ライブラリがテストの定番です。 pip install pytest で導入できます。テスト用のファイルを test_ から始まる名前で作り、その中に test_ から始まる関数を書きます。 def add(a, b): return a + b def test_add(): assert add(2, 3) == 5 assert add(-1, 1) == 0 ターミナルで pytest と実行するだけで、ファイル内の test_ から始まる関数がすべて自動で実行され、結果が一覧表示されます。 異常系もテストしておく 正しい入力だけでなく、想定外の入力(空文字、0、マイナスの値など)を渡した時の挙動もテストしておくと、後々のバグを減らせます。 def test_add_with_zero(): assert add(0, 0) == 0 Pythonならではの注意点 Pythonは動的型付け言語なので、関数に間違った型(文字列と数値など)を渡してもすぐにはエラーにならないことがあります。そのため、型に関するテストも意識して書くと安心です。また、 pytest は...

#15 C++で学ぶデバッグの基本

C++のデバッグは、メモリを直接扱う言語らしく、他の言語より注意深い調査が必要になることがあります。この記事では、C++におけるデバッグの基本的な方法を解説します。 std::coutでその場の状態を確認する std::cout << "ageの中身: " << age << std::endl; もっとも手軽な方法ですが、C++では出力のたびにバッファへの書き込みが発生するため、大量に挟みすぎると実行速度に影響することもあります。`std::endl`の代わりに`"\n"`を使うと、バッファのフラッシュ処理を省略できわずかに高速です。 gdbというデバッガー C++には`gdb`という伝統的なデバッガーがあり、Visual StudioやVSCodeといったエディタからも、この仕組みを活用したデバッグ機能が使えます。 `gdb`ではブレークポイントを設定して処理を一時停止し、`print 変数名`でその時点の値を確認できます。GUIのエディタと連携させれば、Javaなど他言語のデバッガーと同じような感覚でブレークポイント・ステップ実行が使えます。 メモリ関連のバグに注意する 以前の記事でも触れた「ポインタ」を扱うC++では、存在しないメモリ領域にアクセスしてしまう、特有のバグが起こることがあります。こうしたバグは、`Valgrind`のような専用のツールを使うと発見しやすくなります。 典型的なバグには、確保したメモリを解放し忘れる「メモリリーク」や、解放済みのメモリに再度アクセスしてしまう「ダングリングポインタ」があります。`Valgrind`はこうした問題を実行時に検出し、どの行が原因かを教えてくれます。 アサーションで前提条件を確認する #include <cassert> assert(age >= 0); `assert`は「ここでは絶対にこの条件が成り立っているはずだ」という前提を明示する仕組みです。条件が満たされない場合、プログラムはメッセージとともに強制終了し、バグの発生箇所を素早く特定する助けになります。 C++ならではの注意点 C++のバグは、エラーメッセージが出ずにプログラムが突然終了する(クラッシュする)形で現...

#15 C#で学ぶデバッグの基本

C#のデバッグは、Visual Studioに統合された使いやすいデバッガー機能を活用するのが基本です。この記事では、C#におけるデバッグの基本的な方法を、簡単なものから順に解説します。 Console.WriteLine()でその場の状態を確認する Console.WriteLine($"ageの中身: {age}"); もっとも手軽な確認方法ですが、確認が終わったら消し忘れないよう注意しましょう。デバッグ専用に残しておきたい出力には、リリースビルドでは自動的に無視される`Debug.WriteLine`を使う方法もあります。 ブレークポイントで処理を一時停止する Visual Studioには、初心者にも使いやすいデバッガーが統合されています。行番号の左側をクリックするだけでブレークポイントを設定でき、その行に処理が来た瞬間に自動で一時停止します。停止中は変数の値をマウスオーバーするだけで確認でき、`F10`(ステップオーバー)や`F11`(ステップイン)で1行ずつ処理を進めることもできます。 条件付きブレークポイント ループの100回目だけ止めたい、といった場合は、ブレークポイントを右クリックして条件式を設定できます。 i == 100 この条件を満たしたときだけ処理が停止するため、大量に繰り返される処理の中の特定のケースだけをピンポイントで調査できます。 例外の詳細を確認する C#で例外が発生すると、Visual Studioがその場で処理を一時停止し、例外の種類やメッセージ、発生した場所を詳しく表示してくれます。「例外がスローされたときに中断」という設定を有効にしておくと、例外がキャッチされて握りつぶされる前の、本当に問題が起きた場所で止められます。 C#ならではの注意点 Visual Studioのデバッガーは非常に高機能で、変数の値を実行中に書き換えて動作を試す「イミディエイトウィンドウ」という機能まで使えます。最初は基本的なブレークポイントの使い方から慣れていき、条件付きブレークポイントや例外設定など、少しずつ高度な機能も試してみるとよいでしょう。 まとめ C#のデバッグは`Console.WriteLine`とVisual Studioのデバッガーが基本です。ブレークポイント・条件付きブ...

#18 C++で学ぶ日付と時刻の扱いの基本

C++の日付操作は、標準ライブラリの chrono という仕組みを使います。この記事では、C++における日付と時刻の基本的な扱い方を、つまずきやすいポイントも含めて解説します。 chronoを使う #include <chrono> auto now = std::chrono::system_clock::now(); chrono は「時計」を意味する名前の通り、C++に複数用意されている時計(クロック)を扱うための仕組みです。 system_clock はカレンダー時刻(実際の日時)に対応する時計で、後述する経過時間の計測には別の時計を使うのがポイントです。 経過時間を測る C++の chrono は、日付そのものより「処理にかかった時間を測る」用途でよく使われます。 auto start = std::chrono::steady_clock::now(); // 何らかの処理 auto end = std::chrono::steady_clock::now(); auto elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(end - start); ここで system_clock ではなく steady_clock を使っている点に注目してください。 system_clock はシステムの日時設定が変更されると値が飛ぶ(逆行することすらある)のに対し、 steady_clock は必ず一定のペースで進み続けることが保証されています。そのため「処理時間を正確に測りたい」場合は、必ず steady_clock を使うのがC++での定石です。 人が読める形式に変換する system_clock で取得した時刻は、そのままでは内部表現のままで人間が読める文字列になりません。 std::chrono::system_clock::to_time_t() で time_t 型に変換し、 std::localtime や std::strftime と組み合わせることで「2026-07-30 12:00:00」のような見慣れた形式の文字列に変換できます。この変換の手順が他の言語に比べてやや長く感じられる点も、C++の日付操作の特徴です。 ...