人生シーケンスブレイク

人生を楽してクリアしたい。当面はPython学習帳

HomeBrewのアップグレードが面倒なのでLaunchAgentsで自動化した

TL;DR

  • 気が向いた時に $ brew upgrade --cleanup してたけど面倒なので LaunchAgents で自動化した。
  • 開発環境は Docker か pyenv / rbenv などで開発しているので、HomeBrewでインストールしているフォーミュラは全自動で勝手にアップデートしても問題なかった。
  • 実際超便利。

LaunchAgentへ登録

まず、BrewUpgrade.plist ファイルを作成する。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
    <key>Label</key>
    <string>BrewUpgrade</string>
    <key>ProgramArguments</key>
    <array>
      <string>/usr/local/bin/brew</string>
      <string>upgrade</string>
      <string>--cleanup</string>
    </array>
    <key>StartCalendarInterval</key>
    <dict>
      <key>Hour</key>
      <integer>5</integer>
      <key>Minute</key>
      <integer>0</integer>
    </dict>
    <key>StandardOutPath</key>
    <string>/Users/<user_name>/dotfiles/logs/brew_upgrade.out</string>
    <key>StandardErrorPath</key>
    <string>/Users/<user_name>/dotfiles/logs/brew_upgrade.err</string>
  </dict>
</plist>

上記では、 /usr/local/bin/brew upgrade --cleanup コマンドを毎日05:00に実行する。
スリープ状態だった場合には、スリープから復帰したタイミングで実行される。

つくったファイルを、 ~/Library/LaunchAgents/ 以下へ配置し、$ launchctl load ./BrewUpgrade.plist して完了。

~/Library/LaunchAgents $ ll
total 80
drwxr-xr-x  12 user_name  staff   384B  8 22 16:48 ./
drwx------+ 84 user_name  staff   2.6K  5 15 14:36 ../
-rw-r--r--   1 user_name  staff   768B  8 20 17:36 BrewUpgrade.plist
-rw-r--r--   1 user_name  staff   1.4K  2  7  2018 com.github.facebook.watchman.plist
-rw-r--r--   1 user_name  staff   485B  8 30 14:39 com.jetbrains.AppCode.BridgeService.plist
-rw-r--r--   1 user_name  staff   613B  8 29 11:31 com.jetbrains.toolbox.plist
-rw-r--r--   1 user_name  staff   909B  6 24 20:50 com.valvesoftware.steamclean.plist
-rw-r--r--@  1 user_name  staff   677B  4 26 11:51 org.virtualbox.vboxwebsrv.plist


~/Library/LaunchAgents $ launchctl load ./BrewUpgrade.plist
~/Library/LaunchAgents $ # 何もメッセージは出ない。

--cleanup オプションについて

--cleanup オプションを付けると、古いバージョンのフォーミュラを削除してくれる。
gitやgoなどはかなりサイズが大きく、古いバージョンを残すメリットはほぼないので最近は $ brew upgrade --cleanup にしている。 *1

$ brew upgrade --help
brew upgrade [install-options] [--cleanup] [--fetch-HEAD] [--ignore-pinned] [--display-times] [formulae]:
    Upgrade outdated, unpinned brews (with existing install options).

    Options for the install command are also valid here.

    If --cleanup is specified or HOMEBREW_UPGRADE_CLEANUP is set then remove
    previously installed version(s) of upgraded formulae.

    If --fetch-HEAD is passed, fetch the upstream repository to detect if
    the HEAD installation of the formula is outdated. Otherwise, the
    repository's HEAD will be checked for updates when a new stable or devel
    version has been released.

    If --ignore-pinned is passed, set a 0 exit code even if pinned formulae
    are not upgraded.

    If --display-times is passed, install times for each formula are printed
    at the end of the run.

    If formulae are given, upgrade only the specified brews (unless they
    are pinned; see pin, unpin).

ログファイルについて

    <key>StandardOutPath</key>
    <string>/Users/<user_name>/dotfiles/logs/brew_upgrade.out</string>
    <key>StandardErrorPath</key>
    <string>/Users/<user_name>/dotfiles/logs/brew_upgrade.err</string>

としておくと、実行時の標準出力とエラーが指定ファイルに書き込まれる。
その為、万が一アップグレード後に問題が発生した場合でも、ログを元に発生時期を辿れる。

環境ごとに専用ディレクトリをつくるのが面倒だったので、自分は dotfilse/logs/.gitkeep を配置して .gitignore で除外してそこに吐き出させるようにした。

参考

*1:個別に実行したい場合には、 $ brew cleanup もアリ

Xcodeを複数バージョン使い分けたいし、xcodebuildも バージョンを使い分けたい。

動機

複数プロジェクトのCIの為に、Xcodeを複数バージョン使い分けたいし、ビルドコマンドも使い分けたかった。

解決策

複数バージョンのXcode管理

検索した限りでは、手動でDL, リネームしてインストールなどの方法があったが、↓のものが一番良かった。

github.com

rbenvやnvmのようなもので、XcodeCLI上で複数バージョンインストール、切り替えしてくれる。
インストールには Apple Developer Program account が必要で、一度ブラウザでログインして規約等に同意しておく必要がある。

# インストール可能なバージョンリスト
$ xcversion list

# 任意のバージョンのインストール
$ xcversion install 9.2

# 任意のバージョンに切り替え
$ xcversion select 9.2

# 現在のバージョン
$ xcversion selected
Xcode 9.2
Build version 9C40b

環境変数 DEVELOPER_DIR で、xcodebuild コマンドの実行バージョン切り替え

# 9.2でxcodebuildのバージョンを確認
$ xcversion selected
Xcode 9.2
Mac version 9C40b

$ xcodebuild -version
Xcode 9.2
Build version 9C40b

# 9.4.1に切り替えてxcodebuildのバージョンを確認
$ xcversion select 9.4.1
Xcode 9.4.1
Build version 9F2000

$ xcodebuild -version
Xcode 9.4.1
Build version 9F2000

上記のように、 xcversion select でバージョンを切り替えると xcodebuild コマンドの実行バージョンも切り替わるのだが、時々パスワード入力を求められてしまうことがある。 これではCIで利用する際に使えないので、環境変数 DEVELOPER_DIR を使いバージョンを指定しつつ xcodebuild を実行する。

DEVELOPER_DIR には利用したいXcodeのバージョンのPATHを指定する。

$ xcodebuild -version
Xcode 9.4.1
Build version 9F2000

$ DEVELOPER_DIR=/Applications/Xcode-9.2.app/ xcodebuild -version
Xcode 9.2
Build version 9C40b

これでCIなどからも任意のバージョンのXcodeを呼び出せるようになった。

Arlo Baby は Echo Spot 無しでも赤ちゃんの見守りカメラとしてめちゃくちゃいいよという話

結論から

Echo Spot が無くても Arlo Baby は優秀なので、見守りカメラを探しているならマジオススメ。

きっかけ

Echo Spot の予約注文が開始されたタイミングで予約しようとしたら、NETGEAR Arlo Q とセットでも予約を受け付けていた。
どうやらネットワークカメラと連携してビデオ通話できるようだった。

こんな感じで売ってた。

が、調べていく内に赤ちゃんの見守りカメラとして特化した Arlo Baby の方が良いなとの結論になり、こちらを購入した。

利用イメージ

こんな感じ。

f:id:ShineSpark:20180727021810j:plainf:id:ShineSpark:20180727021829p:plainf:id:ShineSpark:20180727021816p:plain
  1. ベッドに配置して
  2. リアルタイムに様子がチェックできて
  3. 温度や湿度などのエアコンディションもチェックできる

自分(夫)は出先でも様子がチェックできて、妻にとっては一瞬子供と離れる時でもiPadスマホで様子が見れるのでハッピー。

妻曰く、「泣いたら様子を見に行くのは変わらないのだけれども、料理中とかに、よく寝てるとか、起きそうとか、もぞもぞしてそろそろ泣き出しそうとかが分かるだけでも安心感が全然違う」とのこと。夫婦共に買ってよかったと思っている。

よかったこと

1. ストリーミング再生もできるし、録画再生もできる

まず会社からでもスマホで我が子をリアルタイムに見れる。優勝。

f:id:ShineSpark:20180727014704p:plain

それとは別に、モーションセンサーやオーディオセンサーに何かしらの反応があった場合に、その時の映像が1週間分は無料でクラウドに保存され、後から好きに再生できる。 f:id:ShineSpark:20180727013021p:plain

もしクラウドの録画映像を30日以上保存したかったり、センサーの反応に限らず24時間連続録画したかったら追加プランを選べば可能。

ただ普通に見守りカメラとして利用する分には無料でも充分見守れます。

2. スマホで見れる、タブレットで見れる。

自分の手元にあるものでは、下記のデバイスから見守りしている。

PCはブラウザからのアクセス。ストリーミング再生は要Flashの為自分の環境では見られない...が、録画映像は視聴できるし、そもそもスマホで見るので問題なし。 複数端末で見る場合には、その分だけアカウントを発行しておくとよい。

一時期格安な中国のネットワークカメラがクラッキングし放題という話題があったが、NETGEARはアメリカの会社だしデバイスにアクセスするのにも認証や権限コントロールができるのでその点でも安心だった。

3. センサーが良い

元々アメリカのガレージとかの防犯カメラ用途の製品の為か、モーションセンサーもオーディオセンサーもしっかりしている。設定はスマホから変更できる。

f:id:ShineSpark:20180727014221j:plainf:id:ShineSpark:20180727014235p:plain
柔軟に設定できるの図

オーディオセンサーの音声への反応も非常に優秀で、離れた所のくしゃみの音にも反応してしまうレベル。 感度は調整可能なので自分の使いやすいように調整するとよい。

ちなみに泣き声検知もあり、プッシュ通知有効にしておくとこんな感じで通知が届く。

f:id:ShineSpark:20180727015946p:plain

ギャン泣き中は通知がすごいことになるが、知らずに大事になるよりはマシかなと思ってる。

4. 暗い所でもはっきり見える

夜中とか結局全然動きを検知できなかったらやだなーとか購入前には思っていたのだけれども、使ってみてビックリしたのが夜間の視界。 左が所謂豆電球で、右が消灯中。

f:id:ShineSpark:20180727020639p:plainf:id:ShineSpark:20180727020644p:plain
左: 豆電球, 右: 消灯

周りの明るさにあわせて補完してくれているようで、 日中 -> 夕方 -> 夜間 いつでもはっきりしているし、豆電球ですらこんなに明るく映るのにビックリした。

5. 赤ちゃん向けっぽいウサ耳は外せる

ウサ耳、その内子供が大きくなったらダサいとかイヤだとか言われてしまうんじゃないかと購入時に心配になったけど、簡単に取り外しができる。 なので子供が大きくなった時には、リビングに置いて普通のネットワークカメラとして使ったり、防犯用途にしてもよい。

それに、5歳くらいまではそこまでダサいとか言われないんじゃないかと考えているのだが、5年間気軽に自宅の様子をチェックできる環境が19,800円なら充分だと思う。

また、ウサ耳以外の選択肢もある模様。

f:id:ShineSpark:20180727024902p:plain

6. 他にも機能がいっぱいある

スマホごしに赤ちゃんに呼びかけられたり、音楽鳴らしたり、ライトを付けたりいろいろできる。 公式サイト見るともっと分かると思う。

www.arlo.com

ということで、見守りカメラなら Arlo Baby がめちゃくちゃ良い。 Echo Spot 買わずとも既にタブレット端末を持っている人なら充分利用できます。むしろ電源ケーブル不要な分タブレットの方が見守り用途では向いているかも知れません。

macOS のキーリピート速度を変更する

Karabiner Elements や Hammerspoon ではキーリピート速度が変更できなかったので、他の方法で実現する方法を調べた。

キーリピート開始時間の設定

# 現在の設定値の確認
$ defaults read -g InitialKeyRepeat
15 # 15: 225ms

# 設定値の変更
$ defaults write -g InitialKeyRepeat -int 10

キーリピート間隔の設定

キーリピート開始後も長押しを続けている際に、文字を連続して入力する間隔の設定

# 現在の設定値の確認
$ defaults read -g KeyRepeat
2 # 2: 30ms

# 設定値の変更
$ defaults write -g KeyRepeat -int 1

どうやら1 = 15ms となっている模様。

参考

DvorakJP用のGoogle 日本語入力ローマ字テーブルを久々にアップデートして Emoji ( 絵文字 )対応した 🎉

Emoji 対応した Google 日本語入力ローマ字入力

github.com

DvorakJP用のGoogle 日本語入力ローマ字テーブルをつくった - 人生シーケンスブレイク で作ったDvorakJP用のGoogle日本語入力ローマ字テーブルを久々にアップデートした。

何気なく自分のリポジトリのフォーク先を眺めていたら、 Add emojis · tock203/dvorakjp-romantable@341d34f を発見したので、IME でも :muscle: みたいに Emoji を入力したい! - pockestrap を参考に自分のリポジトリにも Emoji 変換機能を実装した。

emoji.json のフォーマットが変わっていたことと。折角なのでPythonで書いてみるかとのことで自前で生成スクリプトを実装した。

できたもの: Emoji 入力

:tada と全角で入力しようとすると 🎉 に変換されます。

後ろの: は省略してもいいかなと思ったけど、:rose: 🌹, :rosette: 🏵 のように前方一致している候補がある為に確定できない要素があるので悩んでいる。

shortname_alternates がある際に、前方一致している名称の際には後ろの:は無くとも確定しても良さそうなので後で改善予定。

2018/05/02 追記

通常は後ろの : 無しでも入力可能だが、別の emoji 名の入力途中とも判断できる emoji には後ろの : が必要な仕様に改修した。
入力タイプ数が減るので何回も入力する分にはこちらのほうがよい。

:baseball    ⚾ # baseball に続く他のemojiが存在しない為、: 無しでも確定可能
:basketball:    🏀    # basketball に続く他のemojiがある為、確定の為に : が必要
:basketball_player  ⛹

取り込み方

dvorakjp-romantable/dvorakjp_prime_with_emoji.txt から Google 日本語入力のローマ字テーブルをダウンロードした後に、Google 日本語入力の環境設定を開き、

f:id:ShineSpark:20180424000921p:plain

Romaji table > Customize... をクリックして、

f:id:ShineSpark:20180424000945p:plain

Import from file... で先程のファイルを取り込むだけです。

謝辞

ということでお2人の情報を参考にさせていただきました。ありがとうございます 🙇

キーボード配列QWERTYの謎

キーボード配列QWERTYの謎

eneloop pro(エネループ プロ)の充電器は寿命チェックができて便利

結論から

最新の eneloop pro の充電器は、

  • 昔の充電器より充電時間が短い
  • 残量の異なる eneloop を複数本同時に充電しても1本ずつ充電できる
  • 買い替えの必要な電池を診断してくれる

のでマジオススメ。

自身の eneloop

Wii が発売した頃、Wiiリモコンが乾電池式だった為に乾電池が大量に必要だった。その時にインターネットでちょうど同年発売されたエネループが話題になっていたので手を出したのがキッカケ。
Wiiのホワイトカラーと相まったデザインであったことと、TVリモコンなどにも利用できた為、家で利用できる乾電池は殆ど eneloop に買い換えていった。

大体20本以上は eneloop を利用していた。

f:id:ShineSpark:20180423013311j:plain

今手元にある eneloop や充電器。既に捨てたり、TVリモコンに挿しっぱなしなので実際に買ったのはもっと多い。

自身の eneloop の最近の悩み

「1000回充電して使える!」というのが当時の eneloop の売り文句。が、発売当時から10年以上経過してきたことで寿命が来てしまったのか、

  • 充電してもすぐ切れる
  • 充電したつもりなのに、2本挿すとどちらかが使えない
  • 家に eneloop がいっぱいあるので、どの eneloop の寿命が近くなっているのか見た目から分かりづらい

などの課題を抱えていた。

解決策の模索

パナソニックニッケル水素電池の寿命判断は? PZ18097 - ニッケル水素電池&充電器 には、

充電池の寿命を測定するためには専用の測定器を使わないと正しく測定できません。(一般的には市販していない測定器です。)

と書いてあった。 今なら専用の測定器をインターネットで買えれば解決できるのではと検索してみたが、アスクルで8〜20万円の商品が出てきて途方に暮れていた。

しかし、よくよく考えてみると eneloop の充電器も2006年の購入以来殆ど買い替えていなかったので、Panasonic 移行後に充電器自体も改善されているのではないかと思い、現在販売されている充電器を調べてみたら eneloop pro の充電器に限り eneloop の寿命チェック機能が付いていたので購入することにした。

それが、この寿命チェックできるこやつ。

※ 充電器ごとに仕様が異なり、今市販されている eneloop の充電器でも寿命チェック機能がないものも多いので注意。

具体的には急速充電器 BQ-CC55 がこの寿命診断機能を持っている。他の充電器では持ってない。 気になる人は、単3形 エネループ 4本付急速充電器セット K-KJ55HCD40 商品概要 | ニッケル水素電池&充電器 | Panasonic から取扱説明書を確認するとよい。

この急速充電器の機能

NC-TG1 という2006年にセットで購入した充電器を利用していたのだか、そちらと比較するしてかなりの改善があった。

  • 充電が早い
  • 1本ずつ充電できる(他の充電器はこの記述がないので、恐らくいずれかの電池がフルになると充電が止まるものと思われる)
  • 買い替えチェックしてくれる(寿命になった電池を自動チェックしてくれる)

LEDが緑黄赤に点灯 / 点滅することで電池のステータスをチェックしてくれる。

f:id:ShineSpark:20180423021614p:plain
1本ずつ充電状況を表示してくれている図。1番右は黄色に点滅しており、 eneloop の買い替えをオススメしてくれていた。

f:id:ShineSpark:20180423021624p:plain
これは単4電池充電中の様子。

買い替えを診断するロジックは正直詳しくないため何ともいえないが、少なくとも問題がある eneloop であることと思われるし充分利用したのでリサイクルに出し処分した。

使い古した eneloop を取り除くことができるようになったことで、よりストレスの少ない eneloop の使い回しができるようになった。 組み込みバッテリーの機器が増加傾向であるものの、なんだかんだリモコンなどで乾電池利用はまだまだあると思うので、手元に古い eneloop がある人は、充電器の買い替えも検討してみると良いだろう。

Django 2.x で Rails みたいに jquery-ujs を使って二重submit抑止やconfirmをカンタンに実装する

Django記事シリーズ

の4つ目。

Django 2.x で Haml ライクな Bootstrap 4 を使う - 人生シーケンスブレイク 同様、npmでパッケージ管理し、node_modules/* 以下のファイルを static として読み込める前提。

やりたいこと

Django

  • 削除ボタンなどでconfirmを出す
  • submitボタン押下時に、ボタンをdisableにして連打を抑止する

などを実現したかった。

jquery-ujsをインストールする

github.com をnpm経由でインストールする。

$ npm install --save jquery
$ npm install --save jquery-ujs

インストールしたライブラリ中の jquery/dist/jquery.min.js と jquery-ujs/src/rails.js は、静的ファイルとして読み込めるようにしておく。 Django 2.x で Haml ライクな Bootstrap 4 を使う - 人生シーケンスブレイク 参考。

Templates側の編集

試しにこんな感じに書いてみる。 ソースコードはhamlpyインストール済みの為Haml

%script{ src: "{% static 'jquery/dist/jquery.min.js' %}" }
%script{ src: "{% static 'jquery-ujs/src/rails.js' %}" }

...

%button.btn.btn-outline-primary{ type: 'submit', data-disable-with: '送信中...', data-confirm: '本当に削除してもよろしいですか?' }
  送信

Rails + haml の時と同様、 data-disable-with にsubmit中にボタンに表示したいテキスト、 data-confirm にconfirm に出したいメッセージを書く。

できた

f:id:ShineSpark:20180323203804p:plain

ボタン押した時

f:id:ShineSpark:20180323204343p:plain

submit中

f:id:ShineSpark:20180323204515p:plain

ただここまでやるならRailsでいいんじゃないかな...

参考として、↓のリポジトリソースコードを公開しています。

github.com

みんなのPython 第4版

みんなのPython 第4版