情報・通信工学系でエンジニアリング (研究やソフトウェア開発) にまず必要そうなツールについて

この文書では、情報・通信・計算機工学系 1 のソフトウェアエンジニアリングを行うにあたって、まずは入れておく・使えるようになっておくと良さそうなソフトウェアを一覧しておく。細かい使い方、チューニングについては言及しない。また、なるべくエンジニア方言 2 を避け、ある程度回りくどい言い回しを使っている。用語を全て網羅することはできないため、よくわからない単語は検索して調べてみてほしい。

あくまで、弊研究室や筆者自身の環境を対象としている。どうしてもUnixコマンドを多用する関係上、macOSかDebian GNU/Linux系統のLinuxをOSとして想定している。Windowsの利用は想定していない。Windowsでの互換性等、仮想マシン・WSL2などでどうにかする方法は掲載しない。どうにかする方法はきっとあるので、興味があれば調べてほしい。

パッケージマネージャ

環境を整えるにあたって、何を置いてもまず必要となる。コマンドライン(ターミナル)からソフトウェアのインストール・アンインストール等が効率的にできる。

macOS

homebrewを利用すれば良い。まず速攻で以下でインストールしておく。

% /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

この記事では、以下のような基本的なコマンドしか利用しない。

homebrewの細かい使い方は、公式サイトを参照するか、以下のような記事を参照するといい。

Debian系Linux

OS標準のaptを利用すれば良い。snap等でもよいが、snapdのソフトウェアはOSから隔絶されるため、知識がある人向け。aptの基本的な使い方は以下の通り。

SSH

SSH (Secure SHell) は、遠隔地のコンピュータと暗号化された通信を行うためのプロトコルである。ターミナルから遠隔地のサーバにログインして操作、などというときは基本的にSSHを利用することになる。

また、後述するGitおよびGitHubを利用するには、SSHの導入が必須となる。そのため、まずはSSHを利用可能とする。ターミナルログインのやり方には今回は触れないので、以下のようなサイトを参照しておくと良い。

環境構築

macOSに元々入っているSSHコマンドは、凝ったことをやろうとすると機能が足りないことがある。このため、OpenSSHを導入する。

% brew install openssh

Debian系Linuxでは、元から入っていることが多い。そうでなければaptより導入する。

% sudo apt update && sudo apt install ssh

GitHub向けSSH鍵の設定

後述するGitHubへの登録のために、SSH公開鍵・秘密鍵ペアを作成する。せっかくなのでRSAやECDSAではなく、EdDSA (ED25519) の鍵ペアを生成する。

% ssh-keygen -t ed25519

Generating public/private ed25519 key pair.
Enter file in which to save the key (~/.ssh/id_ed25519): ~/.ssh/id_ed25519_github
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in ~/.ssh/id_ed25519_github
Your public key has been saved in ~/.ssh/id_ed25519_github.pub
......

これにより、GitHub向けに、

が生成される。これらをGitHubへの接続に利用するため、~/.ssh/configに以下を追記する。

Host github.com
  HostName      github.com
  IdentityFile  ~/.ssh/id_ed25519_github
  User          git

これにより、github.comというドメイン名へのSSH接続は、「上記で作成した鍵を用い、ユーザ名gitによる接続」と設定される。

バージョン管理システムとクラウドサービス

Wikipedia曰く、「バージョン管理システム」とは以下のようなものを指す。

ソフトウェアソースコード・ドキュメント・画像・音楽など、様々な電子ファイルは段階を経て編集される。編集の過程で履歴を保存しておけば、何度も変更を加えたファイルであっても過去の状態や変更内容を確認したり変更前の状態を復元したりできる。バージョン管理システムの基本的な機能は、このファイルの変更内容・作成変更日時の履歴保管である。

また編集は複数人により同時並行でおこなわれる場合もある(例: 商業的なソフトウェア開発、オープンソースプロジェクト)。複数の人間が複数のファイルを各々編集すると、それぞれのファイルの最新の状態がどれであるか分からなくなったり、同一ファイルに対する変更が競合(コンフリクト)したりするなどの問題が生じやすい。バージョン管理システムはこのような問題を解決する仕組みを提供する。

弊研究室、弊社では、および筆者個人も、ソフトウェアやLaTeX文書などのあらゆるソースコードについて、Gitを使ってバージョン管理を行い、その作業履歴を記録する。その目的は、上記の通りである。

Git

デファクトスタンダードのバージョン管理ソフトウェア。

macOSには標準で入っているが、バージョンが古いためhomebrewよりインストールする。

% brew install git

Gitの使い方は、たとえば以下を参照する。

*サル先生のGit入門

「リモートリポジトリ」「ローカルリポジトリ」というGitを構成する基本的な概念を理解した後、まずは以下のコマンドが使えるようになることを目指せば良い。

「ブランチ」などの概念は、上記コマンドが使えるようになった後、チュートリアルサイトなどを読みながら学ぶ。

GitHub

GitHubは、Gitのバージョン管理情報を保存、Web上で一覧表示可能とするクラウドサービスである。Gitにおけるリモートリポジトリをクラウドサービス化したもの、と言い換えることができる。弊研究室、弊社では、論文やソフトウェアのソースコードのほとんどをGitHubにて管理し、そこをハブとして共同開発する

そのため、アカウントを作成した後は、ターミナルからSSH経由でGitHubからgit clone、GitHubへgit pushできるようにする。そのために、前述のように作成したSSH公開鍵~/.ssh/id_ed25519_github.pubをGitHubへ登録する。

~/.ssh/id_ed25519_github.pubを以下と仮定する。

ssh-ed25519 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX user@localhost

GitHubのSSH公開鍵登録画面より、上記をコピペしてGitHubへ登録する。登録後は、以下のSSH経由でのテストコマンドが通るかどうかを確かめる。

% ssh -T git@github.com

Hi XXXX! You’ve successfully authenticated, but GitHub does not provide shell access.

エディタ

emacs/vim

筆者はテキストエディタとして、emacs/vimをよく利用するが、基本的には好きなものを利用すれば良い。ただし、vim (vi) の操作はサーバ管理では必須となるため、普段使いはせずとも操作を学んでおくと良い

macOSであれば、vimは標準で入っており、homebrewからGUI込みのemacsが導入できる。

% brew install --cask emacs

Debian系Linuxの場合、vim/emacs共々に標準で入っていることが多い。入っていない場合には、両者ともaptより取得可能。

% sudo apt update && sudo apt install vim emacs

emacs/vim共々、以下のようなサイトを参考にし、操作を学びつつ自身が使いやすいようにカスタマイズすると良い。

統合開発環境 (Integrated Development Environment; IDE)

以下のどちらかを導入しておけば良いだろう。筆者は、元々はIntelliJ派だったが、VSCodeを使う方が多くなった。

Visual Studio Code (VSCode)

macOSであれば、以下でインストールできる。

% brew install visual-studio-code

Debian系Linuxであれば公式サイトからdebファイルをダウンロード、以下のように指示通りにインストールを行えばよい。

% sudo apt install ./<file>.deb

VSCodeは、プラグインを使って対応言語や便利機能を拡張していく。たとえばRust (rust-analyzer)やLaTeX対応プラグイン(LaTeX Workshop)は非常に出来が良いため、うまく使って効率的な記述を行うと良い。また、環境をGitHubアカウントを経由して複数環境で同期することができる。

JetBrains IntelliJ IDEA (PyCharm, WebStorm, GoLand等)

VSCodeと同様のIDE。プラグインで言語対応を拡張していくVSCodeとは違い、言語ごとに別のソフトウェアを利用するのが基本。基本的に有償だが、学生・教職員であれば教育ライセンスが無償で利用できる。

JetBrains Toolboxをインストールし、そこからWebStorm等を導入する。

macOSはhomebrew経由で入れれば良い。

% brew install jetbrains-toolbox

Linuxは公式サイトよりtar.gzをダウンロード、/optあたりへ直接解凍してインストール。(参考: Install IntelliJ IDEA (公式))

% sudo tar -xzf jetbrains-toolbox-<version_number>.tar.gz -C /opt

コンパイラ・インタプリタ

デバッガやLinterはIDEのプラグインとして入れていくこと。なるべくモダンよりの言語を利用し、CやC++などはよほど必要でない限りは避ける。筆者は、最近はRustをメインで書いており、次点でNode.js(TypeScript/JavaScript)、たまにGo、稀にPython、という感じ。

ここでは、需要が多いであろうRustとNode.js、Pythonの環境構築について触れる。3

Rust

C++代替を目指し、Mozillaが開発を進めるコンパイル言語。高速に動作、かつメモリセーフ4なコードが書きやすい。筆者は最近はネットワークのパイプライン処理を行うコードをよく書くため、Rustをメイン言語として採用している。

Rustの環境構築

macOS、Linux共々、公式サイトにある通りに以下を実行する。

% curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

Linuxにおいてcurlが入っていない場合はsudo apt update && sudo apt install curlを実行すること。

Rustのバージョンが上がった場合、以下を実行することで最新バージョンに更新される。

% rustup update

Rustの依存パッケージ管理

Rustの開発プロジェクトでは、cargoというソフトウェアを使って、依存パッケージの管理を行う。cargoはRustの環境を構築すれば同時に導入される。cargoで導入されるパッケージは、デフォルトではcrates.ioというリポジトリから取得されるが、GitHubのリポジトリや、ローカルのディレクトリなども指定できる。

以下のようにすると、新規プロジェクトが作成される。

% pwd
~/some_project

# 新規プロジェクト作成
% cargo init
cargo init
     Created binary (application) package

% ls
Cargo.toml  src

ここで、Cargo.tomlは、依存パッケージを含めた詳細なプロジェクトの情報が記載されたtomlファイル、srcはソースコードのディレクトリである。依存パッケージを追加するにはCargo.tomlを手で編集する必要がある。Rust製の外部ツールcargo-editを使うことでコマンドラインから依存パッケージを追加できる。

# `cargo-edit`をインストール、cargo機能の拡張。
% cargo install cargo-edit

# `clap`という依存パッケージを当該プロジェクトに導入
% cargo add clap
    Updating 'https://github.com/rust-lang/crates.io-index' index
      Adding clap v3.0.14 to dependencies

結果、Cargo.tomlは以下のようになる。

[package]
name = "some_project"
version = "0.1.0"
edition = "2021"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
clap = "3.0.14"

cargo installでインストールされたパッケージは、プロジェクト単位ではなく、apthomebrewで入れたソフトウェア同様に環境全体で利用可能となる。

またRustでは、Cargo.tomlに記載された依存パッケージについて、プロジェクトのコンパイル時に基本的にはそのソースコードを取得、全てをコンパイルする。取得したソースコード、コンパイルの中間ファイル、実行ファイルなどは./targetにキャッシュされる。./targetはGitに追加しないように.gitignoreなどに記載しておくこと。

Node.js

Node.jsは、本来はフロントエンド (Webブラウザ) 上のスクリプト言語であるJavaScriptを、バックエンド・サーバサイドでも実行可能とするために作られた「JavaScript実行エンジン」である。しかしながら現在のWeb開発では、むしろフロントエンドの開発のために必須となっている。というよりも、Node.js標準のパッケージマネージャnpmとその標準パッケージリポジトリnpmjs.comが、膨大な資産として必要不可欠である。もちろんそれらを用いてバックエンド構築もできる。

Node.jsの環境構築

Node.jsでは、LTS (Long Term Support;長期サポート版) と、latest (最新版) の2種類のリリースをおこなっている。LTSは30ヶ月のバグフィックスが保証されている。どちらを選んでも構わないが、最新版はたまに破壊的変更が入ることもあるので、ひとまずLTSを使っておく方が無難。

以下、macOS/Debian系Linux共々にnというソフトウェアを利用して、Node.js LTSを導入する手順である。

パッケージマネージャはnpm代替のyarnを導入

Node.js標準のnpmでもいいのだが、互換となるyarnの方がパッケージマネージャとして高速なため、yarnを追加導入する。

% sudo npm -i g yarn

npm/yarn共々に、開発プロジェクトのディレクトリ直下にパッケージをインストールし、OSの環境全体には影響しない。以下のようにすると、「新規プロジェクトの作成」「プロジェクトへの依存パッケージの導入」が可能になる。このとき、依存パッケージはnpmjs.comから取得される。

% pwd
~/some_project

# 新規プロジェクト作成
% yarn init
question name (test): xxx
question version (1.0.0): xxx
......

# `webpack`というパッケージの追加
% yarn add webpack

% ls
node_modules  package.json  yarn.lock

ここで、node_modulesは依存パッケージがインストールされたディレクトリ、package.jsonは依存パッケージを含めた詳細なプロジェクトの情報が記載されたjsonファイル、yarn.lockは依存パッケージのバージョン情報を記載する。node_modulesはGitに追加しないように.gitignoreなどに記載しておくこと。

yarnで環境全体に影響させたパッケージインストールは以下。

% yarn global add <package_name>

のようにすると~/.yarn/bin以下などにパッケージがインストールされ、プロジェクトに関係なく利用可能となる。利用時は環境変数$PATHにインストール場所を追加すること。Lintingのパッケージ(eslint)など、プロジェクト非依存に利用しそうなものなどは、グローバルに入れても良いかもしれない。筆者はあまり利用しない。

yarnの細かいコマンドは公式サイトを参照すること。

Python

ネットワークスタックを弄ったり、速度を出す演算処理を求めたりしなければ、豊富なライブラリが揃っているのでおそらく一番使いやすい言語。macOS、Ubuntu共々に元々入っていると思うが、OS標準のPythonインタプリタは古いことが多い。パッケージマネージャを利用して新しいものを導入すると良い。

また、jupyter notebookやGoogle Colaboratoryはデータの中身を解析を目的としてPythonを用いるものであり、Pythonをエンジンとして動作するソフトウェアを開発するためのものでは無い。ノートブックファイルの先頭から実行した場合と途中から実行した場合にデータが変化すること5、巨大なパッケージのインストールが必要なこと、などが理由である。データ解析や、コードの動作をとりあえず確認するために用いるのには、とてもお手軽で良い。しかし、ソフトウェアを開発する場合は、開発環境としてjupyter notebookを使ってはいけない。外部の依存パッケージなどの管理を行うことを含めて、環境から整える。

Pythonの環境構築

venvを用いたPythonコードの開発

Pythonによるソフトウェア開発では、パッケージマネージャpipを用いて、依存パッケージを管理する。pipは、基本pypi.orgから取得される。

ただし、何も考えずpipを利用すると、ユーザの環境全体に影響する箇所に依存パッケージがインストールされてしまうため、開発ソフトウェア単位で依存パッケージを管理するvenvを利用する。

以下で、開発プロジェクトのディレクトリ以下にvenvを導入する。./venvディレクトリが作成される。

% pwd
/path/to/development_project_dir

% python -m venv venv

% ls
venv

venvを有効化する。この状態でpipを用いてパッケージをインストールすると、./venv以下にインストールされ、当該の開発プロジェクトのみで利用可能となる。

% source ./venv/bin/activate

(venv) % pip install --upgrade pip numpy

インストール済みの依存パッケージは、以下でそのバージョンも含めて記録しておく。

(venv) % pip freeze > requirements.txt
numpy==1.22.2

requirements.txtを利用することで、別のPCに移動して作業する場合や、共同開発プロジェクトで他メンバに追加導入されたパッケージの反映が楽になる。

(venv) $ pip install -r requirements.txt

一方、このままだと、他プロジェクトのディレクトリに移動してpipで依存パッケージを導入すると、元のプロジェクトのvenvディレクトリに記録されてしまう。以下のようにvenvを無効化し、開発プロジェクトを移ってから再度そのディレクトリでvenvを有効化する。あるいは別のIDEやシェルを立ち上げて、移動先プロジェクトのvenvを有効化する。

(venv) % deactivate

また、./venvディレクトリはGitに登録しないこと。 .gitignorevenv/と記載しておくと良い。

文書作成

基本LaTeXかMarkdown

LaTeX

何も考えずTeXLiveを利用する。

環境構築

TeXのエディタ

エディタに以下のようなプラグインを導入して、効率的なTeXコンパイル (タイプセット) などを可能にする。

以下など参考にすれば良さそう。

スライド作成

beamerを利用する。TeXLiveに導入されているので、以下のテンプレをクローン、自分でデザインなどをカスタマイズして利用すると良い。

数式がまともに書けるならKeynoteなどを使っても良い。

Markdown

Markdownについては、VSCodeのMarkdownプラグインをうまく利用する。あるいはMarkdownエディタを探して利用する。参考までに筆者が入れているVSCodeのMarkdown関連プラグインは以下の通り。

情報管理・検索

文書管理

紙で印刷してクリアファイルで管理しても良いが、MendeleyZoteroなどを使う。先人の知恵を探し、Dropboxなどを組み合わせた文献管理手法など、自分に合った効率的な手法を考えるとよい。

情報検索

以下のようなサービスを利用するとよい。

論文

文献が探せても、PDFがDLできるとは限らないことに注意。

技術情報

ネット上の情報は玉石混交なので、なるべくまずは公式ドキュメントを読むこと。特に、Google検索すると出てくる「〇〇エンジ〇ア塾」とか煽り文句が「現役エンジニアが教える〇〇」のところ、とかも信用してはいけない。たとえば以下のようなものもあくまでまずは参考情報とし、裏取りなどをするとより良い。

その他、検索エンジンを使いこなすのが重要。

  1. 物理現象を計算機を使って解析する「計算科学」ではないことを強調しておく。計算科学は、きっともっと特殊なソフトウェアがたくさん必要になる。 

  2. たとえば「PATHを通す」とかを「環境変数PATHに値を追加しておく」と記載するなど。 

  3. Goもそのうち追加したい 

  4. メモリリークが起きづらい 

  5. 冪等性が保証されない。