B-Teck!

お仕事からゲームまで幅広く

【雑記】前に進むしかないという話

※極個人的な感情の辛さを整理するために書いたものです。

ここ数日、数年ぶりに仕事で何も出来ていないなぁ、役に立てていないなぁという無力感を味わう毎日が続いている。

未知の既存プロダクトの再構築、かつ得手としていないDB部分の構築、1Bに共有され1Eからjoin、3Eまでに動くAPIを用意する業務。
要件の吸い上げ、理解、そして構成、何もかもわからないまま手探りで進んでいるし、何より難しいのが基本的に自分一人の案件で進める案件であることだ。
多忙なドメインエキスパートをうまく捕まえられれば質問や意見をもらうことなどが出来ないわけではないが、それをするには自分がまず理解して言語化しないといけない。
2月に入ってからは、半べそかきながら既存仕様を理解し、あるべき姿を脳内に作り上げ、それを元に意見を交わし、前に進む、の繰り返し。
本当に前に進んでいるのか、自分は何をしているのか、そんな事を自問する毎日で、精神が参らないはずはないなと思った。
この年齢になってその経験が出来ることはありがたいことでもあるけれど、つらいことでもあって、この業務に自分が携わる意味とは…とか、どうせ間に合わないでしょ…とか、そんな事を考えてばかりいた。

正直今でもその気持ちは拭えていないし、諦念半分といったところではあるのだけど、あまりの辛さから急に風呂場で瞑想をしたり、月曜日に絶望したりしていたら、急にタイトルのような心境になったので、忘れないようにこの文章を書いてる。

人生、諦観したところで動きを止めてくれるわけでもなく、流され続けるしかないので、結局流されるか自分の意志で進むしかないのだ。
どうせ進むなら自分の意志で進めたほうがいい。それで駄目だったとして、それはその時考えればいい話で、今考えることではないなってなった。

今の仕事は楽しいし、なるべくやっていきたいなと思っているけど、万が一このプロジェクトが失敗して評価・評判がボロクソになって居場所がなくなろうが、働ける企業が現職一つであるわけでもない。
それだったら成功したときのプラスを最大化出来るようにしたほうが、結果的に得だよねという結論にまで至ることで、どうにかメンタルを持ち直してきた。

万が一ここまで読んだ人がもしいたら私が4月を笑って迎えられるよう祈っていてください。


石風呂 / 壊れぬハートが欲しいのだ【OFFICIAL MUSIC VIDEO】

【雑記】Miband4(Miスマートバンド4)のススメ

昨年末にXiaomiが日本公式販売をスタートしてからにわかに話題となっているXiaomiのスマートバンドですが、実際購入してみて確かに満足度が高かったので改めておすすめしたいと思います。
f:id:beatdjam:20200126151314j:plain

なぜMiband4を購入したのか

昨年秋、知人がFitbit購入を期に生活のトラッキングなどを始めているのを見ました。元々あまり睡眠週間が良くなかったために改善のための何かを探していたのですが、Fitbitはお試しで購入してみるには高く…。実売価格で 4000円弱 だったMiband4を購入しました。

その時はまだ日本公式販売ではなかったので、ほんとに大丈夫かな…と若干不安だったんですが、現在はXiaomiが国内公式販売を始めたのでより手に入れやすくなっていますし安心ですね。
(※余談ですが、なぜかこのタイミングで国内向けの製品名がMiスマートバンド4になりました。謎)

Miband4でできること

じゃあ具体的に何ができるんだというと、下記のような事ができます。

* 各種運動の消費カロリーなどのモニタリングと記録
* 歩数計(万歩計)
* スリープモニター(眠りの質をチェックする)
* 心拍数のモニタリング
* スマートホンからの通知を受ける
* 座りすぎ通知
など…

モニタリングされた情報はXiaomi公式が出している MiFit というアプリで確認できます。

さらに、Androidしか確認していないんですが、サードパーティの睡眠トラッキングアプリと連携して睡眠の浅い時間にアラームを鳴らしたりもできます。
ちょっと古い記事ですが、連携はこちらを参考にしました。
まだアラーム音で朝起きてるの? Sleep as Android×スマートウォッチでスマートに目覚めよう | あすへん! 〜薙月の明日への変化〜

また、一つ特徴的な点として、 Xiaomiが出しているアプリ以外にも、このスマートバンドと連携できるサードパーティ製のアプリが多数リリースされている点があります。
公式のアプリよりも運動などのデータが見やすいものや、ショートカット用のジェスチャーを追加するもの、より細かい通知の制御を提供するもの等様々あるので、こちらを色々探してみるのも良いかもしれないです。
個人的に利用しているのは Tools & Miband というアプリです。Notify & Fitness for Mi Band というアプリも有名みたいですね。

買ってよかったこと

実際にどういった点で満足しているのかというと…

* 防水のためほぼずっとつけっぱなしでいられる
* バンド含めて22g(実測値)なので軽い
* 安いのである程度雑に扱っても罪悪感がない
* 電池持ちがめちゃくちゃ良い
* 最も電力消費する設定にしてもでもフル充電から10日程度は充電が不要
* 歩数・心拍数等がGoogleFit・iOSのヘルスケアにも連携可能

などです。

睡眠時間や運動のログが勝手に残るので、見る習慣をつけるだけで生活習慣の振り返りなどが行えるようになりました。また、生活を振り返る事が習慣化することで、生活の質を上げよう心理が働いてサイクルが回っているような気がします。

あと単純に、スマホを出さなくても通知が確認できるというのは思った以上に便利でした。朝家を出る時間に天気予報の通知が飛ぶように設定しておいたり、Google Calendarの通知を飛ばすようにしてミーティング忘れを防いだり…。

おわりに

  • 安くて多機能なウェアラブルデバイスでエントリーモデルとして最適
  • 腕時計使いたいけど、重さが気になる人にもおすすめ

実は私は合わせてXiaomiの体組成計も買いました。
先述したMiFitに接続することで、こちらもボディスコアなどを勝手に記録してくれるのでとても便利なのでこちらもおすすめです。

【Java】ImmutableなCollectionをJavaで扱う

finalの挙動

Javaのfinalは宣言した変数への代入を禁止するだけで、変数が持っているインスタンスの内容は変更できてしまう。 そのため、Collectionの追加や削除などの操作が行えてしまう。

変更できないCollectionを扱いたい場合、宣言と同時に初期化する インスタンスイニシャライザCollections.unmodifiableXXXメソッド を組み合わせて利用すると良い。

インスタンスイニシャライザ

インスタンスイニシャライザの仕組みを使うと、Collectionを宣言と同時に初期化できる

new ArrayList<String>() {{ add("one"); add("two"); }};
new HashMap<Integer, String>() {{ put(1, "one"); put(2, "two"); }};

操作できないCollectionを作る

java.util.Collectionsには各種Collectionの型に対応した読み取り専用化メソッドがある 各メソッドにCollectionを渡してやると変更不可のCollectionに変換でき、addやputを行うとUnsupportedOperationExceptionがthrowされる。 変換時にnullを渡すとNullPointerExceptionが発生するのでCollections.emptyList()を渡すようにするなど、取り扱いに注意。

また、一度unmodifiableすると変更可能なCollectionにリキャスト等行おうとしてもClassCastExceptionが発生してしまうので注意

unmodifiableCollection(Collection<? extends T> c)
unmodifiableList(List<? extends T> list)
unmodifiableMap(Map<? extends K,? extends V> m)
unmodifiableNavigableMap(NavigableMap<K,? extends V> m)
unmodifiableNavigableSet(NavigableSet<T> s)
unmodifiableSet(Set<? extends T> s)
unmodifiableSortedMap(SortedMap<K,? extends V> m)
unmodifiableSortedSet(SortedSet<T> s)

インスタンスイニシャライザと組み合わせ

static final List<String> list = Collections.unmodifiableList( new ArrayList<String>() {{ add("one"); add("two"); }} );
static final Map<Integer, String> map = Collections.unmodifiableMap(new HashMap<Integer, String>() {{ put(1, "one"); put(2, "two"); }} );