うっかりエンジニアのメモ

未来の自分に宛てたメモ

MacBook Pro 16インチ(2019)を73515円安く買った

ストレスは高額な買い物で発散するタイプのサラリーマンです。資本主義の犬です。

安く買えた理由

「認定整備済製品」を、「楽天リーベイツ」経由で買うと安く買えます。
今回はApple Store新品購入価格より17%引きくらいで買えました。

認定整備済製品とは

www.apple.com

何らかの事情でユーザーから返品された製品について、Appleが整備(refurbish)して新品同様にした個体が「認定整備済製品」としてApple Storeで販売されます。値段は基本的に15%引きです。Apple製品はApple Storeはもちろん、家電量販店でも大幅なセールがほぼありえないので、15%引きというのは非常にお得です。

整備済製品のコンディション

とはいえ一度人の手に渡ったのは間違いないので、コンディションが気になるところではあります。
整備済製品は性能に関して新品と同等であるとAppleにより保証されているため、新品同様に購入後1年間のハードウェア保証がついています。 ですので、ディスプレイの写りがおかしくなるとか、キーボードが反応しないとか、バッテリーが膨らんできたとかの類のトラブルが1年以内に起きれば、基本的には無償修理してもらえます。

整備済製品のデメリットは2つあります。 1つ目は在庫が限られる点。MacはCTOでカスタマイズが可能ですが、整備済製品の場合、必ずしもほしいスペックの整備済製品がほしいタイミングで販売されるとは限りません。
もう一つは外装です。整備済製品のガチャ要素は 外装 、つまりキズです。

開封直後に確認したところ、上記2箇所のキズがありました。コンディションは個体によるとしか言いようがないので、今回は運が良い方なのか悪い方なのかは判らず。整備済製品は新品購入時と同様、2週間以内であれば返品することができるので、どうしても気にいらない傷があった場合は返品しても良いんじゃないかと思います(そしてきっとそれがいつかまた整備品としてリリースされる)

私はこの程度ならまったく気にならないので、いい買い物だったなと思ってます。

楽天リーベイツとは

www.rebates.jp

クレカサイトとかによくあるポイントモールです。このサイトを経由して何か買うだけで、1%の楽天ポイントがゲットできます。 Apple Storeの還元率は通常1%ですが、たまたまこの時期にキャンペーンで4%に増量していたのでラッキーでした。

値引き詳細

Apple Store 新品価格 438680円
認定整備済製品の値引き -58300円
楽天リーベイツによるポイント還元 -15215円
実質価格 365165円 (73515円お得)

MacBook Pro 16インチ(2019)の感想

私は初代Touch Bar搭載モデルであるMacBook Pro 13インチ(Late 2016)からの買い替えなので、その視点でちょっと感想を書いてみます。

キーボードが素晴らしい

Late 2016の初代バタフライキーボードという失敗作を3年半使わされてからのシザー型キーボード、これは感動でした。いかにバタフライキーボードがストレスだったか改めて実感しました。Late 2016~mid 2019のMacBook Proを使っているプログラマーやライターなどのキーボードを酷使する方はこれだけでも買い換える価値があると言えるのではないでしょうか。逆T字型になった矢印キーもミスタイプ率が大幅に減りました。

スピーカーが素晴らしい

私は作曲用途でモニタースピーカーを持っているので正直ほぼ使う場面はありませんが、そうでない大多数の人にとってこれは満足できる音質だと思います。1万円くらいの外付けスピーカー相当でしょうか。

処理性能

CPU

機種 CPU コア数 動作クロック
MacBook Pro 13 inch (Late 2016) Intel Core i7(Skylake) 2 3.3GHz
MacBook Pro 16 inch (2019) Intel Core i9(Coffee Lake) 8 2.4GHz

これまで使ってきたMBP 13インチ(Late 2016)は特盛構成ですが、CPUがデュアルコアでした。そのせいか、12トラックくらいのポップス曲でもプラグインを挿していくとプレイバック時にCPU処理が間に合わずオーディオエンジンが過負荷で停止することがありましたが、これは買い替えで改善しました。さすがの8コア。あと、この数年の間にもソフトウェアのマルチコア最適化がさらに進んだのかもしれない。

ストレージ

これに関しては容量は1TB→2TBと倍になったものの、性能は体感できるほどの差はなかったです。

消費電力

USB-C PDで電力供給ができるモニタLG 32UD99-Wをつないでいます。このディスプレイのPDは60Wなのですが、十分問題なく充電できています。MacBook Proに付属する電源アダプターは96Wなのでやや不安だったのですが、杞憂でした。物凄く高負荷な処理をしたら不足かもしれませんが。

ちなみに、45W程度のGaNモバイル充電器でも充電できるという報告もあります↓ www.youtube.com 薄くて小さいので、外出時はこれ使ってみたいです。

[asin:B07K8975WP:detail]

重さ

1.37kg→2.0kgなので、重いです。片手で持つのが憚られる重さです。私の場合は年2回くらいしか外に持っていかないので、許容できました。

まとめ

これでもう機材のせいにすることはできなくなったので、音楽制作に励みたい…

在宅勤務が始まったのでホームオフィス環境を整える

ついに全国に緊急事態宣言が発令されました。

会社勤めのみなさんもいきなり在宅勤務を求められて、てんやわんやの日々かと思います。
え、自宅待機で外出できないけど日中はミッドガルと無人島にいる?最高ですね。

私は事業会社で働くIT企画屋なので、ノートPC1台あれば9割の仕事はできるリモートワークしやすい職業ではありますが、それでも週5日フルで在宅勤務は初めての経験で、働きやすく生活しやすい環境を整備するにあたって考えたことや用意したものがいろいろありました。

Work

実は厚生労働省が、在宅勤務の作業環境整備のポイントをまとめてくれています。 www.mhlw.go.jp

f:id:entropiajp:20200416230446p:plain

  • 十分な作業空間
  • 椅子
  • 部屋の照度
  • 机の照度
  • ディスプレイ
  • キーボード
  • 空調(温度・湿度・換気)

あくまで環境の物理的なポイントのみです。心理的なポイントは後ほど触れます。

f:id:entropiajp:20200416013858j:plain

今のホームオフィス環境はこんな感じです。
もともとDTMが趣味なのでほとんど何も買う必要がなかった…

仕事部屋をつくる(つくれなかった)

Vagrantで有名なHashiCorpの創業者Mitchell Hashimoto氏も「ベッドルームは休息するための場所。一日中ベッドを見ながら働くのはとても難しい」と言っている通り、Workする場所はLifeする場所と明確に分けろということがよく言われます。が、今の家は1DKでそもそも仕事部屋を作るのは無理なので、今は仕方なくベッドの隣のデスクが仕事環境です。*1

厚労省が書いてた「10m3 以上」については、床3畳 * 天井までの高さ2m = 1.84 * 3 * 2 > 10 なので、ギリギリOK。

将来結婚したらWork部屋は作りたい。*2

オフィスチェア

腰痛持ちなのでオカムラコンテッサセコンダを愛用しています。3年前に大塚家具で17万くらい?かな。最初見た目重視でメッシュ地にしてしまったら、メッシュの張りが意外と強くて身体に対して変な負荷のかかり方して腰痛がさほど変わらず(買った意味…)最近になってクッション地に交換できることを知り、交換してからは抜群のフィット感で1日座っていても楽勝なので本当早く換えればよかった。オプションでランバーサポートもあって買ってみたものの、これもかえって腰に違和感が出てきたので早々に外してます。

会社のチャットツールで後輩が「在宅勤務で座椅子を買いました」と書いていたので思わず「オフィスチェアを買え」と老害ムーブをかましてしまいました。反省しています。でも腰って年齢関係なくやられるときはやられるんで気をつけてほしいな…

デスクライト

ほとんど紙を使う作業はないですが、必要なときはZ-LIGHTをつけます。めちゃくちゃ明るいです。

実は机の手前にステージピアノがあるので、部屋を暗くしてピアノを弾くときにこのZ-LIGHTのアームを反対に伸ばして鍵盤を照らしたりしてます。我ながら上手い配置だと思っています。

ディスプレイ

デュアルディスプレイは人権。
27インチ、4K、USB-C、5万円台という神がかり的にバランスの良いディスプレイがDELLから4月に出たので、早速買いました。

皆同じことを思っているのか、今は在庫切れ。

今は会社PCがアレなのでHDMI接続だけど、夏ごろリプレースされる新PCはUSB-C1本でつながるようになってすっきり接続できるのでワクワクしてます。(Bluetooth機能も解禁されるので自宅ではクラムシェルモードでキーボード、マウスは自分の使ってるだろうな)

キーボード

打鍵音が煩くなく、正確に打てるキーボードということでFILCOのMajestouch Convertible 2 赤軸を使っています。

リアフォとか東プレとかいろいろあるんですが、まー好みだと思います。
ヨドバシなりツクモなりのリアル店舗で実際に感触を確かめて選んでみてはいかがでしょう? って当分無理か…

マウス

Logicoolの適当なやつ。なぜか昔からあまりマウスはこだわりがありません。(いいやつあったら教えてください)

服を着替える

ここからは心理的な話。
つい寝間着で仕事始めたくなりがちなんですが、いつもの出勤時の服*3に着替えるだけで、しゃっきり仕事モードになるので着替えてます。

オンライン井戸端

私の部署は、3月下旬から全員が在宅勤務になっています。そうすると、普段気軽にやってた「雑談」が消滅しました。 4月頭に部署内で雑談したい機運が高まり、ビジネスチャットツール上に「井戸端」というチャネルを作りました。作成後、あっという間に「今日はリングフィット30分やった」「座椅子買った」とか投稿されて、返信もemojiリアクションも沢山あり、ワイワイできています。F2Fの雑談の効用には及ばないものの、オンラインで雑談してホッとできる場があるということの心理面の効用は無視できないと思います(本当はこういうtipsを総務とか健康管理室とかが率先して広報してほしい)

前職の先輩が「ビジネスチャット初級編」というブログ記事で「雑談」チャネルの有用性に触れていました。それ以外に関しても、記事の内容はSlackやTeamsを導入している環境で働いている方には概ね納得できるんじゃないかと思います。弊社はビジネスチャットツールが導入されてまだ1年くらいなので、この記事を全社員に読んでもらいたいくらいです。 blog.satotaichi.info

Life

食宅便

割と自炊するのは好きな方です。でも、普段は

  • 朝:コンビニのサンドイッチ or ドトールモーニング
  • 昼:職場近くでお弁当or外食
  • 夜:スーパーで食材買って自炊

で回してたのでいざ週5の在宅勤務が始まると、食事の用意が単純計算で3倍になって「うへぇ」って気持ちになりました。
ある日、上で書いた会社の「井戸端」チャネルに、子育て中の女性社員が同じ悩みを投稿してて、そこで知ったのが弁当宅配サービス「食宅便」でした。

shokutakubin.com

1食約600円で、管理栄養士が監修したお弁当が届きます。冷凍なので好きなときに食べられるし、5品目くらい入っててバランスも良い。あと意外に美味しい(重要)
高齢者がターゲットということもあり味付けはやや薄めですが、健康的でかえってこういう状況にはいいんじゃないかと思います。

本当は第1候補はつくりおき.jpだったけどサービスエリア外で断念しました。

コロナでは物流が止まるのではないかという群集心理からいろいろなものが買い溜めされました。私は震災の備えということもあり、水や食料は普段からまとめ買いしているので、特に混乱はなかったです。

Amazon定期便で、家に常に水が10Lくらいある状態を維持しておくと、災害備蓄も兼ねることができるので素晴らしいです。
同じ発想で、ウォーターサーバーを契約するのもありだと思います。

Infodemic

もう誰しもが感じているとは思いますが、コロナ以降のTwitterのTLはかなり辛いものになっています。ミュート・RT非表示にした人もいます。極度の不安からか、本人のメンタルに悪影響なのが明らかなのに、Twitterで情報を集めるのをやめられない人が多い。この辺りの"情報中毒"というか、たぶん手を洗い続ける強迫神経症に似てるメカニズムなんだろうけど、いつか医学的な研究が進むといいと思います。

メンタルケアに関して私のオススメの本は、昔からこれです。

著者は精神科医ではありませんが、極度のストレスに晒される自衛隊員のメンタルケアを行っていた人です。観念論に終始せず、実用的なアクションがいくつも載っています。

おしゃべり

外出自粛の影響で、おしゃべりの有り難みがめちゃくちゃ上がってます。

  • 行きつけのレストランのテイクアウトを取りに行くときに、店主と会話
  • 会社の同僚とあえてビデオ会議で雑談
  • 恋人とは寝る前にLINE通話、休日にFaceTime

最後に

コロナの影響は少なくとも向こう2年は続くと思います。
少しでも快適な環境を作って、それぞれの持ち場でやっていきましょう。

*1:23区内に住んでいるため月10万出しても32平米にしか住めない

*2:「いつ結婚できるの?」って言わない

*3:弊社はビジネスカジュアル

声で家電をコントロールしたい(Google Homeの話)

今風の言葉で言えば「ホームオートメーション」の一種なのかな。 数年前にTwitterでエアコンをオンオフして家についたらガンガンに冷房効いてる環境を実現した(以下記事)ので、前から興味あったのだけど、去年ヨドバシがGoogle Home miniの叩き売りしてるの見て、今度は声でいろんな家電をコントロールできると良いなと思った。 entropiajp.hatenablog.com

したいこと

  • 寝る前に、布団に入ったまま照明テレビエアコン消したい
  • 朝起きたら、照明とテレビをつけたい

用意するもの

Nature スマートリモコン Nature Remo mini Remo-2W1

Nature スマートリモコン Nature Remo mini Remo-2W1

Nature Remoは赤外線リモコンしかコントロール手段がない家電をスマート家電化させるハブ。Nature RemoはGoogle Homeに対応しているので、Nature Remoを用意することで声→Google Home→Nature Remo→家電のルートで家電に任意の赤外線を飛ばせる。普通のリモコンってかなりシビアに家電の方向に向けないと反応しないものだけど、Nature Remoの場合は設計上の謎の工夫がされていて、その家電が見えていれば向きはあんまり気にしなくてもちゃんと赤外線が届く。すごい。(昔Arduinoで赤外線飛ばしたときめちゃくちゃ大変だったので…)

操作したいもの

  • シーリングライト
    • 普通のシーリングライト。赤外線リモコンでオンオフや照度の調節ができる
  • LEDテープライト Koogeek LS-1
    • テレビの後ろの間接照明。音声操作を見越してGoogle Home/Apple HomeKit対応のものを買ってあった
  • テレビ
    • BRAVIA KJ-55A8F 2018年購入の割と新しいモデル
    • Google Assistant built-in搭載なので楽勝だろうと思いきやそんなことはなかった(後述)
  • エアコン
    • DAIKIN製の一般のご家庭にあるタイプ

KoogeekのLEDテープライトは音声操作しなくても面白い↓

準備

アプリをダウンロード

Google Home

Google Home

  • Google LLC
  • ライフスタイル
  • 無料
apps.apple.com
Nature Remo

Nature Remo

  • Nature, Inc.
  • ユーティリティ
  • 無料
apps.apple.com
Koogeek Home

Koogeek Home

  • TOMTOP
  • ユーティリティ
  • 無料
apps.apple.com

初期設定

KoogeekのLEDテープライトLS-1をコントロールしたいので、Koogeek Homeのセットアップから。とはいえ、このライトはApple HomeKitに対応しているので、ライトの電源部のシールに印刷されたコードをiPhoneの「ホーム」アプリで読み取るだけでOK。

次に、赤外線リモコンを使うシーリングライトとエアコンをNature Remoに登録する。このへんは公式サイトにもガイドがあるので省略。

Google HomeBRAVIAの電源オンオフはできない

公式「できる場合もありますが、ソニー側で動作保証はしておりません。」 スマートスピーカー(AIスピーカー)とブラビアをつなぐ | Android TV™ 接続情報 | テレビ ブラビア/ベガ | サポート・お問い合わせ | ソニー

BRAVIAをセットアップしようとして調べてみたらこの記事↑。 割とびっくりしたんだけど、Android TV乗っけた2018年のBRAVIAは、Google Homeで電源オンオフに対応してない。 しょうがないので、Nature RemoでBRAVIAのリモコンを普通に学習させることに。

セットアップ

この状態でも、アプリからはそれぞれの家電をコントロールできる。Google Home miniに話しかけてコントロールするためには、もうひと手間が必要。

Google Home miniをGoogle Homeアプリのデバイスとして追加する

Google Homeアプリにはまだなんのデバイスも登録されていない。まず、Google Home miniを登録する。

f:id:entropiajp:20191125020804p:plain:w360

左上の+をタップ

f:id:entropiajp:20191125020808p:plain:w360

「デバイスのセットアップ」

f:id:entropiajp:20191125020811p:plain:w360

「新しいデバイスの設定」

KoogeekのLEDテープライトをGoogle Homeアプリのデバイスとして追加する

上の手順の最後のタップを「セットアップ済みデバイスのリンク」にして、Koogeek Homeを追加する(「Koogeek Life」ではないので注意)

Nature Remoに繋がった家電をGoogle Homeアプリのデバイスとして追加する

Koogeekと同じ手順でNature Remoを追加する。

ルーティンの設定

これまでのセットアップで、すでに音声による個別の家電操作はできるようになっている。でも、いちいち全部の家電名を呼んで消すのは疲れる。

そこで、Google Homeにはルーティンという機能が用意されていて、あらかじめ決めておいた言葉で声を掛けると、指定した操作をまとめて実行してくれる。
設定 > その他の設定 > アシスタント > ルーティン をタップすると、ルーティンの設定画面になる。デフォルトで「おはよう」とか「おやすみ」などが定義されているので、たとえば「おやすみ」のルーティンに「シーリングライトをオフ」「LEDテープライトをオフ」「エアコンをオフ」「テレビをオフ」を設定しておく。すると、「OK Google, おやすみ」と言うだけで全部実行される。素晴らしい。

できた

1週間で医療情報技師能力検定試験に合格する方法

受験者について

  • SIerでSEを5年→製薬会社でIT企画を1年
  • 担当業務は社内ITシステムの企画・PM業務・運用保守
  • 基本情報、応用情報、セキュリティスペシャリスト、DBスペシャリスト持ち
  • これまでの仕事で医療系システム開発に携わったことはない

近々、病院のデータ分析をテーマとした共同研究にシステム屋として関わることになったものの、医療系システムは門外漢の自分には分からないことだらけでどうやって勉強したもんかと悩んでいました。ネット上で情報収集していたところ、医療機関システム開発案件の入札要件に「PJチームに医療情報技師が○名いること」という記載が多いことに気づいて医療情報技師の存在を知り、ざっくり医療系システムの全体像を知ることを狙って受験することにしました。

倒すべき敵を知る

試験は科目合格制を採用しており、3科目全ての試験で合格点に達する必要があります。

**** 情報処理技術系 医療情報システム系 医学・医療系
試験時間 10:30~11:30(60分) 13:00~14:30(90分) 15:30~16:30(60分)
出題形式 マークシート5択 マークシート5択 マークシート5択
出題数 50 60 50
合格点 毎年変動 毎年変動 毎年変動

医療情報技師の試験は税理士試験のような科目合格制を採用しています。一度合格した科目は2年間、つまり次回、次々回までは受験が免除されます。 また合格点が曲者で、おそらく毎年の合格率を30%程度に維持するために、合格点は毎年変わります。

情報処理技術系

基本情報技術者試験をやや易しくしたレベルです。 過去問を見ればわかる通り、基本情報持っていれば無勉強でも楽勝です。

医療情報システム系

おそらく、院内SEや医療情報システムベンダーSEとして実務経験をお持ちの方は、楽勝なのだと思います。 勉強にあたってもっとも苦労したのがこの分野でした。

医学・医療系

看護師、臨床検査技師など、医療従事者にとっては楽勝なのだと思います。 毎年必ず最後の数問が統計系の設問なので、統計基礎をさらっておくと得点源になります。

医療情報技師 - Twitter SearchTwitterで医療情報技師で検索すると、IT系の人は医学・医療系に苦しんでいるし、反対に医療従事者は情報処理技術系に苦しんでいるのがよく分かります。個人的には、この資格は院内SEが取得することを想定して設計されているように感じました。院内SEは、医療従事者・外部ベンダー・医療機関経営層の三方と適切にコミュニケーションしつつ、医療業界特有の各種法規制や業界指針に沿った医療情報システムを企画・開発・運用することを求められることから、上記3科目を広く浅く知っていることを要求する試験になっている気がします。

特に医療情報システム系を勉強してて感じたのは、現代の医療現場は専門家集団の高度な連携によって成り立っており、またそれぞれの職責・権限は各種法規制によって厳密に定義されているということです。「診断」ができるのは医師だけ、「調剤」ができるのは薬剤師だけ…とか。"越権"行為や医療事故、倫理的に不適切な事案を防止するために、医療情報システムの側でできることは多々あるなと感じました。

おすすめ参考書

次の4冊を買うのが鉄板です。

  • 過去問(最重要)
  • 医療情報 第6版 情報処理技術編
  • 医療情報 第6版 医学・医療編
  • 医療情報 第6版 医療情報システム編

医療情報技師能力検定試験過去問題・解説集2019

医療情報技師能力検定試験過去問題・解説集2019

  • 作者: 一般社団法人日本医療情報学会医療情報技師育成部会
  • 出版社/メーカー: 南江堂
  • 発売日: 2019/03/28
  • メディア: 単行本
  • この商品を含むブログを見る

医療情報 第6版 情報処理技術編

医療情報 第6版 情報処理技術編

医療情報 第6版 医学・医療編

医療情報 第6版 医学・医療編

医療情報 第5版 医療情報システム編

医療情報 第5版 医療情報システム編

医療情報の基礎知識とか、サブノートは不要です。

スマホアプリ

IPAの試験のように過去問演習ができるアプリがあれば良かったんですが、残念ながら医療情報技師試験向けの良いアプリは見つかりませんでした…。(あるにはあったんですが、品質が怪しそうだったので購入せず)

勉強法

とにかく過去問演習です。
過去問解く→答え合わせ→確信を持って正答だった設問以外は、3冊の参考書の記述を読んだり、ネット上で検索したりして「なぜその選択肢が正答になるのか」「なぜ他の選択肢は誤答といえるのか」を明らかにしておきます。

私はこんな風にノートにざっとまとめてました。

f:id:entropiajp:20191011020752j:plain

本番直前に目を通すいい教材にもなりました。

合格率は例年3割なのでそこまで高難度の試験ではないのですが、ちゃんと勉強しようとすると範囲が異常に広いので辛い試験です。 「合格最低点でも、満点でも、合格は合格」なので、捨てる分野は捨ててしまっていいと思います。
私は暗記が苦手なので、医学・医療系の腫瘍マーカー、病床利用率の計算、看護分類あたりは捨てました。

総学習時間

22.5時間。ざっくりと内訳↓

  • 過去問 {2.5h(解答)+2h(採点と復習)}×5年分 = 22.5h

結果

**** 情報処理技術 医学医療 医療情報システム
合格点 60/100 58/100 74/120
得点 92 82 86

自分を褒めたいので🍣食いに行きます

こやさんが2018年買ってよかったリスト

2018年もあっという間でした。振り返りましょう。

シモンズ ゴールデンバリューグレーシャスN

f:id:entropiajp:20181224011055j:plain

IT業界ですっかり腰をやられてしまった僕とあらみす @aramis1311 は最高の睡眠を提供してくれるベッドを求めて池袋まで来た。僕はシモンズを、彼はサータを買った。二人共、最高の睡眠を手に入れた。

~完~

ザ・プレミアム ソフゥール敷毛布

ウール100%の敷毛布。最高に肌触りがよく、無限にもふもふできる。
四隅にバンドも付いているので、マットレスへの固定も簡単。

f:id:entropiajp:20181120022350j:plain
ベッドに設置してみた

羽毛ファクトリーすやすや ポーランドマザーグース 羽毛肌掛け布団

春~秋用に買った。羽毛布団というのは昔から訪問販売の話があって胡散臭いイメージがどうしても拭えないけれど、とりあえず「羽毛ファクトリーすやすや」で買っておけば間違いない。僕は無印の掛けふとんカバーを掛けて使ってる。最高。とにかく蒸れない、それでいて暖かい。 この羽毛布団は真冬用のかさが厚い羽毛布団ではないけど、上に書いた敷毛布と組み合わせることで冬も十分暖かく眠れる睡眠環境を作れている。(うちがマンションの高層階でそもそもそんな寒くないというのもある) とにかく、高いものを一度バシッと買ってしまえば、お買い物ジプシーは簡単に終わる。君はオーディオインターフェースをこれまで何台買い替えてきた?最初からRMEにしとけって… そういうことだ。

無印良品 ベッドフレーム オーク材

f:id:entropiajp:20181007183241j:plain

それまで楽天で買った安物のベッドフレーム使ってたので、せっかくシモンズ買ったならベッドフレームも買い換えようということで導入。 まず見た目が良い。そして寝返りをうってもきしむ音が一切しない。 あと、無印の不用家具引取サービスが最高。これは、商品を買い換える場合、古いものを無料で引き取ってくれるサービス。今回の場合ベッドフレームを買ったので、古いベッドフレームを無料で回収してくれる。粗大ごみの手配もめんどいし、そもそも1Fまで一人でどうやって持ってくのか、とか手間を考えるとこのサービスは素晴らしいと思う。あまり知られてないようなので、もっと宣伝するべき。

Sony 4K有機ELテレビ BRAVIA KJ-55A8F

ラ・ラ・ランドインターステラーを最高の環境で観たかった、ただそれだけで購入。 有機ELテレビは2017年はまだかなり高かったけど、2018年には現実的な値段になってきたと思う。来年はもっと下がりそう。 前評判どおり、リモコン操作に対する反応がややもっさりしていてそこだけは不満。

f:id:entropiajp:20180908003801j:plain
PS4 Detroit: Become Human
f:id:entropiajp:20180923065230j:plain
4Kバージョン「君の名は。

Panasonic ドラム式洗濯乾燥機 NA-VX8800

自動洗剤投入は神

前使ってた洗濯機が買って6年経ってたから必要な買い物だったと自分に言い訳しているが、どう考えてもガジェット好きの延長である。 自動洗剤投入機能が神。洗剤、柔軟剤をあらかじめタンクに入れておくと、毎回勝手に衣服の量に応じて適量を投入してくれる。たしかに、言われてみれば機械にできそうなことなのに、なんで今までの洗濯機にはついてなかったんだろう。不思議だ。
ほとんどの洗濯物はドラム式で完結させてるけど、Yシャツは綿50%アクリル50%のものを洗ってみたらややシワが残ってしまうので、取り出してハンガーにかけて乾燥してる。

Panasonic 食洗機 NP-TH1

皿洗いはもともと嫌いではない、というか好きな方の家事なんだけど、今回の引っ越しは「時短」がテーマの一つだったので、思い切って導入してみた。今となっては無くてはならない家電の一つになった。
時短効果もさることながら、60℃のお湯と、手洗いでは使えない強い洗浄力を持つ専用洗剤が使われることで、手洗いでは「絶対に到達できない」レベルで綺麗に仕上がるのが嬉しい。紅茶の茶渋がついたサーモスタンブラーが新品同様になったときには本当に驚いた。 アドバイスできることがあるとすれば、食器の良い置き方(説明書に書いてある)を早く覚えるのと、一番でかいやつを買え
Amazonのレビューにもあるけど、一人暮らしこそ一番大きなサイズを買うべき。

SKAGEN 腕時計

昨年も買ったSKAGEN買い足し。落ち着いた色合いとデザイン、そして何より見やすい盤面(最重要)。それでいて1万円前後と安いので気軽に買える。個人的に北欧テイスト大好きなので来年も買うと思う。

つば屋 三徳包丁

f:id:entropiajp:20181224001537j:plain
V金10号ワイン 牛刀 赤柄

料理するなら包丁に1万くらい出しとこ。一生モノです。 昔買ったものは母親にあげてしまったのでこの度の引っ越しに伴って買い直し。 「つば屋」は浅草近くの合羽橋道具街にある包丁専門店。

Roland RD-2000

言わずもがな、ローランドのフラッグシップステージピアノ。
V-Pianoテクノロジーによるアコースティックピアノ音源も勿論美しいのだけど、なによりタッチが素晴らしい…。RD-2000で弾くだけで強弱がきちんと付くようになるので巧くなったと錯覚する笑
ちなみに僕はソフトシンセ音源「Ivory II」でいつもピアノを弾いてるけど、それでも他のMIDI鍵盤で弾いた場合よりも自分の表現がより的確に伝わっている感触がある。

防音マット 防音カーペット 静床ライト

夜弾いてたら家族から「打鍵音がうるさい」とクレームが入ったので導入した防音マット。電子ピアノはヘッドホンを使えば外に音は出ないけど、鍵盤を打鍵するコツコツという音は相変わらず外に鳴ってしまう。このマットはずっしりと重さがあって、床に響く音(≒振動)を軽減してくれる。

f:id:entropiajp:20180216102541j:plain
設置前
f:id:entropiajp:20180216103058j:plain
設置後

結果的には買って大正解。鍵盤楽器を弾くなら必須だと思う。あと、子どもが床に物を落とした時とか階下に響く音を軽減できるんじゃなかろうか。ファミリー向けにもおすすめ。

ヨネックス ラケバ BAG1729

普通、ラケバ(ラケットバッグ)って横型が多くて、かっこいいんだけど電車移動があったりすると持ち運びにちょっと苦労する。 このラケバは完全に背負う形にしつつ、ラケットがすっぽり2-3本入るようになってる。自分が現役の中高生バドミントン部員だったら絶対買ってた。黒に蛍光イエローのデザインもGood。

Apple iPhone 8

iPhone SEを長く愛用していたけど、iOS 12になり動作が怪しくなってきたのと、バッテリーが1日持つかどうか怪しくなってきたので、えいやでApple Store新宿で買ってきた。本当にサクサク動いて快適&満足。意外な嬉しさとしてはApple Payの便利さ。コンビニの買い物はApple Payで済ますようになったので、現金を使う機会がかなり減った。このままノーキャッシュライフにしたい。

終わりに

2018年も、沢山の良いものと出会えました。 来年も、沢山の良縁がありますように。

Spring Socialについて自分用メモ

概要

SpringアプリケーションからTwitterFacebookなどのSNSサービスを手軽に利用するためのライブラリ。

Spring Socialを使うメリット

  • SNSのユーザ認証が手軽に実装できる(OAuth, OpenID Connectの詳細を知らなくてもOK)
  • Twitter, Facebook, LinkedIn, Githubなど大手SNSなら、それらのREST APIのラッパーSDKが利用できる
  • Spring Securityと連携したユーザ認証機構を手軽に実装できる

おことわり

この記事では、接続するSNSとしてTwitterを例として話します。
Spring Socialのreferenceをもとに話します。
Spring Social Reference

build.gradle

compile("org.springframework.boot:spring-boot-starter-social-twitter")

SNSアカウントでアプリにログインする機能がほしい場合はさらにspring-social-securityが必要。 compile("org.springframework.social:spring-social-security:1.1.0.RELEASE")

用語説明

provider

OAuth認可フローにおける、tokenの発行者。

consumer

OAuth認可フローにおける、tokenの受取者。

つまりSNSを利用するアプリがconsumerで、利用するSNSがproviderとなる。

SNSAPIを呼び出す単純なアプリ(connecting to providers)

SNSとのOAuth認証部分が全てspring-social側で実装されているので、開発者が書くコードは驚くほど少ない。

ConnectController

org.springframework.social.connect.web内で実装されているController
下記エンドポイントが自動的に利用できるようになる。

GET /connect

すべてのproviderについて、アカウント接続状況を一覧で表示する

GET /connect/{providerId}

指定したproviderのアカウント接続状況を表示する。

POST /connect/{providerId}

指定したproviderへの接続処理を開始する。

GET /connect/{providerId}?oauth_token={request token}&oauth_verifier={verifier}

Receives the authorization callback from the provider, accepting a verification code. Exchanges this verification code along with the request token for an access token and completes the connection. The oauth_verifier parameter is optional and is only used for providers implementing OAuth 1.0a. (※リファレンス引用)

DELETE /connect/{providerId}

指定したproviderへの接続情報を削除する。

DELETE /connect/{providerId}/{providerUserId}

ユーザのproviderUserIdに基づいて、指定したproviderへの特定の接続のみ削除する。

{providerId}TwitterであればtwitterFacebookならfacebookのような文字列。

viewはデフォルトで未定義なので、別途用意する必要がある。 サンプルアプリではtemplates.connectフォルダ以下にthymeleafのテンプレートファイルが作られている。

  • twitterConnect.html Twitterに未接続の場合表示されるview
  • twitterConnected.html Twitterに接続済みの場合表示されるview

SNS接続済みかをチェックする

connectionRepository.findPrimaryConnection(Twitter.class)で判別できる。
すでに認証できていれば Connection<Twitter> クラスのコネクションが返ってくるし、未接続ならnullが返る。

Connection<A>はspring-socialの根幹をなすinterface。

public interface Connection<A> extends Serializable {

    ConnectionKey getKey();

    String getDisplayName();

    String getProfileUrl();

    String getImageUrl();

    void sync();

    boolean test();

    boolean hasExpired();

    void refresh();

    UserProfile fetchUserProfile();

    void updateStatus(String message);

    A getApi();

    ConnectionData createData();

}

認証情報の永続化

OAuth認証に必要な情報は以下の4つ。

  • アプリのconsumer ID
  • アプリのconsumer secret
  • ユーザのaccess token
  • ユーザのaccess token secret

上2つはSNSでアプリ登録するとアプリ1つにつき1つ付与されるので、それをPropertiesファイルなどに記載すればよい。 下2つはユーザごとに異なるので、ユーザごとにconnectionから取得し、DBなどに永続化することになる。

access tokenとaccess token secretはそれぞれconnectionから以下のメソッドで取得できる。

  • connection.createData().getAccessToken()
  • connection.createData().getSecret()

providerのAPIコール

REST APIコールをラップするクラスが用意されている。
ConnectionインタフェースのgetApi()メソッドでラッパーのインスタンスを取得できる。型はprovider名と同じ。(TwitterならTwitterクラス)

@Controller
@RequestMapping("/")
public class HelloController {

    private Twitter twitter;

    private ConnectionRepository connectionRepository;

    @Inject
    public HelloController(Twitter twitter, ConnectionRepository connectionRepository) {
        this.twitter = twitter;
        this.connectionRepository = connectionRepository;
    }

    @RequestMapping(method=RequestMethod.GET)
    public String helloTwitter(Model model) {
        if (connectionRepository.findPrimaryConnection(Twitter.class) == null) {
            return "redirect:/connect/twitter";
        }

        model.addAttribute(twitter.userOperations().getUserProfile());
        CursoredList<TwitterProfile> friends = twitter.friendOperations().getFriends();
        model.addAttribute("friends", friends);
        return "hello";
    }

}

上記のコードでは、OAuth認証後にはtwitterインスタンスを用いてTwitterの各種API呼び出しができるようになっている。
例えばtwitter.friendOperations().getFriends()でログインユーザのフォローしている人の情報を取得できる。

SNSアカウントでログインするアプリ(signing in with provider account)

いわゆるソーシャルログイン。

利用例

単純なアプリ例との違い

  • ユーザが同じブラウザでTwitterにログイン中で
  • そのアプリのアクセスをすでに許可している

と、認証を要求されずスムーズにログインできる。 (authorizeせず、authenticateだけ行われる)

先ほどの単純なアプリの場合、上記条件を満たしていても、いちいち「(アプリ名)があなたのアカウントを利用することを許可しますか?」というTwitterの画面にリダイレクトされる。

  • 単純なアプリでエンドポイントを提供するConnectControler
  • SNSアカウントでログインするアプリでエンドポイントを提供するProviderSignInController

どちらのControllerにも定義されているConnectSupportクラスのフィールドにboolean useAuthenticateUrlという値があり、これがいちいちSNSのアプリ認証画面を出すかどうか左右している。

実装方法は2種類ある

SocialAuthenticationFilterを使う方法と ProviderSignInControllerを使う方法がある。

どのように両者を使い分けるかはSpring Social Referenceに記載があり

Although both options will work with Spring Security, we recommend using SocialAuthenticationFilter in applications where Spring Security is in play.

とあるように、Spring Securityを利用しているアプリケーションでは、SocialAuthenticationFilterを使う方法が推奨される。

一方で、

ProviderSignInController, on the other hand, is agnostic to the security mechanism your application employs and can be used in applications that aren’t using Spring Security.

とあるように、ProviderSignInControllerはSpring Securityと独立して(agnostic to security mechanism)動作するので、Spring Securityを利用しないアプリケーションでもProviderSingInControllerを使えば、ソーシャルログイン機能を実装することが可能になる。

SocialAuthenticationFilter

Spring Securityのconfigurationに.apply(new SpringSocialConfigurer())を追加する。

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .formLogin()
            .loginPage("/signin")
            .loginProcessingUrl("/signin/authenticate")
            .failureUrl("/signin?param.error=bad_credentials")
        .and()
            .logout()
                .logoutUrl("/signout")
                .deleteCookies("JSESSIONID")
        .and()
            .authorizeRequests()
                .antMatchers("/admin/**", "/favicon.ico", ...).permitAll()
                .antMatchers("/**").authenticated()
        .and()
            .rememberMe()
        .and()
            .apply(new SpringSocialConfigurer());
}

ProviderSignInController

SNSのアカウントによるログイン機能をSpringアプリに追加するにはProviderSignInControllerをbeanとして設定する。

@Bean
public ProviderSignInController providerSignInController(
            ConnectionFactoryLocator connectionFactoryLocator,
            UsersConnectionRepository usersConnectionRepository) {
    return new ProviderSignInController(
        connectionFactoryLocator,
        usersConnectionRepository,
        new SimpleSignInAdapter(new HttpSessionRequestCache()));
}

参考情報

ニュー・シネマ・パラダイス

※2012年の日記をサルベージ。

高校の頃付き合ってた彼女は,映画監督を目指していた.
頭も良くて,本も沢山読んでいた.当時図書委員だった僕なんかより,ずっと沢山.吹奏楽部でOb.を吹いていたのもあってか,音楽の大切さもわかっていて,そしてちょっと人付き合いが不器用だった.
もう数年会っていないし,メールのやり取りもない.まったくの音信不通である.
彼女は結局,映画監督になったのだろうか??

そんな彼女がこよなく愛していたのが,この映画だった.
当時,この作品は必ず観てほしいと何度も勧められていたが,あらすじだけ聞いた感じだと自分にはピンと来るものが無く,エンニオ・モリコーネ氏の音楽だけ気に入って何度も聞いていた.

そうやって,僕のiPhoneには6年前からこの題名のアルバムが入っている.

最近,そういえばこれは映画音楽だったと思い出し,DVDを買ってきた.
今日やっと本編を観ることができた.

…なんで僕は,今までずっと観てこなかったのだろう.
ラストの,つなぎあわせたフィルムを主人公が試写室でひとり観るシーンは,ひたすらに切なかった.

舞台は映画館のある小さな村.幼少を映画技師の男アルフレードと過ごした少年トトが初恋,徴兵,挫折を経てやがて大人になり,村を捨てて一人前の映画監督として巣立つ.しかし,ある晩に電話で映画技師の死を知る.彼は葬式へ参列するため,30年振りに故郷に戻ることとなる.

お話としては,こういうことだし,映画の最初から最後まではたった1日の話.
しかしほとんどを占める主人公の回想シーンで,アルフレードがトトに語りかける台詞が素晴らしい.

「自分のすることを愛せ。子供の時、映写室を愛したように」

「人生は、お前が見た映画とはちがう。人生は、もっと困難なものだ」

当時,トトは青年に成長していた.しかし徴兵がきっかけで初恋の相手エレナと音信不通となる.失意のどん底にあるトトに,アルフレードが投げかけたのが上の台詞.

アルフレードは年齢が離れているが,トトの良き理解者だった.トトをなぐさめ,エレナとの恋路を応援する選択肢もあっただろう.しかし,アルフレードはトトと接する中で,トトの映画監督としての素養と映画に対する並々ならぬ愛を感じていた.だからこそ,アルフレードはトトに,夢を目指してほしかった.”郷愁に惑わされ”村に留まって映画技師を続けた自分の様な人生を,彼には歩んでほしくなかった.…愛するトトだからこそ.彼の愛はいつだって不器用で,そして深かった.それは最後のシーンでトトが観る,アルフレッドが遺したフィルムにも表れている.

この映画の良さに6年前に気付いていた彼女は,今いったいどんな感性を持っているんだろうと,ふとぼんやり考えてしまった.トトが恋と郷愁を捨てて,将来の夢のために知らない土地を目指していったように,彼女もまた,僕との恋を捨てて夢のために歩く決意をしたのなら,ほんとうに彼女はかっこいい人間だと思う.

ジュゼッペ・トルナトーレという名監督を教えてくれた点も,感謝したい.

ほんとうに,いい映画だった.