プログラム

通院, OpenAI APIと戯れる – 2023年3月19日

午前中は通院などあって付添のため外出。移動中には先日から読み始めた「シャープ 再生への道」を読む。

自宅に戻ってから、先週来からのChatGPTの盛り上がりを受けてOpenAI APIを介した実装に興味が湧いてきたのでシンプルにhttps://github.com/hideack/slack-cli-streamのコマンドとして実装をしてみた。
OpenAI API向けのAPIクライアントのNode.js実装は公開されているものがあるのでサンプルに従って実装したらすぐ呼び出しまで行えた。コマンドとして試したものはSlackの時系列を眺めるなかでふと気になったことがあったら同プログラムのコマンドラインから

> gpt おいしいカレーの作り方を教えてください

といった形で対話の文字列を与えることでAPIに渡せることができてその応答がSlackなどの発言に混ざって帰ってくるもの。

https://github.com/hideack/slack-cli-stream から OpenAI API呼び出しの様子

gpt + 質問文字列 でOpenAI APIを介してリクエスト

どちらかというと久しくコードを書いておらず、VSCodeを開いてvimプラグインを入れてみるなどのテスト勉強になると突然机の周りを整理しだす学生かの如く、開発環境に手を入れ始めてしまい、その中で先のプラグインを入れたときにキーを押しっぱなしにしてもカーソルが動かず、その原因を調べる中で更に深みにはまり... といったことにも時間を使ってしまった。でも、こういうところも含めてコードを書くのは楽しいと思ったのだけどこういった行為もAIとの対話の中でどういった位置づけになるのだろうとふと考えたりした。
なお、このvimプラグインを入れたときの問題は以下のサイトで示されている解決策で解決した。先に書いておくとVSCodeのコンソールから以下の設定を入れた。

defaults write com.microsoft.VSCode ApplePressAndHoldEnabled -bool false # For VS Code
defaults write com.microsoft.VSCodeInsiders ApplePressAndHoldEnabled -bool false # For VS Code Insider

MiniMagickで画像の文字を重ね合わせて新たに画像を作る – 2022年2月13日

この週末三連休の自由研究(?)の一環。
Rubyでテンプレートになる画像を読み込み、その画像の上に文字を重ね合わせ画像ファイルとして書き出すまでの一連の流れは以下の様な形で試すことができたというメモ。

require 'mini_magick'
image = MiniMagick::Image.open("template.png")

image.combine_options do |config|
  config.font "font.ttf"
  config.pointsize 64
  config.fill "#ff0000"
  config.gravity "center"
  config.annotate "0,0", "ここにメッセージを入れる"
end

image.write "#{SecureRandom.hex}.png"

久しぶりに試行錯誤しながらプログラムを書いて動かした。

Railsチュートリアル 第6版 をはじめた

最近、コード書いたりめっきりできてないなと思ったところもあったので、改めてRailsチュートリアルを課金して改めて頭からやってみることにした。目標はカラーミーショップAPIを使ったRailsアプリを1アプリ作ってみることにしてみる。

少し脱線するけども、自分がどういう役割や職位であっても根はエンジニアであり続けたいと思っているので、

  • 事業設計であったりもコードを書いたり設計をしたりするときの視点を持ってみる
  • 事業で直面した技術的な課題に対しての困難さであったりの「あのあたり感」は持ち続ける
  • 素直に周りの人に教えをこいながら技術やトレンドをキャッチアップをしていく (これはエンジニアに限らずだけれども)

といったことは自分の人生の中で仕事をしている間は姿勢として持ちづけたいと思っている。

https://railstutorial.jp/

Google Colaboratory (Colab) でProphetを利用する

突発的に投下されるtipsエントリー。

何らかの時系列データが手元にあるときに先々の予測を行う際に使えるツールとして、Facebookが開発した時系列予測のオープンソースソフトウェア(OSS)ライブラリProphetがあります。

以前書いたエントリーの「Prophetを触ってみる」においてはpyenvとpipを利用して手元のMacなどの環境に直接入れるやり方だったのですが、今回はGoogle Colaboratoryを利用するやり方になります。

続きを読む

CIをGitHub Actionsに移行した

Slack眺めるくんこと https://github.com/hideack/slack-cli-stream で書いているささやかなテストをCircle CIで動かしていたのだけれども、社内や自分が携わっている事業部でGitHub Actionsが活用されているのを横目で見ていたので、どんな形で動くのかくらいわかりたいなと思っていたので少し試してみた。

導入はシンプルにできてリポジトリにあるActionsのタブ (今回だと現在のリポジトリの状況に応じてある程度Workflowがレコメンドされるのでそこから "Set up this worklfow" を選択するとGitHub Actions設定用のYAMLの編集になるのでそれをコミットするだけで完了した。

リポジトリページのタブにあるActionsを選択するとこの様な形でレコメンドされる

実際にGitHub Actionsを通して今回のリポジトリに設けてあるmochaでテストを走らせることはできたのだけれども、手元やCircle CIで通っていた一部のテストが落ちてしまった。はて、これは原因何だろうかと見ていく上で、そもそも落ちているテストを確認すると文字色を変えるためのキャラクターコードが想定どおり出力されているかを確認しているものであった。

ターミナルのセッティングとかそのあたりに依存するのだろうかと思い、いくつかこのあたりのキーワードを元に色々と調べていると以下のコミュニティーの議論に到着した。mochaを実行する際に--colors というオプションを与えることで解決できた。

https://github.community/t/ansi-color-output-in-webview/17621

無事、テストがパスする様になったことを確認してmasterにマージしてGitHub Actionsデビュー第一歩を踏み出した。

mac-peripheral-batteryというnpmを登録した

先日書いたMacに接続したMagic Keyboardの電池残量をコマンドラインで得るというエントリの内容をシンプルなnpmにして公開した。ioregのコマンドをラップしてBatteryPercentという要素を持ち得る周辺機器(主としてはMac製品)のそのコマンドで得られる結果をJSONに置き換えているだけのものだけれども。

[blogcard url="https://www.npmjs.com/package/mac-peripheral-battery"]

npm install -g mac-peripheral-battery

でインストールした上で実行すれば先日紹介した様なJSONが得られる。

実行結果

得られるJSON例

こういった形で得られるのでバッテリ残量の割合が求めたければjqコマンドと組み合わせて

☁ mac-peripheral-battery | jq .[0].BatteryPercent | awk '{printf "Magic Keyboardバッテリー残量 %d%%", $1 }'

Magic Keyboardバッテリー残量 70%

こんな形になるので、あとはSlack通知するなりMacのステータスに表示させるなりすれば「よさそう」なところまで持っていける。

Macに接続したMagic Keyboardの電池残量をコマンドラインで得る

Magic Keyboardを利用する様になって電池残量が気になってしまい、メニューバーのBluetooth接続一覧の箇所からキーボードを選び残量を知るということを行っていたのだけれども、あまりスマートではないなと思ったところもあったので色々と調べると ioreg というコマンドでOSが持つ情報を得れるということを今更ながら知った。

Magic Keyboard等の電池残量は "BatteryPercent" というキーの値で得ることができるので以下の様にioregの引数で渡してやると得ることができる。

ioreg -r -d 1 -k BatteryPercent

ioregの実行結果

上の様な形で結果が得られる

更にこのコマンドに -a という引数を渡すとplist形式のXMLで上の情報を得られるので、更にそれをJSONで扱えると便利そうだなと思ったのでnpmのexecanode-simple-plistを使って以下の様に書いてみた。(このあたりシェルだけで解決できそうな気もするが...)

上の様なものを書いたら、それとなく便利そうなJSONが得られる様になったので、今度はバッテリー残量を定期的にSlack通知させようかと思う。仕事終わりに近いときに残量気付ける様に。

それとなく便利そうなJSON

余談だが今回初めてplistを今更ながら知り、そしてその系譜がNeXTに遡ることを知ってしみじみした。
NS接頭辞以外にもこういうところに残っているんだと。

ShiftJISのファイルをJavaScriptのFile APIで読み込む

ShiftJISで提供されるテキストファイルをJavaScriptのFile APIのFileReaderで読み込み、更にそれをエンコードする方法をいろいろ調べた。見た範囲だとencoding-japaneseを利用する例が多かったので、cdnjsに置かれているこのライブラリをscriptタグで読み込んだ上で以下の様な形で書いた。この形で書くと元の文字コードが自動的に確定されて所望な形に変換される。


クライアントサイドでもいろいろできるんだなと思いながら一日が終わる。

SlackのEvent APIでプライベートチャンネル名を取得する – 2020年9月12日

午前中、ラジオ聴きつつ調べごとをしていた。昨夜放送分の問わず語りの神田伯山だったのだけれども痛快なくらいぶっちゃけていた。

スプレッドシートを眺めるなどしていたらあっという間に時間が過ぎてしまったので昼ごはんにチャーハンを作った。最近、チャーハンの卵の扱いを別途予め半熟状の炒り卵を作ってあとから混ぜる方式と、予め卵かけご飯状態にしたご飯を炒めていくやり方と交互に試しているのだけれども、たしかにパラッとするのは後者なのだけれどもどうしても自分のなかでのチャーハン像は前者なのでもう少し色々な作り方を研究してみねばと思っているんだけれども、間違いなくポイントは「焼く」ことなんだろうな。炒めることをしているときに弄り過ぎない、じっと待つことも大事。

盆栽ワークでSlack眺めるくん https://github.com/hideack/slack-cli-stream の修正。以前からSlackでのプライベートチャンネル名のみ取得できていなかったのでそれを取得できる様にしようと思いつつできていなかったのであった。プライベートチャンネル名はどこでとれるものかとリファレンスを調べた。

https://api.slack.com/events

message.groups eventというのがあるので、そちらを使うとプライベートチャンネルのリストが取得できる。プライベートの場合にはgroupsなのか。(パブリックチャンネルの場合はそのまま message.channels event という名前もそのままである)

雑には以下の様な形で取得ができる。