20211202のJavaに関する記事は8件です。

[Java]ArrayListとLinkedListの違いについて

この記事は、シアトルコンサルティング株式会社 Advent Calendar 2021の24日目の記事です。 こんにちは、シアトルコンサルティングの小泉です。 はじめに 今回はJavaのコレクションフレームワークであるListについて調べてみました。 その中でもArrayListとLinkedListのそれぞれの特徴について説明します。 ゴール ArrayListとLinkedListの違いについて理解する。 はじめに JavaのコレクションフレームワークであるListについて説明します。 Listクラス java.util.ArrayList ・配列型のリスト ・指定位置の要素の取得が速い ・要素の挿入、削除が遅い java.util.LinkedList ・線形リスト型のリスト ・指定位置の要素の取得が遅い ・要素の挿入、削除が速い ArrayList Listインタフェースを実装したコレクションクラスです。 「Array」という名にあるように「配列のような感覚」で扱うことができます。 書き方は下記の通りです。 ArrayList<型> 変数名 = new ArrayList<型>(); import java.util.ArrayList; import java.util.List; public class Main { public static void main(String args[]) { List<String> sampleList = new ArrayList<String>(); sampleList.add("1回目のリストに格納"); sampleList.add("2回目のリストに格納"); // リストに格納した全要素を順番に出力 for (int i = 0; i < sampleList.size(); i++) { System.out.println(sampleList.get(i)); } } } ・要素の追加:addメソッド ・要素の取得:getメソッド 特徴 ArrayListは要素がそれぞれ順序番号を持っており、全てメモリ上でインデックス化されているため、特定の要素へすぐにアクセスすることが出来ます。 一方、末尾意外の要素を足したり引いたりする際は、それ以降の要素全ての順序番号を繰り上げたり繰り下げたりするための再配置処理が行われるため多くの時間がかかってしまいます。 LinkedList LinkedListは、要素同士を前後双方向のリンクで参照するリンクリストを表します。 書き方は下記の通りです。 LinkedList<型> 変数名 = new LinkedList<型>(); class Main { public static void main(String args[]) { List<String> sampleList = new LinkedList<String>(); sampleList.add("1回目のリストに格納"); sampleList.add("2回目のリストに格納"); // リストに格納した全要素を順番に出力 for (int i = 0; i < sampleList.size(); i++) { System.out.println(sampleList.get(i)); } } } ・要素の追加:addメソッド ・要素の取得:getメソッド 特徴 LinkedListでは要素同士が、それぞれ前後に持っているリンク情報で繋がっています。 それぞれの要素は順序番号を保持していないため、特定の要素を取り出す際は、先頭もしくは末尾から一つずつ順序を数えていく必要があります。そのため順序番号があらかじめ保持されているArrayListに比べると、多くの時間がかかってしまいます。 一方、要素を足したり引いたりする際は、リンク情報を書き換えれば終わりなので、再配置処理が行われない分ArrayListよりも高速です。 さいごに ArrayListとLinkedListそれぞれの特徴は理解していただけましたでしょうか? ソースコードに関してはほぼ同じですが、処理の中身の違いを理解することで開発する際に役立つと思います。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

App Service にて Tomcat の設定ファイルを変更してカスタムエラーページを構成する方法

はじめに Microsoft Azure Tech Advent Calendar 2021 の 2 日目の記事です。本稿では、App Service を Tomcat で運用する上で知っていると役立つ Tips を紹介します。 App Service は Windows、Linux、Docker コンテナ(カスタム コンテナー)の Web アプリケーションを Azure 上にホストすることができる PaaS です。Java/Tomcat をスタックとする App Service のリソースを作成する方法については当記事では割愛するため、公式ドキュメント等をご確認くださいませ。 概要 App Service では Java アプリケーションのランタイムの一つとして Tomcat を選択することが可能です。App Service が稼働する上で必要な Tomcat のバイナリや設定ファイルは有難いことに予め Azure により提供されています。そのため、基本的には自分たちで Tomcat の設定を構成せずとも Java アプリケーションを App Service で運用することが可能です。 しかしながら、状況に応じて Tomcat の設定をデフォルトから変更したい場合があるかと思います。当記事では、Tomcat の設定にてカスタムエラーページを構成したい場合に役立つ Tips をご紹介します。(今回の記事では、Windows 版の App Service で Tomcat 9.0.38 を使用している環境を例に解説します。) Tomcat の設定ファイル (conf 配下) を変更する方法 デフォルトの設定では Tomcat の コンフィグレーションを含む設定ファイルは、現時点では C:\Program Files\apache-tomcat-9.0.38 配下に配置されています。(ホームドライブは C ではなく D の場合もあります。) しかしながら、こちらのディレクトリ配下のファイルは App Service の制約により変更がサポートされておりません。この問題を解決するには C:\home 配下に任意のフォルダを作成し、このフォルダ配下に作成した設定ファイルを CATALINA_BASE の指定にて参照させる必要があります。このようにして、CATALINA_BASE は Tomcat の実行用バイナリファイルと設定ファイルを別のフォルダで管理することを可能とします。 具体的な手順 Kudu(高度なツール)の Debug Console より、C:\home 配下にて tomcat フォルダを作成します。 デフォルトの設定ファイルを C:\home\tomcat にコピーします。 cp -r "C:\Program Files\apache-tomcat-9.0.38\conf" C:\home\tomcat\conf C:\home\tomcat\ 直下に logs, work, temp ディレクトリを作成します。 C:\home\tomcat\conf\ 配下の設定ファイル (server.xml 等) に任意の修正を行います。 該当の App Service のポータルにて、[構成]メニューよりアプリケーション設定に以下の設定を追加します。(App Service の再起動が発生します) 名前: CATALINA_BASE 値: C:\home\tomcat 設定ファイルの変更を必要とする例 Tomcat のデフォルトのエラーページの代わりにカスタムエラーページを表示させる App Service への HTTP リクエストに対するレスポンスとして HTTP ステータスコードが 400 もしくは 500 番台を返却する場合、基本的には App Service にホストしているアプリケーションの Web フレームワーク等によりエラーページをブラウザに返却させる場合が多いかと思います。しかしながら 400番台のエラーにおいては Tomcat のリクエスト処理が行われるパイプラインの入り口にて Tomcat 自体がエラーを返却する場合があるため、このような状況では HTTP リクエストが Web アプリケーション自体に到達せず、Tomcat のデフォルトのエラーページが表示されます。任意のエラーページを表示させるには、以下のように Tomcat の設定を行うことで実現が可能です。 手順 ※前述の手順により C:\home\tomcat\ 配下の設定ファイルが参照される前提で解説します。 1. C:\home\tomcat\server.xml の HOST タグ内に以下の定義を入れます。 以下ではエラーコード400に対応したカスタムエラーページを表示する設定を定義しています。他のエラーコード以外の定義も可能なので、必要に応じて同様の定義を追加ください。(errorCode=0は、server.xmlに定義が無いエラーコードの場合に表示するカスタムエラーページを定義します。) <Valve className="org.apache.catalina.valves.ErrorReportValve" errorCode.400="C:\home\site\wwwroot\webapps\ROOT\error400.html" errorCode.0="C:\home\site\wwwroot\webapps\ROOT\errorOthers.html" showReport="false" showServerInfo="false" /> server.xml に追加する ErrorReportValve に関する詳細は以下の Tomcat のドキュメントが参考になります。 ■Apache Tomcat 9 Configuration Reference http://tomcat.apache.org/tomcat-9.0-doc/config/valve.html#Error_Report_Valve ※Error Report Valve の項をご参照ください 2. カスタムエラーページの HTML ファイルを以下のファイルパスで作成します。 (1) 400エラー用 C:\home\site\wwwroot\webapps\ROOT\error400.html (2) errorCode.0用(※任意。エラーコードの定義が server.xml に無い HTTP エラー用。) C:\home\site\wwwroot\webapps\ROOT\errorOthers.html 3. App Service を再起動します。 エラーページの反映が確認できない場合は、ブラウザキャッシュのクリアをお試しください。 App Service 上で Tomcat の設定を変更する際に行ってはいけないこと Tomcat のバージョン自動更新を有効にしてはいけない App Service においては Tomcat のバイナリ (CATALINA_HOME) と設定ファイル (CATALINA_BASE) に対して、App Service 上で Tomcat を動作させるためのカスタマイズがデフォルトで行われています。Tomcat のバージョンが App Service のアップデートにて上がった場合に CATALINA_BASE で独自の設定を参照している場合は CATALINA_HOME に存在するバイナリのみがバージョンアップすることから、両者の整合性が取れずに問題が生じる可能性があります。その為、Tomcat のバージョン自動更新により不意に問題が発生することを避けるためには以下のように特定のバージョンを固定で指定する必要があります。 最後に 以上のような方法で Tomcat の設定をカスタマイズすることが可能です。Tomcat のバージョンを固定している場合は上記のような方法で Tomcat の設定を変更できるので、こちらの方法が参考になればと思います。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Java変数のスコープ(有効範囲)について

この記事は、シアトルコンサルティング株式会社 Advent Calendar 2021の7日目の記事です。 こんにちは、シアトルコンサルティングの小泉です。 はじめに 今回は変数のスコープ範囲についてまとめました。 プログラミングを学び始めた際に、変数の有効範囲がどこまでかわからずエラーが出ることがよくありました。 そんなプログラミング初学者に向けて作成いたしましたので、変数のスコープについて知りたい方はぜひ活用してみてください。 ゴール 変数のスコープについて理解した上でコードを書けるようになる。 Java変数のスコープ(有効範囲)とは 文字通り定義した変数の有効な範囲のことです。 (変数の宣言した場所によって、その変数を使用できる範囲が制限されます) ・ローカル変数 ・インスタンス変数 ・static変数 宣言する場所によって、呼び名も複数種類に分かれています。 ローカル変数 { } ブロック単位で有効範囲が変わり、ブロック内で扱える変数のことをローカル変数と言います。 ブロックの中で、変数を宣言した位置より後ろで使用することが出来ます。 class Main { public static void main(String args[]) { String block1 = "ブロック1"; System.out.println(block1); // ブロック1 { String block2 = "ブロック2"; // block2を宣言したブロック内なのでアクセスできます System.out.println(block2); // ブロック2 // block1はアクセスできます System.out.println(block1); // ブロック1 } // block2を宣言したブロックの外側なので、コンパイルエラーになります System.out.println(block2); // block2 cannot be resolved to a variable } } インスタンス変数 クラス定義の直下で宣言する変数のことを言います。 newされる度にメモリ領域にインスタンスが作成されます。 オブジェクト.インスタンス変数名でアクセスできます。 class Person { // クラスの下で変数を定義(インスタンス変数) String name; int age; int height; // クラス内のメソッドからもアクセスできます(staticメソッドからはアクセスできません。下記参照。) public void checkInfo() { System.out.print("名前は"+ name + "、"); System.out.print("年齢は"+ age + "、"); if(age < 20) { System.out.print("未成年。"); } System.out.println("身長は"+ height + " です。"); } } class Main { public static void main(String args[]) { Person tanaka = new Person(); // newキーワードでオブジェクトを生成 tanaka.name = "田中"; // オブジェクトを代入した変数名tanakaで、インスタンス変数nameに値を代入しています tanaka.age = 19; // オブジェクトを代入した変数名tanakaで、インスタンス変数ageに値を代入しています System.out.println(tanaka.name); // 田中 System.out.println(tanaka.age); // 19 // ↓ローカル変数は宣言・初期化を行わなければならなかったが、 // インスタンス変数は自動で初期化されます。 System.out.println(tanaka.height); // 0 tanaka.checkInfo(); // 名前は田中、年齢は19、未成年。身長は0 です。 Person suzuki = new Person(); // newキーワードでオブジェクトを生成 suzuki.name = "鈴木"; // オブジェクトを代入した変数名suzukiで、インスタンス変数nameに値を代入しています suzuki.age = 51; // オブジェクトを代入した変数名suzukiで、インスタンス変数ageに値を代入しています suzuki.height = 146; // オブジェクトを代入した変数名suzukiで、インスタンス変数heightに値を代入しています System.out.println(suzuki.name); // 鈴木 System.out.println(suzuki.age); // 51 System.out.println(suzuki.height); // 146 suzuki.checkInfo(); // 名前は鈴木、年齢は51、身長は146 です。 } } Personクラスを元にnewキーワードでオブジェクトを複数生成(インスタンス化)した時、 インスタンス変数の値はインスタンス毎に異なり、オブジェクト毎に異なる値を扱うことができます。 オブジェクトを代入した変数名.インスタンス変数名でアクセスします。 static変数(クラス変数) クラス定義の直下で宣言する変数。 変数を宣言する時、static修飾子を指定することでstatic変数として扱われます。 インスタンス変数は、各オブジェクト毎に値を保持していましたが、 static変数は、1箇所にまとめられて値を保持します。 class Sample { int number = 99; // インスタンス変数 static String color = "黄"; // static変数(クラス変数) // static変数(クラス変数)に値をセットするメソッド public void setColor(String value) { color = value; } } 故にクラスをインスタンス化することなく、アクセスができます。 class Main { public static void main(String args[]) { Sample sample1 = new Sample(); sample1.number = 10; System.out.println(sample1.number); // 10 sample1.setColor("赤"); System.out.println(Sample.color); // 赤 Sample sample2 = new Sample(); // インスタンス変数であるnumberは、オブジェクト毎に保持しているものなので、初期値の99が入っています。 System.out.println(sample2.number); // 99 // static変数(クラス変数)のcolorは共通の値を共有するため、 // デフォルトの「黄」はsample1.setColorのタイミングで赤がセットされました。 // だからここでstatic変数(クラス変数)にアクセスすると赤と出力されます。 System.out.println(Sample.color); // 赤 } } static変数(クラス変数)はクラスの共通変数のため、変更を加えると使用している箇所全てに影響が出てしまいます。 さいごに 変数の種類やスコープについて理解いただけましたでしょうか? 今後も初学者に向けて役立つ記事を載せていくのでよろしくお願いします。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

JavaBeansについて

この記事は、シアトルコンサルティング株式会社 Advent Calendar 2021の18日目の記事です。 こんにちは、シアトルコンサルティングの小泉です。 はじめに 今回はJavaBeansについてまとめました。 実務の中でBeansを使用する中でBeansの役割って何なんだろうと疑問に思い調べてまとめてみました。 ゴール JavaBeansの役割について理解できるようになる。 JavaBeansとは JavaBeansとは、Java言語で再利用可能な部品(モジュール)化されたプログラムを作成するための仕様。また、その仕様に則って開発された部品化されたJavaプログラム(略してBeanとも呼ばれる)。※IT用語辞典より 簡単にいうと、データを保存しておくための倉庫のようなものです。 例えば、ユーザーから送られてきた氏名や年齢などの情報を個人ごとにそれぞれ整理して保存しておくための仕組みがJavaBeansです。 JavaBeansの3つの特徴 1:プロパティへのgetter/setterメソッドを持つ 2:引数のないコンストラクタを持つ 3:java.io.Serializableを実装している サンプルコードを下記に示します。 public class UserBean{ private String name; private int age; public UserBean (){}; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } JavaBeansを使うメリット JavaBeansを使うメリットは「データの意図しない書き換えを防げること」です。 各データ属性はprivateであるため、外部からはアクセスできません。 そのため、必ずインスタンスの生成をしてから、セッターを呼ばなければデータ属性を書き換えられない仕組みです。 formとentityとdtoの違い データ保管をしようと思いBeanについて調べていたらform、entity、dto、これらの単語もよく聞くと思います。 一見どれも同じ書き方をしていて違いがわからない方もいらっしゃると思います。 それぞれの違いはなに? 結論から言うと、 formとentityとdtoは3つともBean で、使用目的によって名前が分けられています。 Form ・Web上の画面の入力情報/出力方法を保有します。 entity ・DBに登録・更新する値を保有します。 ・DBから取得した値を保有します。 dto ・データ交換用のbeanであり、様々な情報から必要な情報だけを集めた値を保有します。 さいごに JavaBeansの役割について理解いただけましたでしょうか? 今後も実務の中で気になったことなどがあればまとめていきますのでよろしくお願いいたします。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

java 練習問題5-4 (12/2)

calcTriangleAreaメゾットで 三角形の面積(bottom と height)求めて返す calcCircleAreaメゾットで 円の面積(半径 radius)求めて返す public class Main { public static void main(String[] args) { double triangleArea = calcTriangleArea(10.0, 5.0); System.out.println("三角形の面積:" + triangleArea + "平方cm"); double circleArea = calcCircleArea(5.0); System.out.println("円の面積:" + circleArea + "平方cm"); } public static double calcTriangleArea(double bottom, double height) { double area = (bottom * height) / 2; return area; } public static double calcCircleArea(double radius) { double area = radius * radius * 3.14; return area; } }
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

すっきりjavaでわからなかったとこ5−13

戻り値が配列の時 public class Main { public static int[] makeArray(int size) { //int[]で配列を作る   int[] newArray = new int[size];   for (int i = 0; i < newArray.length; i++ ) {  newArray[i] = i;   }  return newArray; } public static void main(String[] args) { //makeArray(3)を実行して int[] array = makeArray(3); //結果を int i をarrayに変換する for (int i : array) { System.out.println(i); } } }
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Minecraft Java Edition 1.18 サーバ側のバージョンアップの備忘録

はじめに こんにちは withでエンジニアをしているhayatonです。(最近入社したのでピチピチの若手です。) withでは サーバ周りのお仕事をさせてもらっています。 今回、アドベントカレンダーで記事を書かせていただくこととなり、何を書こうかと悩んでいたところに、 Minecraftの大型アップデートがきた。ということもあり、その内容を記事にさせていただきました。 このドキュメントはマイクラサーバの構築手順ではありません。バージョンアップ作業にフォーカスをおいたものです。 私は、マイクラ(Minecraft JavaEdition 1.11ぐらいから)にハマっています。(公共事業大好き勢) 一人だけでは飽き足らず、自前でサーバを構築し友人同士と同じ世界で楽しんでおります。(鯖管兼任) そのサーバのアップデートについて 自分の作業備忘録 気づいたポイント(3つ) の2点についてこの記事に記載します。 割と定期的にあるバージョンアップ作業なのですが、忘れがちなので、次のバージョンアップ向け自分用メモだったりしますが、 もしこの記事を読んで、何かしらで詰まっている方の解決への気づきなどが提供できたら嬉しいなと思い、書いてます。 私のサーバ環境情報 AWS Lightsail Memory/CPU/Disk: 4GM RAM / 2 vCPU / 80GB SSD OS: Debian Mod: none(vanilla) Backup: Daily(to GoogleCloud CloudStorage) java path: /usr/local/java minecraft path: /home/minecraft 作業ユーザー: minecraft 作業備忘録(バージョンアップ作業) 1. 稼働させるJavaのバージョンの変更 以前のminecraft 1.17.1 は、稼働条件のJavaバージョンは16でした。 今回のminecraft 1.18は、Javaバージョンが17になっています。(今回一緒にバージョンアップしています。) ちなみに、この環境はopenjdkで稼働させていますが、JavaSEでもちゃんと動くと思います。 [0] 作業ユーザーになる $ su minecraft [1] java17のダウンロード $ wget "https://download.java.net/java/GA/jdk17.0.1/2a2082e5a09d4267845be086888add4f/1 2/GPL/openjdk-17.0.1_linux-x64_bin.tar.gz" [2] 展開し、Javaをインストール 私の環境では、/usr/local/java で使いたいJavaをシンボリックリンク張っている。 ※ alternatives使うのがベストだろうけど許してください。 lrwxrwxrwx 1 root root 10 Dec 1 02:07 java -> jdk-16.0.1 drwxr-xr-x 8 minecraft minecraft 4096 Jun 25 22:57 jdk-16.0.1 なので、 $ tar zxvf openjdk-17.0.1_linux-x64_bin.tar.gz $ sudo mv jdk-17.0.1 /usr/local/. $ cd /usr/local $ sudo rm java $ sudo ln -s /usr/local/jdk-17.0.1 java $ ls -la /usr/local ... lrwxrwxrwx 1 root root 10 Dec 1 02:07 java -> jdk-17.0.1 drwxr-xr-x 8 minecraft minecraft 4096 Jun 25 22:57 jdk-16.0.1 drwxr-xr-x 8 minecraft minecraft 4096 Dec 1 02:07 jdk-17.0.1 ... として、インストール完了後、確認。 $ /usr/local/java/bin/java --version openjdk 17.0.1 2021-10-19 OpenJDK Runtime Environment (build 17.0.1+12-39) OpenJDK 64-Bit Server VM (build 17.0.1+12-39, mixed mode, sharing) となればOK。 2. minecraftサーバ用jarファイルのダウンロード及び設置(インストール) [1] minecraftサーバ用jarファイルをダウンロード $ wget "https://launcher.mojang.com/v1/objects/3cf24a8694aca6267883b17d934efacc5e44440d/server.jar" $ mv server.jar minecraft_server.1.18.jar [2] jarファイルをセット 私の環境では/home/minecraft に設置してある。 現在は以下のように、バージョンアップごとにシンボリックリンクを張り直しをしている -rw-r--r-- 1 minecraft minecraft 43626592 Jul 6 21:05 minecraft_server.1.17.1.jar -rw-r--r-- 1 minecraft minecraft 43621201 Jun 8 20:03 minecraft_server.1.17.jar lrwxrwxrwx 1 minecraft minecraft 25 Dec 1 01:54 minecraft_server.jar -> minecraft_s erver.1.17.1.jar なので $ mv minecraft_server.1.18.jar /home/minecraft/. $ cd /home/minecraft $ rm minecraft_server.jar $ ln -s minecraft_server.1.18.jar minecraft_server.jar $ ls -la ... -rw-r--r-- 1 minecraft minecraft 43626592 Jul 6 21:05 minecraft_server.1.17.1.jar -rw-r--r-- 1 minecraft minecraft 43621201 Jun 8 20:03 minecraft_server.1.17.jar -rw-r--r-- 1 minecraft minecraft 46323386 Nov 30 18:20 minecraft_server.1.18.jar lrwxrwxrwx 1 minecraft minecraft 25 Dec 1 01:54 minecraft_server.jar -> minecraft_s erver.1.18.jar ... とする。 3. 起動前にワールドデータをバックアップとっておく バックアップとっておく 壊れたことはないが、癖でやっています。(癖をつけておくの大事) バックアップ取る際、どのバージョンだったかを一緒につけると便利かも $ cd /home/minecraft $ cp -rp world world_1.17.1 4. 起動 起動 私の環境では、systemctl組み込み済み $ sudo systemctl status minecraft $ sudo systemctl start minecraft $ tail -F logs/latest.log [02:08:39] [Worker-Main-2/INFO]: Loaded 7 recipes [02:08:40] [Worker-Main-2/INFO]: Loaded 1141 advancements [02:08:43] [Server thread/INFO]: Starting minecraft server version 1.18 [02:08:43] [Server thread/INFO]: Loading properties [02:08:43] [Server thread/INFO]: Default game type: SURVIVAL [02:08:43] [Server thread/INFO]: Generating keypair [02:08:44] [Server thread/INFO]: Starting Minecraft server on *:25565 [02:08:44] [Server thread/INFO]: Using epoll channel type [02:08:44] [Server thread/INFO]: Preparing level "world" [02:08:44] [Server thread/INFO]: Preparing start region for dimension minecraft:overworld とか出てきたらOK。 しっかりと、1.18で稼働したよというログも出てますね。 気づいたポイント [1] バージョンアップ後の初期起動に時間がかかる。 今回のアップデート直後のサーバ起動にかなり時間がかかった印象。(クラッシュしたかと一瞬思った。) 時間がかかっていても、強制終了しないでね。 [02:10:32] [Server thread/INFO]: Done (108.070s)! For help, type "help" 約2分弱ですね。 [2] リリース直後はサーバサイドのJarファイルが1つ前になっていることがある。 (地味にハマった) https://www.minecraft.net/ja-jp/download/server このページが1.18対応したという表記になった直後にjarファイルをダウンロードしたが、 jarファイルを入れ替えして、さぁ起動だ!といったタイミングでずっとログに1.17.1がスタートしたよと出ていた。 [01:49:31] [Server thread/INFO]: Starting minecraft server version 1.17.1 いやいや、新しいの持ってきたんだけどなぁとドハマリしていたが、 以前のjarファイルとハッシュ値を比較した際に、同じ値となっており、古いものをダウンロードしていたことが発覚。 再度上記のサイトにアクセスし、新しいものに変わっていることを確認し、入れ替え作業を行った。 リリース直後はWeb表記は変わっているが、ダウンロードしてきたjarファイルは古いこともある。 以前のjarファイルとダウンロードしてきたjarファイルのmd5値をチェックして、変わっているかどうかを確認するとスマートかもしれない。 [3] 遠くに離れなくても、新要素が反映されている。 (これが今回一番すごいことだと思う。) これは、技術的な話じゃなく、ゲーム上の話なのですが、、、 いままでは、ワールド情報をバージョンアップ前のものから引き継ぐと遠い場所まで移動しないとアップデート内容が確認できないのが普通でした。 (いままでに読んでいないチャンクまで行かないと新要素が発生しなかった。) が、今回のアップデートはいままでに読まれていたチャンクでも、地下に行くことで新要素の確認が出来ました。これが一番の驚きでした。 マイクラ開発スタッフの方々ありがとう・・・・そしてお疲れさまです。。。。。(脱帽) 最後に この記事を最後まで読んでいただいてありがとうございます。 一応バージョンアップしてから今のところは問題が起きていませんが、なにか起きているようであればまた記事書こうと思います。 この記事は、自分の作業の備忘録が主目的ではありますが、 もしなにか躓いている方が、この記事を読んで、お役に立てる何かが見つかったら嬉しいです。 師走で忙しくなってくる時期に、マイクラのこんな大型アップデートをかけてくるなんて、 マイクラ開発スタッフの方々も鬼(warden)ですね!!笑
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

midPointとIGA

今年もこの季節がやってまいりました。本年もOpenStandiaでAdvent Calendarを書いていきます。今年は特にテーマは決めずOpenStandiaのメンバが興味のある技術について25日間書いていきますのでよろしくお付き合いください! midPointについて ということで、1日目はmidPointの話題です。midPointについては、一昨年のAdvent Calendar、昨年のAdvent Calendar、その他、折に触れて、OpenStandiaメンバが記事投稿しているのでご存知の方も多いかもしれません。 2019年のAdvent Calendar https://qiita.com/advent-calendar/2019/midpoint-by-openstandia 2020年のAdvent Calendar https://qiita.com/advent-calendar/2020/nri-openstandia また、最近ですと、クラウドネイティブさん主催の須藤あどみん対談でご紹介させてもらって知って頂いた方もいるかもしれません。 2021年10月29日公開 midPoint VS 須藤あどみん https://www.youtube.com/watch?v=Bd4tRJz9vjI IGAについて midPointの説明をする際に、オープンソースのIGAプラットフォームであるという言葉をよく使います。IGAという言葉もこの1年ですごく広まったような実感がありますが、 ・これまでのID管理と何が違うの? ・実際の製品の機能なの? という疑問がわくこともあると思います。 OpenStandiaチームではよく下記のようなベン図を使ってIGAの概念を説明しています。 Evolveum社から見たIGA midPointの開発元であるEvolveum社は最近ドキュメントの整備に力を入れており、各種技術ドキュメントを以下のページに集約しています。 https://docs.evolveum.com/ 上記の中でIGAの説明、midPointの説明についてわかりやすい解説ページを公開していますのでここで紹介させて頂きます。 https://docs.evolveum.com/iam/iga/ このページをご一読と頂くとIGAって何なの?がさらに少しすっきりするかもしれません(少なくとも私はふむふむとなりました)。ここではArchitectureセクションを抜粋して日本語訳にて内容をご紹介したいと思います。 Identity governance and administration (IGA) systems are part of IT infrastructure layer. They provide essential services, managing and monitoring identity-related information in applications and identity data stores. IGA systems are policing identity data, making sure that they are up-to-date and consistent, applying policies, detecting identity-related security issues, assessing identity-related risk and provide essential visibility and analytics functions. (日本語訳) IDガバナンス&管理(IGA)システムは、ITインフラストラクチャ層の一部です。 これらは重要なサービスを提供し、アプリケーションおよびIDデータストア内のID関連情報を管理および監視します。IGAシステムは、IDデータのポリシー定義を可能にします。IDデータが最新で一貫していることを確認し、ポリシー適用し、ID関連のセキュリティ問題を検出し、ID関連のリスクを評価し、必要不可欠な可視性と分析機能を提供します。 IGA platform has two primary functions, which result in two primary data flows: (日本語訳) IGAプラットフォームには2つの主要な機能があり、その結果、2つの主要なデータフローを実現します。 Identity administration (identity management) is focused on management of user accounts and entitlements, often based on authoritative data, such as data from the human resource (HR) system. In order to fulfill this function, IGA platform has to read data from source systems (e.g. HR), process them, and write data to target systems (e.g LDAP, Active Directory and applications). (日本語訳) ID管理は、ユーザーアカウントと資格の管理に重点を置いており、多くの場合、人事(HR)システムからのデータなどの信頼できるデータに基づいています。この機能を実行するために、IGAプラットフォームは、源泉システム(HRなど)からデータを読み取り、それらを処理し、ターゲットシステム(LDAP、Active Directory、アプリケーションなど)にデータを書き込む必要があります。 Identity governance is focused on application of policies on identity data, driving identity-related processes, gathering identity and entitlement information, analyzing it, assessing the risks and suggesting policy improvements. In order to fulfill this function, IGA platform needs (direct) read access to all connected systems, retrieving and analysing all identity-related data (accounts, groups, roles and other entitlements, organizational structures and so on). IGA platform occasionally writes the information, e.g. in order to remedy policy violations (e.g. disabling access for orphaned account). (日本語訳) IDガバナンスは、IDデータへのポリシーの適用、ID関連のプロセスの推進、IDおよび資格情報の収集、分析、リスクの評価、およびポリシーの改善の提案に重点を置いています。この機能を実行するために、IGAプラットフォームは、接続されているすべてのシステムへの(直接)読み取りアクセス、すべてのID関連データ(アカウント、グループ、役割、その他の資格、組織構造など)の取得と分析を必要とします。 IGAプラットフォームは上記を実現するため情報を書き込むことがあります(例、孤立したアカウントへのアクセスを無効にするなどポリシー違反を修正するため)。 いかがでしょうか?IGAが従来のID管理にガバナンス面の考え方をアドオンして整理された概念であることがわかりやすく記述されているかと思います。 あともう1つID管理とIDガバナンスの違いを表形式でシンプルに説明したページがあるのでこちらもご紹介させて頂きます。 ID管理、IDガバナンスをターゲットレイヤ(テクノロジー v.s. ビジネス)やターゲットユーザなどの観点で端的に整理した非常にわかりやすい表現だなと思っています。 IGAを実現するmidPointの機能について 昨今、様々なベンダからIGAに対応したサービスやソリューション、プロダクトが提供されています(もちろんmidPointもその1つです)。この種の製品群の比較をするにあたり比較軸に困ることが多いと感じていました。IGAの10要素を機能比較軸にすればどの製品にも"○"がついてよくわからないという話です。Evolveum社もこのことは理解していて、IGA⇒IGAを実現する仕組み(いわゆる製品機能)は1対1でマッピングできるようなものではないと説明しています。 IGA capabilities described above provide "tangible" functions, functionality that is obvious to users of the system. However, there are many mechanisms and underlying infrastructure that is used to implement such functions. Following mechanisms are difficult to categorize to any specific capability, as they are almost always reused by many capabilities. (日本語訳) IGA機能は、システムユーザーにとって明らかに「具体的な」機能を提供します。 そして、IGAを実装するために、多くのメカニズムと基盤となるインフラストラクチャが存在します。これらのメカニズムは多くの機能で再利用されるため、特定の機能に分類するのは困難です。 midPointでは下記の仕組みを使ってIGA機能群を実装しています。これらの仕組みについてこれまでのQiita投稿でご紹介できている部分もあればまだ全くご紹介できていない部分もあります。今年のアドベントカレンダーなどでもいくつかご紹介できるかもしれませんので楽しみにしてください! Generic Mechanisms and Infrastructure Attribute mapping Expressions Schema management Identity connectors Customization mechanisms Services (API) and integration Logging and diagnostics Related Capabilities Access control evaluation and enforcement Organizational structure management Personal data protection 最後に それでは25日間、よろしくお願いいたします!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む