Slide 1

Slide 1 text

#javado (ビギナー向け)開発環境構築の共通要素 必要なものを 手 元に持ってきて使えるようにする 山川広人 @gishi_yama Javaユーザグループ北海道 (公立千歳科学技術大学) 1

Slide 2

Slide 2 text

#javado 2 Hiroto YAMAKAWA 公立千歳科学技術大学 情報システム工学科 准教授 R&D: Software Engineering, Programmer & Engineer Education, Learning Technology (Collaboration and Learning Environment) 千歳市バスロケーションシステムの開発(-2022) 適応型学習支援システムの開発、活用 レポート内の話しことば検出エンジンの開発 ソフトウェアの設計・開発手法の追求: ソフトウェア開発への導入効果の検討、プログラミング・エンジニアリング教育への導入とその発展

Slide 3

Slide 3 text

#javado ビギナー向けとして 細やかな正しさよりも理解しやすさや デモを優先していきます 3

Slide 4

Slide 4 text

#javado Java仮想マシン (OSの差異とJavaの世界を繋ぐミドルウェア) 例えばJavaなら...? OS上でプログラムを動かすためには何が必要...? 4 OS (Windows ・ Linux ・ macOS ・ etc...) Hello.java Hello.class 生成 (コンパイル) Spring Bootで "HelloWorld" 出力するぞ! 利用 (依存) 利用 (依存) String.class System.class java.base 🧑💻 spring-boot-x.x.x.jar Spring Application.class 🤔 ...どこから誰が もってきた・くるの? 🥳 動いた! マシン 🤔 誰がやるの?

Slide 5

Slide 5 text

#javado 依存関係 (自分が作った) プログラムが動くために「何が」必要で、「どこ」にあるか? 他のアプリケーション・他のプログラム・他のライブラリ・他のモジュール・他の設定ファイル etc... ※だいたいWebのどこかにあるので、探してきてバージョン合わせて事前準備する必要がある 構築 依存関係にあるものと合わせて、プログラムを動く・配布できる形(パッケージ)にする (コンパイル、テスト、配置、設定、配布可能化 etc...) 例えばパソコンに何かアプリを導入しようとするときには、 そのアプリが動くための「依存関係」が解決され、「構築」が行われている! → アプリが動くのに "必要なものを手元に持ってきて、それを使って動かせるよう" にしてる → 開発環境も "開発に必要なものを手元に持ってきて、 それを使って開発対象を動かせる" にする プログラムが動くためには「依存関係の解決」と「構築」が必要 5 🤝 🛠

Slide 6

Slide 6 text

#javado じゃあ依存性解決して構築して 6 ...と言われても、手動でやるのはダルい (インターネット老人会世代は手動でやっていた) 構成指示に従って、依存関係の解決や構築を自動的にやってもらおう! →〇〇管理ツール(〇〇 manager) 🫠

Slide 7

Slide 7 text

#javado 基本は 構築だけを行うものがビルドツール、依存関係の解決をするものがパッケージ管理ツール (だが、最近は連動・相補が当たり前になっているので、一緒くたに呼ばれる場合も多い) 開発環境のスコープと〇〇管理ツール 7 *1 プロジェクトを超えて管理できる場合、特定の言語のライブラリのものも   パッケージ管理と呼んだりする。Nodeのnpmとか。 *2 k8sはマシンを超えてコンテナを管理する プロジェクトレベルであれば ... プロジェクト管理ツール Javaだと maven, Gradle など アプリケーション・ミドルウェアレベル*1からであれば... パッケージ管理ツール ・macだとHomebrew, MacPorts, Nix ・winだとScoop, WinGet, Chocolatey ・Linuxだと rpm, yum, apt, dnf... ・Nodeのnpm, Pythonのpipなども OS/マシンレベルからであれば ... コンテナ管理ツール Docker, Kubernetes*2 など OS マシン プロジェクト 開発環境の スコープ  限定的 アプリ・ミドルウェア 汎用的

Slide 8

Slide 8 text

#javado 例) Javaであれば... Maven の pom.xml Gradle の build.gradle   Macであれば... Homebrew の Formulae   仮想環境であれば ... Docker の Docker fi le 構成指 示 ファイル(設定の場合もあれば、コマンドリストの場合もある) 8 cask ' fl ic' do version '1.0.7' sha256 '5aa44b4cb6c3af182e5498d593f12b928e8088f43e318d705c33a8dda0aa0732' # s3.amazonaws.com/misc-scl-cdn was veri fi ed as of fi cial when fi rst introduced to the cask url "https://s3.amazonaws.com/misc-scl-cdn/Flic.#{version}.zip" name 'Flic' homepage 'https:// fl ic.io/mac-app/' app 'FlicMac Developer Distribution 2017-05-22 13-09-54/Flic.app' zap delete: [ '~/Library/Application Scripts/com.shortcutlabs.FlicMac', '~/Library/Containers/com.shortcutlabs.FlicMac', ] end

Slide 9

Slide 9 text

#javado demo pom.xmlとかFormulae 見 てみよう 9

Slide 10

Slide 10 text

#javado Maven → mvn コマンド + オプション → 例) mvn package : ソースコードをビルドし、配布可能な形(.jarなど)にまとめる Homebrew → hombrew コマンド+オプション → brew install XXX XXX を動作(もしくは構築)するのに不可欠なパッケージの依存を解決し、 実行できるように配置する Docker → docker run XXX XXX を動作するためのイメージをダウンロードし、指示されたコマンドに従って   環境構築を行う 管理ツールは「コマンド」+「オプション」で実 行 する 10

Slide 11

Slide 11 text

#javado demo 例えばPostgerSQLはどうインストールする? 11

Slide 12

Slide 12 text

#javado パッケージ管理ツールは、OSS文化の強いUnixやLinuxの方が歴史が古い (Unix Ports など) CUIを使って・オープンなプログラムやライブラリと連携するアプリを多く使うのが前提 → 依存関係の解決の効率化が必要に (コマンド一つで全部入れたい) → OSレベルでのパッケージ管理が標準・正式に搭載 Windowsは「インストーラー」でまとめて・個別でインストールする仕組みが長く続いた GUIを使って・依存関係を閉じ込めて、一つ一つ配布可能な状況で使うのが前提 →パッケージ管理よりもインストーラー文化 (むしろ開発環境構築で一つ一つ入れるのが手間) →OSレベルのパッケージ管理の正式な搭載はごく近年(WinGet) 20年ほど前、私がmacユーザーになったのも 「綺麗なGUIで操作できる」×「パッケージマネージャーがある」 夢のOSだったから (UnixベースのOSX、パッケージ管理で開発環境が作れるようになった) Windows使うならScoopかWinGetかChocolatey使えるようになると良いと思う 閑話休題 12 ※主観も大きく入るので、   正しくない部分も多々あると思います ⚠ ⚠

Slide 13

Slide 13 text

#javado OS(やプログラム)が動かせるものはどこにあるの?どこを辿ればいいの?を設定する 例えばHTMLであれば...画像の絶対パス・相対パス 同じ様に(?) 例えばOSであれば...環境変数PATH →PATHをOSに指定すると、OSは「そこにあるファイル/プログラムは特別な指定なしで使える」  と認識する ------ 例えば、仕事の環境と、試したい環境が違う時... 言語とかが全く違う環境であれば、あまり困らないかもしれない でも、同じものをバージョン違いで使いたい時などは...? → プロジェクトごとに設定できる場合は素直にその機能を使う → ミドルウェアレベルの影響があるときは、   (その時だけ) PATHに登録されているものを切り替える とう手段が使える   ※ xxEnvなどの SDK 管理ツールなども有効   ※ Javaであれば、SDKMAN!、JEnvなど パス(PATH)を通す 13

Slide 14

Slide 14 text

#javado demo PATHを 見 てみよう 14

Slide 15

Slide 15 text

#javado 開発環境の用意には? → 開発に必要なものを手元に持ってくる...「依存環境の解決」を行い、   開発したいものを動かせる...「構築」できるようする → 人間がやるのは大変なので、レシピの様なものを作ってツールで自動化する ツールにはどんなものがあるの? → 着目する/必要なスコープによって違う   プロジェクトレベル :プロジェクト管理ツール (Javaなら Maven, Gradle ...)   ミドルウェアレベル :パッケージ管理ツール (Windowsならwinget, macならHomebrew...)   OS/マシンレベル :コンテナ(仮想環境)管理ツール (Docker ...)   どれも「レシピ」の作り方を覚えて「コマンド」を覚えれば、動かすのは簡単!   (動作原理は頑張って勉強しましょう...) PATHって何? 持ってきたもの/構築したものを OSに「ここにあるよ!」と教えておく 「ここにあるよ!」を変えてあげると、開発環境の切り替えなどに便利なこともある (開発に使うミドルウェアやパッケージのバージョン管理など) まとめ 15

Slide 16

Slide 16 text

#javado 環境構築のポイントは 「再現性」 を自分で確保できること だと思っています。 環境構築をした時の全ての手順は 「何をやっているのかよくわからなくても」 時系列順にメモっておく (→ これは注意しないと秘伝のタレになりうるが、タレすらないのはもっと辛い) メモを順番にやって「別のPC」に再現できるかを試しておく、失敗なら検証してメモを直しておく  (...これ、以外と難しいんだなって最近思いました...    自宅にどうなってもいいPC/クラウドとかある人は意外と少ないんですね...) →VMWareがフリーになったし、Dockerでもできそうな気はします メモした後に「これ何?」をうっすらでいいので調べたり理解しておく 何のためのものかよりも、 何をしてるのか? 再現するためにはどれを揃えておくか?の方が、 最初は感覚的には大事な気がする コンピューターの話なので、 難しそうに見えてもしょせんは 命令 and/or 設定 です。   ツールを使っているのなら、「レシピ」を読んだり、何が書かれているか調べてみる レシピの変更に手を出してみる (サンプルプログラム程度でも良いはず) 悩みが多い 人 を受けて   (特に環境設定を操る 自 信のない 人 へ) 16