【Java】最近やっているプロジェクトで後悔していること5点【プログラミング】

Java8でプロジェクトをやっていて後悔していることを5点挙げます。 上から後悔している順です。

nullを返すな、Optionalを使え

文字通りなんですが、null が絡むと何が返ってくるのか分からない状態になるのでOptional使った方がいいです。
特にnullを返しがちなものをUtilにしてしまったのは深い後悔が有ります。

var / valは使った方がよい

lombokvar / valを想定しています。
lombokに依存してしまうというのはそうなんですが、省力化や可読性の高さよる開発効率の向上を考えれば、最初に開発するときはvar / valを使った方が結果としてマシなコードになりやすいと考えています。

(もっと言うならKotlinなどオルトJavaのがプロダクトは綺麗になるなとは思いますが、障壁の厚さも、、、)

オブジェクト名は冗長なぐらいの命名にした方がよい

後からオブジェクトが増えたとき、一体どんな役割を持っているか本当に分からなくなったので、冗長に感じてももっと具体的な命名をすればよかったです。

Lintはチェックルールよりコーディング規約を変更すべきだった

Lint関連の修正はお願いするのも実行するのも手間だったので、ツール側に全部合わせた方が楽でした。
その辺が負担になると機械の奴隷感が出てくるので、何かしらのデフォルトを使った方がいいんじゃないかと思っています。

引数に取るならListよりCollection

Listにしてて困ることが少ないのはそうなんですが、Setを入れたいときに困ったりするんですよね。 Collectionを引数に取って困ることはあまり無いと思うので、やっておくとスマートになったかなと思います。

【プログラミング】好きなインデント、嫌いなインデント【日記】

インデント数や改行のやり方について、自分の好みを書きます。
言語はJava想定ですが、別言語でも基本的な好みは同じです(IDEは当然使うものとします)。

はじめに

好みとは言いますが、基本的に「合理的と感じるか感じないか」が根拠です(あ、この言い回しオタクっぽい)。

そもそもの話

ぶっちゃけどのフォーマットでも利点と欠点は有ると思います。
特に最近はエディタの整形機能やネスト量の表示機能が優秀なので、「コードを作成する/エディタ上で読む」という部分に着目すれば、どのやり方もそう大きくは変わらないと思います。

インデント数

インデント設定というと、基本的に以下3通りに分けられると思います。

  • 2スペース
  • 4スペース
  • Tab

個人的にはこの内で2スペースインデントが好きです。
2スペースインデントの利点は話し尽くされていると思いますが、単純なコードの読みやすさという観点からはズレた部分で語っていきます。

4スペース対2スペース

2スペースインデントを推す理由は、エディタ外での読みやすさが変わるからです。

例えばSlackに投稿する場合やブログやQiitaに記事を作る場合、読みやすい横幅はエディタよりも小さくなるため、4スペースインデントではしばしば不都合があります。
この傾向は、スマホなどの環境でコードを読む時により顕著です。
コード部分が横にスクロールしてくれるならまだいい方で、改行折り返しされてしまうと構造が崩れてもう読めません。

エンジニアにアウトプットが推奨される昨今、エディタ外での読みやすさを考えてコーディングするというのはトレンドになって欲しいなーと思います(とか言いつつ4スペースインデントで記事を量産してるけど)。

Tabインデント

私的にこのような話をしていたところ、「Tabインデントにして幅は個人で設定できるようにすればいいんじゃないか」という意見を頂きましたが、個人的にTabインデントは好きじゃないです。

理由は以下の3点です。

  • 環境によって表示が異なる場合がある
  • 環境ごとに表示設定しなければならず面倒(最悪設定できない場合もありうる)
  • Tabと半角スペースが混じっても見分けられないため、表示が崩れる場合がある

半角スペースをそのまま打つインデントであれば、どんな環境でもある程度読める状態でコードが出ますが、Tabの場合は8文字分のスペースで表示されてしまう場合が有るなど、状況によって設定の修正が必要となります。場合によってはその設定が用意されていないかもしれません。
また、半角スペースとTabとが混じった場合も面倒です。混じっておかしくなる位なら、Tabは入力禁止としたほうが合理的だと思います。

ということで、Tabインデントは好きじゃないです。

改行の方式

大きく、ブロックの改行と引数の改行について書きます。

ブロックの改行

大体以下2種類に分けられると思いますが、個人的に前者のほうが好きです。

if (hoge) {

}
if (hoge)
{

}

理由

以下2点から、現状の環境では「改行量が多い=良くないこと」だと感じるからです。

  • IDEの補助線等の機能から見やすさに殆ど差がない
  • 1画面により多くの情報を表示できたほうがコード間を行き来する回数が減る分可読性が上がる(コード間の物理的距離が離れると可読性が下がる)

特に後者は縦に長すぎる関数の可読性が低い辺りから明らかじゃないかと思います。

引数の改行の方式

引数の改行は、以下2つの方式を知っています。
前者はJavaDocの表示などでよく見るパターンですが、個人的には後者のほうが好きです。

void func(int a,
          int b) {

}
void func(
    int a,
    int b
) {

}

理由

前者では以下3点辛さが有ることが理由です。

  • 引数以前に最長で「インデント + 修飾子 + 戻り値の型 + 関数名」となるため、これらが物凄く長くなった場合に後続の引数を書きにくい
  • メソッド引数を閉じる部分は最長で「アノテーション + 引数の型 + 引数名 + throws句」となるため、メソッド引数開始部分までが長くなると書きにくい
  • (エディタ外で書く時)等幅じゃないフォントだと調整が難しい

極端な例では以下のようになります。

protected static final TypeOfHogerara MethodNameOfHugaGaga(ArgumentTypeOfFooFoo argumentTypeOfFooFoo,
                                                           @AnnotationOfPiyoPiyo(value = "ValueValue") ArgumentTypeOfBarBar argumentTypeOfBarBar) throws ExceptionTypeOfBuzzBuzz {
protected static final TypeOfHogerara MethodNameOfHugaGaga(
    ArgumentTypeOfFooFoo argumentTypeOfFooFoo,
    @AnnotationOfPiyoPiyo(value = "ValueValue") ArgumentTypeOfBarBar argumentTypeOfBarBar
) throws ExceptionTypeOfBuzzBuzz {

結論

ここまで長々書いてきましたが、最終的にはチーム内で定めた自動整形ルールに任せるのが一番だと思います。
インデントやらは本質的な作業ではないので、整形はプログラムに任せて人間はプログラミングに集中すべきでしょう。

ただ、最近のモダンな言語はどんどんコード中の情報密度が上がっていると感じるので、その延長線上で「大量の改行が入るだとか、大量のインデントが入るスタイルというのは環境に適していないんじゃないかなあ」とは感じています。
C言語の登場以来50年弱が経過した今、慣習で残っているからと言ってそのフォーマットが可読性に対して合理的かというのはちょっと疑ってかかるべきなんじゃないかなあ、とも。

まとまってませんがこの辺りで終わります。

【プログラミング】JetBrains Riderで「Cannot run project of type Unloaded using any of available configuration types.」と出てプロジェクトがビルド/実行できなくなった話

何で直ったのかわかりませんが、とりあえず直った話です。

状況

JetBrains Riderでプロジェクトを開発中、Visual Studio InstallerからVisual Studio 2019のアップデートを行ったところ、Visual Studio Installerから「MSBuildがなんたらという」メッセージが出てきたためOKを押しました。
その後、Riderでも「MSBuildがなんたらという」メッセージが出た上でビルド/実行ができなくなったため、Visual Studioのアップデート終了を待ってRiderを再起動しました。

すると、再起動後も、プログラムを実行しようとした際に「Cannot run project of type Unloaded using any of available configuration types.」と出てしまい、プロジェクトをビルド/実行できなくなってしまいました。

解決(?)方法

Edit ConfigurationsのBuild Project -> Show this pageにチェックをつけてOKしたところビルドできるようになりました。
f:id:wrongwrongwrongwrong163377:20190505134019p:plain
一度ビルドが通ったあとはチェックを外しても問題なくビルドできるようになりました。

補足

この操作そのものには恐らく意味は無いと思いますが、副作用が噛み合った結果上手くいったようです。

この操作の前に以下のページを参考にMS Build versionなどを弄り回していましたが、効果がなく操作前の状態に戻していました。
rider-support.jetbrains.com

【日記】サバゲーに行ったので装備をレビューする - エアガン編【レビュー】

wrongwrong163377.hatenablog.com
これ以来サバゲーにハマりました。
wrongwrong163377.hatenablog.com
で、エアガンを買うなど備えていたわけですが、つい先日サバゲーに行く機会が有ったので、持って行った装備についてざっとレビューして行きます。
長くなったので周辺装備編とエアガン編に分けます。

こちらはエアガン編です。



エアガン関連について

主にAUG HCとVERY 100の2点について書きます。
結論は以下3点です。

  • AUG HCそのものは結構使える
  • AUG HCをオススメはしない
  • VERY 100はかなりいい
AUG HCについて

フツーに使えたと思います。
割と遠距離でも狙うことができ、集弾性も悪くは感じず、給弾不良もさほどありませんでした(最初の方でゼンマイを巻き忘れて弾が出ないままやられたマン)

大きな感想は以下3点です。

  • 引ききりフルオートは違和感なく使える上に安全
  • 長さが気になる場面はほぼ無し
  • 弾が足りなくなるので予備弾倉は必須

持った当初は「引ききりフルオート、硬くて引きにくい」と感じていましたが、実戦で使ってみるとフルオートの違和感はそれほどなく、むしろセミで止まってくれる安心感がとてもよかったです。

寸詰まりに見える体形が嫌でLAYLAX・MODE-2 FAT 100を付けてプレイしましたが、特に銃身が長くて苦労する場面はありませんでした。
サプレッサーを付けた方がカッコイイと個人的に思っていますが、サプレッサー付きでも長さが気にならないのはブルパップの利点ですね。

買った当初は330発有れば1ゲーム余裕と思っていましたが、弾切れで降参する機会が何度か有ったので予備弾倉(orサブ武器)は持っておいた方がいいと思います。
今回は特に牽制で撃ちまくるようなフィールドだったので、330発では全く持ちませんでした。
沢山撃つ前提なら3マガジン位持って行った方がいいかもしれませんね……。

AUG HCをオススメはしない

同じハイサイクルでもG3 SAS HCやMP5A5 HCと比べると「重くて装弾数が少ない」からです。
加えて、ワイヤーストックを用いるこれらのエアガンは頬付けする時のマスクの影響が少ない(マスクの話はこちらで触れています)と考えられます。
他にも細々微妙な点はあり、ブルパップが廃れるのも分かるなあという妙な納得感が有りました。

一応、ハイサイクルカスタムの箱出し状態でAUG HCと競合しそうなスペックなのはG3 SAS HCとMP5A5 HCのみで、これらにはピカティニーレールが無いという欠点は有りますが、それ以外は正直AUG HCの方が微妙だと思います。
自分は好きなんですけどね……。

VERY 100について

壊しても後悔しない程度の値段ということでVERY 100を買って行きましたが、かなり良かったです。
当日は森の中の薄暗めなフィールドだったというのもありますが、レティクルが見辛いことは一切有りませんでした。
5000円しないぐらいのEoTechレプリカ2つを借りて比較してみましたが、反射の少なさや透明度の高さでは一番良かったです。
性能面では全く不満の無いものを引きました。

欠点としてはツールレスでの取り外しができないことが有ります。
付けっぱなしなら問題は有りませんが、色々付け替えて遊ぶには不便でした。

まとめ

エアガン本体については特に無く、次に向けての準備はマガジンを買い足す位でしょうか。
AUG HCについては不満も多く有りますが、やはり独特なブルパップスタイルに愛着が有るので、大事に使っていこうと思います。

【日記】サバゲーに行ったので装備をレビューする - 周辺装備編【レビュー】

wrongwrong163377.hatenablog.com
これ以来サバゲーにハマりました。
wrongwrong163377.hatenablog.com
で、エアガンを買うなど備えていたわけですが、つい先日サバゲーに行く機会が有ったので、持って行った装備についてざっとレビューして行きます。
長くなったので周辺装備編とエアガン編に分けます。

こちらは周辺装備編です。



周辺装備について

主にマスクとゴーグル、スリング、ローダー(BBボトル)について書きます。
結論は以下3点です。

  • マスクとゴーグルは狙いやすさと安全性を考えて選んだ方がいい
  • スリングは有った方が楽、バックル型よりカラビナ型のスリングの方が安心感がある
  • ローダーは必須、弾切れは辛い
マスクとゴーグル

プレイして、これは銃に合わせてちゃんと選ばないとダメだなと感じました。
「初期装備にお金が掛からないように」と譲って頂いたものを使っていましたが、以下3点が不満でした。

  1. マスクが固く、頬付けが難しい
  2. ゴーグルとマスクに一体感が無く、着脱でズレたりして心地悪い
  3. ゴーグルとマスクの間に隙間があり、隙間に入ると危ない

1は狙う上で結構致命的でした。
エアガンは人間に合わせて設計されているため、頬をべったり付けて丁度いい位になります。
一方、この状態で頬まで硬い素材でできているようなマスクをしてしまうと、マスクの分だけ銃と顔の間に隙間ができるなど、目線と射線がズレやすく(≒狙いにくく)なります。
ワイヤーストックなどではまた違うのかもしれませんが、特にAUGはマスク有りで頬付けするのが難しいですね。

2はプレイ中・プレイ後ともに結構辛かったです。
視界が安定せず、ズレやすさも有りました。
また、そのせいで3が発生していました。安全性に問題が有るのは致命的です。
これからもサバゲには行くつもりなので、次までにちゃんとしたものを選ぶつもりです。

……とは言え、この辺りを上手く統合した製品って調べてもあまり出てこなかったんですよね。
使い勝手的には「頬が布、口がちゃんとガードできるマスク+それに一体化したゴーグル」という感じが嬉しいんですが、そういう製品は調べても見つけられていません。
「マスクとゴーグルを針金で固定すると使い心地いいよ!」というアドバイスを頂いたので、それを参考に自作する感じになるでしょうか。

スリング

まずは持って行ったスリングについてです。

AUG HCに合わせてこちらの商品を買って行きましたが、簡単に外れてしまい使い物になりませんでした。
仮に簡単に外れなかったとしてもバックル式では外れた時に戻すのがとても面倒なため、サバゲには向かないかなと思います。

当日はこちら(だったはず)のスリングをお借りしてプレイしましたが、特に不満なく使用できました。
金属だとガチャガチャ音が鳴るかなと感じて避けていたのですが、実際に使ってみても特にそういった感じにはなりませんでした。

スリング無しで数戦、スリングを付けて数戦とプレイした感想ですが、やっぱり有ると無いとで大分負担が変わりますね。
特にAUGは後ろ重心なので、そのまま持っていると右手がめっちゃ疲れます。
サバゲは物凄く体力を使うので、スリングが有るに越したことはありません。

ローダー

ローダーというかBBボトルを買い忘れてプレイしていましたが、リロードのめんどくささがヤバかったです。
というか、たまに完全なリロードができないまま試合が始まったりしていました。
これは素直に買って行った方がいいですね。

まとめ

サバゲーはこだわらなくても沢山装備を買う必要が有りますね……。
ただ、やるからにはやっぱり快適な環境でプレイしたいので、次へ向けて買い物をしていくつもりです。

【Windows】環境変数をいくら編集してもPathが通らなかったときの対処【Java】

状況

下記の記事を参考に環境変数を設定しても設定が反映されず、javaコマンドが通りませんでした。 www.atmarkit.co.jp

コンソールには以下のようなエラーが出ていました。

PS C:\Users\wrongwrong> java
Error opening registry key 'Software\JavaSoft\Java Runtime Environment'
Error: could not find java.dll
Error: could not find Java SE Runtime ENvironment.

解決法

www.scriptlife.jp

上記記事を参考に環境変数の一番上にJAVA_HOME%\bin\を移動したところ正常に認識されました。原因は不明です……。 f:id:wrongwrongwrongwrong163377:20190421150900p:plain

大学院を辞めてから、この1年を振り返って

自分は去年、約半年で大学院を辞めて就職をしました。

平成最後の日なので(エイプリルフール)、学校を辞めたきっかけ、辞めてから今日までについてを振り返ろうと思います。

wrongwrong163377.hatenablog.com

改めて、大学院を辞めたきっかけ

少し長くなりますが、改めて大学院を辞めたきっかけをまとめます。

2017年春、ものづくりにハマる

大学院を辞めた一番のきっかけは、ものづくりにハマったことだと思います。

ちょうど2年ほど前になりますが、自分は大学3年から4年にかけて(2017年)の春休みに、初めてのAndroidアプリを作成しました。
人生で初めて、他人に使ってもらうためのプログラムを書いたのです。

これがきっかけとなってブログを始め、新しいアプリを作ったり、研究でもAndroidのアプリケーションを作ったりと、徐々にスキルアップを果たしていきました。

それらが実り、年末の卒業研究発表では先生方から良い評価を頂くことができました。

2018年1, 2月、全力でのものづくりを改めて経験する

ことが大きく動いたのは2018年の1, 2月です。

日記にも残していますが、壮絶なクソコードに対してほぼ自分ひとりの手でリライトを行い、1本の業務用アプリケーションを実質的に1から作りきりました。

お金を貰って作っていることもあって、自分だけの時とは比べ物にならないほど責任を感じましたし、やりきった時には人生でも最大に近い達成感を得ました。
今思い返せば、自分にとってはこれこそがやりがいだったのだと思います。

とは言え、この頃はまだ大学院を卒業する気満々でした。

2018年3 ~ 6月、就活を始めつつ、学校生活が精神に来る

「就活は早めにやって、M2では研究に集中しよう」という思惑から早めの就職活動を始めました。
それまでは世間にどんな就職先が有るだとか、どんな風に働くのかだとか、そういうことは全く知らずに生きてきましたが、人事やエンジニアの方から直接『こんなキラキラした生活ができるよ!』と伝えられたことで、就職に対する不安感は減っていきました。

一方学校生活は、カリキュラム的な問題で特に前期の前半は講義が忙しかったのですが、そこに外部発表を入れてしまったため、更に大変な思いをしていました。
「研究には力を入れたい、大学院に行く以上いいものを作って発表したい」という思いが強くあったのですが、それが学校側にかき消されていく感じが非常に辛かったです。

結局、そもそも講義を受けるよりは一人で勝手に進めたい質だった(B4では1年間講義が無かったので忘れていました)、バイトや趣味でコードを弄っている時間が一番楽しく感じている、研究の方向性が自分の思っていたのとズレてきた、など、学校に通う意味が見いだせなくなっていきました。

そんなこんなで、7月には「少なくとも一旦学校を離れよう」と決心しました。

まとめ

長々書きましたが、ここまでの経緯全てをまとめたのが、退学エントリで書いた「アクセルとブレーキを同時に踏み込んでいるような感覚が強くなった」という言葉です。

自分は元々学校生活が嫌いでした。
友達と過ごす時間や、たまに自分の感性に刺さる内容が出たときは楽しかったです。
しかし、講義は基本的に密度不足で楽しいと思えず、自分の自由で進めていくこともできず、常に縛られている、ブレーキをかけられているという感覚がありました。

学校で楽しくやっていけている友人が多いことを思えば、単純に合わなかったんだなと強く思います。

そんな中、自分が自分自身のやりたいことを理解し始め、やりたいことに対してその他のことが障害になり始めてしまい、結局辞めて就職した方がいい結果が出ると確信したため、辞めて就職することを選びました。

辞めはしましたが、自分が自分のやりたいことを理解し、それを実現するだけの実力が付く所まで面倒を見ていただいたという意味で、学校には感謝しか有りません。
辞めるに際して非常に多くの方にご迷惑をおかけしてしまったので、それに関しては何らかの形で恩返しをしなきゃなと思っています。

大学院を辞めてから今日までのこと

さて、今自分は、『大学院をスパッと辞めて良かったか?』と問われれば、まず間違いなく良かったと言える状況にあります。

理由は以下3点です。

  • 自分が好きなことをずっとやっていられる
  • 金がちゃんと手に入る
  • 学生時代より自由に生きられている
自分が好きなことをずっとやっていられる

3点の内一番大きいのが、自分が好きなことをずっとやっていられることです。

学生時代には、講義や研究という雑音が多く、興味を検証し切るモチベーションが保てていませんでしたが、それが褒められ、客観的に評価され、実績と賃金につながっていくことはとてもやりがいを感じられます。

また、自分の作ったものをより多くの人が使うという感覚もやりがいになっています。

金がちゃんと手に入る

2番目に大きいのが金です。

バイトをやってお金を稼いではいましたが、それとは比べ物にならないほど多くのお金を稼げています。
とりあえず当面食っていくアテが有ることは精神衛生上非常によろしいです。

本やエアガンを買うだとか、趣味をやるにしても金が無いことには始まりません。
もっといい部屋に住みたい、もっといい酒が飲みたいと、物欲には事欠かない質なので、これからも評価と賃金を得られるように頑張っていきます。

学生時代より自由に生きられている

これは会社が自由にさせてくれていることも大きいですが、学生時代より自由に生きることができています。

ちゃんとした裁量労働制なので、例えば出勤時間は遅くても構いませんし、退勤時間は早くても構いません。
リリース前は結構きつかったりもしましたが、これはなにか予定を入れるのに非常にありがたいです。

そして東京は勉強会やらイベントやらに事欠きません。
やりたいと思った時にやりたいことができる、そんな環境と金が有れば、騒音と排ガスと人混み以外はとても良い環境です。

最後に

自分は3月で見習いを卒業し、今月からは立場と賃金が上がることになります。

また、今月は副業も始める事になりました。

色々とやっていることが多くなりつつありますが、個々にやることの質は落とさず、体調も崩さないように、色んなことに油断せずやっていきたいと思います。