- このリポジトリの内容はBYOD下を想定したポータブルなJava開発環境である
- 学生が解く課題を保存するフォルダ(vscode設定ファイル付き),PortableGit内の独自コマンド,PortableGitのバイナリを実行するためのオプション付きexeを作成するフォルダの3つをこのリポジトリで管理する
- 想定するプログラミング演習の言語はJava
- 実行環境はAmazon Correto11+PortableGit+Visual Studio Code.
- 別途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\
を表している.
- ここで$HOMEは
- ターミナル
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
- 以下のようにターミナルで
zipwork
コマンドを実行する
$ zipwork
課題ファイルをアーカイブします
/c/Users/??????/oithomes/java に java20_200523172917.7z が作成されました.
java20_200523172917.7z ファイルを提出して下さい.
提出後は java20_200523172917.7zを削除しても構いません.
- 7zファイルが作成されたら,そのファイルを提出する.
- なお,提出ファイルには開発したソースコード及び各種ログ(ターミナルで実行したコマンドやファイル編集履歴)が含まれている.
- これらのソースコードやログは収集後,匿名化し,誰のものか分からなくした上でより良い開発環境の構築やプログラミング演習等の授業改善,研究等に利用される.
- 以下は0からvs code 環境のセットアップを行う際に参考にする情報.
- Download VSCodeから最新バージョンの7z archive (Windows 64-bits)をダウンロードし,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直下に配置する.
- フォルダ名は「PortableGit-2.20.0-64」のようにつける
- PortableGit-2.xx.x.xx-64-bit.7z.exe
- bash.exe経由で起動するように本リポジトリのjava-bashフォルダからexeファイルを作成しておく
- 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
ファイルが生成されるので,下記のようになっているか確認しておくこと- 本リポジトリのvscodeフォルダ内のsettings.jsonを↑にコピーしても良い.その際,bash.exeのディレクトリを確認しておくこと.
- https://github.com/igakilab/byod.zip/blob/master/vscode/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
フォルダを丸ごと削除
- .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 が更新されているかを確認する
- getjava, getlocalの参照先をGithubに変更したので,このリポジトリに置くこと
- vscode経由でbashを起動する場合,標準入力はsjis(ms932,windows-31j)になるっぽい.なのでencodingを明示的にms932とかに設定する必要があった
- launch.jsonの"encoding": "ms932",にしたらScannerでの文字化けもなくなった.
- 2019年度はこれでいけたが,2020年度にvscodeのバージョンが上がったらまた駄目になった・・.
- 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.
とかなってるのが駄目っぽいんだが,原因は分からず.
- 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を置くディレクトリの場所をどうするか.
- 他の授業との兼ね合いや年度進行(再履修含む)にどう対応するかも検討する必要あり.
- vs codeのデフォはutf-8だが,その場合winで
javac -encoding utf-8
を毎回つける必要がある- 参考 http://kyouichisato.blogspot.jp/2015/06/visual-studio-code-jis.html
- shiftjisの場合は何もつけなくて良いが,課題チェックシステム等のアプリで表示する際にutf-8で統一しておいたほうが多分実装が楽.
- 学生が課題を解いている過程をリアルタイムにチェックできるような課題提出方法が望ましい.
- 方法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元のクラスと同じ名前のクラスを別の課題で作成していた場合に,そちらを参照してしまうことがある
- 原因は下にもあるディレクトリ構造とpackageの問題.JDTによる自動出力先の設定がbinになっているため,packageの指定がないと,同一クラス名は上書きされてしまう.
- 本リポジトリにあるようにjava02とjava01\ex02で両方共PacMan classを定義したところ,java02のNoizyPacMan extends PacMan が正常に継承できなかった(ただし,コンパイル・実行(方法1)で行う場合は正常にコンパイル・実行できる). - 同じクラス名で異なる実装のものを作らないようにする
- ↓の
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」のように明示的に書く必要がある.
- 課題が進むごとに書き換えないといけなくなるので現実的ではない
- mainClassを現在開いているファイルのファイル名から拡張子を取り除いたもの(
"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を書き換える必要がある.
- 初回に起動した際に,
表示->統合ターミナル
を選択すると,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
- 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
- 恐らく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)したら治ったっぽい