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

Java Security Managerを有効にしてSpring Bootを起動する

Spring BootをJavaのSecurity Managerと一緒に起動することで、お手軽にサンドボックス化できます。例えば外部から送られてくるスクリプトをアプリケーション上で実行しなきゃいけないけど、セキュリティが不安な時とか。 2021/05/17 2:07 JST: 実際に試してみたら工夫が必要だったので説明を加えました。 見切り発車で書いてました。ごめんなさい。 Java Security Manager JavaのSecurity Managerという機能を有効にすると、プログラムが実行してもよい操作を制限することができます。例えばファイルや環境変数の読み書き、ネットワークへの接続など、想定外の挙動をした場合にそれを検知して、失敗させることができます。 許可する権限はポリシーファイルというものに書き連ねます。 example.policy grant { // 全て許可する permission java.security.AllPermission; }; そして、Javaを実行する際に-Djava.security.managerと-Djava.security.policyオプションも付けます。-Djava.security.managerだけの場合は、デフォルトのポリシーファイルが使用されます。 java -Djava.security.manager -Djava.security.policy=example.policy Spring BootでSecurity Managerを有効にする Spring Bootと一緒にSecurity Managerを使おうとするとすこし工夫が必要になります。 準備 ポリシーはパッケージや個別クラスごとに設定ができず、jarやjarのあるディレクトリごとにしかできません。従って、Spring Bootの入ってるjarにはすべてを許可し(そうしないとTomcatとか諸々起動しない)、制限したいプログラムは外部のjarにまとめる必要があります。 イメージとしてこんな感じ。 ./ ├─ libs/ <== 制限したいプログラムをいれる場所 │ └─ myutils.jar ├─ example.policy └─ my_application.jar <== Spring Bootの実行可能jar Gradleを使っている人はcompileOnly filesで外部jarを指定すれば、Spring Boot側のコンパイルが通ります。 build.gradle dependencies { ... compileOnly files('libs/myutils.jar') } ポリシーはこんな感じになります。 example.policy grant codeBase "file:my_application.jar" { // Spring Bootアプリケーションには全て許可する permission java.security.AllPermission; }; grant codeBase "file:libs/*" { // 例: libs内のjarには、my_test.txtの読み書きだけ許可する permission java.io.FilePermission "C:/my_test.txt", "read,write"; }; Spring Bootを実行する際に追加のクラスパスを指定する方法として、PropertiesLauncherが使えます。 以下のコマンドのように、Spring Bootを実行する際に-Dloader.pathで追加のクラスパスlibs/を設定して起動します。 java -cp my_application.jar -Dloader.path=libs/ org.springframework.boot.loader.PropertiesLauncher Security Managerのオプションも付ければ完成! java -cp my_application.jar -Djava.security.manager -Djava.security.policy=example.policy -Dloader.path=libs/ org.springframework.boot.loader.PropertiesLauncher 実行 これで良さそうなんですが、JDK 15でやるとなんかエラーが出ます。 $ java -version java version "15.0.1" 2020-10-20 Java(TM) SE Runtime Environment (build 15.0.1+9-18) Java HotSpot(TM) 64-Bit Server VM (build 15.0.1+9-18, mixed mode, sharing) $ java -cp my_application.jar -Djava.security.manager -Djava.security.policy=example.policy -Dloader.path=libs/ org.springframework.boot.loader.PropertiesLauncher Exception in thread "main" java.lang.ClassNotFoundException: com.github.otoiku.Application at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:435) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:589) at org.springframework.boot.loader.LaunchedURLClassLoader.loadClass(LaunchedURLClassLoader.java:151) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522) at java.base/java.lang.Class.forName0(Native Method) at java.base/java.lang.Class.forName(Class.java:468) at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:46) at org.springframework.boot.loader.Launcher.launch(Launcher.java:107) at org.springframework.boot.loader.Launcher.launch(Launcher.java:58) at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:88) JDK 11以上の場合 結論から言えば、-Dsun.misc.URLClassPath.disableJarCheckingオプションも付けると直ります。 $ java -cp my_application.jar -Djava.security.manager -Dsun.misc.URLClassPath.disableJarChecking -Djava.security.policy=example.policy -Dloader.path=libs/ org.springframework.boot.loader.PropertiesLauncher なにやらJDK 11時代からあるSpring Bootのバグらしく、GitHubに報告されてから2年近くたった今も直っていません(2021年5月現在)。 https://stackoverflow.com/questions/54063602/springboot-on-open-jdk-11-classnotfound-errors-when-securitymanager-is-activ https://github.com/spring-projects/spring-boot/issues/17796 https://github.com/spring-projects/spring-boot/issues/25538
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

2021年 給料が一番高いプログラミング言語 5選

多くの人が高給のためにプログラミング業界を選びますが、世界で最も収益性の高いプログラミング言語は何か知っていますか? 1)Java 「Javaは時代遅れですか?」と尋ねるかもしれません。もちろん、そうではありません。 なぜJavaはまだ人気があるのですか?Javaは最も古く、堅牢なプログラミング言語の1つです。また、主にAndroidアプリケーション開発に使用されるオブジェクト指向言語です。これが、今日でも使用されている主な理由の1つです。しかし、Kotlin(Android開発にも適しています)のようなプログラミング言語の出現により、Javaの人気は低下しています。 ただし、Javaは依然として最も高額なプログラミング言語の1つであり、かなりの需要があります。Indeedによると、ソフトウェア開発会社はJava開発者に興味があり、毎年10万ドル以上の給料を支払う。 2)Swift Swift iOSアプリケーション開発は現在非常に人気があります。Swiftは非常に安定したプログラミング言語であり、勉強する価値があります。Javaに比べて、習得しやすいです。YouTubeには、学習に役立つリソースがたくさんあり、それを使ったプログラミングも楽しいものです。今Swiftの自由開発者であると、或いは関する仕事を従業すると、年給11.5万ドルに達する可能もあります。 3)SQL SQLまたはSequelは構造的な検索言語です。実際にはプログラミング言語ではないと思う人がいます。SQLは主にデータの管理とインタラクティブに用いられる。ですから、SQLはプログラミングに欠かせないスキルであり、どのタイプのWeb開発(バックエンドまたはフルスタック)でも、データを管理するためにそれを学ぶ必要があります。統計によると、SQL開発者の平均年収は9万ドルを超えています。 4)JavaScript これは不思議なプログラミング言語で、一部の人はそれが一番いいと思っています。JavaScriptは非常に人気のある言語です。GitHubをチェックすると、JavaScriptをサポートする新しいフレームワークが常に表示されます。さらに、すべてのブラウザはJavaScriptをサポートします。したがって、JavaScriptを習得することは、ソフトウェア開発に把握しなければならないスキルの一つであると言えます。JavaScript開発者は、9万ドルから11.3万ドルの範囲の収入を得ることができます。 5)Python GoogleトレンドとPyPI人気指数によると、Pythonは世界で最も人気のあるプログラミング言語の1つであり、確かに最も高額なプログラミング言語の1つです。GoogleはPythonで構築され、YouTubeもPythonで開発されました。 Pythonの驚くべき点は、汎用プログラミング言語であり、幅広いアプリケーションを構築するために使われています。更に人工知能に活躍しています。自動運転車、ウォルマートの自動精算、多くの自動化とマシン学習(ML)アプリはPythonを通じて開発されました。これはこの言語をより重要にし、急速に普及させます。さらに、Pythonは他のすべての言語よりも習得が容易であり、初心者にも優しいです。 また、複雑なアプリケーションを比較的簡単かつ迅速に構築することもできます。米国では、Python開発者の平均給与は約7.8万ドルですが、経験豊富な開発者は12.2万ドルにもなります。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Kotlin学習記②

はじめに 今回はKotlinのデータ型についてJavaとの比較を交えながらまとめたいと思います。 記事投稿の経緯 Kotlinのデータ型はIntなどが存在するが、Javaにはint,Integerの2パターンが存在する。(プリミティブ型と参照型) そこで、Kotlinのデータ型がJavaのデータ型とどのように対応しているのかについて疑問を持ち、調査することにした。 実装 IntelliJ IDEAを用いてKotlinコードからJavaコードにDecompileして確認してみる。 Tools > Kotlin > Show Kotlin Bytecode > 「Decompile」ボタンクリック import kotlin.jvm.JvmStatic class KotlinDecompile { fun foo(): Int { return 1 } fun foo2(): Double { return 1.0 } fun foo3(): Boolean { return true } fun foo4(): Char { return 'a' } fun foo5(): Int? { return 1 } fun foo6(): Double? { return 1.0 } fun foo7(): Boolean? { return true } fun foo8(): Char? { return 'a' } fun foo9(): Array<String> { return arrayOf("a") } fun foo10(): List<String> { return listOf("a") } fun foo11(): String { return "a" } companion object { @JvmStatic fun main(args: Array<String>) { } } } import java.util.List; import kotlin.Metadata; import kotlin.collections.CollectionsKt; import kotlin.jvm.JvmStatic; import kotlin.jvm.internal.DefaultConstructorMarker; import kotlin.jvm.internal.Intrinsics; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; public final class KotlinDecompile { @NotNull public static final KotlinDecompile.Companion Companion = new KotlinDecompile.Companion((DefaultConstructorMarker)null); public final int foo() { return 1; } public final double foo2() { return 1.0D; } public final boolean foo3() { return true; } public final char foo4() { return 'a'; } @Nullable public final Integer foo5() { return 1; } @Nullable public final Double foo6() { return 1.0D; } @Nullable public final Boolean foo7() { return true; } @Nullable public final Character foo8() { return 'a'; } @NotNull public final String[] foo9() { return new String[]{"a"}; } @NotNull public final List foo10() { return CollectionsKt.listOf(new String[]{"a"}); } @NotNull public final String foo11() { return "a"; } @JvmStatic public static final void main(@NotNull String[] args) { Companion.main(args); } } ※今回はデータ型の比較のみを行いたいため、一部コードを省略しています。 まとめ 以下のような関係性になると考えられる。 Kotlin Java Int int Double double Boolean boolean Char char Int? Integer Double? Double Boolean? Boolean Char? Character Array [] List List 参考記事
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

図解で解説!! Apache、Tomcatってなんなの?

ログイン画面出ているのに404になった。 そこで、関連してくるApacheとTomcatについて書いていこうと思います! はじめに Apacheってなんだ?! Tomcatってなんだ?! お前達は一体どこにいるんだ?! 何をしてるんだ?! そんなApacheとTomcatの疑問に関してまとめていきます。 ※概念部分のみで、以降には技術的なコードを書いてませんのでご了承を...   環境 OS macOS Catalina バージョン10.15.7     Apacheって何? Webサーバ用のソフトのこと 正式名称はApache HTTP Serverという 世界中で最も使用されているWebサーバソフト   Webサーバって何? ブラウザからのHTTPリクエストに対して、HTMLファイルなどをレスポンスとして返してくれるサーバのこと   今回でいうとPCなどにApacheというWebサーバ用のソフトを入れることでWebサーバになる!   Tomcatって何? APPサーバ(アプリケーション) Java Servletを動かす時に使うソフトでWebコンテナのこと(サーブレットコンテナとも言う) 簡易的なWebサーバとしての機能も持っている 正式名称はApache Tomcatという   ここで疑問に思うことがありますよね! ・ ApacheはWebサーバ用のソフト ・ Tomcatも簡易的なWebサーバとしての機能も持っている   • • • ?? だったら、Tomcatあれば、Apache要らなくね?! という疑問。。 ここからはタイトルにもあった通り、図解での説明に入ります!! 図解で説明 1. まずは全体のイメージを掴む 【 全体図から分かること 】 クライアントはWEBサーバに対してリクエストを送るので、ApacheとTomcatがある場合にクライアントと最初に繋がるのはApacheになる リクエストに対してApacheからWebアプリケーションを動作させるための実行環境であるTomcatへ必要な処理を要求する DBとTomcatの間にJAVAが有り、そのJAVAがDBをたたきにいったり、必要なテンプレートを作成したりしている。(TomcatがDBをたたきにいくわけではないということ)     次は、簡易的なWebサーバとしての機能も持っているTomcatあれば、Apache要らなくね?! という疑問を考えてみる。 ここは、エンジニアの先輩がめちゃくちゃわかりやすく教えてくれたので、その例えを使って書いていきます!!   2.Apacheがないとどうなるのか? ホール担当のバイト(Apacheさん)と、ホールもキッチンもできるオーナー(Tomcatさん)のお話 【 少々のリクエスト&レスポンスなら対応できる 】 クライアントからの少ない注文に対しては対応できる!!   メニューに無い注文がきたらそんなもんうちには無い!!と対応できる(404エラー)     【 沢山のリクエストが来てそのレスポンスを返さなくてはいけない場合どうなる? 】 当然...負担がかかることでレスポンスが遅くなり、ダウンする原因に。。     3. Apache入れるとどうなるのか? ・ 設定の柔軟性、拡張性が高くなる ・ サーバ負荷を減らすことで、Js、CSS,HTMLの静的コンテンツが高速化できる (条件によってはTomcatだけの方が早い時もあるみたい)       4. ついでに図から404と500番系のエラーを考える 【 Not Found 404エラー】 〜 クライアント側に問題あり 〜 Apacheのリソースに無い、クライアント側の無茶振りな注文には404エラーを出す       【 Internal Server Error 500系のエラー】 〜 サーバー側に問題あり 〜 クライアント側の要求は良いけど、サーバ側に不具合がある場合に500系のエラーを出す     【 エラー出る場所を切り分ける】 ちなみに、 Webサーバで出る404の特徴、Webコンテナで出る404特徴があります。 【 Apacheがあかん時 のNot Found 404エラー】 みんな大嫌いな真っ赤っかのエラーが出る  ブラウザがあかんのでリクエスト関連を見るべし! 【 Tomcatがあかん時 のNot Found 404エラー】 下のような紺色のエラーが出る 【 JAVAがあかん時 のNot Found 404エラー】 (例) ログイン画面は表示できているけど、ログインボタン押すと404が発生する時など おまけ ちなみに、Apache以外のWebサーバ用のソフトっていうとこんなのがあるみたい IIS(アイアイエス) : Windowsの標準Webサーバソフト nginx(エンジンエックス) : 大規模システムに使われるWebサーバソフト          ApacheとNginxの使い分けって? Apache Nginx アクセス急増時のサーバーへの負荷 いっきに負荷増 アクセスに比例して負荷は急激に増えない その結果Webサーバーの動き 遅くなり、ダウンしやすくなる 処理速度は維持し、ダウンしにくい ※RailsだとNginxが使われることが多い.....みたい。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む