20210604のJavaに関する記事は4件です。

Minecraft Forge 1.12.2-14.23.5.2855を導入したときのログ

背景 forge-1.12.2-14.23.5.2768の上でModdingをしていたけど、いつの間にかめっちゃ古くなっていることが分かったので、forge-1.12.2-14.23.5.2855に切り替えることにしました。 これはその時の備忘録です。 環境 Windows 10 Eclipse Java 8 Minecraft 1.12.2 Minecraft Forge 1.12.2-14.23.5.2855 環境の配置 MDKのダウンロード ここから14.23.5.2855 Mdkを得ます。 https://files.minecraftforge.net/net/minecraftforge/forge/index_1.12.2.html 余談:Forgeの公式サイトがいつの間にかHTTPSに移行しており、古いインストーラーは動作しなくなった模様。 展開 展開すると色々入っています。 README.txtにはModdingの上でいろいろと技術的に重要なことが書いてあります。 環境のセットアップ Eclipseプロジェクトの作成手順 以下はREADME.txtにある記述を抜粋し、意訳したものです。 1. "gradlew genEclipseRuns"を実行する 2. "gradlew eclipse"でEclipseプロジェクトを作成する 3. runClientとrunServerのMOD_CLASSESをto show [modid]%%[Path]; 2 times rather then the generated 4.のように書き換える(よくわからない) もしIDEでライブラリが見つからないとか出た場合は、 "gradlew --refresh-dependencies" でローカルキャッシュを更新してみてください。 "gradlew clean"はソースコード以外のすべてを初期化します。 gradlewの実行に使うJavaの指定 gradlewコマンドを実行するにはJavaがインストールされている(javaコマンドが通るかJAVA_HOME環境変数が設定されている場合?)必要があります。 次のようにgradlew.batの先頭にJavaホームへのローカルパスを指定すると、そのファイル以外の場所に変更を加えずに無理やりjavaを認識させることができます。 set JAVA_HOME=D:\eclipse\pleiades-2020-12-java-win-64bit-jre_20201222\pleiades\java\8 @if "%DEBUG%" == "" @echo off @rem ########################################################################## @rem @rem Gradle startup script for Windows @rem @rem ########################################################################## ≪以下略≫ この改変されたgradlew.batをgitに取り込みたくない場合、次のようにするとgitがこのファイルを認知しなくなります。 https://riotz.works/articles/lulzneko/2019/07/14/temporarily-ignore-change-tracking-for-files-managed-by-git/ gradlew.batへの変更を無視するようにするbashコマンド(WSL) $ git update-index --skip-worktree gradlew.bat gradlew.batへの変更を無視する状態を元に戻すbashコマンド(WSL) $ git update-index --no-skip-worktree gradlew.bat Windowsでgitを扱う場合、改行コードを自動的に変換するautocrlfオプションの設定に気を付けてください。 特にシェルスクリプトとバッチファイルが共存するgradlewは相性が悪いです。 GitHub Desktopの場合、それ用のgitの設定ファイルを参照していることがあります(よくわからないけど、リポジトリ固有の設定が効かない場合がある?)。 それは次の場所にあります。 C:\Users\【Windowsユーザー名】\AppData\Local\GitHubDesktop\app-~~\resources\app\git\etc\gitconfig Eclipseで読み込み Eclipseプロジェクトの作成 ここは特に何も問題は起きませんでした。 コマンドプロンプト > gradlew genEclipseRuns 出力 To honour the JVM settings for this build a new JVM will be forked. Please consider using the daemon: https://docs.gradlDaemon will be stopped at the end of the build stopping after processing > Configure project : New Dep: net.minecraftforge:forge:1.12.2-14.23.5.2855_mapped_snapshot_20171003-1.12 > Task :extractNatives Downloading: https://libraries.minecraft.net/org/lwjgl/lwjgl/lwjgl-platform/2.9.4-nightly-20150209/lwjgl-platform-2.9.4-nightly-20150209-natives-windows.jar Downloading: https://libraries.minecraft.net/org/lwjgl/lwjgl/lwjgl-platform/2.9.2-nightly-20140822/lwjgl-platform-2.9.2-nightly-20140822-natives-windows.jar Downloading: https://libraries.minecraft.net/net/java/jinput/jinput-platform/2.0.5/jinput-platform-2.0.5-natives-windows.jar Downloading: https://libraries.minecraft.net/com/mojang/text2speech/1.10.3/text2speech-1.10.3-natives-windows.jar Deprecated Gradle features were used in this build, making it incompatible with Gradle 5.0. Use '--warning-mode all' to show the individual deprecation warnings. See https://docs.gradle.org/4.9/userguide/command_line_interface.html#sec:command_line_warnings BUILD SUCCESSFUL in 39s 8 actionable tasks: 8 executed コマンドプロンプト > gradlew eclipse 出力 To honour the JVM settings for this build a new JVM will be forked. Please consider using the daemon: https://docs.gradle.org/4.9/userguide/gradle_daemon.html. Daemon will be stopped at the end of the build stopping after processing > Configure project : New Dep: net.minecraftforge:forge:1.12.2-14.23.5.2855_mapped_snapshot_20171003-1.12 Deprecated Gradle features were used in this build, making it incompatible with Gradle 5.0. Use '--warning-mode all' to show the individual deprecation warnings. See https://docs.gradle.org/4.9/userguide/command_line_interface.html#sec:command_line_warnings BUILD SUCCESSFUL in 9s 10 actionable tasks: 6 executed, 4 up-to-date Eclipseでインポート ここでは特に何も弄っていないPleiades Eclipseを使います。 https://mergedoc.osdn.jp/ Eclipseでインポートします。 プロジェクトを右クリックして、象のアイコンのGradleプラグイン(buildship)を有効化します。この手順は実は要らないかもしれません。 Eclipseからの起動 MC_VERSIONの設定 runClient.launchをEclipse上で右クリックして実行しようとすると、次のように怒られます。 これはrunClient.launchを次のように手作業で書き換えるとうまくいくようです。 これはrunServer.launchでも同様です。 - <mapEntry key="MC_VERSION" value="${MC_VERSION}"/> + <mapEntry key="MC_VERSION" value="1.12.2"/> いかにもオプションで自動的に出力されそうな見た目ですが、検索したところなんかみんな手動で書き換えてるっぽいです。 I just needed to change the variable value of MC_VERSION in my runClient launch file クライアントの起動 ここまでくるとクライアントを起動できるようになります。 サーバーの起動 サーバーサイドを起動するには、eula.txtのeulaがtrueである必要があります。 サーバーを一度起動しようとするとeula.txtが生成されます。 これはここに記述されている指示に従ってください。 #By changing the setting below to TRUE you are indicating your agreement to our EULA (https://account.mojang.com/documents/minecraft_eula). #Fri Jun 04 22:50:25 GMT+09:00 2021 eula=false eulaが解決されていればサーバーは起動できます。 Eclipseからの編集内容をリアルタイムで反映させられるようにする Javaプログラムが動いているときにEclipseがJavaコードをコンパイルすると実行中にプログラムが書き換えられる奴を有効にします。 それには、「ソース・フォルダーごとに出力フォルダーの指定を可能にする」をオフにすると、なぜかうまくいきました。 なお、これでも一部のコードはリアルタイムで反映されません(SideOnlyがあるクラスは同期できない?EventBusに登録したクラスは同期できない?)。 Moddingに便利なMinecraft上の操作 サーバーのプロパティを変える テスト用のサーバーではコマンドブロックを有効、オンラインモードを無効にしたりするのがよいでしょう。 - online-mode=true + online-mode=false - enable-command-block=false + enable-command-block=true オンラインモードが有効なままだと、Minecraftアカウントを複数持っていなければオンラインで複数のプレイヤーが関わる機能のテストができません。 オンラインモードを無効にすると認証していないユーザーがログインできるので、一人でデバッグができます。 コマンドブロックはここで設定しなければ使いたいときに「動かないぞ!」ってなります。 ローカルホスト上に建っているサーバーに入る サーバーを起動するとデフォルトでlocalhost:25565というアドレスに出現します。 サーバーのポートはserver.propertiesで変更できます。 - server-port=25565 + server-port=12345 アカウントにログインする runClientで起動するMinecraftクライアントでMinecraftアカウントにログインしたい場合、次のように実行の構成を書き換えます。 これはrunClient.launchを直接書き換えてもよいです。 <stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="net.minecraftforge.legacydev.MainClient"/> + <stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="--username メールアドレス等 --password パスワード"/> <stringAttribute key="org.eclipse.jdt.launching.CLASSPATH_PROVIDER" value="org.eclipse.buildship.core.classpathprovider"/> なお、--passwordを指定しなければ認証しない状態でユーザー名だけを固定化できます(間違ったパスワードを指定した場合はエラーになる)。 その他、--uuidでUUIDも設定可能であることがnet.minecraftforge.fml.common.launcher.Yggdrasilに書かれています。 ≪前略≫ public class Yggdrasil { public static void login(Map<String, String> args) { ≪中略≫ args.put("--username", auth.getSelectedProfile().getName()); args.put("--uuid", auth.getSelectedProfile().getId().toString().replace("-", "")); args.put("--accessToken", auth.getAuthenticatedToken()); args.put("--userProperties", auth.getUserProperties().toString()); } } OP化とかワールド設定とか これらはModdingに便利なMinecraftコマンドのメモです。 次のコマンドでユーザーにop権限を与えます。 前述の方法で名前を固定化しない場合、起動ごとにプロファイルが変わってopを与え直す必要が生まれたり毎回インベントリが消えるなど、テスト用サーバー内での行動が色々面倒になります。 /op メールアドレス等 これは死亡時にアイテムや経験値をロストしない設定です。 /gamerule keepInventory true これらは太陽の位置や天候が変わらなくなります。 /gamerule doDaylightCycle false /gamerule doWeatherCycle false これは太陽を真上にします。 /time set 6000 これは実行したプレイヤーの足の下に広大な石の足場を出現させます。 /fill ~-50 ~-1 ~-50 ~50 ~-1 ~50 minecraft:stone ビルド ビルドコマンド ビルドもコマンドプロンプトで行います。 コマンドプロンプト > gradlew build 結果 D:\forge-1.12.2-14.23.5.2855-mdk>set JAVA_HOME=D:\eclipse\pleiades-2020-12-java-win-64bit-jre_20201222\pleiades\java\8 To honour the JVM settings for this build a new JVM will be forked. Please consider using the daemon: https://docs.gradle.org/4.9/userguide/gradle_daemon.html. Daemon will be stopped at the end of the build stopping after processing > Configure project : New Dep: net.minecraftforge:forge:1.12.2-14.23.5.2855_mapped_snapshot_20171003-1.12 Deprecated Gradle features were used in this build, making it incompatible with Gradle 5.0. Use '--warning-mode all' to show the individual deprecation warnings. See https://docs.gradle.org/4.9/userguide/command_line_interface.html#sec:command_line_warnings BUILD SUCCESSFUL in 9s 7 actionable tasks: 6 executed, 1 up-to-date 成果物はbuild\libs内に出現します。 GitHub Actionsでの自動化 高頻度で成果物をリリースしたければ、GitHub Actionsなどで自動化するのが良いです。 これはこの記事を書いたときに作った自動化です(参考)。 https://github.com/MirrgieRiana/MirageFairy2019/blob/master/.github/workflows/release.yml
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ローカル変数の型推論

ローカル変数の型推論 varによる変数宣言 JDK10より、Local-Variable Type Inference(ローカル変数型推論)が使用できるようになりました。 これにより、ローカル変数の宣言時に特定のデータ型を記述するのではなく,varを利用することができます。 int num = 10; //従来の書き方 var num = 10; //ローカル変数型推論の利用 ローカル変数型推論を利用した場合、変数のデータ型が不明無ように見えますが、初期化時に代入されている 右辺の値(上記の例であれば10)によりnum変数はint型と推論できます。 varが利用できる箇所 varが利用できる箇所は以下のとおりです。 ・ローカル変数の初期化時 ・拡張for文内のインデックス ・通常for文内で宣言されたローカル変数 varが使用できない箇所 varには使用できない箇所があります。以下の場面で使用できない流れです。 ・メソッドの引数 ・コンストラクタの引数 以上では、使用ができません。 まとめ ・ローカル変数は変数の型を予測してくれる。 ・for文内でローカル変数は使用できない。 ・メソッドの引数、コンストラクタの引数では使用できない。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

? [Kotlin] 基礎 androidstudio 変数宣言と条件式メモ

「作って楽しむプログラミング Androidアプリ超入門」の勉強をまとめていきます。 環境 java: 1.8.0_281 kotlin:1.5.10 Class 構文 クラスのインスタンス化 クラス名() 基本はこれだけ。 中身を定義するときには()必要 Javaと違いインスタンス生成にnewは不要。 sample.kt class Empty val instance = Test() val customer = Customer("Name") varとval Kotlin で変数を定義するには、val キーワードまたは、var キーワードを使用します。 変数定義時に値を初期化する場合は、コンパイラが型を判断してくれるので、多くの場合は型の記述を省略することができます(この機能を型推論 (type inference) と言います)。 val:再代入できない参照を保持するための変数 (immutable reference)。Java の final 変数に相当。value の略。 var: 再代入可能な変数 (mutable reference)。variable の略。 sample.kt //var:変数 val:固定 var str = "大吉" //=> var str : String = "大吉" //乱数を得るためのRandomクラスを、インスタンス化し、クラス型変数rndに初期値として代入している val rnd = Random() //nextIntメソッドに引数として(3)を渡し、戻り値として整数の値を得ている //nextIntメソッドは乱数を整数で返すメソッド。乱数の範囲は指定した数字の-1 val number = rnd.nextInt(3) ifとwhen 条件分岐のための構文 制御構文を用いることで、処理を分けることができる sample.kt if (number == 0) { str = "吉" } else if (number == 1) { str = "凶" } //if文をwhenで置き換えると //when (number) { //0 -> str = "吉" //1 -> str = "凶" //} //when式で書き換えると //val str = when(number){ //0 -> "吉" //1 -> "凶" //else -> "大吉" //} //式として用いる場合は、戻り値が必要。したがってelseは省略不可 配列の種類と特徴 Kotlinの配列には大きく分けて2つの種類があります。 基本型(プリミティブ型)の1つとしての配列: Arrayが該当します コレクションパッケージの1つとしての配列: ListやArrayListなどArray以外のほとんどが該当します Kotlinで複数の要素を扱う際は、基本的にコレクションパッケージで用意されているListやMutableListなどのクラスを使用します。 Arrayはライブラリなどで明示的に使うことを指定されている場合に使用すると良いでしょう。またListは読み取り専用のクラスであり、要素や要素数を変更する可能性がある場合はMutableListを使用します。 MutableListと同等のクラスにArrayListがあります。両者の違いは可変(Mutable)であることを明示しているか、です。通常はMutableListを使用し、Javaとの互換性などで明示的に使うことを指定されている場合にのみArrayListを使用すると良いでしょう。 サンプルコード 要素の確率を変更したい時は、if,whenなどの条件分岐ではなく、配列を用いるほうがベター if,whenのサンプルコードはこちら 今回は吉:大吉:凶を18:1:1に設定したい。 また、今回使用するArrayクラスでは、宣言と同時に配列要素の初期化を行うことができる。 初期化処理には各要素に設定したい値を返す式を書く。今回は「吉」という文字列で初期化。 インデックス番号を指定して、「大吉」「凶」を代入する sample.kt //文字列型が20個分入った配列を宣言する val omikujiShelf = Array<String>(20,{"吉"}) omikujiShelf[0] = "大吉" omikujiShelf[19] = "凶" for文で配列にアクセスする 要素数が増えてきても、要素1つずつ指定するのは非効率なのでfor文の範囲式を使用する javaで言うと拡張for文みたいなイメージ 上記のコードを範囲式で書き換える sample.kt //文字列型が20個分入った配列を宣言する for (i in 0 .. 19 ) { omikujiShelf[i] = "吉"                 } 参考 https://techacademy.jp/magazine/32265
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

? [Kotlin] 基礎 変数宣言と条件式メモ

「作って楽しむプログラミング Androidアプリ超入門」の勉強をまとめていきます。 環境 java: 1.8.0_281 kotlin:1.5.10 Class 構文 クラスのインスタンス化 クラス名() 基本はこれだけ。 中身を定義するときには()必要 Javaと違いインスタンス生成にnewは不要。 sample.kt class Empty val instance = Test() val customer = Customer("Name") varとval Kotlin で変数を定義するには、val キーワードまたは、var キーワードを使用します。 変数定義時に値を初期化する場合は、コンパイラが型を判断してくれるので、多くの場合は型の記述を省略することができます(この機能を型推論 (type inference) と言います)。 val:再代入できない参照を保持するための変数 (immutable reference)。Java の final 変数に相当。value の略。 var: 再代入可能な変数 (mutable reference)。variable の略。 sample.kt //var:変数 val:固定 var str = "大吉" //=> var str : String = "大吉" //乱数を得るためのRandomクラスを、インスタンス化し、クラス型変数rndに初期値として代入している val rnd = Random() //nextIntメソッドに引数として(3)を渡し、戻り値として整数の値を得ている //nextIntメソッドは乱数を整数で返すメソッド。乱数の範囲は指定した数字の-1 val number = rnd.nextInt(3) ifとwhen 条件分岐のための構文 制御構文を用いることで、処理を分けることができる sample.kt if (number == 0) { str = "吉" } else if (number == 1) { str = "凶" } //if文をwhenで置き換えると //when (number) { //0 -> str = "吉" //1 -> str = "凶" //} //when式で書き換えると //val str = when(number){ //0 -> "吉" //1 -> "凶" //else -> "大吉" //} //式として用いる場合は、戻り値が必要。したがってelseは省略不可 配列の種類と特徴 Kotlinの配列には大きく分けて2つの種類があります。 基本型(プリミティブ型)の1つとしての配列: Arrayが該当します コレクションパッケージの1つとしての配列: ListやArrayListなどArray以外のほとんどが該当します Kotlinで複数の要素を扱う際は、基本的にコレクションパッケージで用意されているListやMutableListなどのクラスを使用します。 Arrayはライブラリなどで明示的に使うことを指定されている場合に使用すると良いでしょう。またListは読み取り専用のクラスであり、要素や要素数を変更する可能性がある場合はMutableListを使用します。 MutableListと同等のクラスにArrayListがあります。両者の違いは可変(Mutable)であることを明示しているか、です。通常はMutableListを使用し、Javaとの互換性などで明示的に使うことを指定されている場合にのみArrayListを使用すると良いでしょう。 サンプルコード 要素の確率を変更したい時は、if,whenなどの条件分岐ではなく、配列を用いるほうがベター if,whenのサンプルコードはこちら 今回は吉:大吉:凶を18:1:1に設定したい。 また、今回使用するArrayクラスでは、宣言と同時に配列要素の初期化を行うことができる。 初期化処理には各要素に設定したい値を返す式を書く。今回は「吉」という文字列で初期化。 インデックス番号を指定して、「大吉」「凶」を代入する sample.kt //文字列型が20個分入った配列を宣言する val omikujiShelf = Array<String>(20,{"吉"}) omikujiShelf[0] = "大吉" omikujiShelf[19] = "凶" for文で配列にアクセスする 要素数が増えてきても、要素1つずつ指定するのは非効率なのでfor文の範囲式を使用する javaで言うと拡張for文みたいなイメージ 上記のコードを範囲式で書き換える sample.kt //文字列型が20個分入った配列を宣言する for (i in 0 .. 19 ) { omikujiShelf[i] = "吉"                 } 参考 https://techacademy.jp/magazine/32265
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む