★★Java質問・相談スレッド181★★
■ このスレッドは過去ログ倉庫に格納されています
プログラミング言語Javaに関する質問スレです。 JavaScript, Ajaxの質問は、ここでは受け付けていません。 Web製作管理 http://pc11.2ch.net/hp/ Webプログラミング http://pc11.2ch.net/php/ をご利用下さい。 よくある質問 ・「コマンドまたはファイル名が違います」 「'javac' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。」 「Exception in thread "main" java.lang.NoClassDefFoundError: 」 (p)ttp://www.wikiroom.com/java/?path,classpath ・「\12288 は不正な文字です。」 文字リテラル以外で全角スペースは使えません。半角スペースに。 ・その他の質問→「APIのjavadoc見ろ」 ・String に == は使うな。equals() を使え。※ 質問時の心得 ・コンパイルエラーか実行時エラーか、エラーではないが意図しない動作なのかはっきりしろ。あとエラーメッセージちゃんと読め。 ・前提条件としてOS、開発環境、バージョン、使用フレームワーク等を明記。 前スレ ★★Java質問・相談スレッド180★★ https://mevius.5ch.net/test/read.cgi/tech/1492780397/ 通常プロセスはOS側で管理するべきと思ってるからあまり考えたことないな どうしてもやりたいなら通信を管理するプロセスを作れば良い つまり>>643 アンドロイドアプリを作りたいのですが 数か月の間、メンターになってくえれる人を探そうと思ったら どんなサイトで募集すればいいのでしょうか? メンターなんて言葉一般的に使うの? 自己啓発セミナーみたいでいやだなあ あ、ボクはアナルオナニーインストラクターです 基本料金1か月3万円でお願いします あとはオファーにより別途請求というシステムで マンツーマンで教えるとなると時給の最低ラインは3000円だから 月3万円だと月10時間、1日15分ぐらいだな 専属の人を雇うとなると家庭教師雇うみたいなもんだから高くなるのではないか? 本やネットで調べながらでも何れはできるようになる事についてそこまで投資する必要があるのか? 何らかの期限があるなどして早く覚えないとまずいということか? synchronizedListはイテレータがスレッドセーフじゃないといいますが for(int i=0;i<list.size();i++) Element e = list.get(i); もしsizeの増減が無い場合、こんな書き方はスレッドセーフに全要素にアクセスできますか? できません sizeを確認してからgetするまでに要素数が変化する可能性を排除できていません それはサイズが既知でgetしか使ってないのと同じで安全 ていうか要素が変化しないならスレッドセーフではないLinkedListでさえ安全に使えるでしょ https://github.com/OpenHFT/Chronicle-Network ここに出てくる"Wire"ってどういう意味ですか? WireTextだの、WireEchoだの。 たぶんプログラミング界隈の用語だと思うんですが ネットワークを繋ぐ線の概念なんじゃないかな 知らんけど、それっぽいと思った meta -> meta.write(() -> "tid") こういう記法は何を意味しますか? (arg) -> code みたいなのはラムダ式の説明で出てきますけど、metaはカッコがついていません Wire Message = 電報 ⇒ 通信されるデータ WireType.TEXTとかWireType.BINARYがあるから、たぶんまさにそれだけの意味。 Network = Wireくらいの意味でこの人は使ってそうです。 >>660 引数が1つのときはカッコを省略できるんよ 数千もの通信を同時処理する高性能なネットワークライブラリを探してるんですが、 何が良いんでしょう?Nettyは内容が難しすぎるんですが・・・。 難しいというか、必要としてるのは単にバイナリを送受信できればいいだけなので、 無駄に高機能過ぎる。 しかし、KeepAliveとか、サーバーが常駐してメッセージを受信してイベント起動、 とかは必要で。ネットワークライブラリの中身なにやってるかあまり詳しくないんですが。 Chronicle-Networkも良く分からない。 // the tid must be unique, final long tid = tcpChannelHub.nextUniqueTransaction(System.currentTimeMillis()); System.currentTimeMillis()を使ったら、複数クライアントにおいてtidが重複するけど、 それでユニークといっていいのかどうか。 ちょっと情報が少なすぎるのでこれも無理そう。高速らしいんですが Kryonetは、性能不足ですね。アップデートもされてません。 やはりNettyを頑張るしかないかもしれません。 >This comes at the cost of scalability for large number os connections. In this situation, this library should perform at least as well as netty. これは多数のコンピューターからの同時接続ではNettyと同等の性能しかでない、 ということでしょうか? 想定してるのは1コンピューターとの高速な通信ということでしょうか。 やっぱり高性能なJavaのネットワーキングライブラリはNettyが有力のようです。 あと、Wire Messageは、たぶん「頭4バイトにINT入れて、次8バイトにLONG入れて」みたいな バイト配列にデータを敷き詰めてく感じの行為をWireというのだろうと。 PooledUnsafeDirectByteBufとは何ですか? Handlerでbyte[]やByteBufなどクラスを限定できますが、 単にbyte[]を使うことと比べてByteBufやPooledUnsafeDirectByteBufは何かメリットがありますか? どうやら単にbyte[]を送りたい場合でもByteBufを通すのが普通みたいですね でもそれだとByteBufを作るときもそこからbyte[]を読み取るときもコピー操作があるようで遅そうです 通信に比べればメモリ操作による遅れは微々たるものかもしれませんが Nettyより高速と謳うライブラリがありますがやはりバッファ周りの問題を指摘してましたが これですかね ソース読んではいないけど、byte[]のWrapperなんじゃないの? 渡されたbyte[]を丸々コピーするような、あなたのような超初心者な実装はしていないと思うよw そもそも、byte[]で送るといっても、自分でBufferのサイズを決めたり、通信環境を考慮したり、いろいろやらなきゃいけない。 だから、そういった最適化をByteBufのサブクラスたちは提供してくれているのでしょう。 こういうコードがあった時、logが呼ばれてもデバッグモードでなければ 意味が無いけど、AnyHeavyMethodは計算されちゃうんでしょうか。 それとも最適化で実行されませんか? //in some method log(""+AnyHeavyNoEffectMethod(o)); public void log(String s){ if(isDebugMode()) System.out.println(s); } JITコンパイラは副作用がないことをどこまで調べるんだろうね >>671 isDebugModeの返す値が定数で、かつそこに登場してる全てのメソッドがインライン展開されれば実行されないんじゃない? Javaって基本的に大規模アプリケーションに最適化されてて、局所的な速度よりも全体的な安定性やメモリ消費量を重視する傾向があるから、 あまり最適化には期待しないほうがいいよ AnyHeavyNoEffectMethodが重い処理で、Java8以降ならラムダ式使うんじゃね? log(() -> "" + AnyHeavyNoEffectMethod(o)); public viod log(Supplier<String> s){ if (isDebugMode()) System.out.println(s.get()); // ここでAnyHeavyNoEffectMethodが実行される } いいね。そっくりそのままDecoratorにもなってるからすっきりする。 それJavaの場合はラムダ内で外のミューダブルな変数を参照できないから微妙 どーーしても必要なら、観測したい変数をHeapに逃がせばいい(オブジェクトにぶら下げるとか)わけだけど。 Functional信者は怒りMaxだろうな。 >>678 そう思うだろ? これでコンパイルエラーなんだよね int x = 1; log(() -> x); x += hoge(); log(() -> x); >>679 完全に使い方の問題だし、マルチスレッドの問題もあるし。 JavaScriptとかできちゃうけど、それやってどうなってもしらないぞ、と。 ログなら普通にある状況だろ それを使い方の問題というならラムダをログに使うという>>674 の発想が間違ってるわ ないよ。AOPとかDecoratorとか、ラムダが登場する以前からずっとやってきている話。 ラムダはそれをちょっとエレガントにできるようにしただけ。 だから、使い方の問題なんだよ。 >>684 はミュータブルな変数を一切ログ出力してないの? 自身を持って無いと言い切れるなら偉そうなこと言っていいぞ ちなみにログ出力にJavaのラムダが適していないという話であって、ラムダがミューダブルな変数を参照できるべきだなんて誰も言ってないけど >>684 は勘違いしてる 簡単な実験コード書いてみたけど最適化されませんね。 private static final boolean debug = false; @Test public final void testOptimization() { final long start = System.currentTimeMillis(); log(anyHeavyNoEffectMethod() + ""); final long end = System.currentTimeMillis(); System.out.println((end - start) + "ms");//50ms } private static final void log(final String s) { if (debug) System.out.println(s); } private static final long anyHeavyNoEffectMethod() { final Random r = new Random(); long total = 0; int loop = 1000 * 1000; for (int i = 0; i < loop; i++) total += r.nextLong(); return total; } ラムダ式の方はanyHeavyNoEffectMethodが呼ばれません。 しかし、指摘のようにミュータブルな変数を渡せません。 log()の実装を二種類用意して使い分けていくのが妥当な気がします。 デコレーターパターンで解決できるんですか? このような頻出のパターンについてJITは最適化すべきだと思います。 たぶん、それが一番妥当な解決策です。 副作用が無い事を確認する機能は、JITに既にありそうなものです。 少なくともある程度の範囲で副作用が無い事を確認できるはずです。 どうでもいいんですがこんなパターンにはJITは最適化を見せました。 for(){ list.add(i); list.remove(i);//追加したものを即削除する } オーバーロードでいんじゃない? ログの出力ってきほんStringじゃん 匿名クラスとかでスタック領域の変数を参照できますが、匿名クラスのオブジェクトが破棄されるまでそれらは生存するということですか? public void method(Observable obs){ Object o = ...; EventHandler handler = new EventHandler(){ @Override public void handler(){ System.out.println(o); } } obs.setOnAction(handler); } >>691 気のせい 実は無名クラスの中に隠しフィールドが生成されてoの値をコピーしている ちなみにoは暗黙的にfinalになっており、後でoを書き換えようとするとコンパイルエラー そこまでするならScalaやKotlinやC#みたいに最初からoをヒープに作っちまえよと思わなくもないが、 この中途半端な仕事かJavaクォリティ >>691 そうなるよ、参照関係を図で表すとこうな感じでしょ https://light.dotup.org/uploda/light.dotup.org543719.png オレンジが変数 緑がオブジェクト メソッドを抜けてローカル変数o, handler, obsがなくなっても Observable → EventHandler → Object の参照は消えない 引数に渡してるObservableはメソッドの外で 変数から参照されてるだろうからメソッドを抜けても 破棄されないよ >>693 691が気にしてるのはローカル変数o自体の寿命でしょ 実際には無名クラスの外側にある変数oとhandlerの中で参照してる変数oは別の実体だから問題ない、が答えだよ 後者は>>692 の通り無名クラスの隠しフィールドであり、インスタンス生成時に値をコピーしている この仕様だと、後で内側または外側でoの値を書き換えてしまうと辻褄が合わなくなるから、 oを後で書き換えてはいけないという制限が必要なの ここを見るとRSA系は2048までしかありません。4096等だとRSA鍵による暗号化ができないということですか? その場合、非標準のライブラリ等で解決できますか? https://docs.oracle.com/javase/jp/8/docs/api/javax/crypto/Cipher.html RSA/ECB/PKCS1Padding (1024、2048) RSA/ECB/OAEPWithSHA-1AndMGF1Padding (1024、2048) RSA/ECB/OAEPWithSHA-256AndMGF1Padding (1024、2048) 強度の強い暗号化は輸出制限あるから気を付けてね。 うっかりノートPCにセットしたまま他国へ持って行こうとするとバレた時に大変まずいことになるかも知れない。 jre1.8の最近のバージョンでデフォルトで強度無制限になったようです。 とはいえ、java8の仕様上、2048までしかサポートする必要は無いようです。 実装によってサポートしているかもしれません。 このようなコードがあった場合、tは生存しますか? tはどこからも参照されてないとします。 //in some method Thread t = new Thread(){...}; t.start(); return; >>699 試してみた https://paiza.io/projects/PxoO2-fLSd_KfpwF5B3prA 結果からわかることは ・メソッドを抜けてもスレッドが終了するわけではない ・スレッドが終了しないならばプロセスは終了しない ・ローカル変数がなくてもスレッドを取得できる 作成したスレッドのオブジェクトはどこかに保持されるみたいね tは生存します、が答えっす threadは、main thread同様garbage collectionのrootとして扱われるそうなので、生存しまする Eclipseとかいう汚物にJavaFXを入れたく思いマーケットプレースでjavafxで出てくるe(fx)clipseをインストールしようとしたところ長時間待たされた挙句にエラーが出ました どうすればいいでしょうか? >>704 JavaFXは廃止されたから使っちゃダメ 厳密には廃止ではなく分離とされてる。 あとJava8が2020年までサポートだから、2020年までは1.8系のjreがあれば使える。 そもそもJavaの未来はどうなるのか。JREが有償化される。 OpenJDKはインストーラや自動アップデータが提供されるのか。 JavaFXは単体のライブラリとして独立できるはずだが、誰かがやるのかどうか。 現状だと、何やら面倒なインストール手順が必要なようで、 デスクトップアプリに使われるであろうJavaFXにとって致命的なはず。 mavenとかを使ってアプリに気軽に同梱できるものになればいいのだが。 JavaFX will continue to be supported in the future by the company Gluon as a downloadable module in addition to the JDK. このスレではJavaFXをオヌヌメします JavaFXをオヌヌメしないのはoracleのコウサクイン JavaでデスクトップのGUI環境自体どうなんだ? downloadable moduleってなんだろうな。 そもそも後方互換性を捨てて高速リリースとか言ってるのが怖くて仕方ない。 開発者が最新版に対応したって、エンドユーザーが最新版を持ってるか分からない。 どのバージョンに向けて作ればいいんだ? いやクロスプラットフォームGUIという概念は重要でしょ。 Java8+JavaFXは2022年までサポートされるってかいてあるな だからもう少し先の話ではあるし、人気のある環境だからそれまでに整備されるだろう。 AndroidでもJavaFX動くみたいだし、クロスプラットフォーム性という面で やはり一番優れてるよJavaは ちなみにJavaやKotlinのコードをネイティブコードにするコンパイラがあって iPhoneでもJavaやKotlinのソースコードで動かせるみたいだぞ ちょっと前までiPhone用のJVMもあったんだけどな https://www.oracle.com/technetwork/jp/java/eol-135779-ja.html Java8 個人ユーザーの公式アップデート終了日 2020-12 このときまでにOpenJDKやGluonのインストーラが登場していなければ困る。 そしてそれが自動アップデータを搭載していなければ。 ところが自動アップデータ搭載されてても、後方互換性を捨てたアップデートを勝手にされると困るw 困りまくりだ OpenJDKに自動アップデータが提供されたとする。 OpenJDKのアップデートがアプリのアップデートを先行する →勝手に互換性を捨てたアップデートが来てアプリが動かなくなる。 アプリを最新版に対応してリリースしてもアプリのアップデータは動かないw アプリのアップデートが先行する →エンドユーザーのOpenJDKが古くて動作しない だから、互換性を捨てて高速リリースとかいってるのはほとんど意図的なJava界隈への攻撃。 一番欲しいのは、Java8のサポート継続&自動アップデート継続&互換性の維持。 APIを変更するならdeprecatedの期間をある程度とってくれないと無理。 高速リリースがうれしい人が居るのか? .netと同じ道を歩んでるようにみえて microsoftの.netはMITライセンス OpenJDKのリンク例外つきGPLは十分だろ。 OpenJDKにおいて、互換性を考慮したアップデートが行われ、自動アップデータが提供されるか。 GPLだから誰でもそのプロジェクトをやれる。 >>720 の解決法はこうだ OpenJDKの次期バージョンで現在のアプリが問題を起こすかチェックする。 →問題があるならOpenJDKがアップデートされる前にアプリをアップデートしておく。 そのアプリの修正は、現在のOpenJDKと次のOpenJDK両方で動作する事を確認する。 もうJavaで書いたアプリがあるし、Javaに慣れてるから。 それに、.NETに移ったとして、同じ事が起こらない保証があるのか? 実は俺はこの問題に対する根本的解決策を知ってる。うまくいくかは知らないが それも含めて考えると、やはりJavaを続けようと思える。 リリース前でもビルドが公開されてるだろうと思ったけど。 プラットフォーム系でプレビューリリースとかアーリーアクセス的なものを提供して 予め対応してもらおうというアイデアは一般的なもので、オラクルがOpenJDKをサポートするなら たぶんやるだろう、というか既にやってると思うけど。 JDK 11 Early-Access Builds http://jdk.java.net/11/ 大前提の認識が間違ってるぞ。 Java11以降においては無償のスタンドアロンなJREは無くなるんだよ。 デスクトップ用途なら開発者自身がアプリにJavaランタイムを組み込んで配布することが推奨される。 そして、OpenJDKはエンドユーザーが自分で個人端末にインストールするようなことを想定したものではない。 開発者がシステムに元々入っているのOpenJDKに依存してよいのは、業務システムなどで 開発者が完全に実行環境のOpenJDKディストリビューションのバージョンや構成を制御できる場合のみだ。 https://docs.oracle.com/javase/jp/8/docs/technotes/guides/deploy/self-contained-packaging.html#A1307236 >自己完結型アプリケーション・パッケージは、プラットフォーム固有で、ビルドしたシステムと同じシステムにのみ作成できます。 各プラットフォーム向けにビルドしなきゃいけないようだ >自己完結型アプリケーションには、自動更新の組込みサポートがありません。 アプリのアップデータで簡単にアップデートできるなら問題ではない。 アプリへのJREの組み込み手段がサポートされて、 そこでJavaFXがサポートされるなら、問題無い気がする。 JavaFXはそこでサポートされなきゃ意味が無いし。 >Java SE 8は、デスクトップ展開を対象とした最後のJava SEリリースです(Java Web StartやスタンドアロンシステムJREなど)。 こういう文言もあるから、Java11以降、OpenJDKでJavaFXみたいな デスクトップ展開がサポートされるのかどうか。Java8最終版を組み込んで使い続けるか Gluonに期待するか。 初心者だけどJavaFXでFTPサーバーとやりとりして追加したり一覧表示してダウンロードしたりするwindows用アプリを作りたいんだ apache commons netというライブラリを使ってやろうと思うけどviewにファイルを入れるにはどうすれば良いんだろう? 入れた後はjavaからviewをインスタンス化してその中の変数の値(ファイルのパスかな?)を取り出してって感じでなんとかなりそうだけど... 本当に何も分からない状態で、何か良い勉強方法は無いかな? FTPサーバーについても素人に近いよ そういや今はJavaは標準のライブラリでFTP接続してアップロードとか楽にできるクラスあるのかな? ダウンロードだけはURLクラスでできるの知ってるが。 viewにファイルを入れるってなに? TableViewとかTreeViewクラスにアイテムを表示する方法ならチュートリアルあるでしょ ああ解読できたかも 要するにGUIにアプリから値を設定、ないし アプリからGUIに値を設定するにはってことでしょ? てかGUIってそういう使い方しかないし。 そんなのぐぐればいくらでも出てくるのでは。 https://docs.oracle.com/javase/jp/8/javafx/user-interface-tutorial/table-view.htm 訂正 人→GUI→アプリ アプリ→GUI→人 この流れがやりたいってことだとおもわれる >>739 そうそんな感じ 全然イメージ出来ん どうやって起動させるの? でも公式ドキュメント見やすそうだねありがとう Project Loomを急ぐんだ! はやく第一級継続を書かせるんだ。 どうか限定じゃありませんように イメージできんってもなあ・・・ GUI部品クラスが提供されてて、何らかの値の設定方法、取得方法があるだけじゃん。 StageやSceneクラスという、GUI全体を意味するクラスも提供されてる。 そこにGUI部品を積み上げてくだけだぞ。 起動って・・・IDEのプロジェクトアーキテクチャの選択でfx系選べば何もしなくても GUI立ち上がるでしょ >>743 webアプリならサーバー起動させてコントローラにある接続用のurlをブラウザに入れれば始めれるじゃん これはメイン関数なくても行けるんでしょ?起動ボタンあるの? 何かの障害持ちだと理解の過程が通常と違う 彼らにネットは不向きだと思う ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.1 2024/04/28 Walang Kapalit ★ | Donguri System Team 5ちゃんねる