| @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 からにしてもらえると短足胴長のおっさんでも快適に使えて助かります

| @登山/ランニング

Patagonia Strider Pro Shorts と山と道 Light 5-Pocket Shorts

ランニング用短パンで困ってるという話を去年書いた。

履き心地は山と道の短パン( Light 5-Pocket Shorts )が最高だが値段が高い( 13200 円)ので日々のランニングでは使いたくない、何か良い代替はないものか、というもの。

山と道の Light 5-Pocket Shorts には値段が高いことに加えてデメリットがあることがわかってきた。

山と道 Light 5-Pocket Shorts

一つ目はポケットに入れたものが揺れること。登山の時にはスマートフォン用のサイドポケットがすこぶる便利だが、走るときにここにスマートフォンを入れていると揺れて邪魔になる。去年書いた記事ではポケットがあった方がよいということを書いているが、走るときにはポケットは考え物だということに気がついた。

もう一つは耐久性の低さで、ちょっとほかの繊維とこすれただけで毛玉ができてしまった。毛玉取りしても良いが、ただでさえ生地が薄いのに(ストッキングみたいな生地を想像してもらえばよい)毛玉取りをかけたらさらに生地が薄くなりそうだ。

最後に、スースーで快適な履き心地といってもあくまで登山用の短パンなので走る際に下着のパンツをはいてさらにその上から短パンだと暑い。 7 月に山を走ったときにはいてみたらハチャメチャに暑かった。

山と道の Light 5-Pokcet Shorts 並の履き心地の良さ、足さばきの良さを保ちつつ値段がそこそこで、ガシガシ使っても大丈夫な耐久性を備え、ポケットに入れた物が揺れて邪魔になることがなく、走っても暑くならない短パンがあったらうれしい。 YAMAP STORE で値引きになっていた patagonia のストライダー・プロ・ショーツの 5 インチを試してみたらなかなか良かった。

Patagonia Strider Pro Shorts

値段は定価 9350 円だがセール品だったので 7480 円で買えた。

履き心地は山と道の Light 5-Pocket Shorts 同様に快適だが、生地の耐久性は高そうだ。

ポケットは腰回りにあり、体に密着するような作りになっているので入れた物が揺れることはない。ただし自分のスマートフォンは iPhone 11 ででかくてポケットに入らない。その点は残念だ(ケースなしの裸状態であれば iPhone 11 でも背面ポケットに入ることがわかりました。お詫びして訂正します🙇🏻‍♂️)。 iPhone SE や iPhone 12 mini 、 iPhone 13 mini などであればポケットに入ると思う。

さらにライナー付きなので下着のパンツをはく必要がない。下着を身につけずに直接短パンをはくのには最初は抵抗があったが、何度がはいて走ってみてこっちの方が断然快適だということに気がついた。

山と道の Light 5-Pocket Shorts は購入の争奪戦もすさまじく、めっちゃ運が良くないと買えないものになってしまったが、 patagonia の製品であれば普通に買えるし、運が良ければセールで少し安く買える。安定して 7000 円くらいでストライダー・プロ・ショーツが手に入るとうれしい。アメリカの REI では $79 で売られてるみたいだ。

ただし patagonia は円安の影響で日本での販売価格を値上げしたようで、公式サイトで定価を確認したところ 11000 円になっていた。これでは山と道の Light 5-Pocket Shorts とあまり値段が変わらない…。なお YAMAP STORE であればまだ旧来の価格 9350 円で買えるようだ。YAMAP ユーザーは DOMO のクーポンなどが定期的にもらえると思うのでもしクーポンがあるなら利用することで少し安く買えると思う。

なおサイズについて。ストライダー・プロ・ショーツはピチピチ気味なので patagonia 公式サイトのレビューだと自分と同じような体型(身長 172cm 、体重 70kg )で M を選んでいる人が多いが、 S で良いと思う。自分は去年 M サイズを買って( M しか残ってなかった)今年は S サイズを買ってみたが、 M だと走るときに生地がばたついてうるさいし、あまりにもスースーしすぎてフリチンで走ってるみたいな感じがして不安になる。S は確かにピチピチ気味になりライナーも少し窮屈だが、生地がばたつくことはないし、生地に伸縮性があるのでパッツンパッツンで走れないということもない。 patagonia の公式サイトのモデルの人たち( 185cm で M サイズを着てる)もパッツンパッツン気味ではいてるし、そもそもパッツンパッツン気味ではくことを想定されている製品だと思う。

Patagonia Strider Pro Shorts

10 年くらい前、月に 2, 3 度くらい大濠公園を走ってたとき高級なランニングウェアに身を包んで走ってる人たちを見て「バカなのかな…」と思ってたけど、気がつくと自分も散財してることに気がついた。綿のTシャツや短パンでももちろん走れるが、汗をかいて不快になったり足さばきが悪くてストレスを感じたりする。 1km ~ 2km くらいをちょろっと走るくらいならそれでもよいかもだけど、 5km 走ると汗びっしょりになって綿の服ではどうにもならない感じになる。また値の張るランニング用品を買うことで「せっかく買ったのだから」と走るモチベーションを上げることにもつながる。通勤もしないし出かける機会も少ないので走らないと体の調子悪くなるしまっとうな金の使い方をしているということにしよう。

| @WWW

以前書いたはてなブックマークについての記事で、ホットエントリー入りするドメインの多様性が減ってきている、匿名ダイアリーと Togetter ばかりになってきている、なかでも最近は Togetter が匿名ダイアリーを抜いて一位になり、はてなからアテンションを奪って低俗広告を見せている、はてブを見ると Togetter の低俗広告も見ることになり問題だ、ということを書いた。

先日、はてなブックマークで特定キーワードかドメインを非表示にできるミュート機能がリリースされたが、 Togetter の広告が不快なのでミュートできてうれしいという意見が多く、低俗広告に不快感を抱いている人が結構たくさんいるようだった。

低俗広告を表示する側は広告単価が高いので効率的に稼げるし、ユーザーも表立っては苦情を言わないだろうから大したことではないと思ってるのかも知れない。しかし低俗広告は確実に訪れる人の心にストレスを与え、掲載するサイトの信用を毀損していく。

Togetter は訪問者にエロマンガの広告を見せてどうしたいのだろう。エロマンガサイトに行って有料課金サービスに登録して欲しいのだろうか? 自分の家族や友達にも同じことが出来るのだろうか? エロマンガやコンプレックスに訴えかけるようなサイトを少なくとも自分は信頼したり親身に感じることはないし、自分の親や子どもや友達にひどい広告を見せてマネタイズしたいとは思わない。

37signals は一連の従業員退職騒動で以前ほど魅力を感じなくなったが、それでも彼らのサイトに掲げてあるポリシーはよいと思う。

07. We don’t sell you

They say that if you don’t pay for what you use, then you’re the one that’s for sale. Not here. We don’t sell customer data to anyone, and we don’t use personal information to place targeted advertising either. We make a product, people pay for that product, end of transaction. Our business model is selling products, not selling you.

https://37signals.com/07

家族や友だちに見せて良心の呵責を感じることがないプロダクトを作っていきたい。

| @映画/ドラマ/テレビ

テヘラン

5 月からテヘランシーズン 2 が毎週 1 エピソードずつ公開されてて毎週楽しみに見てた。 Homeland もだけど、自分はどうもイランが絡むスパイものドラマが好きみたいだ。テヘランは面白かったが最後の終わり方が何それ感があった。あれでシーズン 3 なかったら納得がいかない。ショーン・トーブももっと活躍して欲しい。シーズン 3 が作られて欲しいので Apple TV+ に入ってる人は見てください。

ザ・モーニングショー

コロナに罹患してスーパー具合が悪いときにザ・モーニングショーを一気見した。いわゆる #MeToo 的な内容だが、主人公アレックス・レヴィ役のジェニファー・アニストンが 50 代とは思えぬ美しさで輝いていた。ミッチ・ケスラー役のスティーブ・カレルも中年男性の魅力を遺憾なく発揮していて良かった。同じ人物が「40歳の童貞男」の主人公を演じているとは思えないかっこよさだった。

#MeToo 的な話は映画業界などを中心に最近日本でも問題になっていたが、ザ・モーニングショーで取り上げられているのはもうちょい悪質度が低い問題な気がする。いわゆる飲み会でお持ち帰りした的なやつだ。多分裁判したら女性の方は勝てない気がする。少なくともいまの日本では。女性の方が抵抗しなかったという意味で合意の上での出来事っぽいんだけど、いまのアメリカのリベラルな基準で言うとそれはアウトで、男性側は社会的に抹殺されるようだ。そう遠くない将来に日本でもそういう空気感に変わっていくのかも知れない。村上春樹のノルウェイの森に出てくる永沢さんなんかは外務省クビになると思う。プレイボーイの人はザ・モーニングショーを見て認識を改めた方が良さげ。

Apple TV+ 、テッド・ラッソはじめカバー写真が惹かれなくてなかなか見てこなかったけど、見始めると面白い。次はフォー・オール・マンカインドを見たい。

| @ブログ

グローバルナビゲーション(右上の白い領域)内の検索ボタンを押したら Alfred 風のモーダル検索フォームが開いて、そこにキーワードを入力するとインクリメンタルサーチが実行されて逐次検索結果の記事が表示されるようにした。

これまでだと検索すると Archives ページの絞り込み検索に飛ばすだけだったが、 Archives ページに遷移せずに検索できるようになった。また Archives ページだと時系列順でしか検索結果が表示されないが、インクリメンタルサーチではマッチ度順に関連度の高いものを表示するようにしている。ただし表示するのは上位 10 件だけにして、それ以上は Archives ページで時系列順の検索に飛ばしている。

昔ながらのブログの検索 UI には不満がある。ページネーションで何ページも辿って検索結果を見ていくのは大変だし、大抵並び順が時系列順で自分が最も用事がありそうな記事に辿り着くのに時間がかかる。自分のブログの検索はタイトルのみ表示されればよくて本文のプレビューは不要だし(著者だからタイトルを見ただけでどんな記事なのか大体わかる)、何ページもページネーションせずに一覧でガッと検索結果を見たい。それに結果は時系列順ではなく関連度が高い順に並んでいて欲しい。キーワードを一部だけかすってるような最近の記事が最も関連度が高い記事を差し置いて最上位に表示されるのはいまいちだ。

今回作った Alfred 風インクリメンタルサーチではこれらの問題が解消されていて非常に満足。自分にとって自分のブログが世の中の情報の中で一番参照頻度が高いし、そのブログで効率的に情報を取り出せるのは大切なことだと思う。

| @ブログ

ダークモードとライトモードの切り替えをグローバルナビゲーション(上の方の半透明の白い領域)から簡単に行えるようにした(これまではこのサイトについてのページで切り替える必要があった)。デフォルトは OS の設定準拠で、 OS がダークモードであればダークモードに、ライトモードであればライトモードで表示される。手動でテーマを切り替えると Cookie に設定値を保存する。機能と見た目は MDN Web Docs を参考にした。

CSS がぐちゃぐちゃなのでかなり難儀した( 3 年前にも同じことを書いている)。ダークモードとライトモードの切り替えなんて自分しかしていないと思うがかなり満足度の高い休日プログラミングだった。

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

Rust 製の全文検索システム Tantivy を Ruby から使える Tantiny を導入したことを書いた。

結構手軽に使えるのだがやはり日本語のトークナイズ(形態素解析)ができないのでいまいちなところがあった。 Tantivy には lindera-tantivy というものがあって、 Lindera は kuromoji のポートなので、これを使うと日本語や中国語、韓国語の形態素解析ができる。 Tantiny に導入できないか試してみたが、自分の Rust 力では到底無理だった。

ちなみに関連記事の表示でも日本語の形態素解析は行っている。

MeCab に neologd/mecab-ipadic-neologd を組み合わせてナウな日本語に対応させつつ形態素解析している。

この仕組みを作ってトークナイズは Ruby で自前で行い、 Tantiny および Tantivy にはトークナイズ済みの配列を食わせるだけにした( Tantiny はトークナイズ済みのテキストを受け付けることもできる)。トークナイズを自前で行うことで辞書ファイルで拾いきれないような固有名詞もカバーできる。例えば 山と道 なんかは MeCab と mecab-ipadic-neologd にトークナイズさせると に分割されてしまう。自前のトークナイザーで単語として認識させていている。おかげで「山と道」をちゃんと検索できるようになっている

なお、自前のトークナイザーはこんなコードになっている。

class Tokenizer
  attr_reader :text

  class << self
    def run(text)
      self.new(text).tokenize
    end
  end

  def initialize(text)
    @text = text
  end

  def cleansed_text
    @cleansed_ ||= text.
      gsub(/<.+?>/, '').
      gsub(/!?\[(.+)?\].+?\)/, '\1').
      gsub(%r{(?:```|<code>)(.+?)(?:```|</code>)}m, '\1')
  end

  def words_to_ignore
    @words_to_ignore ||= %w[
      これ こと とき よう そう やつ とこ ところ 用 もの はず みたい たち いま 後 確か 中 気 方
      頃 上 先 点 前 一 内 lt gt ここ なか どこ まま わけ ため 的 それ あと
    ]
  end

  def preserved_words
    @preserved_words ||= %w[
      山と道 ハイキング 縦走 散歩 プログラミング はてブ 鐘撞山 散財 はてなブックマーク はてな
    ]
  end

  def nm
    require 'natto'
    @nm ||= Natto::MeCab.new
  end

  def words
    @words ||= []
  end

  def tokenize
    preserved_words.each do |word|
      words << word if cleansed_text.match?(word)
    end

    nm.parse(cleansed_text) do |n|
      next unless n.feature.match?(/名詞/)
      next if n.feature.match?(/(サ変接続|数)/)
      next if n.surface.match?(/\A([a-z][0-9]|\p{hiragana}|\p{katakana})\Z/i)
      next if words_to_ignore.include?(n.surface)
      words << n.surface
    end

    words
  end
end

preserved_words が手製の辞書だ。 はてなはてブ も辞書登録しておかないと MeCab だとバラバラに分割されてしまって検索できなかった。

難点としては記事更新後に自動でインデックスの更新が行われず、 cron によるバッチ処理でインデックス更新を行っている[1]。なので検索インデックスにデータが反映されるまでにタイムラグがある。 Tantiny でやれれば記事作成・更新時のコールバックとして処理できるのでリアルタイムに変更を検索インデックスに反映させることができるが、個人の日記なのでタイムラグありでも大きな問題にはならない。

本当は Tantiny で lindera-tantivy を使えるようにして Pull Request がカッチョイイのだが、とりあえずは自分は目的が達成できたので満足してしまった。 5 年くらい前から Rust 勉強したいと思っているが、いつまでも経っても Rust を書けるようにはならない。

[1]: mecab-ipadic-neologd を VPS 上でインストールできず(めっちゃメモリを使う)、手元の Mac で Docker コンテナ化して Docker Hub 経由でコンテナイメージを Pull して VPS 上で Docker 経由で動かしている(その辺について書いてる記事: ブログのコンテナ化を試みたけどやめた