tmux上のClaude CodeやらCodexやらCopilotのCLIからShift + Enterを送信できるようにする

普段はGhosttyの上でtmuxを使って生活しているが、Claude CodeやらCodexやらCopilotのCLIで入力するときに複数行が入力できない問題があった。

これらのツールはKitty keyboard protocolというものでGhosttyなどのターミナルエミュレーターからShift+Enterを受信するようだが、tmuxを経由するとその入力が中継できずにただの改行として認識されてしまうようだった。 tmuxでKitty keyboard protocolに完全対応するのは厳しそうだったが、 .tmux.conf に以下の1行を入れたところ期待通りの動作をした。

bind -n S-Enter send-keys Escape "[13;2u"

Shift+Enterを検知したら本来送られて欲しい Escape "[13;2u" を送信するようにリマップする設定。 他の用途でShift+Enterをフックしたいケースは今の所思いつかないので、これでよさそう。

Turing RK1でboot deviceを切り替える

Turing Pi 2.5上のTuring RK1で普段はNVMeから起動しているが、リカバリ用途などで遠隔からeMMCから起動したくなった時の作業メモ。 この手順を忘れていても物理的にNVMeを取り外せばeMMCから起動するが、せっかくBMCがついているので全て遠隔から操作したい。

BMCにsshする

Turing Pi 2.5のBMCにsshする。(デフォルトのユーザ/パスワードはroot / turing)

user@turingpi.local

ノードの電源を投入する

数字はノード番号(1~4)

$ tpi power --node 1 off
$ tpi power --node 1 on

すぐにBMC上からシリアルコンソールにアタッチする

$ microcom -s 115200 /dev/ttyS1

U-bootのメニューに入る

カウントダウンが表示されたらenterキーを押すとブートシーケンスが止まってU-bootのメニューに入れる

U-Boot 2024.01 (Jan 28 2024 - 19:39:18 +0000)

Model: Turing Machines RK1
DRAM:  32 GiB (effective 31.7 GiB)
Core:  318 devices, 27 uclasses, devicetree: separate
MMC:   mmc@fe2e0000: 0
Loading Environment from nowhere... OK
In:    serial@febc0000
Out:   serial@febc0000
Err:   serial@febc0000
Model: Turing Machines RK1
Net:   eth0: ethernet@fe1c0000
Hit any key to stop autoboot:  2
=>

bootする

boot対象一覧を表示する。ちなみにmmc1はSDカードになっていて、内蔵eMMCはmmc0。なのでSDカードを刺さなければNVMeから起動しようとする。

=> printenv boot_targets
boot_targets=mmc1 nvme scsi usb mmc0 pxe dhcp spi

一時的に起動順序を変更する。setenvは一時的な値の変更であって永続的ではない。 永続的な変更は不可能な模様。 https://forum.turingpi.com/t/16718526/rk1-booting-and-running-off-storage-beyond-emmc

内蔵eMMCから優先的に起動する場合は以下のようにする。

=> setenv boot_targets "mmc0 mmc1 nvme scsi usb pxe dhcp spi"
=> boot

生成AI時代にハッカーとして生き残るには

タイトルは今の自分の悩みであってこの記事を読んでも特に解決はしません。

ハッカーあるいはエンジニアとは

ここでいうエンジニアはソフトウェアを開発したりデリバリーしたりするためにエンジニアリングを行う職業で、今の自分の職業でもある。
ハッカーがなんなのかはよくわかっていない。ただ自分がソフトウェアエンジニアになるきっかけになった憧れのようなものを想像している。
欲しいものがなければ自分で作るし、痒い所に手が届かないものがあれば手が届くようにする。成果を公開すれば誰かがそれを使ってくれるかもしれないし、物好きな人がそれを改造してくれるかもしれない。
好きでやっているので「技術の無駄遣い」と言われるようなこともしたりする。そしてそれを楽しそうに話す。
ビジネスとマッチすれば好きなことをしながらそこそこお金ももらえるらしい。社会貢献できる機会も増えてきた。そんな存在。

Web業界のソフトウェアエンジニアとして働き始めて9年ちょっとが経過した。
書かれているプログラムの大半は英数字と記号の羅列からなる無機質なもので、当初はソフトウェアエンジニアは淡々と無機質なものを生成する職業だと思っていた。
実際に働いてみるとそんなことはなく、機械より人間と対話する時間の方が長いし、特に特定のプロダクトに関わる時間が多ければそのコードに対して生き物とはまた違った何かを育てているような愛着を持つ。
全く理由もなくコードを書くことはまれで、関わる人々の何かしらの意思があり、それを実現するためにコードに落とし込んでいるので当然といえは当然である。
世の中で動いているコードは無機質な見た目に反して泥臭いものの集合体なんだなという実感が得られたのが最近である。

人間の介在価値とは

2023年は生成AIブーム(?)もあって街を歩いていてもAIの話題を耳にする機会が増えた。
生成AIで業務の生産性を向上させようという話が世の中では本格化しそうだが、実のところ嬉しいよりも不安の方が大きい。

会社を経営する立場からすると仕事に再現性があれば安定して成果が生産できるし、もっと言えばAIに置き換えやすくなるので嬉しいのでしょう。
雇われる側の立場としては再現性があることがわかった/再現できるようにした時点から当初の仕事の価値は減り始めているので、「生産性向上バンザイ!🙌」と喜んでいる場合ではない。
その代わりに何かできることが増えていないと給料を維持するのも難しくなってきそうだ。だからリスキリングが流行り始めたのだろう。

今更AIを頭ごなしに規制すべきだとも思わないし、積極的に取り入れて個人の能力拡張に生かしていくべきだとは思う。
仮にAIに頼らずに何かを作り上げたとしても、AIが生成するものと似通っていれば相対的に価値が下がってしまう(むしろAIの価値が上がったりする)し、自分にとってはオリジナリティがある行動だったものが実はそうでもないことがAIによって勝手に証明されてしまうところに危機感を感じている。

自分や自分たちの力で成し遂げたと思っていること、誇りに思っていること、アイデンティティだと思っていることを機械に否定されるような気がしてつらい。
今まではわざわざ他人の小さなことを逐一否定してまわるような暇な人はいなかったために各人のアイデンティティは守られていた気がするが、個人とAIの距離が縮まったことでそこがスケールしてしまった感がある。

強制的に自分が行なっていることの価値を考えさせられる世の中になって努力したり成長したりするきっかけが増えた反面、常にそれを突き付けられる世の中になってしまったように感じている。

逃げのAI活用

単に自分が想像できないことを「AIを活用すれば〜」という言葉で置き換えるのは逃げだとも感じるようになってきた。

少なくとも現時点では知らないこと、理解できないことを全てAIに任せておけば勝手に解決しておいてくれるわけではないし、逃げるとむしろうまく活用するチャンスを失ってしまう気がする。
何かをしたいという意思は必ず人間から生まれてくるものであるから、そこにどうAIを組み込んで、どんな出力が得られるように仕上げるかは人間が決めなければいけない。AIを活用しても人間の意図は最後まで途切れないはず。
あえてよくわからない状態を生み出すことを楽しむ方法もあるかもしれないが、多くはそうではないだろう。

対話型の生成AIは誰でも使いやすく、組み込みやすいインターフェースを持つことから急速にいろんなサービスに組み込まれていく一方で、 人間がわざわざプログラミング言語というものを発明して自然言語の曖昧さをなくした厳密な定義を作ったのに、自然言語をコンピュータ(AI)に解釈させて非決定的な結果を頑張ってチューニングするような使い方に関してはなんとも言い難い違和感がある。
でもAIが生成したコードを人間がレビューして修正しつつ採用するスタイルは慣れてきた。人間の意図や思考を論理的に整理した結果生成されるものがコードだとすれば、思考の整理のための補助としてのAIなのだろうと考えると受け入れやすい気もする。この違いは何だろう。このあたりに生成AIをうまく活用していく切り口がある気がしている。

この先生きのこるには

自分が介在する価値を高めるために、自分がが介在しなくてもいいものをエンジニアリングで増やしていこうという気持ちが以前より強くなってきた。
AIによる人間のタスクの置き換えは自然な流れであるから乗らない手はないし、それはそれとして自分の能力がAIで拡張されるのは嬉しいので、AIの活用は増やしていきたい。

職業エンジニアとしてお金を稼いでいくこともそうだが、ハッカーへの漠然とした憧れがあるので、その楽しみがAIに置き換えられることは阻止したい。
そのためにやるべきことはなんなのか、自分らしい仕事とはなんなのか悩んでいる。
生きのこる方法について悩むのは現役世代しかいないと思うので、自分で考えていくしかない。将来の人たちにとっては憧れる対象がなくなれば憧れることもないので。

この記事はVSCodeでGitHub Copilotを使いながら書いたので何割かはAIの出力がまざっていて、自分の考えもすでにAIに引っ張られている気がする。
暗い話ばかり書いたが特に落ち込んでるわけでもなくて、好奇心さえ失わなければいろんなことが達成できるはずだし、楽しい仕事もなくならないだろうと楽観的に考えてはいる。

さいごに

個人的な答えは見つかっていませんが、AIの回答を置いておきます。

ChatGPTからの回答

Akamai x UNIQLOコラボTシャツに書かれたプログラムを解読してみる

Akamai x UNIQLOコラボのTシャツのデザインが、エンジニアからすると目を引くようなものだった。

Akamaiのリリース記事を読むと、

Akamai、ユニクロのチャリティTシャツプロジェクト「PEACE FOR ALL」に参画|アカマイ・テクノロジーズ合同会社のプレスリリース

このデザインに使われている「texture」というコードは、さまざまデジタル体験の裏側にある共通言語を表現しています。

と書かれており、どんなコードなのかさらに気になったので、解読してみることに。

写経

写真をみた感じGoっぽい感じがする。とりあえず写経してみる。

gist.github.com

ぱっと見でわかったことは

  • HTTPサーバっぽい
  • channelが多用されていそう
  • コードの右端が途切れてそう
  • Goっぽいけどセミコロンがたくさんある(1行に書くため?)

くらいだった。右端が切れていることからコピペしただけでは動かないことがわかる。 整合性が取れていなさそうに見受けられる部分もありそうなので、補うだけではダメで、若干の修正も必要そう。

解読

ということで、前後の文脈を頼りに整合性をとりながら、コンパイルが通るようにしたコードがこちら。1時間くらい掛かってしまった。

gist.github.com

何をするコードなのか

コンパイルは通るようにしたが、実行すると全てのgoroutineが停止してしまうため、panicする。 httpサーバっぽいコードだが、listenする処理などがないため、それはそうだろうという感じがする。

雰囲気から察するに /admin/status 2つのエンドポイントを持っていて、/admin

type controlMessage struct {
    Target string
    Count  int
}

このようなメッセージを受け取ったら何かの処理をするサーバのようだ。 /status は処理中かどうかがわかるようだ。

それ以上の隠された何かは特に見つけられなかったので、知っていたら誰か教えてください。

このコードからの学び

statusPollChannel := make(chan chan bool)

チャネルのチャネル(chan chan)という使い方は見たことがなかった(意識してないだけかもしれない)ので、確かにそういう使い方もあるかという学びになった。

何か特定の自分がリクエストしたものに対しての応答を待ち受けるような実装があれば使えそう。

ここまでやってから気づいたこと

Tシャツのハイライトされた文字だけ読むと、、ということなのか😇

感想

ここまでTシャツのデザインを凝視したことはなかったので、ユニクロに立ち寄った際にこのTシャツが売っていたら買おうと思う。