くうと徒然なるままに

モバイルアプリを作りながらバックエンドも作っています。

無線ノイキャンイヤホンWF1000-XM3を使い倒してみた@大学、新幹線、オフィス、京都観光

ソニーから最近発売開始され人気を集めている無線ノイキャンイヤホン WF1000-XM3 を使い倒してみたので感想記事を書いていきます。

ソニー SONY ワイヤレスノイズキャンセリングイヤホン WF-1000XM3 : 完全ワイヤレス/Bluetooth/ハイレゾ相当 最大6時間連続再生 2019年モデル プラチナシルバー WF-1000XM3 S

WF1000-XM3 とは?

強力なノイズキャンセリングを搭載したAirPodsのような無線イヤホンです。
Amazon などで購入でき、色は黒と白から選ぶことができます。

特徴

ノイズキャンセリング

ソニーからはノイズキャンセリング機能が秀悦なため以前より話題になっている WH-1000XM3 というものが出ています。
写真のやつです。

ソニー SONY ワイヤレスノイズキャンセリングヘッドホン WH-1000XM3 B : LDAC/Bluetooth/ハイレゾ 最大30時間連続再生 密閉型 マイク付 2018年モデル ブラック

こちらのノイズキャンセリング機能を移植したものです。実際に使ってみると ほぼ同等なノイズキャンセリング効果 を発揮してくれているようです。

音がいいらしい

ハイレゾとかAACとかよくわかりませんが、音がいいらしいです。詳しくないですが、iPhone 付属のイヤホンやAirPodsより音質いいかなーってぐらいです。

耳に触れる部分がゴム製なため耳の隙間がなくなるのでいい感じに使えます。

ソニー製😇

ソニー信者はソニーの製品を買わないといけないのです。

購入モチベーション

WH-1000XM3 では暑い時期になってきた。

WH-1000XM3 はヘッドホンです。耳全体を覆うため暑いです。

イヤホンなら軽減されるかなーと思い購入。

WH-1000XM3 は大きい

旅行とかに行くときにWH-1000XM3 を持ち歩くとかさばって辛いです。

小型化したかった。

実際使ってみてどうなの?

大学

大学の中を歩いてるときに静かに歩くことができます。

イヤホン自体の大きさが小さいため目立たずに使えて良さげです。

講義中は外しましょう(つけ心地いいのでつい忘れてしまう

東海道新幹線

とある事情により毎週東京と名古屋を往復しています。そのためかなりの頻度で新幹線を使っています。

大体3時間ぐらい電車に乗っているのですが、ノイズキャンセリング付きのものを使う前はかなり体力を消費していました。しかし、使うようになってからは体力がほとんど減ることなく乗車することができます。

新幹線のノイズって割とMPだけでなくHPも奪っていくんですね。

車内販売する時どうなの?

イヤホンを耳から外さないと辛いです。イヤホンにも一応外音取り込み機能がついてますが、正直外した方が楽...
シンカンセンスゴクカタイアイス 美味しい☺️

WH1000-XM3 と比べてどうなの?新幹線で寝る時辛い問題とか

ヘッドホンタイプの場合新幹線で寝るときにい引っかかってしまい辛いです。しかし、このイヤホンを使えばその問題が解決されます。

眠い時はぐっすり寝てます。₍₍ (ง ˘ω˘ )ว ⁾⁾ スヤッ スヤッ

オフィス

私は学生ですが、現在関東地方にあるIT企業で Software engineer のインターンシップをしています。
そのため、オフィス環境で使っている時の感想を書きます。

オフィス環境の前提条件

  • オープンスペース, 空いてる空間活用してフリーアドレスみたいにしてる人もいる
  • 席の近くにカフェがある
  • 電話がかかってくることはない

メルカリオフィスがUpdateされたよ!Part2 #メルカリな日々 | mercan (メルカン)

iPhone の音楽アプリで一番小さい音量で音楽を流すだけで大抵の騒音はカットできます。

使ってる風景

Sync の時以外は基本的にずっとつけてます。1on1 の時を除くとほとんど入ってないので割と多い時間で付けてます。

前の席はクーラー的に割と涼しかったのでヘッドホンの方を使ってましたが、最近は出番減り気味です。(暑がり

カフェで買う時

カフェで買うときには人間とコミュケーションを取らないといけないので話すのですが、こちらも新幹線の車内販売と同じようにイヤホンを外してます。

京都観光

旅行に行くときに充電もつ?

試しに1泊二日で京都へ旅行してきました。(それ以外にも目的はあるけど

朝充電が完了してから行きましたが、二日目に帰ってきてからも使えました。

トイレ行く時とかにイヤホンをケースに入れて充電してました。実用上は十分な印象。

観光とノイズキャンセリングイヤホン

ずっとつけていたわけではないのですが、愛知から京都への新幹線での移動時間やお寺等での鑑賞時に使いました。音が聞こえてた方がいいような場所では外しましたが、観光地で静かに鑑賞したい派の私としてはノイズキャンセリングが騒音だけにいい感じに聞いててよかったです。

音楽無しでノイズキャンセリングだけしてると騒音カットしつつ会話できていい感じ。

f:id:kuxumarin:20190718034213j:plain

欠点は?

防水ではない

防水ではないので雨が降ってくると辛い....

次のバージョンでは頑張ってほしい

最低音量でもある程度大きい

微妙に音楽かけたい時ってあるじゃん。そういうときに辛い。

ここから買ってくれると筆者が喜びます

iPad に入っているアプリを棚卸してみる。

iPad に入っているアプリを書き出してみる。

特によく使うやつ

写真系

動画見る系

たまによく使う

特によく使う

定番アプリ

写真系

Lightroom で編集してクラウドにバックアップしてます。

動画見る系

BGMがあると集中できるので

たまによく使う

本は最近あまり買ってないのでなぁ。

Circle CI の Config ファイルの検証をローカルで実行する。

Circle CI の .circleci/config.yaml をローカルで検証したくないですか?

Step 1. Install Circle Ci CLI

Circle CI にはローカルで実行できるようにCLI Tool が存在します。
また、Homebrew から導入できるようになっているので以下のコマンドを叩くだけで入れることができます。

brew install circleci

Step 2. Execute Validate Command

Circle CI のバリデーションを行うコマンドを実行することができます。

circleci config validate

検証に成功した時の出力

Config file at .circleci/config.yml is valid.

RecyclerView.ListAdapter でアイテム挿入後に何かしたい!非同期辛い!

RecyclerView を使って何かする時に ListAdapter を使ってますか? DIFFUtil を使うときに合わせて使うことが多いかなと思います。

問題点

submitList しても非同期で挿入されるため、 SubmitList() した直後にRecyclerView(Adapter) に対してあれこれすると古いリストに対して操作してしまう。

どのようなケースで問題になるのでしょうか?
具体的には以下にsubmitList した後に処理をするケースで問題になります。

// adpater は ListAdapter の実装クラス
adapter.submitList(emptyList())
// RecyclerView に適当な処理を加える
binding.RecyclerView.scrollToPosition(100)

Why?

SubmitList は内部で DIFFUtil を使い差分を計算する処理をバックグラウンドExecuter でしているからです。

そのため、submitList が発火した後に非同期的に差分計算をし、挿入したりしてます。

必ず挿入した後のリストに対して操作しなければいけない場合は?

コールバックを設定すれば大丈夫そうです。
ただ、もっとスッキリできる方法あるかも....

        adapter.registerAdapterDataObserver(object: RecyclerView.AdapterDataObserver(){
            override fun onItemRangeChanged(positionStart: Int, itemCount: Int) {
                super.onItemRangeChanged(positionStart, itemCount)
                // 変更されたのがコールバックされる
            }
        })

NodeJS で Json のAPIを叩いてみる

コード

const fetch = require('node-fetch')

fetch("http://weather.livedoor.com/forecast/webservice/json/v1?city=130010")
    .then(response => {
        return response.json()
    }).then(json => {
        console.log(json.description.text)
    })

結果

f:id:kuxumarin:20190417013354p:plain

LiveData-Kotlin Extension を試してみた

基本的には、 Transformations の拡張関数の集合です。

implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.1.0-alpha04"
class MainActivityViewModel : ViewModel() {

    private val source1LiveData = Source1Livedata()

    // 同じものが流れてきたときにブロックしてくれる
    val distinctResult: LiveData<String> = source1LiveData.distinctUntilChanged()
    // 射影
    val mapResult: LiveData<String> = source1LiveData.map { it.toUpperCase() + it.toLowerCase() }
    // 新しいものが流れてきたら前のものを中止するマン
    val switchMapResult: LiveData<String> = source1LiveData.switchMap { name -> getFullName(name) }

    // このようなメソッドが必要かは置いておいてLiveData を返す関数の時に使うと良さそう
    fun getFullName(name: String): LiveData<FullName> {
        val liveData = MutableLiveData<String>()
        liveData.value = name + name
        return liveData
    }
}

// ちゃんとした型定義をすべき...
typealias FullName = String
class Source1Livedata : LiveData<String>()