IntelliJでJavaFXをネイティブパッケージング

by orekyuu 0 Comments

いままでJavaのデスクトップアプリは実行可能jarファイルの形式で配布していたけど、これから出すJavaビーム工房のようなできるだけ多くの人に使ってもらいたいアプリはできればexeやappのようなネイティブの形式にしたかったのでやり方を調べてみました。

Project StructureのArtifacts
上部の緑色の+をクリックしてJavaFX Applicationの”From module ‘モジュール名'”を選択
artifacts

Output Layoutで一緒に入れるライブラリの追加削除などを行う。
Gradle形式のプロジェクトだったら別にresourcesフォルダとライブラリ指定する必要ある感じかな?

JavaFXタブでは起動に必要な設定などを入力する

javafx

注意としてはApplicationClassの項目で指定したクラスにはmainメソッドが必要なくらい
後はNative bundleでallを指定して設定終了

上部のメニューバーからBuild→Build Artifacts→さっき作ったartifact名→Buildでビルドが開始する
Winならexe Macならappができるはずです。

Postfix補完のススメ

by orekyuu 0 Comments

Postfix補完とは

条件式からif文に変換したり、値をフィールドや変数に代入する形へ変換したりする補完の機能。
例えばlength < 10.ifを変換してif(length < 10) {}へ変換してくれる。

GIF

上のgifでは
Arrays.asList()を.varから変数へ代入
stringsを.forでfor文へ変換
s.length() == 2を.ifでif文へ変換
sを.soutで出力へ変換している。

Postfix補完の魅力

たとえば「2文字の文字列を抽出する」みたいな処理を書こうと思った時に先に条件式が出てくるような人は今すぐ使ってみて欲しい。そのまま条件式を書いてあとからifに変換できるってのがとても嬉しかったりする。

対象書く→何に変換するかを後に続けるみたいな感じでコードがかけて気持ち良い。
1週間ほど使えばPostfix補完無しでは書けない体になっているぞ!

Eclipseでやりたいなぁ・・・やりたくない?

EclipseにもPostfix補完プラグインがあったのでご確認ください。
https://github.com/trylimits/Eclipse-Postfix-Code-Completion
EclipseユーザーでもPostfix補完を始めよう

GS Collectionsハンズオンに行ってきた

by orekyuu 0 Comments

関ジャバのGSCollectionsハンズオンに行ってきました。

GS Collectionsとは

ゴールドマンサックスが開発したオープンソースのコレクションフレームワーク。
Github: https://github.com/goldmansachs/gs-collections
Mavenリポジトリ: http://mvnrepository.com/artifact/com.goldmansachs/gs-collections/6.2.0

ハンズオンの内容

GSCollectionsKataをクローンして、落ちているユニットテストを通していくって感じの内容でした。
興味があるならこれから始めるのが良いかもしれません。

GSCollectionsを使った感想

StreamAPIと比べて多くのメソッドが提供されていて使いやすい!けど、APIが大きいのでチーム開発で使うには他の人を巻き込むのに苦労しそうだとは思った。
懇親会のLTでやっていたFunctions.throwing()で例外を投げるラムダを書けるのが良い感じ。

customer.getName()がExceptionをthrowsしている時、ラムダで書くとこんなかんじになって腹立つけど。

customers.collect(customer -> {
            //ピャアアアアアアアアアアア
            try {
                return customer.getName();
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
            
        });

Functions.throwingを使えば楽に書ける

customers.collect(Functions.throwing(Customer::getName));

こんなかんじでかなり嬉しい便利メソッドがあったりする。

不満点としてはnullかもしれない戻り値でOptionalが使われていないって所。
これが結構もやもやする。detectという条件に一致するものを検索して最初に見つかった要素を返す操作があるんだけど、こういうのがOptionalで返ってくると嬉しいなーと思った。

そういった要望とか不満点はStackOverflowに投げてくれとのことでした。日本語版でも質問の答えは返ってこないかもしれないけど、書いていれば対応する流れができるかもらしいです。

おしまい

BitbucketのIssueを見れるIntelliJのプラグイン作った

by orekyuu 0 Comments

無題

学校のプロジェクト演習でタスクの管理にBitbucketのIssue使ってるんだけど、ブラウザ開いて確認するのも面倒だなと思ってIntelliJで見れるようにしてみた。

BitbucketIssuesのToolWindowを開くと最初に認証画面出てくるのでそれをやった後使えるようになります。
機能としてはステータスのフィルタと担当者のフィルタがかけれるのと、Rowをダブルクリックでブラウザで見ることができます。

良かったら使ってみてください。
ダウンロード

SpringBootでCSRFを無効にせずAjaxを使いたい

学校での作品制作してる時に詰まったAjaxをCSRFトークン無効化せずにやる方法をメモ代わりに書いておく。

headでcsrfトークンを埋め込む

<meta name="_csrf" th:content="${_csrf.token}" />
<meta name="_csrf_header" th:content="${_csrf.headerName}" />

リクエストヘッダーに、metaタグから取得した値を設定する

<script type="text/javascript">
    var token = $("meta[name='_csrf']").attr("content");
    var header = $("meta[name='_csrf_header']").attr("content");
    $(document).ajaxSend(function(e, xhr, options) {
        xhr.setRequestHeader(header, token);
    });

    $(function() {
        $('#button').on('click', function() {
            $.ajax({
                url : 'url',
                type : 'POST',
                data: {
                    project: "Test"
                }
            }).done(function(data) {
                $("#message").text("成功");
            }).fail(function(data) {
                $("#message").text("エラー: " + data.statusText);
            });
        });
    });
</script>

参考: http://terasolunaorg.github.io/guideline/5.0.0.RELEASE/ja/Security/CSRF.html#ajaxcsrf

匿名クラスとラムダと時々弱参照

by orekyuu 0 Comments

今Javaビーム工房の作り直しをしていて、その中でWeakReferenceを使ったObserverパターンを書いた。

やりたいことは大体こんな感じ。

これは参照されなくなった時にGCされるとリスナが呼び出されなくなるって感じの挙動になる。
実行するとAAAだけ出力されてGCされた後のBBBは出力されない。

これ使えばリスナの解除を忘れてた時もメモリリークしにくくなると思ったけど思った通りに動作しなかった。
さっきのコードでは問題なく動いているけど、ラムダでaddListenerをするとGCしても参照が消えない。
そこで書いてみたのがこのコード

匿名クラスを使用しているときは問題なく消えてるけど、ラムダを使った時は残ったままだし消えない。
匿名クラスとラムダが違うというのは聞いたことあったけど、こんなところで違いが出てくるとは思わなかった。原因はなんなんだろう・・・?

学校でやってる作品制作の授業の様子の話

by orekyuu 0 Comments

僕の行っている専門学校ではチームを組んで作品を1つ作るプロジェクト演習という授業があります。
他の学校でも同じような授業があったりするけど雰囲気が学校によって違うみたいなので、どんな感じなのかブログに書いてみようと思った次第です。


 

講義内容

学科によって微妙に変わったりするけどある程度テーマが決められて、それを満たすように1年間かけてチームを組んで作品を作っていきます。僕の学科ならサーバーと連携するかサーバー上で動くアプリってかんじです。


 

主に使われている言語

僕の学校ではPHPを使っている人が多いです。
特にサーバーサイドで限れば8〜9割くらいかなと。
残り1、2割がJavaとかRubyとかって感じですね。PHPの鯖にデプロイするだけという手軽さが受けているんですかね?ボクPHPヤラナイカラワカラナイ
Javaやっている人が本当に少なくてメンバー確保に結構苦労しました。


 

生徒のモチベーション

皆無からとても高い人まで様々です。
大雑把に分けるとこんなかんじです。

モチベーション100: 即効でチームつくって作る作品の企画ねってたり作業始めたりしてる。あとは使うフレームワークとかも色々試行錯誤している感じ。多くはないけど一定数は居る。
モチベーション50: 作業も結構やってるけど単位もらえたらいいやくらいのモチベーション。大体の人がこの辺。一番おおいかな?
モチベーション10: 一応授業には来てるけどチームもできてないし企画もなにもやってない。ちらほら見かけるかんじ。
モチベーション0: 授業に来てないというか、「え?同じ教室でうけてたの?」ってレベルで来ない人 授業に来ないので割合確認できない。


 

僕がいるチームの現状

Java書ける人が見つからなかったので、Webデザインできる人を連れてきてフロントとバックで完全に分けて二人で作業してました。極力デザイナの人がらくできる環境を作りたかったので、Spring boot + thymeleafを使用することにしました。
その後僕のチームの企画に興味持った人が二人来たのでその二人をチームに入れてGitの操作を教えながら作業開始しているって段階です。

新しいメンバーのモチベーションも結構高い人みたいで、コードレビューで結構指摘飛んだり、レビュアーに指定していなくても颯爽と現れて横から失礼しますレビューをしてきたりして面白い。


 

チームによってモチベーションとかスキルの差はあるけど、各チーム試行錯誤しながら作業しているようで結構面白かったりする。