投稿

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

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

C#の日付操作は、`DateTime`という型を使い、分かりやすいメソッド名で操作できるのが特徴です。この記事では、C#における日付の基本的な扱い方と、実務でハマりやすいポイントを解説します。 DateTimeを使う DateTime now = DateTime.Now; Console.WriteLine(now); `DateTime.Now`は実行環境のローカル時刻を返します。サーバーとクライアントで環境が違うアプリでは、後述する`DateTimeOffset`や`DateTime.UtcNow`との使い分けが重要になります。 日付を文字列にする Console.WriteLine(now.ToString("yyyy年MM月dd日")); Console.WriteLine(now.ToString("HH:mm:ss")); `ToString`の引数に渡す書式指定子を変えることで、表示形式を自由にカスタマイズできます。`yyyy`は西暦4桁、`MM`は月(2桁)、`dd`は日(2桁)を表します。よく使う組み合わせは覚えておくと便利です。 文字列から日付に変換する 逆に、文字列を`DateTime`に変換したい場合は`DateTime.Parse`や`DateTime.TryParse`を使います。 string input = "2026-08-18"; if (DateTime.TryParse(input, out DateTime result)) { Console.WriteLine(result); } `Parse`は変換に失敗すると例外を投げますが、`TryParse`は失敗時に`false`を返すだけなので、ユーザー入力のように形式が保証されていない値を扱う場合は`TryParse`を使うのが安全です。 日付を計算する DateTime threeDaysLater = now.AddDays(3); DateTime lastMonth = now.AddMonths(-1); TimeSpan diff = threeDaysLater - now; `AddDays`や`AddMonths`は負の値を渡すことで過去方向への計算も...

#17 C++で学ぶモジュールとパッケージの基本

C++のファイル整理は、伝統的な「ヘッダーファイル」という仕組みに加え、比較的新しい「名前空間」や「モジュール」も使われます。この記事では、C++におけるファイル分割の基本を解説します。 ヘッダーファイルと実装ファイル C++では、関数の宣言を .h ファイルに、中身を .cpp ファイルに分けて書くのが伝統的な方法です。 // utils.h #pragma once void greet(std::string name); // utils.cpp #include "utils.h" #include <iostream> void greet(std::string name) { std::cout << "こんにちは、" << name << "さん" << std::endl; } // main.cpp #include "utils.h" int main() { greet("太郎"); } #pragma once は、同じヘッダーファイルが誤って複数回読み込まれるのを防ぐおまじないです。宣言(何ができるか)と実装(具体的にどう動くか)を分けておくことで、他のファイルからは .h だけを見れば使い方が分かるようになります。 namespaceという仕組み C#と同じく、C++にも namespace という仕組みがあり、名前の衝突を防ぐために使われます。 namespace utils { void greet(std::string name) { std::cout << "こんにちは、" << name << "さん" << std::endl; } } utils::greet("太郎"); 別々のライブラリで同じ名前の関数( greet など)が定義されていても、 namespace で囲んでおけば utils::greet のように区別して呼び出せるため、名前の衝突を避けられます。 C+...

#17 C#で学ぶモジュールとパッケージの基本

C#のファイル整理は「名前空間(namespace)」という仕組みで行います。この記事では、C#における名前空間の基本と、外部ライブラリ(NuGetパッケージ)の使い方をあわせて解説します。 namespaceの宣言 namespace MyProject.Utils { public class Greeter { public static void Greet(string name) { Console.WriteLine($"こんにちは、{name}さん"); } } } C# 10以降では、ファイル全体を1つの名前空間にする場合、波かっこを省略した「ファイルスコープ名前空間」というシンプルな書き方もできます。 namespace MyProject.Utils; public class Greeter { public static void Greet(string name) { Console.WriteLine($"こんにちは、{name}さん"); } } 他の名前空間から使う using MyProject.Utils; Greeter.Greet("太郎"); `using`を書くことで、その名前空間のクラスをフルパス無しで呼び出せるようになります。同じクラス名が複数の名前空間に存在する場合は、`MyProject.Utils.Greeter`のようにフルパスで指定して曖昧さを解消できます。 外部パッケージ(NuGet)を使う 他の人が作ったライブラリを使いたい場合は、NuGetというパッケージ管理の仕組みを使います。 dotnet add package Newtonsoft.Json インストール後は、そのライブラリの名前空間を`using`で読み込めば、自分のコードと同じように使えます。 C#ならではの注意点 C#の`namespace`は、Javaの`package`のようにフォルダ構造と厳密に一致させる必要はありません。とはいえ、多くのプロジェクトではフォルダ構造と名前空間を揃えるのが慣習になっており、Visual Studioも...

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

C++で名前と値の組み合わせを扱うには、 std::map という仕組みを使います。この記事では、C++における辞書に相当する使い方と、安全な値の取り出し方を解説します。 mapを作ってみる #include std::map scores; scores["太郎"] = 90; scores["次郎"] = 85; 値を取り出す 存在しないキーで直接アクセスすると、その型のデフォルト値が新しく作られてしまうことがあるため、 find() を使って事前に確認するのが安全です。 auto it = scores.find("太郎"); if (it != scores.end()) { std::cout second it->first がキー、 it->second が値を表します。 キーの有無だけを調べる if (scores.count("太郎") > 0) { std::cout 比較的新しいC++では scores.contains("太郎") という、より直感的な書き方も使えます。 全てのキーと値を順に処理する for (const auto& pair : scores) { std::cout 構造化束縛という比較的新しい書き方を使うと、 pair.first ・ pair.second の代わりに、キーと値を直接名前付きで受け取れます。 for (const auto& [name, score] : scores) { std::cout キーが無いときだけ値を設定する 「既にあれば何もせず、無ければ挿入する」という処理は insert を使うと1行で書けます。 scores.insert({"三郎", 78}); // 既に"三郎"キーがあれば何も起きない C++ならではの注意点 std::map は、内部でキーが自動的に並べ替えられて管理されるという特徴があります。 for で繰り返し処理すると、キーの昇順で取り出されることが保証されています。順序を気にしない場合は、 std::unor...

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

C#で名前と値の組み合わせを扱うには、 Dictionary というクラスを使います。この記事では、C#における辞書(連想配列)の使い方と、実務でよく使う操作を解説します。 Dictionaryを作ってみる var scores = new Dictionary<string, int>(); scores["太郎"] = 90; scores["花子"] = 85; Dictionary<TKey, TValue> のように、キーと値それぞれの型を山かっこの中で指定します。上の例では、キーが文字列( string )、値が整数( int )の辞書を作っています。 値を取り出す 存在しないキーで直接アクセスすると例外が発生するため、 TryGetValue という安全な取り出し方がよく使われます。 if (scores.TryGetValue("太郎", out int score)) { Console.WriteLine(score); } else { Console.WriteLine("見つかりませんでした"); } キーが存在するか確認する 値そのものは不要で、キーの有無だけ調べたい場合は ContainsKey を使います。 if (scores.ContainsKey("太郎")) { Console.WriteLine("太郎さんのデータがあります"); } 削除したい場合は Remove("太郎") を呼び出すだけで、キーと値のペアがまとめて取り除かれます。 全てのキーと値を順に処理する foreach (var pair in scores) { Console.WriteLine($"{pair.Key}: {pair.Value}"); } pair.Key ・ pair.Value のほかに、C# 7.0以降では foreach (var (name, score) in scores) のように、キーと値を直接分解して受け取る書き方も使えます。 C#ならではの注意点 TryGetVal...

#6 Dartで学ぶループの基本

Dartのループは、C言語系の言語に共通する標準的な書き方が基本です。この記事では、Dartにおけるループの基本と、Flutter開発を見据えた使い分けを解説します。 for文の基本 for (int i = 0; i < 5; i++) { print(i); } for-in文でリストの中身を処理する リストの中身を1つずつ処理したい場合は、 for...in を使います。 var fruits = ["りんご", "みかん", "ぶどう"]; for (var fruit in fruits) { print(fruit); } forEachメソッド Dartには、リストに対して直接 forEach を呼び出す書き方もあります。 fruits.forEach((fruit) { print(fruit); }); for...in との違いは、 forEach の中では break や continue が使えない点です。途中でループを止める可能性がある処理には for...in を、単純に全件処理したいだけなら forEach を、というように使い分けるとよいでしょう。 while文 int count = 0; while (count < 5) { print(count); count++; } 「最低1回は必ず実行してから条件を確認したい」場合は do-while を使います。 int count = 0; do { print(count); count++; } while (count < 5); 添字も一緒に取り出したい場合 for...in や forEach だけでは要素の番号(インデックス)が分からないため、番号も必要な場合は asMap() を組み合わせます。 fruits.asMap().forEach((index, fruit) { print("$index: $fruit"); }); Dartならではの注意点 Flutterでリスト表示の画面を作る際は、こうした基本的なループをそのまま使うのではなく、 ListVi...

#5 Dartで学ぶ条件分岐の基本

Dartの条件分岐は、C言語系の言語に共通する標準的な書き方に加えて、null安全と組み合わせた便利な書き方が用意されています。この記事では、Dartにおける条件分岐の基本と、便利な書き方を解説します。 if文の基本 int age = 20; if (age >= 18) { print("成人です"); } else { print("未成年です"); } 複数の条件を順に確認する if (age >= 65) { print("高齢者です"); } else if (age >= 18) { print("成人です"); } else { print("未成年です"); } switch文 候補が多い場合は switch を使います。 switch (day) { case 1: print("月曜日"); break; default: print("その他"); } null安全と組み合わせた書き方 Dartには、値がnullでないことを確認しつつ処理を進める if (value != null) という書き方に加えて、 ?? を使った簡潔な書き方もよく使われます。 String displayName = nickname ?? "名無しさん"; 「nullでなければその値を使い、値があれば処理を続ける」という書き方には ?. も便利です。 int? length = nickname?.length; 三項演算子で短く書く 「条件によって値を1つ選ぶ」だけの単純な分岐は、三項演算子でも書けます。 String status = age >= 18 ? "成人" : "未成年"; ifを式として使う 比較的新しいDartでは、リストやウィジェットを組み立てる際に、コレクションの中で直接 if を使う書き方もできます。 final items = [ "りんご...

#4 Dartで学ぶ標準入力の基本

Dartにおける標準入力は、主にコマンドラインツールを作る際に使う機能です。この記事では、Dartで利用者からの入力を受け取る基本的な方法と、安全な変換の仕方を解説します。 stdin.readLineSync()を使う Dartでは、 dart:io というライブラリを読み込むことで、標準入力を扱えるようになります。 import 'dart:io'; print("名前を入力してください: "); String? name = stdin.readLineSync(); readLineSync() の結果は、Kotlinと同じように「値が入っていないかもしれない(null許容型)」として扱われます。 数値として受け取る 数値として使いたい場合は、 int.parse() や、失敗してもエラーにならない int.tryParse() を使って変換します。 int age = int.tryParse(stdin.readLineSync() ?? "") ?? 0; 「入力がなければ空文字を使い、数値に変換できなければ0を使う」という安全な処理を1行で表しています。 複数の値をまとめて受け取る スペース区切りで複数の値が入力される場合は、 split で分割してから、それぞれを変換します。 final line = stdin.readLineSync() ?? ""; final numbers = line.split(" ").map((s) => int.parse(s)); print(numbers.reduce((a, b) => a + b)); 入力を繰り返し受け取る 利用者が特定の文字を入力するまで繰り返し受け付けたい場合は、 while と組み合わせます。 String? line; while ((line = stdin.readLineSync()) != null && line != "exit") { print("入力: $line"); } Dartならではの注意点 Dartの標準入力はFlutterアプリの開発...

#3 Dartで学ぶ演算子の基本

Dartの演算子は、基本的な計算に加えて、null(値がない状態)を安全に扱うための演算子が充実しているのが特徴です。この記事では、Dartの基本的な演算子と、Flutter開発でよく登場するnull安全の演算子について解説します。 算術演算子・比較演算子 Dartでは、次のような演算子を使います。 + - * / % 算術演算子 == != > < 比較演算子 && || ! 論理演算子 整数同士の割り算で商だけを求めたい場合は、専用の ~/ という演算子を使います。 print(10 / 3); // 3.3333333333333335(通常の割り算) print(10 ~/ 3); // 3(商だけを整数で取得) print(10 % 3); // 1(余り) 複合代入演算子で短く書く 「変数に加算してから代入し直す」という処理はよく登場するため、まとめて書ける複合代入演算子が用意されています。 int count = 0; count += 1; // count = count + 1 と同じ count *= 2; // count = count * 2 と同じ Null対応の演算子 Dartには、null安全という仕組みに対応した便利な演算子が用意されています。 ?? 値がnullのとき、代わりの値を使う ??= 値がnullのときだけ、新しい値を代入する ?. 値がnullでなければ処理を続ける String? nickname; nickname ??= "名無しさん"; print(nickname); // 名無しさん String? name; print(name?.length); // nameがnullならnullを出力(エラーにならない) ?. は、オブジェクトがnullでない場合だけメソッドやプロパティにアクセスし、nullの場合はエラーを起こさずにnullを返してくれます。「もしかしたら値が無いかもしれない」変数を安全に扱うために欠かせない演算子です。 Dartならではの注意点 整数の割り算の商を求める ~/ という演算子は、他の言語ではあまり見かけない独特な記号で...

#2 Dartで学ぶ変数とデータ型の基本

Dartの変数には、 var ・ final ・ const という3種類のキーワードがあります。この記事では、Dartにおける変数の作り方と、代表的なデータ型について解説します。 var・final・constの使い分け Dartでは、値を変更できる変数には var 、後から変更できない変数には final または const を使います。 var age = 20; final name = "太郎"; final と const はどちらも「変更不可」を表しますが、 const はプログラムを書いている時点で値が決まっている場合に、 final は実行してみるまで値がわからない場合に使う、という違いがあります。 const pi = 3.14; // コンパイル時に確定 final now = DateTime.now(); // 実行時にしか分からない 代表的なデータ型 Dartの基本的なデータ型には、次のようなものがあります。 整数(int) 浮動小数点数(double) 文字列(String) 真偽値(bool) Dartにも型推論があるため、 var を使うだけで代入する値から型を自動的に判断してくれます。 null安全という仕組み 近年のDartには「null安全」という仕組みが導入されています。通常の型は「値が必ず入っている」ことが保証されており、値が入らない可能性を許したい場合は、型の後ろに「?」を付ける必要があります。 String? nickname; nickname = "たろちゃん"; // 後から代入できる この仕組みにより、「値がないかもしれない」ことをうっかり見落とすミスを、実行前の段階で防げるようになっています。 lateキーワードで初期化を遅らせる 「後で必ず値を設定するが、宣言の時点では値を決められない」という変数には、 late を使います。 late String description; void setup() { description = "初期化完了"; } late を付けると、null許容型にしなくても宣言と初期化を分けられますが、実際に使われる前に初期化を忘れるとエラー...

#1 Dartで学ぶ環境構築の基本

Dartは、Googleが開発した言語で、スマートフォンアプリ開発フレームワーク「Flutter」の登場によって一気に知名度が上がりました。この記事では、Dartを学ぶための環境構築を解説します。 Dart単体でのインストール Dartだけを学びたい場合は、公式サイト(dart.dev)からDart SDKをインストールします。インストール後、次のコマンドでバージョンを確認しましょう。 dart --version Flutterとセットで学ぶ場合 将来的にスマートフォンアプリ開発まで見据えている場合は、最初から「Flutter SDK」をインストールする方法もあります。Flutter SDKには、Dartの実行環境がまとめて含まれているため、別途Dartだけをインストールする必要はありません。どちらから始めるか迷ったら、「アプリを作りたいか」を基準に選ぶとよいでしょう。 ファイルを実行してみる 拡張子 .dart のファイルを用意し、次のコマンドで実行します。 dart run ファイル名.dart コンパイルの手間を意識せず、その場で実行結果を確認できる手軽さがあります。 DartPadというブラウザ上の実験場 環境構築の前に、まずDartの雰囲気だけ知りたいという場合は、「DartPad」というブラウザ上で動く公式のお試し環境も用意されています。インストール不要でコードを試せるので、学習を始める前の下見に最適です。 エディタの選択肢 Dart・Flutterの開発には、Google公式のDart・Flutter拡張機能を入れたVS Codeがよく使われます。Android Studioでも同様の拡張機能を追加でき、実機やエミュレータでの動作確認までまとめて行えます。 pub.devというライブラリの置き場 Dartの外部ライブラリ(パッケージ)は「pub.dev」という公式サイトで公開されています。 dart pub add パッケージ名 というコマンドで、プロジェクトに簡単に追加できます。 Dartならではの注意点 Dartは元々ブラウザ向けの言語として開発された歴史があり、その後スマートフォンアプリ開発向けに大きく方向転換したという珍しい経緯を持っています。そのため学習情報を検索すると、古い時代の使い方(ブラ...

#4 Goで学ぶ標準入力の基本

Goにおける標準入力の扱いは、シンプルさを重視するGoらしく、比較的わかりやすい書き方が用意されています。この記事では、Goで利用者からの入力を受け取る基本的な方法を解説します。 fmt.Scanを使う Goで標準入力を扱うもっとも手軽な方法は、 fmt パッケージにある Scan という機能を使うことです。 var name string fmt.Print("名前を入力してください: ") fmt.Scan(&name) 読み込んだ内容を入れたい変数の前に & という記号を付けるのが特徴です。これは、値そのものではなく「変数の場所」を教えるための書き方です。 bufioを使ったもう1つの方法 fmt.Scan は単語の区切り(スペース)までしか読み取れないため、スペースを含む文章をまるごと受け取りたい場合は、 bufio という別のパッケージを使う方法が一般的です。 reader := bufio.NewReader(os.Stdin) line, _ := reader.ReadString('\n') line = strings.TrimSpace(line) ReadString('\n') は改行文字が来るまで読み込むため、まるごと1行を受け取れます。読み込んだ結果には改行が含まれるので、 strings.TrimSpace で取り除くのが定番です。 数値として受け取る fmt.Scan は、変数の型に合わせて自動的に変換を試みてくれます。 var age int fmt.Scan(&age) ただし、数字ではない文字が入力された場合はエラーになるため、実際のプログラムではエラーの確認も合わせて行います。 var age int _, err := fmt.Scan(&age) if err != nil { fmt.Println("数値を入力してください") } Goならではの注意点 変数の前に付ける & という記号は、Goを学び始めたばかりの人にとって最初は意味がわかりにくいポイントです。これは「この変数の場所に、読み込んだ値を書き込んでください」とGoに伝えるための書き方だと理解しておくと...

#7 Goで学ぶ配列の基本

Goには、複数の値をまとめて扱うためのデータ構造として、「配列」と「スライス」という2種類の仕組みがあります。この記事では、それぞれの違いと基本的な使い方を解説します。 配列(固定長) Goの配列は、大きさがあらかじめ決まっていて、後から変更できません。 var fruits [3]string = [3]string{"りんご", "みかん", "ぶどう"} スライス(可変長) 実際の開発では、大きさを自由に変えられる「スライス」を使うのが一般的です。 fruits := []string{"りんご", "みかん", "ぶどう"} fruits = append(fruits, "メロン") 配列の宣言と似ていますが、大きさの数字を書かない点が違いです。値を追加するには append() という関数を使います。 要素にアクセスする・繰り返す 配列・スライスどちらも、0から始まる添字でアクセスします。 fmt.Println(fruits[0]) for i, fruit := range fruits { fmt.Println(i, fruit) } スライスの一部を切り出す スライスには、既存のスライスの一部分だけを取り出す「スライス式」という書き方があります。 numbers := []int{10, 20, 30, 40, 50} part := numbers[1:3] // [20, 30](添字1から3未満) fmt.Println(part) この「スライス」という名前は、実はこの「切り出す」という操作に由来しています。 makeで初期サイズを指定する あらかじめサイズが分かっている場合は、 make という関数でスライスを作ると、 append のたびにメモリの再確保が起きるのを防げます。 scores := make([]int, 0, 10) // 長さ0、容量10のスライス Goならではの注意点 Goの append() は、Pythonの append() のように直接中身を追加するのではなく、「追加された新しいスライスを返す」という書き方を...

#6 Goで学ぶループの基本

Goのループには、他の言語のように複数の種類が存在せず、 for だけですべての繰り返しを表現するという、シンプルな設計思想があります。この記事では、Goにおけるループの基本を解説します。 forだけですべて表現する Goには while という単語が存在せず、条件による繰り返しも for で書きます。 count := 0 for count C言語風の書き方も可能 もちろん、初期値・条件・更新をまとめて書く、なじみのある書き方もできます。 for i := 0; i 無限ループとbreak 条件を何も書かなければ、無限に繰り返す for になります。抜け出すには break を使います。 count := 0 for { fmt.Println(count) count++ if count >= 5 { break } } 特定の条件のときだけ処理をスキップしたい場合は continue が使えます。 rangeを使った繰り返し 配列やスライス(可変長のリストのようなもの)の中身を順番に処理したい場合は、 range という書き方を使います。 fruits := []string{"りんご", "みかん", "ぶどう"} for i, fruit := range fruits { fmt.Println(i, fruit) } range は、位置(添字)と値の両方を同時に取り出せるのが特徴です。添字が不要な場合は、アンダースコア _ を使って無視できます。 for _, fruit := range fruits { fmt.Println(fruit) } ネストしたループから抜ける 二重ループの内側から、外側のループごと一気に抜けたい場合は、ループにラベルを付ける書き方が使えます。 outer: for i := 0; i ラベル無しの break は、それを直接囲んでいる内側のループしか抜けられないため、多重ループの外側までまとめて抜けたい場面ではラベルが役立ちます。 Goならではの注意点 他の言語の経験がある人は、「whileはどこにあるのか」と探してしまいがちですが...

#5 Goで学ぶ条件分岐の基本

Goの条件分岐は、Rustと同じく、条件を囲むかっこが不要なすっきりとした書き方が特徴です。この記事では、Goにおける条件分岐の基本と、実務でよく使われる書き方を解説します。 if文の基本 age := 20 if age >= 18 { fmt.Println("成人です") } else { fmt.Println("未成年です") } 条件をかっこで囲む必要がなく、すっきりとした見た目になります。ただし、処理をまとめる波かっこ { } は省略できず、1行の処理であっても必ず書く必要があります。 複数の条件を順に確認する score := 75 if score >= 90 { fmt.Println("優") } else if score >= 70 { fmt.Println("良") } else { fmt.Println("可") } switch文で分かりやすく分岐する 複数の値によって処理を分けたい場合は、 switch 文を使うとif文を並べるより読みやすくなります。 day := "月" switch day { case "土", "日": fmt.Println("休日です") default: fmt.Println("平日です") } Goの switch は、他の言語のように各 case の最後に break を書く必要がありません。1つの case に該当したら自動的にそこで処理が終わる仕組みになっています。 if文の中で変数を作る Goには、if文の条件を書く前に、その場限りの変数を用意できるという独自の書き方があります。 if age := 20; age >= 18 { fmt.Println("成人です") } この age という変数は、このif文(とelseブロック)の中だけで使える一時的な変数になります。エラーの確認処理などで、このパターンがよく使われます。 if err := ...

#3 Goで学ぶ演算子の基本

Goの演算子は、シンプルさを重視するGoらしく、余計な機能を持たないすっきりとした設計になっています。この記事では、Goの基本的な演算子と、他の言語との違いを解説します。 算術演算子・比較演算子 Goでも、なじみのある演算子を使います。 + - * / % 算術演算子 == != > < 比較演算子 && || ! 論理演算子 異なる型同士は計算できない Goでは、Rustと同様に型の扱いが厳格です。整数型と浮動小数点型の変数を、そのまま計算しようとするとエラーになります。計算したい場合は、明示的に型を変換する必要があります。 var a int = 5 var b float64 = 2.5 result := float64(a) + b 複合代入演算子 「変数に加算してから代入し直す」処理をまとめて書ける複合代入演算子も使えます。 count := 0 count += 1 // count = count + 1 と同じ count *= 2 // count = count * 2 と同じ インクリメント演算子の制限 多くの言語には、値を1増やす i++ という書き方がありますが、Goにも同様の書き方があります。ただし、Goの i++ は「文」として扱われ、他の言語のように x = i++ のような形で式の中に組み込むことはできません。必ず単独の行として書く必要があります。 i := 0 i++ // x := i++ // これはエラーになる ビット演算子 Goには、ビット単位の計算を行う演算子も用意されています。 & ビットごとのAND | ビットごとのOR << >> 左右へのビットシフト フラグの管理や低レイヤーな処理を書く際に登場しますが、日常的なアプリケーション開発では使う頻度は高くありません。 Goならではの注意点 Goは言語仕様をシンプルに保つという方針のもと、他の言語にある複雑な演算子の使い方(例えば三項演算子など)をあえて採用していません。慣れた言語に三項演算子がある人ほど「Goには無いのか」と驚くことがありますが、これはコードの読みやすさを優先したGoの設計...

#2 Goで学ぶ変数とデータ型の基本

Goの変数の作り方には、書き方が2種類あるという特徴があります。この記事では、Goにおける変数の作り方と、代表的なデータ型について解説します。 varを使った書き方 1つ目は、 var というキーワードを使う書き方です。 var age int = 20 変数名、型、値の順に書きます。型を省略して、値から自動的に判断させることもできます。 var age = 20 :=を使った書き方 2つ目は、 := という記号を使う、より簡潔な書き方です。 age := 20 var とは書かずに、いきなり変数名と値を := でつなぎます。関数の中で手軽に変数を作りたいときによく使われる書き方です。 代表的なデータ型 Goの基本的なデータ型には、次のようなものがあります。 整数(int) 浮動小数点数(float64) 文字列(string) 真偽値(bool) 「ゼロ値」という考え方 Goには「ゼロ値」という独特の仕組みがあります。これは、変数を値なしで宣言した場合に、型に応じた初期値が自動的に入るというものです。例えば整数型なら0、文字列型なら空文字、真偽値型ならfalseが自動で入ります。 var count int // countには自動的に0が入る 「変数が初期化されていない」という状態が存在しないため、意図しない不具合を防ぎやすくなっています。 複数の変数をまとめて宣言する var を使うと、複数の変数をまとめて宣言することもできます。 var ( name string = "太郎" age int = 20 ) 関連する設定値などをまとめて宣言したい場合に、見た目がすっきりします。 定数を表すconst 値を変更されたくない場合は const を使います。 const MaxScore = 100 var と違い、 const で宣言した値はコンパイル時に決まっている必要があり、実行中に計算した結果を代入することはできません。 Goならではの注意点 Goでは、宣言したのに一度も使っていない変数があると、実行前の段階でエラーになります。他の言語ではただの警告で済むことが多いため、Goを学び始めた人が最初に戸惑いやすいポイントです。...

#1 Goで学ぶ環境構築の基本

Go(Golang)は、Googleが開発したシンプルさと実行速度を両立した言語です。文法が読みやすく整理されているため、学習の最初でつまずきにくい言語のひとつと言われています。この記事では、Goの環境構築の手順を紹介します。 Goのインストール 公式サイト(go.dev)からインストーラーをダウンロードして実行するだけで、環境構築が完了します。インストール後、ターミナルで次のコマンドを実行し、正しく入っているか確認しましょう。 go version プロジェクトを作って実行する Goでは、プロジェクトごとに go.mod という管理ファイルを作るのが基本です。フォルダを作成したら、その中で次のコマンドを実行します。 go mod init サンプル あとは .go という拡張子のファイルにコードを書き、次のコマンドで実行するだけです。 go run ファイル名.go コンパイルして実行ファイルを作る go run はその場で実行するコマンドですが、配布用の実行ファイルを作りたい場合は次のコマンドを使います。 go build ファイル名.go 実行するたびにコンパイルし直す必要がなく、生成されたファイルをそのまま他のパソコンでも動かせるのがGoの強みです。 エディタの選択肢 Goの開発にはVS Codeがよく使われ、公式のGo拡張機能を入れることで、補完・フォーマット・デバッグまで一通りの機能が揃います。GoLandという専用の統合開発環境も人気があります。 go fmtで自動整形する Goには go fmt という、コードのスタイルを自動的に統一されたルールへ整形してくれるコマンドが標準で用意されています。 go fmt ./... チーム開発でスタイルの好みによる論争が起きにくいのは、この標準ツールが浸透しているGoならではの利点です。 Goならではの注意点 Goには「使っていない変数やimportがあるとエラーになる」という、他の言語には見られない厳格なルールがあります。最初は面倒に感じるかもしれませんが、これは無駄なコードが増えるのを防ぎ、常に整理されたコードを保つための仕組みです。エディタの自動整形機能( gofmt )と組み合わせて使うと、書き方の癖に迷うことも少なくなります。 まとめ Goの環...

#7 Javaで学ぶ配列の基本

Javaには、複数の値をまとめて扱うデータ構造として、「配列」と「ArrayList」という2種類の仕組みがあります。この記事では、それぞれの違いと基本的な使い方を解説します。 配列(固定長) Javaの配列は、大きさがあらかじめ決まっていて、後から変更できません。 String[] fruits = {"りんご", "みかん", "ぶどう"}; System.out.println(fruits.length); // 3 ArrayList(可変長) 大きさを自由に変えたい場合は、 ArrayList というクラスを使います。 import java.util.ArrayList; ArrayList fruits = new ArrayList (); fruits.add("りんご"); fruits.add("みかん"); 値の追加には add() 、削除には remove() を使います。 要素にアクセスする・繰り返す 配列は fruits[0] のように角かっこで、 ArrayList は fruits.get(0) のように専用のメソッドでアクセスします。この書き方の違いは、Java初心者が混同しやすいポイントです。 for (String fruit : fruits) { System.out.println(fruit); } for-each 文はどちらに対しても同じ書き方で使えます。 Stream APIで加工する 比較的新しいJavaでは、 ArrayList の中身を条件で絞り込んだり変換したりする際、Stream APIという機能がよく使われます。 import java.util.stream.Collectors; List longNames = fruits.stream() .filter(f -> f.length() > 2) .collect(Collectors.toList()); Javaならではの注意点 配列は基本的なデータ型(intなど)も直接格納できますが、 ArrayList は基本的に Integer のような「オブジェ...

#6 Javaで学ぶループの基本

Javaのループは、C言語系の言語に共通する標準的な書き方に加えて、配列やリストを扱いやすい拡張for文が用意されています。この記事では、Javaにおけるループの基本と、目的別の使い分けを解説します。 for文の基本 for (int i = 0; i 括弧内は「初期化式; 継続条件; 更新式」の3つで構成されています。初期化式でカウンタ変数`i`を用意し、継続条件を満たす間繰り返し、1周ごとに更新式(`i++`)が実行されます。 拡張for文 配列やリストの中身を1つずつ処理したい場合は、拡張for文(for-eachとも呼ばれる)が便利です。 String[] fruits = {"りんご", "みかん", "ぶどう"}; for (String fruit : fruits) { System.out.println(fruit); } 添字を管理する必要がなく、簡潔に書けます。`List`のようなコレクション型に対しても同じ書き方が使えます。 List<String> list = List.of("a", "b", "c"); for (String s : list) { System.out.println(s); } while文とdo-while文 int count = 0; while (count Javaには「最低1回は処理を実行してから条件を判定する」`do-while`文もあります。 int n = 0; do { System.out.println(n); n++; } while (n ループの制御:break/continue 特定の条件でループを抜けたい場合は`break`、その回だけスキップしたい場合は`continue`を使います。二重ループの外側だけを抜けたい場合は、ラベルを使うことで実現できます。 outer: for (int i = 0; i Javaならではの注意点 拡張for文は読みやすい反面、ループの途中で今何番目の要素を処理しているかという「添字」の情報を直接扱えません。添字が必要な処理では、従来のfo...

#5 Javaで学ぶ条件分岐の基本

Javaの条件分岐は、C言語系の言語に共通する標準的な書き方を採用しています。この記事では、Javaにおける条件分岐の基本と、比較的新しい書き方を解説します。 if文の基本 int age = 20; if (age >= 18) { System.out.println("成人です"); } else { System.out.println("未成年です"); } else ifで分岐を増やす if (age >= 65) { System.out.println("高齢者です"); } else if (age >= 18) { System.out.println("成人です"); } else { System.out.println("未成年です"); } switch文という選択肢 条件の候補が多い場合、Javaには switch という書き方もあります。1つの値に対して、複数の候補のどれに当てはまるかを判定したいときに便利です。 switch (day) { case 1: System.out.println("月曜日"); break; default: System.out.println("その他"); } 各 case の最後に break を書き忘れると、次の case の処理までそのまま実行されてしまう(フォールスルーと呼ばれる)ため、注意が必要です。 switch式という新しい書き方 比較的新しいJavaには、 break が不要で値を返せる「switch式」という書き方もあります。 String result = switch (day) { case 1 -> "月曜日"; case 6, 7 -> "週末"; default -> "その他"; }; 矢印( -> )を使うことでフォールスルーが起きなくなり、従来の switch 文よ...

#4 Javaで学ぶ標準入力の基本

Javaにおける標準入力の扱いは、決まった書き方さえ覚えてしまえば、あとはほぼ同じパターンの繰り返しで対応できます。この記事では、Javaで利用者からの入力を受け取る基本的な方法と、つまずきやすいポイントを解説します。 Scannerクラスを使う Javaで標準入力を扱う際によく使われるのが、 Scanner という機能です。 import java.util.Scanner; Scanner scanner = new Scanner(System.in); System.out.print("名前を入力してください: "); String name = scanner.nextLine(); 最初に Scanner を使う準備をしたあと、 nextLine() で1行分の入力を受け取る、という流れになります。 数値として受け取る 数値をそのまま受け取りたい場合は、 nextInt() のような専用の機能を使います。 int age = scanner.nextInt(); Pythonのように文字列を後から変換するのではなく、最初から「数値として読み込む」という指示を出せるのがJavaの特徴です。数字ではない文字が入力されると InputMismatchException という例外が発生するため、以前の記事で触れた try ・ catch と組み合わせると安全になります。 nextIntとnextLineを混在させる際の注意 nextInt() の後に nextLine() を呼ぶと、直前の入力の改行文字が残っていて空文字が読み込まれてしまう、というよくあるバグがあります。 int age = scanner.nextInt(); scanner.nextLine(); // 残った改行を読み捨てる String name = scanner.nextLine(); このように、間に空の nextLine() を1回挟んで改行を読み捨てるのが定番の対処法です。 Javaならではの注意点 Scanner は毎回 import 文を書いて準備する必要があり、Pythonの input() のような手軽さはありません。しかし、書き方自体はいつも同じパターンなので、一度テンプレートとして覚えてしまえば、あとはど...

#3 Javaで学ぶ演算子の基本

Javaの演算子は、多くのプログラミング言語の元になった、標準的な書き方を採用しています。この記事では、Javaの基本的な演算子と、初心者がつまずきやすいポイントを解説します。 算術演算子・比較演算子 Javaでは、次のような演算子を使います。 + - * / % 算術演算子 == != > < 比較演算子 && || ! 論理演算子 整数の割り算は切り捨てになる Javaで特に注意したいのが、整数型(int)同士の割り算です。小数点以下は自動的に切り捨てられます。 int result = 10 / 3; // 結果は3 小数の結果が欲しい場合は、どちらかの値をdouble型にする必要があります。 double result = 10.0 / 3; // 結果は3.333... 複合代入演算子 「変数に加算してから代入し直す」処理をまとめて書ける複合代入演算子も使えます。 int count = 0; count += 1; // count = count + 1 と同じ count *= 2; // count = count * 2 と同じ 文字列の比較には注意が必要 Javaでは、文字列(String)同士を比べる際に == を使うと、意図しない結果になることがあります。 == は「同じ実体かどうか」を比べる演算子であり、文字の中身が同じかどうかを調べたい場合は equals() というメソッドを使う必要があります。 if (name.equals("太郎")) { ... } 三項演算子 簡単な条件分岐は、三項演算子を使って1行にまとめられます。 String message = age >= 18 ? "成人です" : "未成年です"; 複合代入演算子 「変数に加算してから代入し直す」処理をまとめて書ける複合代入演算子も使えます。 int count = 0; count += 1; // count = count + 1 と同じ Javaならではの注意点 数値の比較には == をそのまま使えますが、文字列の比較にだけは equals() が必要という違いは...

#2 Javaで学ぶ変数とデータ型の基本

Javaでは、変数を使う前に必ず「型」を明示する必要があります。この記事では、Javaにおける変数の宣言方法と、代表的なデータ型について解説します。 型を明示して変数を作る Javaの変数は、型・変数名・値の順に書きます。 int age = 20; Pythonのように型を省略することはできません。最初は少し窮屈に感じるかもしれませんが、この明示的な書き方が、大きなプログラムを安全に保つ助けになります。 代表的なデータ型 Javaでよく使う基本的なデータ型(プリミティブ型)には、次のようなものがあります。 整数(int) 浮動小数点数(double) 真偽値(boolean) 1文字(char) 複数の文字を扱う「文字列」は、これらとは別に String という特別な型を使います。 String name = "太郎"; varによる型推論(Java 10以降) 近年のJavaでは、 var というキーワードを使うことで、型の記述を省略できるようになりました。 var age = 20; 代入する値からJavaが型を自動的に判断してくれますが、変数の型自体は決まったまま変わらない点はこれまでと同じです。読みやすさを優先したいときは、型を明示する従来の書き方も広く使われています。 finalという変更不可の指定 値を後から変更されたくない変数には、 final というキーワードを付けます。 final int MAX = 100; 設定値など、プログラム中で書き換わってほしくない値に使うと、うっかりミスを防げます。 数値の桁区切り 大きな数値リテラルには、読みやすくするためにアンダースコアを桁区切りとして挿入できます。 int million = 1_000_000; アンダースコアはコンパイル時に無視されるため、実際の値には影響しません。 ラッパークラスという仕組み プリミティブ型( int など)は、オブジェクトとして扱う必要がある場面(コレクションクラスなど)では使えません。そのため、 int に対応する Integer のような「ラッパークラス」が用意されています。 Integer age = 20; // オブジェクトとして扱えるint Javaな...

#1 Javaで学ぶ環境構築の基本

Javaは、長年にわたって企業システムや業務アプリケーションで使われ続けている定番の言語です。学習を始める人向けの教材も多く、環境構築の手順自体もパターンが確立されています。この記事では、Javaを動かすための準備を解説します。 JDKのインストール Javaのプログラムを書いたり実行したりするには、「JDK(Java Development Kit)」というソフトウェアをインストールする必要があります。OracleやAmazon、Eclipseなど複数の団体が無料でJDKを配布しているので、いずれかを選んでインストールします。迷った場合は、無料利用の範囲がわかりやすい「Eclipse Temurin」がおすすめです。 環境変数の設定 Javaの環境構築で多くの人がつまずくのが、「JAVA_HOME」という環境変数の設定です。環境変数とは、パソコン全体で共有される「設定の一覧」のようなものです。JDKをインストールした場所を、この環境変数に登録しておくことで、どのフォルダからでもJavaのコマンドが使えるようになります。 設定できたか確認するには、ターミナルで次のコマンドを実行します。 java --version ファイルを作って実行する Javaでは、ファイル名とクラス名(プログラムの入れ物の名前)を必ず一致させる必要があります。例えば Hello.java というファイルには、 Hello というクラスを書きます。実行する際は、まずコンパイルしてからクラスファイルを実行するという2段階の手順を踏みます。 javac Hello.java java Hello ビルドツールという選択肢 複数のファイルで構成される本格的なプロジェクトでは、コンパイルや依存ライブラリの管理をまとめて行う「Maven」や「Gradle」というビルドツールがよく使われます。学習の最初のうちは javac ・ java だけで十分ですが、プロジェクトが大きくなったら検討するとよいでしょう。 エディタの選択肢 本格的な開発には「IntelliJ IDEA」という統合開発環境が広く使われています。軽量な環境で学びたい場合はVS CodeにJava用の拡張機能を入れる方法もあります。 Javaならではの注意点 他の言語と違い、Javaは「ファイル名とク...

#17 PHPで学ぶモジュールとパッケージの基本

PHPのファイル整理は、以前の記事で触れたComposerと「名前空間」を組み合わせて行うのが現代的な方法です。この記事では、PHPにおけるファイル分割の基本を解説します。 ファイルを読み込む基本 // utils.php function greet($name) { echo "こんにちは、{$name}さん"; } // main.php require_once 'utils.php'; greet("太郎"); `require`は同じファイルを何度も読み込むとエラーになる場合があるため、実務では二重読み込みを防いでくれる`require_once`を使うのが基本です。似た機能に`include`・`include_once`もありますが、読み込みに失敗した際の扱いが異なり、`require`系は失敗すると処理を停止する一方、`include`系は警告を出しつつ処理を続行します。 namespaceという仕組み namespace App\Utils; function greet($name) { echo "こんにちは、{$name}さん"; } use App\Utils; Utils\greet("太郎"); `namespace`は、クラス名や関数名が別のファイルの定義と衝突するのを防ぐための仕組みです。フォルダ構成に合わせて`App\Models`、`App\Controllers`のように階層的に名前空間を分けるのが一般的な設計です。 クラスにも名前空間を使う // src/Models/User.php namespace App\Models; class User { public $name; } // main.php use App\Models\User; $user = new User(); `use`を使うと、毎回フルの名前空間を書かずに短いクラス名だけで扱えるようになり、コードがすっきりします。 PHPならではの注意点 以前の記事で触れたComposerの`autoload`機能を使うと、`require`を1つずつ書かなくても、名前空間に沿ったファイルを自...

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

JavaScriptの日付操作は、伝統的な Date オブジェクトに加え、近年新しい標準機能も登場しています。この記事では、JavaScriptにおける日付と時刻の基本的な扱い方と、つまずきやすいポイントを解説します。 Dateオブジェクトを使う const now = new Date(); console.log(now); 特定の日付を指定して作りたい場合は、 new Date(2026, 6, 30) のように年・月・日を渡します(月の指定方法には後述の注意点があります)。 日付の一部を取得する console.log(now.getFullYear()); // 年 console.log(now.getMonth()); // 月(0から始まる点に注意) console.log(now.getDate()); // 日 console.log(now.getDay()); // 曜日(0が日曜日) 日付を文字列にする 画面にそのまま表示できる読みやすい形式にしたい場合は、 toLocaleDateString が便利です。 console.log(now.toLocaleDateString("ja-JP")); // 2026/7/30 日付を計算する JavaScriptの Date には、Pythonの timedelta のような便利な計算機能がなく、ミリ秒単位で自分で計算する必要があります。 const threeDaysLater = new Date(now.getTime() + 3 * 24 * 60 * 60 * 1000); 「1日は24時間、1時間は60分、1分は60秒、1秒は1000ミリ秒」という単位換算を毎回書くのは間違いのもとになりやすいため、定数として用意しておくと安全です。 const ONE_DAY_MS = 24 * 60 * 60 * 1000; const threeDaysLater = new Date(now.getTime() + 3 * ONE_DAY_MS); JavaScriptならではの注意点 getMonth() は、1月が 0 、12月が 11 として返される点が、初心者が非常につまずきやすいポイントです。表示...

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

Scalaのデバッグは、JVM言語らしくJavaと共通するツールを活用できます。この記事では、Scalaにおけるデバッグの基本的な方法と、関数型スタイル特有の工夫を解説します。 println()でその場の状態を確認する println(s"ageの中身: $age") Scalaの文字列補間(`s"..."`)を使うと、`$age`のように変数をそのまま埋め込めます。複雑な式を埋め込みたい場合は`${a + b}`のように波かっこで囲みます。 IntelliJ IDEAのデバッガー ScalaもIntelliJ IDEAとの相性がよく、Javaと同じようにブレークポイントを設定してデバッグできます。行番号の左側をクリックするだけでブレークポイントを置け、実行が止まったら変数の中身をマウスオーバーで確認できます。 関数型プログラミング特有の注意点 Scalaでは、複数の処理を`.map`や`.filter`のようにつなげて書くことが多く、途中経過を確認しづらいことがあります。そのような場合は、途中に`.map { x => println(x); x }`のような一時的なコードを挟んで、途中の値を確認する方法がよく使われます。 val result = numbers .map(_ * 2) .map { x => println(s"倍にした後: $x"); x } .filter(_ > 10) IDEのデバッガーでメソッドチェーンを追う IntelliJ IDEAには、`.map`や`.filter`をつなげた1行に複数のブレークポイントを個別に設定できる機能があります。行の左側に複数の停止点のアイコンが表示され、それぞれのステップでの値を個別に確認できるため、`println`を挟まずに調査したい場合はこちらも便利です。 Scalaならではの注意点 処理をつなげて書くスタイルに慣れないうちは、一度に多くのことをやろうとせず、`val`を使って途中の結果を一旦変数に入れ、`println`で確認しながら組み立てていくと、原因を見つけやすくなります。また、Scalaは型推論が強力なため、意図しない型になっていることがバグの原因になっている場...

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

TypeScriptの日付操作は、JavaScriptの`Date`オブジェクトをそのまま使いますが、型があることで扱い方がより明確になります。この記事では、TypeScriptにおける日付の基本的な扱い方を解説します。 Dateオブジェクトを使う const now: Date = new Date(); console.log(now.getFullYear()); 実際には型推論が効くため`const now = new Date();`だけでも`now`は自動的に`Date`型として扱われます。型注釈を書くのは、関数の引数や戻り値など、意図を明示したい場面が中心です。 関数の引数に日付の型を使う function formatDate(date: Date): string { return `${date.getFullYear()}年${date.getMonth() + 1}月`; } 引数の型を`Date`と明示しておくことで、日付ではない値を誤って渡そうとした際に、実行前の段階でエラーとして教えてもらえます。 文字列から日付に変換する 文字列から`Date`オブジェクトを作りたい場合は、コンストラクタに文字列を渡します。 const d: Date = new Date("2026-08-20"); ただし`new Date(文字列)`は、渡す文字列の形式によって解釈のされ方が微妙に異なることがあり、実務では`dayjs`のような日付ライブラリを併用するケースも多くあります。 日付を計算する TypeScript(JavaScript)の標準機能には、日付に「〇日後」を計算する専用メソッドがありません。ミリ秒単位で計算するのが基本です。 const threeDaysLater = new Date(now.getTime() + 3 * 24 * 60 * 60 * 1000); TypeScriptならではの注意点 JavaScriptと同様、`getMonth()`が0から始まる点には変わらず注意が必要です。型があってもこの仕様自体が変わるわけではないため、月を表示する処理では`+1`を忘れないようにしましょう。また、標準の`Date`型は日付計算の機能が乏しいため、業務アプ...

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

Rustの標準ライブラリには、日付を手軽に扱う機能があまり用意されておらず、`chrono`という外部ライブラリ(クレート)を使うのが一般的です。この記事では、Rustにおける日付の基本的な扱い方と、実務で気をつけたいポイントを解説します。 chronoを使う 以前の記事で触れた`Cargo.toml`に、`chrono`を追加します。 [dependencies] chrono = "0.4" use chrono::Local; let now = Local::now(); println!("{}", now); 日付を文字列にする println!("{}", now.format("%Y年%m月%d日")); println!("{}", now.format("%H:%M:%S")); `format`に渡す書式指定子は`strftime`系のライブラリ(PythonやRuby)とよく似ているため、他言語の経験があれば覚えやすいはずです。 文字列から日付に変換する 逆に文字列から日時を作りたい場合は、`NaiveDateTime::parse_from_str`などを使います。 use chrono::NaiveDate; let d = NaiveDate::parse_from_str("2026-08-18", "%Y-%m-%d").unwrap(); println!("{}", d); Rustらしく、変換に失敗する可能性のある処理は`Result`型を返すため、`unwrap()`で強制的に取り出すか、`match`や`if let`でエラーを丁寧にハンドリングするかを選べます。実務では入力値の妥当性が保証できない場合、`unwrap()`せず適切にエラー処理することが推奨されます。 日付を計算する use chrono::Duration; let three_days_later = now + Duration::days(3); `Duration`型を使うことで、日数だけでなく時間・分・秒単位の加減算も同じ書き...

#14 Scalaで学ぶ外部ライブラリの基本

Scalaの外部ライブラリは、以前の記事で触れた sbt という管理ツールを使って導入します。この記事では、Scalaにおける外部ライブラリの使い方の基本と、記法の意味を解説します。 build.sbtに追加する build.sbt という設定ファイルに、使いたいライブラリを書き加えます。 libraryDependencies += "com.typesafe.play" %% "play-json" % "2.9.0" 設定ファイルを保存して sbt compile や sbt run を実行すると、自動的にダウンロードされます。 ライブラリを使う import play.api.libs.json._ val json = Json.obj("name" -> "太郎") println(json) ScalaもJavaのライブラリを利用できる ScalaはJVM上で動くため、Maven Centralで公開されているJava向けのライブラリも、多くの場合そのまま利用できます。Scala専用のライブラリが見つからない場合は、Java向けのライブラリを探してみるのもよい方法です。Javaのライブラリを使う場合は、 %% ではなく % 1つだけの記法( "組織名" % "ライブラリ名" % "バージョン" )を使います。 複数のライブラリを追加する 複数のライブラリをまとめて追加したい場合は、 Seq を使ってリスト形式で書くこともできます。 libraryDependencies ++= Seq( "com.typesafe.play" %% "play-json" % "2.9.0", "org.scalatest" %% "scalatest" % "3.2.15" % Test ) % Test のように末尾に「スコープ」を指定すると、そのライブラリをテストコードの中だけで使うといった制御もできます。 Scalaならではの注意点 ...

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

Kotlinの日付操作は、Javaの java.time パッケージをそのまま利用できます。この記事では、Kotlinにおける日付の基本的な扱い方と、実務でよく使う操作を解説します。 LocalDateTimeを使う import java.time.LocalDateTime val now = LocalDateTime.now() println(now) // 2026-07-30T15:04:22.123 時刻を含めず日付だけを扱いたい場合は LocalDate 、日付を含めず時刻だけを扱いたい場合は LocalTime というクラスもあります。必要な情報だけを持つクラスを選ぶことで、意図しない情報の混入を防げます。 日付を文字列にする import java.time.format.DateTimeFormatter val formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日") println(now.format(formatter)) // 2026年07月30日 文字列から日付に変換する 逆に、文字列から日付データを作りたい場合は parse を使います。 import java.time.LocalDate val date = LocalDate.parse("2026-08-01") println(date.dayOfWeek) // FRIDAY dayOfWeek のように、曜日や月といった情報も自動で計算して取得できます。 日付を計算する val threeDaysLater = now.plusDays(3) val oneMonthAgo = now.minusMonths(1) plusDays ・ minusMonths のように、加算・減算のメソッドが単位ごとに用意されているため、「3日後」「1ヶ月前」といった計算を直感的に書けます。2つの日付の差を求めたい場合は java.time.Period や java.time.Duration を使います。 Kotlinならではの注意点 KotlinにはJava向けの java.time をより簡潔に扱える kotlinx-datetime ...

#17 Rustで学ぶモジュールとパッケージの基本

Rustのモジュールは、 mod というキーワードを使って管理する、少し独特な仕組みを持っています。この記事では、Rustにおけるモジュールとパッケージの基本を、つまずきやすいポイントも含めて解説します。 modでモジュールを定義する mod utils { pub fn greet(name: &str) { println!("こんにちは、{}さん", name); } } utils::greet("太郎"); 関数の前に pub を付けないと、モジュールの外から使えません。Rustでは他の言語と違い「デフォルトで非公開」という設計思想が徹底されているため、公開したい要素には自分で明示的に pub を付ける必要があります。 別ファイルに分ける 実際のプロジェクトでは、 mod utils; と書くことで、 utils.rs という別ファイルの中身をモジュールとして読み込めます。プロジェクトが大きくなると、さらに utils/mod.rs や utils/helper.rs のようにフォルダ単位でモジュールを階層化することもできます。 useでパスを短縮する モジュールの中身を呼び出すたびに utils::greet(...) のようにフルパスを書くのは面倒です。 use キーワードを使うと、呼び出しを短縮できます。 use utils::greet; greet("太郎"); // utils:: を省略できる 複数の要素をまとめて使いたい場合は use utils::{greet, farewell}; のように波括弧でまとめて書くこともできます。 クレートとパッケージの関係 以前の記事で触れた「クレート」(外部ライブラリ)は、それぞれが独自のモジュール構造を持っています。1つの「パッケージ」( Cargo.toml で管理される単位)は、実行可能なバイナリを作る src/main.rs クレートと、ライブラリを作る src/lib.rs クレートを、それぞれ1つずつまで含められます。自分のプロジェクトも、大きくなるにつれて複数のモジュールに整理していくことになります。 Rustならではの注意点 Rustでは、デフォルト...

#17 JavaScriptで学ぶモジュールとパッケージの基本

JavaScriptでファイルを分けて整理する仕組みは、比較的新しいバージョンで統一され、以前より扱いやすくなりました。この記事では、JavaScriptにおけるモジュールの基本と、2つの形式の違いを解説します。 exportとimportの基本 // utils.js export function greet(name) { console.log(`こんにちは、${name}さん`); } // main.js import { greet } from './utils.js'; greet("太郎"); export を付けた機能だけが、他のファイルから読み込めるようになります。複数の機能をまとめてエクスポートすることもできます。 export function greet(name) { ... } export function farewell(name) { ... } // main.js import { greet, farewell } from './utils.js'; デフォルトエクスポート 1つのファイルにつき1つだけ、 export default を使った特別な書き方もあります。 // utils.js export default function greet(name) { ... } // main.js import greet from './utils.js'; // {} を付けずに読み込める export default で書かれたものは、読み込む側で好きな名前を付けて受け取れます。「そのファイルが主に提供する1つの機能」を表す場合によく使われます。 CommonJSという古い形式 Node.jsでは長らく、 require と module.exports を使うCommonJSという形式が使われてきました。 // utils.js(CommonJS形式) module.exports.greet = function(name) { ... }; // main.js const { greet } = require('./utils.js'); JavaScriptならでは...

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

PHPの日付操作は、Webサイトの投稿日時表示など、実務でも頻繁に使われる機能です。この記事では、PHPにおける日付と時刻の基本的な扱い方を解説します。 date()関数を使う echo date("Y年m月d日"); PHPには、日付を扱う手軽な`date()`関数が標準で用意されています。`Y`は西暦4桁、`m`は月(2桁)、`d`は日(2桁)を表す書式指定子で、`H:i:s`のように組み合わせれば時刻の表示にも使えます。 DateTimeクラスを使う より柔軟に日付を扱いたい場合は、`DateTime`というクラスを使います。 $now = new DateTime(); echo $now->format("Y年m月d日"); `date()`関数は現在時刻や指定したタイムスタンプを文字列にするだけの機能ですが、`DateTime`はオブジェクトとして日時を保持するため、計算・比較・タイムゾーンの変更などをまとめて扱えます。 文字列から日付に変換する 逆に文字列から`DateTime`オブジェクトを作りたい場合は、コンストラクタに直接文字列を渡します。 $d = new DateTime("2026-08-20"); echo $d->format("Y年m月d日"); 形式が厳密に決まっている場合は`DateTime::createFromFormat`を使うと、想定外の形式を弾きやすくなり安全です。 日付を計算する $now->modify("+3 days"); $now->modify("-1 month"); `"+3 days"`のように、人間が読める形で計算内容を指定できるのがPHPらしい特徴です。`DateInterval`クラスを使ったより厳密な計算方法もあります。 $interval = new DateInterval("P3D"); // 3日間 $now->add($interval); 2つの日付の差を求める $start = new DateTime("2026-08-01");...

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

名前と値の組み合わせでデータを管理できる仕組みを「辞書」と呼びます。この記事では、Pythonにおける辞書の基本的な使い方と、実務でよく使う操作を解説します。 辞書を作ってみる Pythonでは波かっこ {} を使って辞書を作ります。 person = {"name": "太郎", "age": 20} 「キー」(名前)と「値」を : で結び、複数の組をカンマで区切って並べます。 値を取り出す・追加する print(person["name"]) # 太郎 person["job"] = "学生" 角かっこの中にキーを書くだけで値を取り出せます。存在しないキーに値を代入すると、新しい組が追加されます。 キーが存在するか確認する 存在しないキーにそのままアクセスするとエラーになります。 in を使って事前に確認するか、 get() を使うと安全です。 if "email" in person: print(person["email"]) print(person.get("email", "未設定")) get() は、キーが存在しない場合に指定した既定値を返してくれます。 全てのキーと値を順に処理する for key, value in person.items(): print(key, value) キーだけを取り出したい場合は person.keys() 、値だけを取り出したい場合は person.values() が使えます。 辞書内包表記で新しい辞書を作る リストと同じように、辞書にも「内包表記」という書き方があります。 scores = {"太郎": 90, "次郎": 60} passed = {name: score for name, score in scores.items() if score >= 70} print(passed) # {'太郎': 90} 条件に合う要素だけを絞り込んだ新しい辞書を、簡潔な1行で作れ...

#17 TypeScriptで学ぶモジュールとパッケージの基本

TypeScriptのモジュールは、JavaScriptと同じ export ・ import の仕組みをそのまま使います。この記事では、TypeScriptにおけるモジュールの基本を、つまずきやすいポイントも含めて解説します。 exportとimportの基本 // utils.ts export function greet(name: string): void { console.log(`こんにちは、${name}さん`); } // main.ts import { greet } from './utils'; greet("太郎"); このように名前を指定してエクスポートする書き方を「名前付きエクスポート(named export)」と呼びます。1つのファイルから複数の関数・変数をエクスポートしたい場合に向いています。 デフォルトエクスポート 1ファイルにつき1つだけ、主役となる値をエクスポートしたい場合は export default が使えます。 // greeter.ts export default function greet(name: string): void { console.log(`こんにちは、${name}さん`); } // main.ts import greet from './greeter'; // 波括弧不要、好きな名前を付けられる 名前付きエクスポートと違い、インポート時に波括弧 {} が不要で、好きな名前を付けられるのが特徴です。ただし、どちらの方式を使うかチーム・プロジェクトで統一しておかないと、ファイルによって書き方がバラバラになりがちなので注意しましょう。 型だけをエクスポートする TypeScriptには、型定義だけを他のファイルと共有する export type という書き方もあります。 export type Person = { name: string; age: number }; インポート側でも、型であることを明示する import type という書き方があります。 import type { Person } from './types'; import type...

#17 Kotlinで学ぶモジュールとパッケージの基本

Kotlinのパッケージは、Javaと同じ考え方を引き継ぎながら、少し柔軟なルールになっています。この記事では、Kotlinにおけるパッケージの基本と、外部ライブラリの導入方法をあわせて解説します。 パッケージの宣言 package com.example.utils fun greet(name: String) { println("こんにちは、${name}さん") } パッケージ名は慣習的に、自分の管理するドメイン名を逆順にしたもの(`com.example.〜`)を使うことが多いです。 他のパッケージから使う import com.example.utils.greet greet("太郎") クラスではなく関数やプロパティを直接`import`できるのも、トップレベル関数を持つKotlinらしい特徴です。同名の関数を複数使いたい場合は、`import com.example.utils.greet as utilsGreet`のように別名を付けることもできます。 Javaより柔軟なルール Kotlinでは、Javaのような「1つのファイルに1つの公開クラス」「ファイル名とクラス名の一致」といった厳格なルールがありません。1つのファイルに複数の関数やクラスを自由に書くことができ、ファイル名も内容に合わせて自由に付けられます。 外部ライブラリを使う Kotlinプロジェクト(Gradleを使う場合)では、`build.gradle.kts`に依存関係を追記することで外部ライブラリを導入します。 dependencies { implementation("com.squareup.okhttp3:okhttp:4.12.0") } 追記後にビルドを実行すると、指定したバージョンのライブラリが自動でダウンロードされ、`import`で使えるようになります。 Kotlinならではの注意点 Java経験者は、Kotlinの自由度の高さに最初は戸惑うかもしれません。とはいえ、読みやすさのために「関連するクラスや関数はまとめて1つのファイルに書く」という慣習に沿って整理するのがおすすめです。またKotlinはJavaのライブラリ資産をそのまま`impo...

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

PHPのデバッグは、`echo`や`var_dump`を使った手軽な方法から、`Xdebug`という本格的なツールまで、幅広い選択肢があります。この記事では、PHPにおけるデバッグの基本的な方法を解説します。 echoやvar_dumpでその場の状態を確認する echo "ageの中身: {$age}"; var_dump($person); `var_dump`は、変数の型や構造まで詳しく表示してくれる便利な機能です。配列や連想配列の中身を丸ごと確認したい場合は、`print_r($person)`という、より見やすい形で出力してくれる関数も使われます。 エラー表示を有効にする PHPの設定によっては、エラーが起きても画面に何も表示されないことがあります。開発中は、エラー表示を有効にする設定を確認しておくと、問題に気づきやすくなります。 ini_set('display_errors', 1); error_reporting(E_ALL); コードの先頭にこの2行を入れておくと、通常は表示されない警告(Warning)や注意(Notice)も含めて画面に表示されるようになり、見落としがちな小さなミスにも気づきやすくなります。 Xdebugという本格的なツール `Xdebug`という拡張機能をインストールすると、VSCodeなどのエディタと連携して、ブレークポイントを使った本格的なデバッグができるようになります。 Xdebugを導入すると、ブレークポイントで処理を一時停止し、その時点の変数の中身を1つずつ確認しながら、1行ずつ処理を進められるようになります。`echo`を書いては消す作業を繰り返すよりも、複雑なバグを追う際には圧倒的に効率的です。 ログファイルに出力する error_log("デバッグ: age=" . $age); 画面に表示する代わりに、ログファイルへ出力する`error_log`関数も便利です。本番環境では画面にエラー内容を表示しないよう設定するのが一般的なため、ログファイルへの出力は本番環境の調査でも役立ちます。 PHPならではの注意点 Webサーバーと連携して動くPHPは、エラーがブラウザの画面ではなく、サーバーのログファイルにだけ記録されてい...

#17 Swiftで学ぶモジュールとパッケージの基本

Swiftのファイル整理は、他の言語に比べて手軽なのが特徴です。この記事では、Swiftにおけるモジュールの考え方と、アクセス制御の仕組みを解説します。 同じモジュール内は自動的に使える Swiftでは、同じプロジェクト(モジュール)の中にあるファイルであれば、 import を書かなくても、他のファイルの関数やクラスをそのまま使えます。 // Utils.swift func greet(name: String) { print("こんにちは、\(name)さん") } // main.swift greet(name: "太郎") // importなしで使える 外部のモジュールを読み込む 以前の記事で触れた外部ライブラリなど、別のモジュールの機能を使う場合は import が必要です。 import Foundation import SwiftUI アクセス制御という仕組み Swiftには private ・ internal ・ public など、以前のクラスの記事で触れた以上に細かいアクセス制御の仕組みがあります。モジュールの外に公開したい機能には public を付けます。 public func greet(name: String) { print("こんにちは、\(name)さん") } private func internalHelper() { ... } 何も指定しない場合は internal という既定のレベルになり、「同じモジュール内であればどこからでも使えるが、モジュールの外には公開されない」という状態になります。 Swift Package Managerというパッケージ管理の仕組み 複数のプロジェクトで再利用するコードをライブラリとして配布・利用する際は、「Swift Package Manager(SPM)」という公式のツールがよく使われます。 Package.swift というファイルに依存関係を書き加えることで、外部のライブラリを取り込めます。 Swiftならではの注意点 「同じプロジェクト内ならimport不要」という仕様は、Java・Kotlinなどの経験がある人ほど意外に感じるポイントです。ファイ...

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

Kotlinのデバッグは、Javaと同じくIntelliJ IDEAのデバッガー機能を活用するのが基本です。この記事では、Kotlinにおけるデバッグの基本的な方法を解説します。 println()でその場の状態を確認する println("ageの中身: $age") Kotlinでは文字列テンプレート(`$変数名`)がそのまま使えるため、Javaのように文字列連結を書かなくても、変数の値を手軽に確認できます。 IntelliJ IDEAのデバッガー KotlinはIntelliJ IDEAとの相性がよく、ブレークポイントを設定して処理を一時停止し、変数の中身を確認する、というJavaと同じデバッグ手順がそのまま使えます。 「ステップオーバー」「ステップイン」「ステップアウト」といった操作もJavaと共通で、ラムダ式や高階関数の中に入って処理を追いたい場合は「ステップイン」を使うと、`map`や`filter`の中身がどう評価されているかを1行ずつ確認できます。 null許容型のエラーに注意する Kotlinでよく遭遇するエラーに「NullPointerException」があります。null許容型を扱っている箇所で、値の確認を怠っていないかを重点的に見直すと、原因が見つかりやすいです。 val name: String? = null println(name!!.length) 特に`!!`(非null表明演算子)を使っている箇所は要注意です。「絶対にnullではない」と自分で断言している部分なので、実際にnullが入っているとその場でクラッシュします。デバッグの際は、まず`!!`が使われている行を疑ってみるとよいでしょう。 ログ出力ライブラリを使う 本格的なアプリケーションでは、`println`の代わりにログの重要度(DEBUG・INFO・ERRORなど)を指定できるログ出力ライブラリ(kotlin-loggingなど)を使うのが一般的です。デバッグ用の出力を後から一括でオフにできる利点があります。 Kotlinならではの注意点 Kotlinはコンパイルの段階でnullの扱いを厳しくチェックしてくれるため、Javaに比べるとNullPointerExceptionが発生する場面は少なくなります。それ...

#17 Rubyで学ぶモジュールとパッケージの基本

Rubyのファイル整理は「モジュール」という仕組みが中心で、クラスとは少し違う役割を持っています。この記事では、Rubyにおけるモジュールの基本と、ミックスインという応用的な使い方までを解説します。 ファイルを分けて読み込む # utils.rb def greet(name) puts "こんにちは、#{name}さん" end # main.rb require_relative 'utils' greet("太郎") `require_relative`は、今いるファイルから見た相対パスで別のファイルを読み込む書き方です。gemなど外部ライブラリを読み込む場合は、相対パスを使わない`require`を使います。 moduleという仕組み Rubyの`module`は、関連する機能をひとまとめにする点でクラスに似ていますが、インスタンスを作ることはできません。名前の衝突を防ぐための「名前空間」として使われることが多い機能です。 module Utils def self.greet(name) puts "こんにちは、#{name}さん" end end Utils.greet("太郎") 大きなアプリでは、`module Shop; class Order; end; end`のようにモジュールをネストさせ、`Shop::Order`という形でクラス名を管理することもあります。同じ「Order」という名前のクラスが別の場所にあっても、名前空間が違えば衝突しません。 ミックスインという使い方 Rubyの`module`は、クラスに機能を「混ぜ込む」(ミックスイン)という、Rubyらしい応用的な使い方もできます。`include`を使うと、モジュールに定義したメソッドをそのクラスのインスタンスメソッドとして使えるようになります。 module Greetable def greet puts "こんにちは、#{name}さん" end end class User include Greetable attr_reader :name def initialize(na...

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

Dartのデバッグは、Flutterアプリの開発と密接に関わっており、専用の便利なツールが用意されています。この記事では、Dartにおけるデバッグの基本的な方法を解説します。 print()でその場の状態を確認する print("ageの中身: $age"); Dartの文字列補間は`$変数名`または`${式}`で書けます。ただし、リリースビルドでは`print`の出力が切り捨てられることがあるため、本番向けのログには`debugPrint`や専用のロギングライブラリを使うのが望ましいです。 DevToolsという専用のツール FlutterおよびDartには「DevTools」という専用のデバッグツールがあり、画面の見た目の構造(ウィジェットツリー)を確認したり、変数の値を調べたりできます。IDE(VS CodeやAndroid Studio)からブレークポイントを設定してDevToolsを起動すると、ブラウザ上のリッチなUIでアプリの状態を調査できます。 ウィジェットの検査(Widget Inspector) DevToolsには「Widget Inspector」という機能があり、画面上の要素をクリックすると、対応するウィジェットのコードやプロパティの値がその場で確認できます。レイアウトが崩れている原因を調査するときに特に役立ちます。 ホットリロードとの組み合わせ Flutterには、コードを保存するとすぐに画面に変更が反映される「ホットリロード」という機能があります。`print()`での確認とホットリロードを組み合わせることで、素早く試行錯誤しながら原因を調査できます。ただし、状態(State)を初期化するような変更をした場合はホットリロードだけでは反映されず、アプリを再起動する「ホットリスタート」が必要になることもあります。 Dartならではの注意点 Flutterのエラーは、画面が赤くなって詳細なエラー情報が表示される「レッドスクリーン」という形で現れることがあります。エラーメッセージの内容をよく読むと、どのウィジェットで問題が起きているかが分かることが多いので、慌てず内容を確認しましょう。エラーメッセージの先頭部分には、多くの場合「何をしようとして失敗したか」が要約されているため、まずそこだけ読んで...

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

PHPで名前と値の組み合わせを扱う仕組みは、以前の記事で触れた「連想配列」です。この記事では、PHPにおける辞書に相当する使い方を、改めて詳しく解説します。 連想配列を作ってみる $scores = ["太郎" => 90, "次郎" => 85]; キーには文字列だけでなく整数も使えますが、キーが数値の場合は通常のリスト(添字配列)との違いが分かりにくくなるため、辞書として使う場合は文字列のキーを使うのが基本です。 値を取り出す・追加する echo $scores["太郎"]; $scores["三郎"] = 78; 既に存在するキーに代入すると値が上書きされ、存在しないキーに代入すると新しい要素として追加されます。 キーが存在するか確認する if (array_key_exists("三郎", $scores)) { echo $scores["三郎"]; } 似た関数に`isset()`がありますが、値が`null`の場合の挙動が異なります。`isset()`は値が`null`だとキーがあっても`false`を返しますが、`array_key_exists()`はキーの有無だけを厳密に判定します。この違いを知らずに`isset()`を使うと、値がnullの要素を「存在しない」と誤判定してしまうことがあるため注意しましょう。 キーを削除する unset($scores["三郎"]); 全てのキーと値を順に処理する foreach ($scores as $name => $score) { echo "{$name}: {$score}"; } キーだけ、または値だけが欲しい場合は`array_keys()`・`array_values()`を使うと、それぞれの一覧を配列として取得できます。 PHPならではの注意点 PHPの配列は、以前の記事で触れた通り、単純なリストと連想配列を同じ`array`という型で扱います。今使っている配列がどちらの用途なのかを意識しながらコードを読み書きすることが、PHPのコードを理解する上で重要です...

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

Javaで名前と値の組み合わせを扱うには、 HashMap というクラスを使います。この記事では、Javaにおける辞書に相当する使い方と、実務でよく使う操作を解説します。 HashMapを作ってみる import java.util.HashMap; HashMap<String, Integer> scores = new HashMap<>(); scores.put("太郎", 90); scores.put("次郎", 85); 値を取り出す int score = scores.get("太郎"); 存在しないキーを get() で取得しようとすると null が返るため、あらかじめ containsKey() で確認するのが安全です。 if (scores.containsKey("次郎")) { // 処理 } 既定値をあらかじめ決めておきたい場合は getOrDefault が便利です。 int score = scores.getOrDefault("三郎", 0); 全てのキーと値を順に処理する for (String key : scores.keySet()) { System.out.println(key + ": " + scores.get(key)); } キーと値の両方を一度に取り出したい場合は entrySet() を使うと、 get() を毎回呼び出す必要がなく効率的です。 for (Map.Entry<String, Integer> entry : scores.entrySet()) { System.out.println(entry.getKey() + ": " + entry.getValue()); } Javaならではの注意点 HashMap<String, Integer> のように、キーと値の型を必ず指定する必要があります。プリミティブ型(int など)はそのまま使えず、 Integer のような「オブジェクト版」の型を使う点も、以前のArrayListの記事...

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

Rubyの日付操作は、標準ライブラリの`Time`や`Date`を使い、直感的な書き方ができます。この記事では、Rubyにおける日付と時刻の基本的な扱い方と、`Time`・`Date`・`DateTime`の使い分けを解説します。 Timeを使う now = Time.now puts now `Time.now`は実行環境のローカル時刻を返します。UTC(協定世界時)で扱いたい場合は`Time.now.utc`を使います。 日付を文字列にする puts now.strftime("%Y年%m月%d日") puts now.strftime("%H時%M分%S秒") この`strftime`という名前と書式は、Pythonの`datetime`とよく似ています。`%Y`は西暦4桁、`%m`は月、`%d`は日を表す書式指定子で、組み合わせて自由な形式の文字列を作れます。 文字列から日付に変換する 逆に文字列を日付として扱いたい場合は、`Date.parse`や`Time.parse`(要`require "time"`)が便利です。 require "date" d = Date.parse("2026-08-18") puts d.year ユーザー入力など形式が保証されていない文字列を扱う場合は、`strptime`で明示的にフォーマットを指定して変換すると、意図しない形式の文字列を誤って解釈してしまう事故を防げます。 日付を計算する Rubyでは、秒数を表す数値をそのまま足すことで、簡単に日付を計算できます。 three_days_later = now + 3 * 24 * 60 * 60 ただし`Date`型に対しては、加算する数値の単位が「日数」になる点に注意が必要です。 require "date" today = Date.today next_week = today + 7 Rubyならではの注意点 Rubyには`Time`のほかに`Date`・`DateTime`というクラスもあり、それぞれ得意な用途が少し異なります。時刻まで必要なら`Time`、日付だけを扱いたいなら`Date`、タ...

#17 Pythonで学ぶモジュールとパッケージの基本

プログラムが大きくなると、1つのファイルに全てを書くのではなく、複数のファイルに分けて整理したくなります。この記事では、Pythonにおけるモジュールとパッケージの基本と、実務での使い方を解説します。 モジュールとは Pythonでは、1つの .py ファイルがそのまま「モジュール」として扱われます。別のファイルの機能を使いたいときは import を使います。 # utils.py def greet(name): print(f"こんにちは、{name}さん") # main.py import utils utils.greet("太郎") 特定の機能だけを読み込む from utils import greet greet("太郎") 長い名前のモジュールに別名を付けたい場合は as が使えます。データ分析でよく見る import pandas as pd もこの書き方です。 import utils as u u.greet("太郎") パッケージという考え方 複数のモジュールをまとめたフォルダを「パッケージ」と呼びます。フォルダの中に __init__.py という特別なファイルを置くことで、そのフォルダがパッケージとして認識されます。 myapp/ __init__.py utils.py models.py from myapp import utils from myapp.models import User 比較的新しいPythonでは __init__.py が無くてもパッケージとして扱える場合がありますが、明示的に置いておくと意図が伝わりやすく、初期化処理を書く場所としても使えます。 if __name__ == "__main__": という決まり文句 Pythonのファイルでよく見かける if __name__ == "__main__": は、「このファイルが直接実行されたときだけ、このブロックを実行する」という意味です。 # utils.py def greet(name): print(f"こんにちは、{name}さん...

#17 Dartで学ぶモジュールとパッケージの基本

Dartのファイル整理は、シンプルな import の仕組みで行います。この記事では、Dartにおけるファイル分割の基本と、Flutterプロジェクトでの実践的な使い方を解説します。 ファイルを分けて読み込む // utils.dart void greet(String name) { print("こんにちは、$name さん"); } // main.dart import 'utils.dart'; void main() { greet("太郎"); } 特定の機能だけを読み込む・除外する ファイル全体ではなく、特定の関数だけを使いたい場合は show 、逆に特定の関数だけ除外したい場合は hide が使えます。 import 'utils.dart' show greet; import 'utils.dart' hide farewell; 外部パッケージを読み込む 以前の記事で触れた外部パッケージ(pub.devで公開されているもの)は、 package: という特別な形式で読み込みます。 import 'package:http/http.dart' as http; asを使った名前の衝突回避 複数のファイルで同じ名前の関数がある場合、 as を使って別名を付けることで、名前の衝突を避けられます。 import 'utils.dart' as myUtils; myUtils.greet("太郎"); フォルダをまたいだimport Flutterプロジェクトでは lib/ フォルダの下にサブフォルダを作って整理することが多く、その場合はフォルダの階層を含めたパスで import します。 import 'package:my_app/models/user.dart'; ライブラリファイルというまとめ方 複数のファイルをまとめて1つの機能として公開したい場合、それらをまとめて再エクスポートする専用のファイルを作る方法もよく使われます。 // my_library.dart export 'src/greet.dart...