あんパン

こしあん派

毎週ブログを書く習慣を意識的に作っている

数日前に公開されたPodcastに出演した。

anchor.fm

この中でも触れている通り、最近は毎週ブログを書く習慣をつけている。始まりはCTOの id:motemen さんが毎週ブログを書いているなということに気付いて、自分より忙しいはずなのに自分にできないわけがないと考えたからだった。

motemen.hatenablog.com

加えて、これまで半期に1,2記事書くくらいのペースが続いていてアウトプットの量に引きずられてインプットも減っていく危機感があり、まずは手を動かすところから始めようと考えた。これが7月末くらいの出来事で、8月から毎週何かしら書いている。

目標の管理

目標は忘れないようにScrapboxに書いてChromeの起動時に表示されるようにしている。こういうページは目にする機会を増やすことでようやく意識できるようになる。設定は chrome://settings/onStartupOpen a specific page or set of pages を選んで表示したいURLを入力するだけ。自分は目標ページに加えて、Todoistも表示している。個人のタスクはTodoistで管理しているのだけど、そのあたりの話はまた今度。

毎週書いているけど、実はそれを目標にはしていなくて、月2を必達・年内20を努力目標とした。高すぎるハードルを設定すると簡単に不達になってやる気をなくしてしまうため。

Scrapboxに書いた目標

本当はスパンも短くして月ごとに目標を持つ方が良いと思う。その月達成できなければハードルを調整しつつ翌月の目標を設定できるため。半年スパンだと最悪半年書かないということが起きうる。今回はたまたま起きなかったけど、次の半年はこれも取り入れるかもしれない。

ネタの管理

ネタはTodoistで管理している。TodoistはiPhoneとWebのクライアントの出来がしっかりしていて、どちらからでも操作しやすいのが良い。メモ帳のように自由に入力できると散らかりやすいので、基本これで管理してもっと細かく書きたいことができたらScrapboxにするなどの使い分けをしている。

ネタたち(これは例で、実際にはこういうのが20件くらい入っているプロジェクトがある)

目標とは違って毎日見ているわけではなくて、ときどき眺めて次に何を書こうか考えるために利用している。項目は思い付いたら追加している。基本的に土日で記事を書くor書けるネタを作って次の金曜で公開することにしている(今回は曜日感覚を失って遅れてしまった)。土日で作り切れなかったら月曜から木曜でなんとかする方式。なので毎週土曜くらいにこのリストを眺めることが多い。

時間の管理

これは実は何もしていない。結構忙しいときはパッと小ネタを掴んで1時間くらいで書くし、そうでもないときはゆっくり土日に書いたりもする。というか忙しすぎて小ネタしか書けなかった。結果的に終盤は大きなネタしか残らず苦労したので、作業時間をうまく取るのが向こう半年の課題になりそう。単純に書くための時間を作るのもそうだけど、各ネタにどれくらいかかるのかの目算も置いておけるとよさそう。などなど、いろいろな話題がありそう。


試しに半年やってみて継続的に記事を書く習慣はできたので、次は時間管理やネタの管理をもうすこし改善して中くらいのネタを安定的に書ける状態を作ろうとしている。趣味なのだからもっとゆるくやればいいじゃんという気持ちがどこかでありつつ、しかし自分の場合は低きに流れるのをよしとすると無限に低まってしまうのでこれくらいが丁度良いのだと思う。ついでに誰かの参考になれば幸い。

CDKで複数の環境にデプロイしたいStackを書くときにやっていること

最近CDKを書くことがちまちまあって、手癖としてこんなことやっていますという紹介。世間のベストプラクティスみたいなのをあんまり収集しているわけではないのでこれがいいやり方なのかはよく分かっていない。一応 Best practices for developing and deploying cloud infrastructure with the AWS CDK - AWS Cloud Development Kit (AWS CDK) v2 とか公式ドキュメント系は読んでます、くらいのレベル感。もっといいやり方あるよなどがあれば教えてください。

ここで取り上げたいのは同じStackをdevelop, staging, productionなど複数の環境に対してデプロイしたいケース。

export const stages = ['develop', 'staging', 'production'] as const;
export type StageName = typeof stages[number];
export class Config {
  public readonly stage: StageName;

  constructor(stage: StageName) {
    this.stage = stage;
  }

  genId(id: string) {
    return ['service-name', this.stage, id].join('-');
  }
}

みたいなのを lib/util.ts とかに用意しておいて bin/*.ts

import * as cdk from 'aws-cdk-lib';
import { HogeStack } from '../lib/hoge-stack';
import { stages, Config } from '../lib/util';

const app = new cdk.App();

for (const stage of stages) {
  const config = new Config(stage);
  new HogeStack(app, config.genId('hoge'), {});
}

みたいな感じにしている。こうすると

$ cdk ls
service-name-develop-hoge
service-name-production-hoge
service-name-staging-hoge

こうなる。Stackが複数になったとしても、develop環境だけデプロイしたいときは cdk deploy 'service-name-develop-*' みたいな感じでデプロイできる。単純に -c オプションで環境を与えて場合分けするパターンと比較したメリットとしては cdk ls するだけでひととおりのStackを一覧できる(環境含めてどんなStackがあるのか分かりやすい)、若干スナップショットテストしやすいとかだろうか。あとはStackの名前が揃うのでCloudFormationのWebコンソール上で探しやすいとか?

設定値を差し込みたいときは cdk.json のcontextに環境ごとの値を書いて、Configでappを受け取って app.node.tryGetContext(stage) で抜き出してConfigのプロパティに設定する、みたいなのを普通にやるイメージ。

突撃! 自宅のデスクトップ(物理)

記事を書いた。

developer.hatenastaff.com

ので、こちらでは自宅のデスクトップ(物理)の話でも。突撃要素は無。

こういう環境で仕事しています

至って普通のディスプレイ2枚構成。キーボードはHHKB HYBRID Type-S、トラックボールはKensington ExpertMouse。早くSlimBlade Proきて欲しい。ペンはシュナイダーのベースボールで、メモは縦長ロディア or ニーモシネのA5 5mm方眼が常時控えている状態。ペン立ては無印の歯ブラシ立て。

とまあそんな話がしたいわけではなくて、実はこの机の下にデスクトップPCが3台控えているのでそのあたりの話をしたい。

デスクトップPCたち。配線はそのうちなんとかしたい……

ダイソーのラックにDeskMiniで組んだLinux、Windows、その横にMac mini、あとは上段にHPのThunderbolt 3 Dockを置いている。Dockはこれ。

jp.ext.hp.com

MacBookだとめちゃくちゃ相性よくないのであんまりオススメはしない…… 詳しくはググってください。

DockからThunderbolt 3 ケーブル(アクティブケーブルの長いやつ)を机の上に出していて、ラップトップはこれに繋いで電源も受けるしディスプレイ2枚にも出力できるしキーボードもマウスも繋がるという状態。

これらをなんやかんやでいい感じに切り替えられるようにしている(後述)。裏側に有孔ボードをくくりつけていて、ここにYAMAHAの安い8ポートのL2スイッチとか弱電のケーブルを這わせている。燃えないように・ノイズでめちゃくちゃにならないようにある程度は注意している。電源系は全て下の段に置いて12ポート用意している。このラックの概要はそんなところ。

で、どうやってこれらをディスプレイ・キーボード等と協調させているか。

まずディスプレイだけど、入力が3ポートあるHDMIセレクタを2つ買って、ひとつのセレクタに対してひとつのディスプレイを割り当てている。ラックのデスクトップPCはセレクタに繋いで、Dockだけはディスプレイ2枚に対して直接DisplayPortで繋いでいる。当初は4in2outのHDMIマルチプレクサを買ってなんとかするつもりだったのだけど、どうにも食い合わせが悪いので諦めた。具体的にはマルチプレクサ自身がEDIDを吐いてしまう、つまりディスプレイとして振る舞ってしまうのだった。何が困るかというとディスプレイがWQHDにもかかわらずHDMIマルチプレクサが4Kディスプレイとして振る舞うせいでPCがディプレイサイズを誤認してしまいうまく表示されない。これは困るので、EDIDを吐かないような安いHDMIセレクタを2枚買って協調動作させることでなんとかしている。協調動作といっても赤外線リモコンを向けて操作するだけ。

↑これなんだけど、もはや売ってなくてやや困る。

リモコンがまさにこれと同型なので、おそらくどこかのOEMなのだろう、そしてこれを買えばきっとなんとかなるだろう、という気はしている。

そしてキーボードやマウスのような入力系統はUSB切替器をつかうことでなんとかしている。これと同型をAliExpressで購入した。リモートスイッチもあるけれど使っておらず、机の下に潜って切り替えている。

USBキーボードやUSBマウスを使っているのであればこれで完成なのだけれど、極力机からケーブルを排除できる方が望ましい。しかしBluetoothキーボードやBluetoothマウスを利用しているとPCの切替時にいちいちペアリングしなおす必要があり面倒。最近だとペアリング先を登録しておいて切り替えられるようになっている機器もあるけど(というかHHKB HYBRID Type-Sがそれ)、3台までしか登録できなかったりとやや要件に合わないよく見たら4台だった! けどトラックボールと切り替えが連動してほしいとかBIOS画面でも入力できたいなどの要求はある。

そこで、BluetoothキーボードとBluetoothトラックボールをUSB入力に変換するグッズをRaspberry Pi Zeroに入れて使っている。なにを言っているんだという感じだけど2年前に作ったこれのこと。

github.com

このときのことは記事にも書いた。

masawada.hatenablog.jp

このころからずっと安定して使えていて便利。

キーボードとマウスをBluetoothでRaspberry Pi Zeroに繋いで、microUSBポートをUSB切替器に接続している。Raspberry Pi Zeroはあんまりネットワークに繋ぎたくないなと思ってスタンドアロンで動作させていて、最近はメンテするときはシリアル接続している。USBシリアル変換ケーブルを机の上に出しているのでいつでもメンテ可能。このあたりの話は最近書いた。

masawada.hatenablog.jp

切り替え機能はラックの上段にまとめていて、このような感じ。

Dock、HDMIセレクタ、USBセレクタ、Raspberry Piが載っている

というわけで、まとめると以下のような状態で複数のPCを切り替えられるようにしている。

清書する力は尽きました

なんだかんだLinuxもWindowsもMac miniもラップトップも使っているのであんまりこの構成を変える気持ちはなくて、もうすこし切替器まわりをシュッとさせたいな〜、KVMスイッチっぽいのを導入したいな〜と思うのだけど、なかなか要求にあったKVMスイッチはないor高い。ので一旦これで落ち着いている。自作KVMスイッチとか面白いだろうな〜などと思いつつまだ手を動かすまでには至れていない。

Wi-Fi資格情報の共有方法

週末に妻の友人が家に遊びにくることになった。我が家ではタグVLANでゲストネットワークを作り、それに繋げられる専用のSSID/パスワードを用意している。せっかくならこれを使ってもらいたい。自動生成したパスワードを手打ちするのは面倒なので、簡単に利用してもらえる方法をいくつか試してみた。

QRコードで設定する

ZXingというライブラリの仕様が広く一般に利用されているようで(要出典)、これに沿ってQRコードを作っておけばiOS/AndroidデフォルトのQRコードリーダーでWi-Fiの設定をすることができる。

具体的には以下のようなテキストをQRコード化しておけば良い。

WIFI:T:WPA;S:${SSID};P:${PASSWORD};;

ポストカードに印刷するのもよさそう。

NFCで設定する (主にAndroid向け)

NFCに資格情報を書き込み、端末でタッチすることでWi-Fiの設定をすることもできる。先日偶然NFCのシールを購入していたのでこれに書き込んでみる。書き込みはNFC Toolsというアプリが一般に使われていそう? なのでこれを利用する。

NFC Tools

NFC Tools

  • wakdev
  • ユーティリティ
  • 無料
apps.apple.com

play.google.com

Wi-Fiの設定を作って書き込み / 読み込み / Androidで読み込んだスクリーンショット

Androidは標準でNFCからWi-Fiを設定する機能が組み込まれているけれど、iOSには存在しない。なので、わざわざアプリを入れないと設定できないのが難しいポイント。

構成プロファイルを用意する (iOSとmacOSのみ)

まあこれは無いかな〜と思うんだけど一応。

macOSのApp StoreでApple Configuratorをダウンロードして、構成プロファイルを作ることができる。

Apple Configurator

Apple Configurator

  • Apple
  • ユーティリティ
  • 無料
apps.apple.com

これをAirDropでiOSやmacOSに転送してあげると、Wi-Fiの設定をすることができる。

Apple Configuratorで構成プロファイルを作る

1Passwordで共有する

最近は1Passwordが結構よくなっていて、1Passwordのアカウントを持っていない相手にも共有できるようになっている。ただし、相手のメールアドレスを知っていることが前提となる。メールアドレスを入力してリンクを生成し、これを共有する。

共有された側はメールアドレスを入力すると認証コードが届くので、これを入力する。

共有する側、される側

これでWebブラウザ上でパスワードを確認できる。

表示されたSSIDとパスワード

相手のメールアドレスを知っていて、かつこういう操作に苦がないならこれが一番良いのではないか。


いろいろ試してみたけど、スマートフォンに関してはQRコードが一番簡単であろうから、これを用意することにした。Switchとかゲーム機を繋ぎたいということになったら、自分の1Passwordに入れておいた資格情報を見せて直接手入力してもらうことになるかなー。

保存していないファイルでvim-quickrunを実行する

めちゃくちゃ小ネタだけど便利に使っているので。

vim-quickrunはこれ。vim-plugなりなんなりで入れましょう。

github.com

普通は保存してるファイルを開いて実行するとかそういう感じだと思うんだけど、保存せずにその場でシュッと実行したいことがある。保存していない状態だとquickrunが何を実行すればいいのか認識してくれないので :set ft=sh とかして拡張子を指定してあげればその場で実行できる。

特定の文字列を一気に編集してその場で実行したい、とかのときに便利。具体的には

hello,world,hoge,fuga

みたいな文字列があったとして :%s/,/\n/ で行を分割して

hello
world
hoge
fuga

vim-surroundで文字列として包んで

"hello"
"world"
"hoge"
"fuga"

visual blockで一気に編集して

open "https://google.com/search?q=hello"
open "https://google.com/search?q=world"
open "https://google.com/search?q=hoge"
open "https://google.com/search?q=fuga"

これでquickrunすると一気に検索結果を開ける、みたいな……

xargsとか駆使すれば同様のことはできるけど、手札として持っておけると結構便利。