| @Mac/iPhone

iA Writer

iPad Air を買ったことで iPad で文章を書くときに何を使うか考え始めた。 iOS と iPad で iA Writer は同一アプリとなっているようで、 iPhone 用に買った iA Writer をそのまま iPad Air でも使うことができた。

iPad Air で iA Writer を使ってみて、ファイル管理っぽい機能があることに初めて気が付いた。 iOS では小さく表示されるのでそんな機能があることに気がつかなかった。それで Mac 版を試してみたところ結構良かったので、ブログなどの文章書きを Vim から iA Writer に乗り換えることにした。

iA Writer は iPhone では 6 年くらい前から使ってる。その頃は 1200 円くらいで買えたがいまはめっちゃ値上がりしてて 8000 円もする1( iPhone 用アプリで 8000 円ですよ!)。ドルベースの価格も上がっているが円安が効いていて高くなっている(ドルでの価格は 49.99 ドル)。

iA Writer for iOS は電車の中で文章を編集するのに使ってた。通勤してた頃、混んだ電車の中でパソコンを取り出せず、 iPhone の iA Writer で Vim で書き起こしたポエムの続きを書いたりしてた。

まぁまぁ便利だったのだが、やっぱりスマートフォンのキーボードでは書きづらいしまぁこんなもんかなぁと思いながら、どうしても iPhone で文章を編集したいときだけ起動するような使い方をしていた。

iPad Air で iA Writer を使ってみて、ファイル管理っぽい機能があることに初めて気が付いた。

iA Writer のファイル管理機能

スマートフォルダという機能もあって、バラバラに散らばったファイルをいい感じに整理できることにも気が付いた。 Apple Music のスマートプレイリストみたいな機能だ。 macOS の Finder の機能を転用してるのだと思う。

iA Writer のスマートフォルダ

"メモを取り、書き、編集するための集中できる環境。それ以外には何もありません。"

iA Writer のウェブサイトではフルスクリーン表示できて文章を書くことに集中できることをウリにしているが、自分にとってはファイルを一覧表示・管理できる機能(ファイラー)がめっちゃ便利だと思った。これまで Vim + memolist で書いた文章は一定期間経過したら Day One に取り込みつつ、年ごとアーカイブ用フォルダーを作って Ruby スクリプトでそこに待避していたが、そんなことをする必要なく iA Writer だけでファイルの管理ができてしまう(サブディレクトリに移動させたいファイルをドラッグ&ドロップで移動させればよい)。

Day One のカレンダーで過去の記事を見られる機能は便利だが、Day One はプレーンテキストを捨てて Markdown ベースの独自仕様リッチテキストに移行してしまったし、起動に時間がかかるのも微妙だと思っていて、シンプルにプレーンテキストのファイルとして管理できる iA Writer の方がよい気がしてきた。

Day One のカレンダー UI

iA Writer の良いところを列挙するとこんな感じ。

  1. 起動が速い
    起動してすぐ書き始められる
  2. ファイル管理機能
    Finder とテキストエディターが統合されたような使い勝手
  3. クイック検索
    Vim の Unite 検索のような機能があり、めっちゃ素早く対象のディレクトリ以下のファイルを検索できる

これまで Vim を使い続けてきたのは Unite での検索が便利すぎたからだった。メモ書きディレクトリに移動してテキトーに Vim を起動して UniteGrep すれば書きかけのファイルをぱっと探せる。

iA Writer には UniteGrep と似たクイック検索という機能があって、しかもショートカットで検索 UI を呼び出せるところが良い( + + o)。

iA Writer のクイック検索

Day One にも似たような検索機能はあるものの、検索窓を呼び出すショートカットがない。いちいちマウスカーソルを動かして🔍マークをタップしないと検索できない。検索窓はマウスやトラックパッドに手を持ち替えることなく表示されないとダメだと思う(一つ前の記事参照

デバイス間のファイル同期は iCloud を使っている。複数の端末で同時に開いてもコンフリクトが起こることはほぼなくファイルが同期される。敬虔な Apple 信者でいる限りファイルの同期のために Evernote や Notion を使う必要はない。

いまは Obsidian や Roam Research のような新手のソフトもあるようだが、自分の場合は iA Writer で満足している。使っていないが Wiki Link 記法も使えるのでファイル同士の繋がりを作ることもできるようだ。

職業プログラマーになって以来、テキストエディターは Vim 一択だろうという気持ちでいたが、 GUI でファイル検索・管理できるという一点で iA Writer を気に入ってしまった。コードを書くならいまでも Vim が良いが、ブログの文章や個人用メモは完全に iA Writer に乗り換えてしまった。世間的に大人気な Notion を使っていたらこのようにエディターを他のものに乗り換えることはできなかったのでプレーンテキスト万歳だ。


ピアソン版の『達人プログラマー』に GUI のファイル検索だと目的のファイルが見つかるのに時間がかかるので grepfind でファイルを探す方が高速だ、という記事がある(第3章)。 Unix 哲学的な話で、小さな機能を持つソフトを組み合わせて使う方が効率的だという話だった。 grepfind で検索して xargs -o vim するより、テキストエディターの中で一覧表示出来る方が便利だ。少なくとも普通の人にとっては。何でもシェルでやるのが良いという時代は終わったのかもしれない。

とはいえ iA Writer は macOS の仕組みの上で達人プログラマー的なやり方を継承しているようにも感じる。例えば先ほどのスマートフォルダは macOS の Finder にある機能だ。ひょっとしたら UI が同じだけでまるっきり別の実装がしてあるかもしれないが、 OS や SDK が提供しているシンプルな GUI を組み合わせて便利なものを作るのが今風の達人プログラマーなのかもしれない。


  1. Mac 版は同一ライセンスになっておらず Mac App Store から別途購入する必要がある。 8000 円は高いので一か月くらい悩んで買った。 

| @技術/プログラミング

Homebrew で入れた SQLite で load_extension() が動かなくなっていた。

どうも以前は --enable-loadable-extensions でビルドできていたらしいが、 Homebrew 全体でオプション指定をできなくする変更が 4 年前にあったみたいだ。

オプション指定できるのは UX として良くない(ビルド済みのバイナリをダウンロードできない)し、オプション指定を Homebrew のチームでテストしていないからだそう。

TF-IDF で関連記事を表示する機能は SQLite の拡張に依存していたので、最近 Homebrew で入れた SQLite だと機能が動かなくなってしまった(エラーが発生する)。

対策としては自分で SQLite をビルドするしかない。 Mac でそれやるのは面倒なのでこういうのは全部 Docker でやることにした。

Homebrew のウリはビルド済みのバイナリをサクッとダウンロードできてローカルでビルド不要なところではあると思うが、ちょっと凝ったことをしようとするとソースコードをダウンロードしてきて手元でビルドしないといけなくなってしまった。依存パッケージをまとめてインストールできてたことも便利だったんだけど、カスタムインストールをしたいときは昔みたいに依存関係を自分で調べて都度都度インストールしていかないといけなくなった。開発チームの考えもわからなくはないがちょっと残念だ。

ちなみに Homebrew のリポジトリ( homebrew-core )の過去のコミットログを調べるのがめっちゃ大変だった。 tig Formula/sqlite.rb しても 3 分くらい反応がなかった。 git log -Sextension Formula/sqlite.rb してそれっぽいコミットのハッシュ値を見つけて GitHub で検索して何とか上記の Pull Request と Issue に辿り着いた。超巨大なプロジェクトのソースコード管理は Git でやると大変そうだ。

| @Mac/iPhone

Desktop

コロナ禍によるリモートワークも 2 年以上が経過した。仕事用のパソコンと私用のパソコンの二台を机の上に置かねばならず困っている人も多いんじゃないだろうか。自分は書斎もなく、狭い無印良品の机の上で仕事用の Mac と私物の Mac とをどう配置するかいろいろ試してきたが、一応の結論に辿り着いたのでメモっておく。要点は以下だ。

  • USB スイッチを導入する
  • トラックパッドやキーボードはあえて有線接続する
  • スピーカーへの出力も USB 経由にする

左側に勤務先から貸与されている MacBook Pro 、真ん中に私物の Dell の 23 インチディスプレイ、右側に私物の iMac 5K を配置している。当初はそれぞれキーボードとトラックパッド、マウスなどを配置していたので机の上が狭く悩んでいた。またスピーカー( BOSE の Computer Music Monitor )も一つの Mac にしか接続できず、仕事用 Mac に接続すると仕事中は良い音質で音楽が聴けるが仕事が終わったあとは iMac の内蔵スピーカーで聴くみたいな感じになっていて残念だった。

まず取り組んだのが USB スイッチの導入だ。以下の製品を購入した。

これにより一セットのキーボードとトラックパッドを日中は仕事用 Mac 、夜は私物 Mac という具合に接続を切り替えられるようになった。それまで机の上にキーボード二つ、トラックパッド、マウスがあって狭かったのが仕事でも私用でも同じキーボードとトラックパッドが使えるようになり、机が広々と使えるようになった。なおマジックトラックパッドは Bluetooth 接続ではなく USB スイッチで切り替えるためにあえて USB ケーブルで有線接続している。

USB Switch

次にスピーカーを共用できないかいろいろ調べたみた。 3.5mm ジャックが二つあってスイッチで切り替えられる製品があることを知り導入してみた。これによりスピーカーについても仕事と私用で共用できるようになったが、仕事モードと私用モードを切り替えるときに USB スイッチのボタンとオーディオスイッチのボタンで二回押すのが面倒だった。

その後、 USB DAC を導入した。せっかく買ったのだから仕事中も私用でも USB DAC を通してハイレゾロスレスで音楽を聞きたいと思うようになった。なので 3.5mm ジャック経由で音を出力するのをやめて仕事用 Mac からも私物 Mac からも USB 経由で音を出力し、 USB スイッチを経由するようにした。 USB スイッチから USB DAC につなぐことで、仕事用でも私物 Mac でもハイレゾロスレスで音楽を再生できるようになった。

すべての入出力を USB スイッチを経由するようにしたことにより、キーボード、トラックパッド、スピーカーをすべて仕事用 Mac と私物 Mac で共用できるようになった。切り替えはボタン一発だ。

なおこの環境を構築し終わったあとに macOS Monterey 12.4 がリリースされてユニバーサールコントロールにより隣り合う Mac でキーボードやトラックパッドを共有できるようになったが、結構接続が不安定だしカクつくこともあるので現状の有線接続の USB スイッチによる切り替えで全く不満はない。

私物の iMac 5K が机右側にあり、私用で Mac を触るときに首を少し右側に向けないと行けないのが少しストレスだ。なので L 字形の机を導入して常に机を正面に据えて作業できるようにしてみようとしたが、 FlexiSpot の以下の昇降デスクの購入を検討しているうちにプライムデーセールで売り切れてしまい、いまも顔を右にひねりながらブログを書いている。

この EG1-L を導入することができたら自分の在宅ワーク環境は完成されるなと思っている。楽歌株式会社さん( FlexiSpot の製造元)、良かったら再販売してもらえないでしょうか。できたら昇降範囲を 69cm からにしてもらえると短足胴長のおっさんでも快適に使えて助かります

| @散財

Topping D10s

一つ前の記事で USB DAC を買ってハイレゾ音源を再生できるようになったが違いがわからなかったと書いている。

しかし↑の記事では全然ハイレゾ再生できていなかった。「 Mac 側の設定は不要」などと書いているが、 Mac 側でも設定は必要だった。一つは Music アプリのオーディオ品質設定でハイレゾロスレスを選ぶことだ。

Music アプリのオーディオ品質設定

なお、ドルビーアトモスを「常に」にしていると、ハイレゾに対応した楽曲でも Dolby Atmos を優先してしまってハイレゾで曲を聴くことができない。 Dolby Atmos でハイレゾというのは両立できないようなので、ドルビーアトモスの設定値は「自動」にしておくと良い。

次に、 Audio MIDI 設定アプリのフォーマットのセレクトボックスからハイレゾに対応した周波数を選ぶ必要がある。 D10s だと 2 ch 32 ビット整数 384.0 kHz まで選ぶことができるのでこれにしておく。

Audio MIDI 設定アプリ

ここまでしてようやくハイレゾ再生できるようになる。

Topping D10s

Hotel California をハイレゾ再生中

なので一つ前の記事の追記で

何時間か聞き込んでみた。音を大きめにして、ジャズなどのドラムの音を聞き取りやすい曲を再生してみると違いがわかるような気がする。ドラムの音がなまめかしい。なまめかしいという表現が適切なのかわからないが、音に生音感があるといったらいいんだろうか。ギターなどでは違いを感じにくいけど(高音難聴だからかもしれない)、打楽器の聞こえ方で結構な違いがあるような気がする。最初は無駄銭失いかと思ったけどそうでもないかもしれいと思い直している。

などとのたまわっているが、このときは 44.1 kHz でしか楽曲を再生できておらず何の変化もなかったはずだ。設定が必要とわかったあとに設定を変更して聞き比べてもみたが、やっぱり違いがわからなかった。なので自分はハイレゾを聞き分けられる耳を持っていないのだろう。 

なおいろいろ調べていて衝撃の事実がわかった。新しめの Mac ( 2021 年以降の M1 Mac )なら USB DAC 不要でハイレゾ音質で音楽を再生できるようだ1

MacBook Pro (14-inch, 2021) および MacBook Pro (16-inch, 2021) は、高品質のハードウェア DAC (デジタル/アナログコンバータ) を搭載していて、最大 96 kHz のデジタルオーディオをアナログオーディオに変換できます。ヘッドフォンやスピーカーなどのアナログデバイスを Mac のヘッドフォンジャックに直接接続すれば、外付けの DAC がなくてもハイレゾ音源を楽しめます。

新しい MacBook Pro モデルのハイレゾ DAC について - Apple サポート (日本)

自分の Mac は私物も仕事用のものもまだ Intel Mac なので USB DAC 経由でないとハイレゾ再生できないが、 2021 年以降の M1 Mac を持っている人なら USB DAC なしでハイレゾで音楽を聞くことができるということだ。 M1 チップは本当に何でもできてすごい。

USB DAC を買ってみてわかったことをまとめると以下だ。

  1. そもそも自分はハイレゾの音を聞き分けられない
  2. 2021 年以降の M1 Mac は 3.5m ジャックからハイレゾに対応したオーディオ出力が可能

ハイレゾロスレスを聞き分けられる自信があるおっさんは M1 チップを搭載した 2021 年以降の Mac を買いましょう。


  1. ただしサポートしている周波数は 96 kHz までで、 Apple Music のハイレゾロスレスの最高値は 24 ビット 192 kHz のようなのでそれには及ばない。 

| @技術/プログラミング

松浦福島初崎海岸のドクロのような岩

Mac の Homebrew のライブラリ群を久しぶりにアップデートした。 tmux と fish のバージョンを上げたら tmux が動かなくなってめっちゃ焦った。いろんなものを同時にバージョンアップするとどっちに原因があるのかわからなくて困る。結局、 brew reinstall tmux で事なきを得た。

次に VPS の Ubuntu のバージョンが古くなっていたのでアップグレードした。ついでにいろいろ気になってたところ(ログローテートがうまく動いていないところとか Nginx の設定ファイルの配置など)を直して回った。

OS のアップグレードに伴って Ruby の再インストールが必要になり、 Ruby 再インストール後にアプリケーションを deploy しようとすると mimemagic gem が yank されていたりでライブラリのアップデートが必要になった( MimeMagic は脆弱性があって Mercel に変更しないといけなかったが、変え忘れていたところがあった)。これによって引きずられるように gem のアップデートが必要になり、うっかり capistrano3-puma を v5 系にしたところ、 puma の起動ができなくて困った。どうも puma の v5 ではデーモン化オプションが削除されているようで、 capistrano で puma を再起動させたりはできないようだった。いろいろ面倒くさそうなので capistrano3-puma も puma も v4 系に固定して凌いだ。

Archives ページの npm パッケージも古くなってたので、 React や React Router 、 Webpack 、 Babel など各種ライブラリのバージョンを上げた。 React Router の v5 系から v6 系へのアップデートは結構大変だった。以下を読みながらやった。

withRouter などは React Router から機能が消えるのでそれをラップする関数を自分で書いてコンポーネントに mixin するような感じだった。以前に比べたらマイルドになっているとはいえ、 JavaScript 界隈はアップデートについて行くのが厳しい。

職業プログラマーじゃなくなったので開発環境の維持管理などがおろそかになりがちだし、 Vim やシェルのショートカットを忘れてしまうことがある。 Vim やシェルの操作は特殊技能のようなものなので忘れるともったいない。たまに触って忘れないようにしておきたい。

そういえば温かくなって庭の雑草が伸びてきたので庭の草むしりもやった。ゴールデンメンテナンスウィークだ

| @Mac/iPhone

"Your Computer Isn't Yours" という記事が先週バズってた。

概略を説明すると、 Catalina の頃から Apple が Mac ユーザーのアプリ起動ログを勝手に収集していたが、 Big Sur の公開日にログ集約サーバーがダウンしてしまい、そのせいで Mac を使えなくなる人が続出して問題が発覚したというもの。 Rebuild の Episode 288 で触れられているので興味がある人は聞いて下さい。

この記事については日本語の翻訳もあってはてブで 500 ブックマークくらいついていたが、どうも機械翻訳されただけのようだったし、一部訳が違うのではと思われるところがあったので自分でも訳してみた。訳を原著者の Jeffrey Paul 氏にメールで送ったので恐らくそのうち本家に日本語訳が追加されると思う。

Your Computer Isn't Yours

2020-11-25 9:16 追記

日本語訳追加してもらいました。


起きていることをまとめると以下のような感じだ。

  1. Apple は Mac ユーザーのアプリ起動データを IP 付きで Apple のサーバーに集めている(ログ送信)
    • 各アプリの署名有効期限チェックやマルウェア対策のためということになっている
    • Mac から Apple への通信は暗号化されていない
      • ISP や CDN ( Akamai )、ネットワークを盗聴している他人が内容を確認可能
    • この通信はユーザーが自分の意思で無効化できない(「Mac解析を共有」をオフにしても送信される)
  2. Mac (特に Big Sur でしか動かない Apple Silicon Mac )を使いたければ利用ログ送信を甘受するしかない
    • Big Sur から、上述のログ送信や Apple 製のアプリは VPN やファイヤウォールを無視するようになった
    • OS の挙動を変更しようとすると Mac が起動しなくなる
  3. iCloud Backup は iMessage の秘密鍵も一緒にバックアップするので Apple がメッセージの内容を読むことができる
    • 自分自身が iCloud Backup 利用していなくても、メッセージの送信相手が iCloud Backup を使っていると自分が送ったメッセージが iCloud 上に保存される
  4. Apple はプライバシー保護を売りにしながらユーザープライバシーをなおざりにしている
    • iMessages/iCloud Backup のバックドアを放置している
    • 過去にアプリ開発者には HTTPS を強制しながら自分たちは OCSP の通信を平文で行っている
    • ログ送信の件について対応を発表したが、対応時期を明確にしていない

その結果、以下のような状況に陥ることが懸念されている。

  • Apple が集めている情報は NSA や FBI に筒抜けになる
    • Apple はアメリカ軍の諜報機関や FBI にユーザーログデータなどの閲覧を令状なしで認める協定を結んでいる
    • iCloud Photo や iMessage の内容を Apple だけでなく軍や FBI も見られるようになっている
  • ユーザー保護を隠れ蓑に Apple が力を増大させる
    • マルウェアから守る、を大義名分にして、ユーザーがどのアプリを動かせるかを Apple がコントロールできる可能性がある
    • 原理的には Apple が気に入らないアプリを起動できなくしてしまうことが可能

モバイルアプリの利用状況の収集は多分いろんなアプリがやっている。 Mac で Apple が集めている程度以上の情報を集めているアプリも多いだろう(位置情報を取得しているアプリなど)。なので最初この件については過剰に反応しすぎなのではないかと思っていたが、よくよく考えてみると自分の感覚の方が麻痺していたのかもしれない。アプリの利用履歴を IP アドレス付きで送るということは、どこで何をしているかがアプリ開発者に筒抜けだ。そしてそのログを公権力が自由に閲覧可能だとしたらいい気持ちはしない。

アプリと Apple の場合で決定的に異なるのは、アプリはそのアプリが起動している間(あるいはバックグラウンドでのログ送信を許可されている間)だけログを送信するが、 Mac に関して言うとずっーっと起動しっぱなしで使い続けるものなので、ログデータからユーザーの行動履歴・生活様式がわかってしまう。地図アプリで検索した場所の情報も送られていたということなので、 Jeffrey Paul 氏が書いているように、その人がこれから行く予定の場所もわかってしまう。

GDPR や様々なプライバシー保護は、アプリを作りサービスを運営する側としては正直厳しいなと思うところはあるけど、 Apple がアメリカ軍と結んでいる PRISM のような取り決めが存在すると、様々な個人情報が政府機関に流れてしまって、アメリカのサスペンスドラマのように個人の位置情報を携帯の使用履歴からいとも簡単に割り出せるようになってしまう。それはやはり恐ろしい世界だ。

プライバシーの侵害のみならず、プラットフォーマーである Apple の匙加減次第で、ユーザーが使えるアプリが決まるという状況も好ましくない。たびたび iOS の App Store で起こる Apple の恣意的な審査基準改変などはその一端だ。 Hey の件で Apple とやり合った DHH は痛烈に Apple を批判するとともに、かつて邪悪な Microsoft に対抗するための救いとも言えた Apple が以前の Microsoft 以上に邪悪になってしまったのが嘆かわしいと Twitter に書いていた。学生の頃、 Mac を広める活動をやって大学のクラスの半分の同級生のラップトップを Mac にしたというエピソードや、 Rails の開発でも Mac を激推ししたという話は胸熱だった。応援してきた Apple が Evil になってしまい、人一倍残念に思っているのだろう。

Apple はかつて "The computer for the rest of us" というコピーで Macintosh を宣伝していた。しかし今日、 Mac は彼らのコンピューターになってしまったのだ。

| @Mac/iPhone

仕事用の MacBook Pro が新しいやつになったので備忘のために設定方法をメモしておきます。

以前書いた通り、自分は Google Chrome の Profile を二つ作ってノーマルの Chrome と Canary チャンネルの Chrome (ベータよりももっと攻めてるやつ)の二つを使い分けている。仕事用が Canary Chrome でノーマルが私生活用。 Slack からのリンクや Google Drive の URL は仕事用の Canary Chrome で開くように Choosy を使って設定している。 Cloud で Profile が同期される都合上、こうするしかない。

その Canary Chrome への 1Password のインストール方法がちょと特殊で、公式サポートフォーラムの以下の記事の通りにやる必要がある。

  1. rm ~/Library/Application Support/Google/Chrome Canary/NativeMessagingHosts/2bua8c4s2c.com.agilebits.1password.json
    Canary Chrome の 1Password 用設定ファイルを削除(存在しない場合もあり)
  2. ln -s ~/Library/Application\ Support/Google/Chrome/NativeMessagingHosts/2bua8c4s2c.com.agilebits.1password.json ~/Library/Application\ Support/Google/Chrome\ Canary/NativeMessagingHosts/
    ノーマル Chrome の 1Password 用設定ファイルのシンボリックを Canary Chrome の設定ディレクトリに張る
  3. Canary Chrome 再起動

1Password が Chrome とのやりとりに使う JSON ファイルをノーマル Chrome と Canary Chrome で共通化してしまうようだ。これで Canary Chrome でも 1Password が使えるようになる。