このリポジトリの内容はBYOD下を想定したポータブルなJava開発環境である
学生が解く課題を保存するフォルダ(vscode設定ファイル付き),PortableGit内の独自コマンド,PortableGitのバイナリを実行するためのオプション付きexeを作成するフォルダの3つをこのリポジトリで管理する
想定するプログラミング演習の言語はJava
実行環境はAmazon Correto11+PortableGit+Visual Studio Code.
vscode, jdk, portablegitのインストール
別途oit-javaYYYYMMDD.exeの最新版をC:\oitにダウンロードし,実行(展開)する
- 自己解凍ファイル展開後のフォルダ構成が以下のとおりになっていれば良い(X,Y,Zにはバージョン番号が入る)
C:\oit\javaYY\vscode-portable-win64-1.XX.Y-Z\app
C:\oit\javaYY\vscode-portable-win64-1.XX.Y-Z\data
C:\oit\javaYY\vscode-portable-win64-1.XX.Y-Z\vscode-portable.exe
:
C:\oit\javaYY\amazonjdk11.XXX\bin
C:\oit\javaYY\amazonjdk11.XXX\include
C:\oit\javaYY\amazonjdk11.XXX\jre
C:\oit\javaYY\amazonjdk11.XXX\lib
:
C:\oit\javaYY\PortableGit-2.XX.Y-64\bin
C:\oit\javaYY\PortableGit-2.XX.Y-64\cmd
C:\oit\javaYY\PortableGit-2.XX.Y-64\git-bash.exe
:
C:\oit\javaYY\java-bash-2.XX.Y-64.exe
C:\oit\javaYY\java-bash-2.XX.Y-64.exeを実行する.
C:\Users\{ユーザ名}\oithomes\java\kadai\javaYY\フォルダが生成される(なお,javaYYのYYにはその年の末尾2桁が入る).
下記に示すとおり,getlocal, getenv コマンドを順に実行する.
更新は完了しました と表示されればOK.失敗した等の表示の場合はネットワーク接続を確認の上,コマンドを再実行すること.
$ getlocal
開発環境データを取得します
ダウンロード中.........完了しました
各種コマンドを更新します.
各種設定を更新します.
更新は完了しました.
$ getenv
~ /kadai/java20/を更新します.
更新は完了しました.
エクスプローラーで C:\Users\{ユーザ名}\oithomes\java\kadai\javaYY\ を確認し,下記のようなフォルダやファイルが存在すればOK.
.settings
.vscode
.classpath
.project
C:\oit\javaYY\vscode-portable-win64-1.XX.Y-Z\vscode-portable.exe をダブルクリックして起動する
ターミナルC:\oit\javaYY\java-bash-2.XX.Y-64.exeを起動して,codeコマンドを入力しても同じものが起動する.
javaYYのYYにはその年の末尾2桁が入る
vscodeからファイル->フォルダを開く->$HOME\kadai\javaYYフォルダを指定する.
ここで$HOMEは C:\Users\{ユーザ名}\oithomes\java\ を表している.
ターミナルC:\oit\javaYY\java-bash-2.XX.Y-64.exeを起動する.
ターミナルはvscode内でも開ける.「表示->ターミナル」を選択する.
$HOMEにいる状態でターミナルが開く(はず)ので,cd kadai/javaYYを実行し,Hello.javaなどのJavaファイルが存在するディレクトリに移動し,javac Hello.javaと実行する.
javaYYのYYには年度の末尾2桁を入れる(2020の場合はjava20)
vscode内のターミナルで開いた場合はjavaYYフォルダが直接開くので,そのままコンパイルを実行する.
正常にコンパイルができ,classファイルができたら,java Work11と実行すると結果が出力される.
C:\oit\javaYY\java-bash-2.XX.YY.Z-64.exeを起動し,shussekiコマンドを実行する.
javaYYのYYには年度の末尾2桁を入れる
下記のように~/kadai がo-vnc.center.oit.ac.jp上の同じフォルダとsyncされればOK.
授業中や課題実施中はshussekiコマンドを実行したままにしておくこと.
終了時にはCtr + C
出席・課題提出方法(VPNを接続してshussekiコマンドを実行できない場合)
以下のようにターミナルでzipwork コマンドを実行する
$ zipwork
課題ファイルをアーカイブします
/c/Users/?????? /oithomes/java に java20_200523172917.7z が作成されました.
java20_200523172917.7z ファイルを提出して下さい.
提出後は java20_200523172917.7zを削除しても構いません.
7zファイルが作成されたら,そのファイルを提出する.
なお,提出ファイルには開発したソースコード及び各種ログ(ターミナルで実行したコマンドやファイル編集履歴)が含まれている.
これらのソースコードやログは収集後,匿名化し,誰のものか分からなくした上でより良い開発環境の構築やプログラミング演習等の授業改善,研究等に利用される.
Java演習開発環境用VS codeセットアップ詳細
以下は0からvs code 環境のセットアップを行う際に参考にする情報.
Step1. VSCode Portableのダウンロード
Download VSCode から最新バージョンの7z archive (Windows 64-bits)をダウンロードし,c:\oitに保存・実行(展開)する.
Step2. 以下の2つをC:\oit以下に追加インストール
ディレクトリ名を指定のものに変更する
Amazon coretto (x64)
https://aws.amazon.com/jp/corretto/
C:\oit\javaYYにamazonjdk11.0.5_10のようなバージョンに対応するフォルダを作成し,DLしたjdkのzipファイル内の中身を展開する.
C:\oit\javaYY\amazonjdk11.0.5_10\bin といったディレクトリ構成になっていることを確認する.
PortableGit(x64)(解凍するだけ)
フォルダ名は「PortableGit-2.20.0-64」のようにつける
- PortableGit-2.xx.x.xx-64-bit.7z.exe
- bash.exe経由で起動するように本リポジトリのjava-bashフォルダからexeファイルを作成しておく
go環境を作成し(msys2のpacman利用),java-bash/build_java-bash.sh を実行する.その後ファイル名をjava-bash-2.xx.x-64.exe にし,c:\oit\javaYY直下に配置する.
Japanese Language Pack for Visual Studio Code
最新のバージョンだとInstall後に再起動すると自動で設定するっぽい
Language support for Java ™ for Visual Studio Code, Debugger for Java
Java Extension Packだと不要なMaven pluginとかまでインストールされるので,個別に2つのプラグインをインストールする
EvilInspector
Local History
ファイル->基本設定->設定をクリックする
ユーザー設定を選択し,updateで設定を検索する.
拡張機能やアプリケーションの更新関連の自動アップデート等をすべてOFFにしておく
C:\oit\javaYY\vscode-portable-win64-1.31.0-1\data\appdata\Code\User\settings.json ファイルが生成されるので,下記のようになっているか確認しておくこと
自動整形設定やjava.homeの設定(settings.jsonに追記)
JavaSrcリポジトリ参照
C:\oit\javaYY\vscode-portable-win64-1.31.0-1\data\appdata\Codeの中身を以下を除いて削除する.
C:\oit\javaYY\vscode-portable-win64-1.31.0-1\data\appdata\Code\User\settings.json
C:\oit\javaYY\vscode-portable-win64-1.31.0-1\data\appdata\Code\languagepacks.json
C:\oit\javaYY\vscode-portable-win64-1.31.0-1\data\extensions\redhat.java-0.38.0\server\config_win以下にキャッシュができる場合があるので削除する(config.ini以外はキャッシュ)
C:\oit\javaYY\vscode-portable-win64-1.31.0-1\data\logsフォルダを丸ごと削除
C:\oit\javaYY\vscode-portable-win64-1.31.0-1\logsフォルダを丸ごと削除
Step7. 演習フォルダ(本リポジトリ)のセットアップ
.vscode以下のlaunch.json, settings.json
フォルダルートにある.classpathと.project
以上のファイルの設定はJavaSrcリポジトリ参照のこと
C:\oit\javaYY\PortableGit-2.XX.YY.Z-64 以下に本リポジトリのPortableGitフォルダ以下をコピーする
PortableGit/usr/local/bin/course,coursejdk,coursevscode が更新されているかを確認する
Step9. /usr/local/bin/と学生用java演習フォルダをGithubに設置
getjava, getlocalの参照先をGithubに変更したので,このリポジトリに置くこと
F5でビルドしたときの-Dfile.encoding=UTF-8オプションのせいでScannerでの入力が文字化けする
vscode経由でbashを起動する場合,標準入力はsjis(ms932,windows-31j)になるっぽい.なのでencodingを明示的にms932とかに設定する必要があった
launch.jsonの"encoding": "ms932",にしたらScannerでの文字化けもなくなった.
2019年度はこれでいけたが,2020年度にvscodeのバージョンが上がったらまた駄目になった・・.
Javaのlanguage serverがしょっちゅうクラッシュする(一応いけた)
MS本家のportable mode だとNGだが,↓からダウンロードしたvscode(v1.31-0.1 windows-64bits 7zip archives)を利用したらOKだった.
起動して放置してると100%の確率でThe Language Support for Java server crashed 5 times in the last 3 minutes. The server will not be restarted.と出て,Intellisenseとかが使えなくなる.
The workspace will exit with unsaved changes in this session.とかなってるのが駄目っぽいんだが,原因は分からず.
Ctrl+@でvscode内のターミナルでbashを開くと,コンパイルエラー時に文字化けする(なおった)
vscode内のターミナルで開く場合とmintty経由でbashを開く場合で,javac, javaの必要となる引数が違った.前者はjavac -encoding UTF-8でjavaコマンドは引数なし,後者はjavac,java両方共にjavac -J-Dfile.encoding=UTF-8つける必要あり.
if [ $BASH = "/usr/bin/bash" ]; then
alias javac='javac -encoding UTF-8'
else
alias javac='javac -J-Dfile.encoding=UTF-8'
alias java='java -Dfile.encoding=UTF-8'
fi
なお,vscodeのF5でコンパイル・実行をする場合はlaunch.jsonのencodingをms932にする必要がある(じゃないと文字化けする).
vscode内ターミナルでjavac Hello.javaを実行し,コンパイルエラーが起きると文字化けする.調べた限りではshift-jisをutf-8で表示しようとして文字化けしてるっぽい.
正常にコンパイルが通ったときは問題なく日本語も出力されるが,コンパイルエラー(恐らく実行時エラーも?)時にのみ文字化けする.
今の所Ctrl+@を実行させないようにするしか解決方法がない
encodingを指定しても駄目.
jdk,vscode,portablegit等のバイナリを置くディレクトリとjavakadaiを置くディレクトリの場所をどうするか.
他の授業との兼ね合いや年度進行(再履修含む)にどう対応するかも検討する必要あり.
デフォルト文字エンコードをどうするか(UTF8で確定)
vs codeのデフォはutf-8だが,その場合winでjavac -encoding utf-8を毎回つける必要がある
課題提出方法をどうするか(rsyncの定期実行で確定)
学生が課題を解いている過程をリアルタイムにチェックできるような課題提出方法が望ましい.
方法1: 学生にネットワークドライブ上のフォルダに特定のドライブレターを割り当てさせる.その中に学生ごとのフォルダを作成し,そこに本リポジトリの内容を配置,学生ごとのvscodeから開かせる
メリット:フォルダを教員が任意のタイミングで配布できる.
デメリット:ファイル削除の際にゴミ箱に保存できないので一々システムからのアラートがでる.VPNで接続したときにだいぶ重いことがある(ネットワークによってはファイル書き込みに数秒かかる).教員側のLinuxからアクセスするのが困難.
方法2: rsyncコマンドと本リポジトリの内容を配布し,サーバ側の学生のホームディレクトリ下にrsyncさせる(コマンドは既にある)
メリット:教員側から見ると,現状の演習環境と同一に見える(学生のホームディレクトリ下の特定ディレクトリにアクセスすると学生のコードが見える).
デメリット:rsyncコマンドを学生が実施するのを忘れると提出がまったくできないことになる.学生から見たときに何が提出されているかを確認することが難しい(定期的にrsyncを実行する関係上,最新がUPLOADされているかが分からない).rsyncが何らかの不具合で学生環境において正常に実行できないと詰む詰む(方法1もこの点では同様).
PortableGit(Bash)を導入するとbash.exeが利用できる(250MB程度必要)
- javacへのPATHをbash.bashrcを用いてPortableな形で通せる
Powershell, cmd.exeも可能
Windows10だとデフォがpowershell, それ以前だとcmdになる
- javacへのPATHをPortableな形で通せなくなる(Windowsのシステム環境変数かユーザ環境変数で指定する必要あり)->他の環境と競合を起こす.
ファイル編集時にextends元のクラスが間違っており,エラーが検出されることがある(運用で解決)
extends元のクラスと同じ名前のクラスを別の課題で作成していた場合に,そちらを参照してしまうことがある
原因は下にもあるディレクトリ構造とpackageの問題.JDTによる自動出力先の設定がbinになっているため,packageの指定がないと,同一クラス名は上書きされてしまう.
本リポジトリにあるようにjava02とjava01\ex02で両方共PacMan classを定義したところ,java02のNoizyPacMan extends PacMan が正常に継承できなかった(ただし,コンパイル・実行(方法1)で行う場合は正常にコンパイル・実行できる).
- 同じクラス名で異なる実装のものを作らないようにする
java課題のディレクトリ構造をどうするか(解決)
↓のsrc/java02方式で実施する予定.つまり授業回ごとにフォルダを作成する.また,パッケージはやらず,授業回が変わっても同じクラス名は使わない.
現在は.classpathを以下のように指定している.
srcとoutputを指定しないと,ソースコードの自動チェックが走らない(Intellisenseとかも働かない)
つまり,*.javaファイルを置くディレクトリごとにsrcの指定が必要
<?xml version =" 1.0" encoding =" UTF-8" ?>
<classpath >
<classpathentry kind =" src" path =" src/java01/ex01" />
<classpathentry kind =" src" path =" src/java01/ex02" />
<classpathentry kind =" src" path =" src/java02" />
<classpathentry kind =" con" path =" org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8" />
<classpathentry kind =" output" path =" bin" />
</classpath >
packageの概念を教えてsrcフォルダのみをsrcにし,java01.ex01.Hello を実行させることも可能だが,その場合は「.vscode\launch.json」で別の問題が発生する.
現状のlaunch.jsonファイル(抜粋)は以下のとおり
mainClassを現在開いているファイルのファイル名から拡張子を取り除いたもの(${fileBasenameNoExtension})を自動的に取得して設定するようになっている
packageを利用する場合,mainClassの設定を「java01.ex01.Hello」のように明示的に書く必要がある.
課題が進むごとに書き換えないといけなくなるので現実的ではない
"configurations" : [
{
"type" : "java" ,
"name" : "Debug (Launch)" ,
"request" : "launch" ,
"mainClass" : "${fileBasenameNoExtension}" ,
"args" : "" ,
"preLaunchTask" : "Compile Java4" ,
"encoding" : "UTF-8" ,
"classPaths" : [
"${workspaceRoot}\\bin"
]
}
]
現実的な案としてはjava2017というようなフォルダ(.vscodeがある)を1つ作り,その下に全14回の回ごとのフォルダを1つずつ作り,課題ごとにはフォルダを作らないようにするものが考えられる.classpathentryは「src/java01」「src/java02」といった単位で設定しておく.また,packageを教えない場合は全課題を通じて,同一クラス名で仕様が異なるクラスを作成しないようにする必要がある.
packageを教える場合は「java2017」フォルダは用意せず,「java01」フォルダ,「java02」フォルダ,のように回ごとに.vscodeを含むフォルダを配布し,毎回設定を変えることで対応し,かつ,課題ごとにmainClassを書き換える必要がある.
初回起動時に統合ターミナルがbashにならない(一応解決)
初回に起動した際に,表示->統合ターミナルを選択すると,settings.jsonにbash.exeで統合ターミナルを開くよう設定しているにも関わらず,powershellが起動する(Win10の場合).
さらに,shell:"C://oit/.../bash.exe"(ワークスペースの設定として定義されている)をターミナルで起動することを許可しますか?というメッセージが表示される
下記のデバッガと同様に初回起動時はbash.exeでの起動が認識されていない(許可が必要)
上記の許可しますか?のメッセージを対象にAllowを選択し,Visual Studio Codeを再起動すればOK.
初回に起動し,ソースが含まれたフォルダを選択してから方法2でコンパイル・デバッグを行うとデバッグアダプター'{0}'の実行可能ファイルを判別できませんと表示される
すべての設定をソースが含まれたフォルダ内に置いているため,Java拡張機能が起動時にjava.homeの場所を認識できていないと推測される.
デバッガあるいはvscode本体を再起動すればOK
初回起動時に方法2でビルドを行うと失敗する(解決)
Ctr+Shit+bなどでtask.jsonに定義されたビルドタスクを実施するとbinフォルダがないと言われて失敗する
下記コマンドで-dオプションで指定している出力先フォルダが存在しないため
javac.exe -encoding utf-8 -source 1.8 -target 1.8 -cp bin -d C:\oit_tmp\javatest_local\bin -sourcepath C:\oit_tmp\javatest_local\src\java01\ex01 C:\oit_tmp\javatest_local\src\java01\ex01\Hello.java
jdtも初回起動時には実施されない(java.homeが認識されないため)ので,自動生成もされない
ソースフォルダ配布時にbinフォルダを付与して配布すればOK
日本語出力が文字化けする(コンパイル・実行(方法2)時)(解決)
恐らくJDTによる自動コンパイルがShift-jisで行われているため
手動でビルドしたときはutf8でビルドしているため,文字化けは起こらない.
実行時に手動でビルドした直後であれば文字化けは起きないが,修正した後にJDTが自動ビルドした状態で,ビルドせずに実行すると修正したクラスについてだけ(要するにJDTでビルドされたクラスファイルの方は)文字化けが起きる.
settings.jsonに"java.jdt.ls.vmargs": "-Dfile.encoding=UTF-8"を追加したらいけたっぽい
方法2でコンパイル・実行をした場合,デバッガ実行時にコンパイルエラー・ランタイムエラーが発生すると,該当のファイルへのリンクがデバッガ出力に表示されるが,そのリンクが間違っており,ファイルが開けない
VScodeのバージョンをUP(1.16.1->1.18.1)したら治ったっぽい