じまろぐ

めめ

ねこちゃんと泊まれる旅館で癒やしと学びを得てきた

f:id:nakajmg:20180924235917j:plain

湯河原にあるまいきゃっとという旅館でねこちゃんと一晩を過ごしてきた

www.mycat-yugawara.com

この旅館では併設されている猫カフェのねこちゃんを部屋に招いて一緒に泊まれる。控えめにいっても最高の体験&経験だった

ねこちゃんのトライアル

ねこちゃんと一緒に泊まれるというのは、ねこちゃんをレンタルするというわけではなく、あくまでもお試しで共同生活を体験してみるというやつ。ねこちゃんの糞の世話なんかもやる必要がある

今我が家では真剣にねこちゃんを飼うことを検討しているので、ねこちゃんとの生活がどういうものかを少しながら体験できて大変よかった

宿泊当日の流れ

  • 15時までにチェックイン
  • 併設されている猫カフェでトライアルするねこちゃんを決める
  • 18時~翌朝9時までねこちゃんと一緒に暮らす

旅館はすべて素泊まりで食事などの提供はなし。ねこちゃんのトライアル開始時間以降は部屋にねこちゃんしかいない状況にはできないので、18時までに外で済ますか、外で買ってきて部屋に持ち込むかのどちらか。

自分の場合、14時半に旅館に到着、猫カフェでねこちゃんを決めて、16時~17時30くらいまで熱海駅前を観光してた。熱海までは電車で10分。

トライアルの記録

今回2匹のねこちゃん、あらしくんとよしのちゃんをトライアルした。2匹は姉弟

最初は警戒してかごの中からあまりでてこない

f:id:nakajmg:20180924235758j:plain

わりとすぐ慣れてきて遊んでくれる

f:id:nakajmg:20180925000233j:plain

f:id:nakajmg:20180924235805j:plain

f:id:nakajmg:20180924235912j:plain

ちゅーるすごい

f:id:nakajmg:20180924235915j:plain

かわいい

f:id:nakajmg:20180924235923j:plain

朝背中に乗られる

f:id:nakajmg:20180925000747p:plain

ねこちゃんのいる暮らし

めちゃくちゃ幸せな時間だった。今回トライアルしてみて、ねこちゃんがいる暮らしがどんな感じなのかの具体的なイメージが掴めた。ねこちゃんにも性格がいろいろあるとか、糞はリアルなニオイがするとか、寝てると乗ってくるとか顔舐めてくるとか。

夫婦ともによい感触が得られたので、次の引っ越しの際には、ねこちゃんを迎え入れるのにかなり前向きになれそう。

Nuxtが監視していないファイルの更新をトリガーに再レンダリングしたい

Nuxtでプレゼンツールが作れないもんかと試してみたときにたどり着いた副産物。

作ったのはこれ。(数ヶ月前に作ってもう飽きてる

github.com

スクショ

f:id:nakajmg:20180925001859p:plain

TL;DR

  • Nuxtをexpressのmiddlewareで動かす
  • コンテンツの取得はexpressでAPI
  • ファイルの監視はchokidar
  • クライアントへの通知にServer Sent Events

プレゼンツールの概要

  • Markdownファイルでスライドが作れる
  • generateSSRしたやつが静的HTMLとして吐き出せる
  • pdfで保存できる

もろもろ

  • Nuxtはexpressのmiddlewareとして動かす
  • スライドは --- でページ区切り
  • Markdownのパースとかはexpress側でやる
  • パースした内容はAPIで取得
  • /talks/awesometalk/2 みたいな感じでページごとに取得

Markdownが更新されたら再レンダリングしたい

本題。Markdownの更新をトリガーにAPIから再fetchして画面を更新したい。

使ったのはServer Sent Events (SSE)

developer.mozilla.org

その辺りのソースはこれ

https://github.com/nakajmg/vresentation/blob/master/scripts/devServer.js

https://github.com/nakajmg/vresentation/blob/master/store/actions.js#L23-L34

EventSourceはVuexのactionsで作成するようにした。

  async [types.WATCH_MARKDOWN]({ commit, state }) {
    if (!es) {
      es = new EventSource('/stream')
      es.addEventListener('updated', async ({ data }) => {
        const { slug } = JSON.parse(data)
        if (slug !== state.slug) return
        const filePath = baseURL(`/${state.slug}/${state.page}`)
        const response = await request(filePath)
        return commit(types.SET_RESPONSE, response)
      })
    }
  },

これでNuxtの監視してないファイルの更新をトリガーにして再レンダリング成功

Nuxt便利

VuePressみたいなツール、Nuxt使えばわりと低コストで作れそうだなという感触。

SSR環境を自前でつくるの、思ってるより数倍はめんどくさいから、Nuxt使って楽していこう。

超お高級耳栓 BOSE SLEEPBUDSでストレスが減った

f:id:nakajmg:20180924235932j:plain

BOSEから発売された眠るためのイヤホン、BOSE SLEEPBUDSを購入してから3週間ほど経ちました。このエントリは自分にはそこそこ効果があったよというレビューです。

BOSE NOISE-MASKING SLEEPBUDS ノイズマスキングイヤープラグ

BOSE NOISE-MASKING SLEEPBUDS ノイズマスキングイヤープラグ

※ 自分は眠りにつくのが遅い&眠りも浅めでちょっとの音で起きるタイプです。

なにこれ

  • 入眠時に周りの音で眠りを妨げられないようにするためのイヤホン
  • ノイズキャンセリングではなく、ノイズマスキングで周りの音が気にならないようにする
  • アプリを使ってヒーリングサウンドを流し続ける(ノイズマスキング)
  • アラームが設定できる
  • 決まった音しか流せない(Bluetoohイヤホンではない)

小さいワイヤレスイヤホンをつけて、音を流し続けてほかの音を気にならないようにする、というやつ。決まった音しか流せない。

f:id:nakajmg:20180924235816j:plain
10種類の音から選んで流す

f:id:nakajmg:20180924235812j:plain
アラームが設定できる

使ってみての感想

まずこれを使うことで眠れるのかどうか、自分の場合は眠りにつく際に周囲の音で困っていたこともあり、その音への解決策として一定の効果があった。

自分が困っていた音は次の2つ。

  • 寝室と扉1枚で隣接するリビングからの音(生活音、話し声)
  • 深夜に動き出す上の住人の音(2時すぎ、足音とかいろいろ)

とくにリビングからの音に悩んでた。音の主は妻。いつもは一緒の時間に寝るか、自分が後から寝るので問題ないが、たまに先に寝たいときに音が気になって眠れない。

それがSLEEPBUDSをつけて音を流すと、リビングからの音が気にならなくなり眠れるようになった。これだけでも自分にとっては買った価値があったなと思えた。眠れないストレスって悪循環でさらに眠れなくなるから、ストレスを減らせるなら3万でもまぁいいかと自分は納得できた。

つけ心地

  • かなり小さいが、耳の穴が小さい人には合わなそう
  • つけて横向きになると「あるな」と思うくらいには装着感はある。枕によって変わりそう
  • 仰向けで寝る人には合ってそう

前はどうしても寝たいときBOSEノイズキャンセリングイヤホンで音楽流すとかもやってた。普通のイヤホンだと大きさのせいで仰向けを強制されるんだけど、SLEEPBUDSはかなり小さいので眠る体制は割と好きにできる。

寝るとき以外の使い道を模索

なにせ3万ですから。寝るときだけ使うのもアレなので試してみた。

  • カフェで作業するとき
  • 家で作業するとき
  • オフィスで作業するとき

カフェで作業するときSLEEPBUDSつけて音を流してみると、近くの席の会話が気にならなかった。水の音とか流すと、完全にシャットダウンするほど大きい音量じゃなくても会話に耳がいかなくなる感じ。

家作業では、車の音とか、おばちゃんの話し声とか、工事の音とかが気にならなくなる感じ。

オフィスでは話し声が聞こえなくなって集中できた。

それ普通のイヤホンでよくない?

はい。

でもでも、集中したいけど曲は聴きたくないときとか、ただ話し声をカットしたいときには結構いいと思う。ノイズキャンセリングだと話し声ってカットしきれないし。

総評

  • 入眠時の音で困ってるなら一考する価値はある
    • 先に普通のイイ耳栓試したほうがいい
  • 決まった音しか流せないのがちょっと残念
    • 好きな音楽とか流せないので注意
    • 作業用に使うのは割とアリな感じ
  • ケースがかっこよくて所有欲が満たせる

自分の場合は割とマッチしててアリかなという感じ。ただ3万円が適正価格かどうかというと何とも言えないかも。

現状これ系の選択肢がSLEEPBUDS以外になさそうなので、ほかのメーカーも参入してくれたらいいなぁと思う。特許ガチガチで無理なら、あと数ミリ小さくして好きな曲が流せるやつ出してくださいBOSEさん。

Dockerでホストしてるwebページを同一ネットワークにいる端末から開きたい

Dockerでホストしてるページ、pcで localhost とかでアクセスできるやつにiOS端末実機から開こうとしたらできなかった(同一ネットワークでpcのローカルipをURLに入れて) 。

webpackとかのローカルサーバだと同一ネットワーク内ならip入れればアクセスできるけど、Dockerの場合は事情が違うようで、検索したらいろいろ設定が必要とか出てきてめんどくさそうだった。

めんどくさいから localhost をそのままプロキシして公開すりゃいけるだろと思って試したらできた。

npx browser-sync start ---proxy localhost

npx でダウンロード&起動してお手軽プロキシ。すぐ思い出せたのが browser-sync なだけで、プロキシできればなんでもいい。

無事実機からページを開けて世界は救われました。fin

Firebase SDKのimportでwarningが出るときは

import firebase from "firebase"

すると

It looks like you're using the development build of the Firebase JS SDK.
When deploying Firebase apps to production, it is advisable to only import
the individual SDK components you intend to use.

とwarningが出る。

使うパッケージだけimportしろってことなので

import firebase from "firebase/app"
import "firebase/auth"
import "firebase/firestore"

使うやつだけimportするとwarningは出なくなる

これで解決しなかったら次のissueを参照

github.com

13インチ MBPに合わせてポータブルなモニタを買った

f:id:nakajmg:20180822200345j:plain

MBPを15インチから13インチに変えた影響で作業領域が若干せまくなりました。出先でやる気を出したいときに作業領域を広げたいので小さめなモニタを探しました。

いろいろ見た結果、購入したのはこれ。

よさ

  • type-c対応
  • HDMI(mini)入力あり
  • 13.3インチ

大きさはMBP13インチとほぼ一緒。

type-c対応で給電含めてケーブル1本で完結するのがとても良いところ。

HDMI(mini)入力があるのもよくて、type-cだけだと現状mac以外に使い道がなくなるので、HDMIでいろんな機器に使い回せるのは高評価ポイント。

あまり使わないけどスピーカーも内蔵してる。

スタンド

付属品のスタンドが若干重いので、代わりにプラ製のこれを持ち運んでる。

ケース

画面保護用のケースが一切ついてないので、使わないときはエレコムの保護ケースに入れてる。ジャストサイズ。

ポケットがついてるのでtype-cケーブルとスタンドを入れてすっきり収納。

ケーブル

type-c to type-c なケーブルは付属してないので、Ankerの50cmのやつを使ってる。MBP13インチの左側にモニタおいてMBP右側のtype-cにつなげる長さ。

いいよ

この大きさ&重さであれば普通に持ち歩ける。ケーブルも1本で済む。

おすすめです。

vuex-connectでnamespacedなmoduleを使いやすくするヘルパーを作った

vuex-connectはVuexでReduxのconnectのようにstoreとコンポーネントを繋ぐやつ。

www.npmjs.com

コンポーネントとstoreを繋ぐ部分を切り離せて宣言的に書けて気に入ってる。mapStateとかVuexが用意してるやつ使わなくてもstoreの値を取り出せて注入できる。

namespacedなmoduleを繋ぐとき

たとえば次のようなstoreがあったとき

const store = new Vuex.Store({
  state: {
    foo: 'foo',
  },
  modules: {
    moduleName: {
      namespaced: true,
      state: {
        bar: 'bar',
      },
      mutations: {
        barMutation(state, payload) {
          state.bar = payload
        },
      },
      actions: {
        barAction({ commit }, payload) {
          commit('barMutation', payload)
        },
      },
      getters: {
        barbar: state => state.bar + state.bar,
      },
    },
  },
})

vuex-connectではこう、関数で書いて階層たどってreturn。

import { connect } from 'vuex-connect'
import MyComponent from './MyComponent'

export default connect({
  stateToProps: {
    foo: 'foo',
    bar: state => state.moduleName.bar,
  },
})(MyComponent)

mapXxxxxぽく書きたいからヘルパー作った

数が少なければいいんだけど多くなってくると毎回namespaceの階層まで記述するのめんどい、のでヘルパー関数作った。

www.npmjs.com

import { connect } from 'vuex-connect'
import { stateToProps } from 'vuex-connect-namespace-helper'
import MyComponent from './MyComponent'

export default connect({
  stateToProps: {
    foo: 'foo',
    ...stateToProps('moduleName', {
      bar: 'bar',
    }),
  },
})(MyComponent)

mapXxxxxとかと同じように1つ目の引数にnamespaceを指定、そのあとそのmoduleのlocal stateを指定する。

ヘルパーがやってるのは指定されたnamespaceとstate名をいい感じにマッピングして、moduleのstateを返す関数に変換してるだけ。

API

内部的にやってることはほぼ同じだけど一応わけてある。

helperFunction(namespace, options) -> Object

  • stateToProps
  • gettersToProps
  • mutationsToEvents
  • mutationsToProps
  • actionsToEvents
  • actionsToProps

vuex-connectおすすめ

VuexのmapXxxxxを無計画に使ってるとつらみになりがちで

  • storeと密結合になるからmapXxxxxをpresentationなコンポーネントには使いたくない
  • コンポーネントごとに小さなcontainerを都度作るのつらい
  • pageレベルのcontainerにやらせるとmapXxxxxが増えまくってつらい
  • コンポーネント$emitをバケツリレーしてcontainerでmapMutationsとかした処理呼ぶのつらい

とかとか。

この辺りをスッと綺麗に書けるようになるので、Vuex使う人は一度試してみるのおすすめです。

starください。

github.com

github.com