【ITニュース解説】OSD600 - Lab2
2025年09月20日に「Dev.to」が公開したITニュース「OSD600 - Lab2」について初心者にもわかりやすく解説しています。
ITニュース概要
C++プロジェクトで、最近変更されたファイルのみを抽出するフィルター機能を実装し、クラスメイトのリポジトリに貢献した。環境構築やC++のタイムスタンプ処理に苦戦したが、プルリクエスト作成を含む共同開発のワークフローを実践し多くの学びを得た。
ITニュース解説
今回の学習課題であるラボでは、クラスメートが作成したプログラム(リポジトリ)に新機能を追加し、その成果を貢献するという目標が設定されていた。これは、プログラミングにおける共同開発のプロセスを実践的に学ぶための重要な機会である。筆者は、クラスメートの中で唯一C++を使用している学生のリポジトリを選び、そのプロジェクトに貢献することにした。
このプロジェクトに筆者が追加したのは、「最近の変更フィルター」という機能である。これは、プログラムが通常、リポジトリ内のすべてのファイルを処理する代わりに、過去7日以内に更新されたファイルのみを対象とするように絞り込むための仕組みだ。全ファイルの中から特定の情報を見つけ出す際、関係のない古いファイルを除外することで、情報の検索効率を高め、より関連性の高い結果を素早く得られるという利点がある。
このフィルター機能を実装するために、いくつかの具体的な変更を加えた。まず、プログラムを実行する際に、ユーザーがコマンドラインから --recent または -r というオプション(フラグ)を指定することで、このフィルターを有効にできるようにした。これにより、必要に応じて機能のオンオフを切り替えられるようになる。次に、ファイルが「最近変更されたもの」であるかどうかを判断するための特別なヘルパー関数 isRecentlyModified() を utils.cpp および utils.hpp というファイル内に実装した。この関数は、C++の標準機能である std::filesystem::last_write_time を利用して、ファイルの最終更新時刻を取得し、それが現在時刻から7日以内であるかを判定する役割を担う。さらに、プログラムがリポジトリ内のファイルを一つずつ辿って処理するロジックが記述されている fs_travel.cpp ファイルを修正し、--recent フラグが有効な場合にのみ、新しく作成した isRecentlyModified() 関数を呼び出してファイルのチェックを行うように変更した。最終的に、フィルターが適用された際に出力されるテキストに、「Recent Changes」という専用のセクションを追加し、どのファイルが最近変更されたものとして選ばれたのかが一目でわかるように改善した。これらの変更は、プルリクエストという形で元のリポジトリの管理者に提案された。
機能開発を進める中で、いくつかの課題に直面した。最も大きな課題の一つは、開発環境のセットアップだった。協力したクラスメートのプロジェクトは libgit2 という高度なライブラリを使用しており、これを利用するためには、通常のビルドプロセスに加えて、いくつかの追加の依存関係をインストールし、プログラム全体を正しくコンパイル(ビルド)する必要があった。筆者にとって libgit2 を扱うのは初めての経験であり、この環境構築の部分でかなりの時間を費やし、一時的に作業が滞ることもあった。幸い、リポジトリのオーナーであるクラスメートが、彼の環境設定やビルド方法について丁寧に指導してくれたため、この困難を乗り越えることができた。技術的な側面では、C++でファイルのタイムスタンプ(最終更新日時)を正確に扱う点も挑戦的だった。std::filesystem::last_write_time() 関数は、ファイルの最終更新時刻を正確に取得するが、この戻り値を現在時刻と比較して「何日前」という具体的な日数を計算するには、時刻のデータ型変換や、異なる時間基準間での比較処理を慎重に行う必要があった。これは、高レベルなプログラミング言語のように、ファイルの情報を取得してすぐに最終更新日を日数で比較できるような単純なものではなく、C++特有の低レベルな処理が必要とされた。
今回のラボを通して、筆者はこれまで経験のなかったプルリクエストのワークフロー全体を実践的に学ぶことができた。具体的には、共同開発の出発点として、他者のリポジトリを自身のGitHubアカウントに複製する「フォーク」の操作、新機能開発のために元のコードベースから独立した作業空間を作る「ブランチの作成」、そして作業の進捗を細かく記録していく「コミット」の実行方法などである。また、自身の変更を元のリポジトリに統合してもらうための「プルリクエスト」の作成と提出、さらにはプルリクエストと関連する課題(Issue)をGitHub上で自動的にリンクさせる方法も習得した。これにより、プロジェクトの進捗状況をより効率的に追跡し、管理できることを実感した。
今回の経験は、今後のプログラミング学習や開発における言語選択について深く考えるきっかけとなった。C++は非常に強力で高性能な言語であるが、一方で、ファイルのタイムスタンプ取得や日付計算といった、他のプログラミング言語では標準ライブラリや簡単な関数呼び出しで済むような基本的な機能でも、C++ではより多くのコードを自分で書いたり、細かな実装の詳細にまで踏み込む必要があった。例えば、JavaScriptを使っていたクラスメートは、同様の機能をごく少量のコードと既存のライブラリの利用で実現していた。このことから、今後のラボやプロジェクトにおいては、開発の効率性や利用可能なライブラリの豊富さを考慮し、より迅速に機能を実装できるような言語を選択することも重要であると感じている。