ちなみに

火曜日の空は僕を押しつぶした。

AppleScriptでSlackの特定チャネルに定型文を投稿する

Slackの特定のチャネルを開いて定型文を入力したい。具体的にはAPIでは発火できないスラッシュコマンドを実行したい。

特定のチャネルを開く簡単な方法は、Slackアプリに用意されている Deep Link を使うことです。 この場合は slack://channel を使うと目的を達成できます。試すには open slack://channel?team=<チームID>&id=<チャネルID> みたいにすると良い。 IDはWeb版で目的にチャネルを開くとURLに含まれているので、2つ合わせてゲットするにはそこからが速いかも。

AppleScript でこれを開くにはいくつか方法がありますが、今回は System Events を使います。 (System Events についてのドキュメントを発見できなかったのだけれど誰か教えてください。)

tell application "System Events"
    open location "slack://channel?team=<チームID>&id=<チャネルID>"
end tell

System Events を使ったのは文字入力をするための布石で keystroke を使っていきます。 keystroke "Hello" のようにすると、キーボードから Hello と入力したのと同様の結果が得られます。

tell application "System Events"
    keystroke "Hello"
end tell

ただしここで問題が生じます。キーストロークなので日本語をそのまま与えてもおかしなことになります。 キーボード操作を考えても、IMEをオンにして、文字を入力、変換して、確定という操作をしているので当然です。

そんな面倒なことを再現しないといけないのかというとそうでもなくて、クリップボードを使うと実現できます。

set the clipboard to "日本語でこんにちは"

tell application "System Events"
    keystroke "v" using {command down}
end tell

using {command down}Cmd を押しながら別のキーを押すを実現できます。 これで Cmd+v をして貼り付けすることが出来ます。

これらを組み合わせると以下のように特定のチャネルに定型文を投稿することが可能です。

ここでは ジョブカン のスラッシュコマンドを実行しています。 メッセージも入力したいので引数を受け取れるようにしました。

on run argv
    set message to item 1 of argv
    set the clipboard to "/jobcan_touch " & message

    tell application "System Events"
        open location "slack://channel?team=<チームID>&id=<チャネルID>"
        delay 1

        keystroke "v" using {command down}
        delay 0.5

        keystroke return
    end tell
end run

これで人力でやっていたチャネルを開いて、入力して、投稿の3ステップの操作が1ステップで完了できるようになりました。

べんりですね。

能楽堂で音楽を聴く

argerich-mf.jp

別府アルゲリッチ音楽祭の催しの1つで、平和市民公園能楽堂 で行われたチェロとピアノの演奏会に行ってきた。

生でチェロを聴くのはもしかしたら初めてかもしれない。

能楽堂は別に音響に特化したわけではないと思うので、めちゃくちゃ良い音で聴けるわけではないけど、やはり生演奏というのは響くものがある。 席もめっちゃよくて二人の手元がよく見える位置で目でも楽しむことができた。

アンコールの朧月夜が特によくて、ピアノの編曲がすごく好きだった。

Keep In Touch

どうやら一般的には人との関係はメンテナンスしないと壊れてしまうらしい。

自分は友達や知り合いにたいしてこちらから連絡をほとんどしない。 友達だと思っている人達は連絡を取らなくてもつながっていて、何かあったときだけ連絡すればすぐに元の関係に戻れると思っていたからだ。 特にSNSのようなものが普及していつでも連絡が取れるようになってからは顕著で、SNSでつながってなかったとしてもなんらかで連絡取れるやろと思っている。 物理的に会うなんて考えもしていない。

しかし、どうやら幻想だったようで、友人達とはどんどん疎遠になってしまっている。 まあたぶん連絡したらなんかなるとは思いつつ、昔よりもやり取り自体がかなり減ってしまっている。

特に何かあった訳じゃないのだけれど別府市にやってきて、物理的に会う機会がほぼ無くなったことでふと不安に思ったのであった。

GitHub Copilot Chat 舐めていた

marketplace.visualstudio.com

GitHub Copilot と直接会話できる Copilot Chat 、皆さん使ってますか? 私は最近まともに使い始めました。

Copilot と言えば補完だけだと思っている人、以前ちょっとだけ触れて使えないと思った人(僕です)、いまのバージョンをもう一度触ってみてください、めっちゃ便利になっている。

www.youtube.com

この動画が出来ることを追いかけるのに良さそうなので見てください。

ベースモデルがGPT-4に変わったりとかいろいろ変化はありますが、便利なのは ParticipantContext の概念が入ったことだと思います。

Participantは @workspace みたいなやつで、Chat-GPTにおける GPTs みたいなやつ。例えば @workspace ならいま開いているプロジェクトについての情報をローカルで集めてくれて俯瞰的でかつトークン制限を超えた回答ができる。 さいきん発表された Copilot Extension などもこの仕組みにのっかっていそう。

Context は #file:REAME.md とか #selection みたいな感じで特にここを見てくれというのを明示的に伝えられる。これによって意図していない回答が得られる率を大幅に減らせている。

code.visualstudio.com

ドキュメントがちゃんと更新されているのでここを読むと一望できそう。

また、英語が苦手勢としては日本語でプロンプトを入力するのが面倒な時がある。そういうときには VS Code Speech を使うと音声入力できるので重宝している。 日本語だと精度がそこまででもないのと、日本語の中に英語を交ぜたりできないのが玉に瑕。3S 原則 を守っていたらそんなに長文にはならないのでギリ使えている。

marketplace.visualstudio.com

今後はどんどん人間の作業が減っていくのは間違いないので、コードの詳細よりもっと大きな視点で考えられるように意識を変えていこう。

VSCodeでGoの文字列内のSQLをシンタックスハイライトしたい

TL;DR

適当な Grammer 拡張を入れて以下の設定を書いておきましょう。

"gopls": {
  "ui.semanticTokens": true,

  // you can optionally turn on these features for more colors
  // see https://go.dev/issue/45753 and https://go.dev/issue/45792
  "ui.noSemanticString": true,  // delegates string syntax highlighting to vscode
  "ui.noSemanticNumber": true,  // delegates number syntax highlighting to vscode
}

本文

仕事では主に Go を書いていて、DBへのクエリは生のSQLを文字列で Go のファイル内に書いている。 このSQLはただの文字列なので当然シンタックスハイライトはされない。

Goland を使っている同僚は、JetBrains のテクノロジーによってシンタックスハイライトされるらしい。ずるい。 VSCode でもこれをやりたい。

実は VSCode でも特定の言語内に埋め込まれた別の言語をあつかう方法は用意されていて Injection grammars というやつを使うと実現できる。

難点は Grammer の設定は拡張にしか書けないので、手元でシュッとやることができない。 なんか適当なやつを入れるか、自分で拡張を書く必要がある。 自分は Inline SQL というやつを入れているが、シンタックスハイライトしたいだけには過剰なのでもっとシンプルなやつでいいと思います。

ところで VSCode で Go を書いている人はほぼ間違いなく Go拡張 を使っていると思います。

この拡張経由で gopls を使うと Semantic Highlighting によって、より正確なシンタックスハイライトが出来るわけですが、これを使うと Injection grammars を使うことができません。「文字列」としてトークナイズされて処理されるので文字列の色にしかなりません。

よって、以下のような設定で Semantic Tokens を無効にするような手段が提示されています。SQLシンタックスハイライトのために失うものが大きすぎる。

{
    "gopls.ui.semanticTokens": false
}

僕はこれをなんとかするために自前でテーマ拡張を書くことで文字列だけ Semantic Highlighting の対象外にする力業をやっていました。

しかし、実は ui.noSemanticString 使うことで回避できるらしい。そしてよくみると Features に しっかり書いて あった。 2022年の8月ごろ に実装された設定らしく、拡張側のドキュメントに記載されたのが 2023年2月 ごろなので、気付くのに一年以上かかってしまった。

HUAWEI FreeClipはいいぞ

consumer.huawei.com

まとめ

  • 着け心地最強クラス
  • ふつうに音楽が聴ける音質
  • まじで買った方がよい

経緯

しばらく有線のヘッドホンやイヤホンばかりを使っていたのですが、去年買った FreeBuds 5 がめちゃくちゃ良かったのと、前評判がかなり良かったので予約して購入しました。 イヤーカフ型が使ったことがなかったので、お試しくらいの気持ちでしたが、大正解で、今や仕事用のメインイヤホンです。

外耳炎になってしまって耳に押し込むカナル型は使えず、耳にかけるやつも肌が弱くて最近はかぶれてしまうようになったので、そういう意味でも試してみたかったやつです。

着け心地

まずはなんといっても着け心地。さすがに何も付けてない感じとは言えませんが、快適度はこれまで使ってきたものの中で最高です。 Shokzやオーテクの骨伝導や、Oladanceなどと比べても圧倒的に快適。これなら一日中付けていても苦になりません。バッテリーが切れて外す感じになっています。

どうやら同時期に発売された Bose Ultra Open Earbuds の方が快適度は上という噂もあるのですが高価すぎる。 この値段を出すのならそれなりの有線イヤホンが買えてしまいそうです。 よって着け心地と価格のバランスを考えると現行最強と言いたいです。

音質

低音が弱そうなイメージだったのですが音楽も全然聴けました。もちろん有線のいいやつと比べると比較にならないのですが、ながら聴きをするくらいならこれで十分。 コーデックとしてLDAP対応してないので困る人はいそうですが、僕にはAACと聴き比べても違いが分からなかったので誤差だと思っています。

そして人の声を聞くにはまったく不満がなくて、ミーティング用はこれで間違いないと思います。着け心地も考えると仕事用としても最強クラス。 耳を塞がないタイプなので遮音性もなく、ノイズキャンセリングもないので、五月蠅いところだと使いにくいですが、在宅ワークだとなんとでもできそうです。

逆に音漏れについて心配な人もいそうですが、逆位相の音を外向けに出す仕組みでかなり抑えられています。 自分の用途ではちょっと五月蠅いくらいにしても漏れてなさそうでした。

操作性

いちばんすごいのが左右の違いがないという点。デザイン上差異がないだけじゃなくて、どちらをつけてもちゃんと正しい方向で再生される謎技術。これはすごい。めっちゃ快適。

操作もどこをタップしても反応するので狙ってタップする必要がなくてストレスなく扱えます。ダブルタップと、トリプルタップを左右それぞれに操作割り当てができる。 自分は再生と停止、曲送りを設定している。逆にそれ以外はそんな使わなさそう。オーディオアシスタントとかは外で使う人には便利かもしれない。

2台までのマルチポイント接続にも対応しているので、PCとスマフォをシームレスに切り替えられるのは嬉しい。 接続が不安定になることもなく、狙ったデバイスからちゃんと音を出せている。よくできてる。 FreeBuds 5 ではできなかったのでメインで使えていなかった。

残念なのは音量調整ができないことで、これはPCやスマフォを操作しないといけない。

(追記) ファームウェアアップデートでジェスチャーによる音量調整が実装された。ちょっと使いにくいけどこれで出来ないことはなくなった。

合わせて買いたい

blog.nishimu.land