OpenAI Playgroundを使ってGPTを会話風テキスト生成ツールとして楽しむ

俺のChatGPT活用術

——みたいな記事を避けていたので世間の動向をあんまり把握していないんだけど、一方自分自身の話は披露したいという悲しい中年の性(さが)よ。

Playgroundを使う

いきなりChatGPTを使ってないんだけどOpenAI Playgroundを使います。

このページではOpenAIが提供する言語系のモデルAPIの動作をWebインターフェイスから試せて、ChatGPTのモデルであるgpt-3.5-turboも使える。

ChatGPT(chat.openai.com)の方を利用しない理由としては

  • Systemメッセージ:AIに対して人間より優先するメッセージを与えられる。ChatGPTの方でもそのうち使えるようになるらしい
  • AI側のテキストも編集できる
  • temperatureやtop_pなどのパラメータを調整できる
  • Complete, Insert, Editなどの別のAPIが使える

というものがある。

逆にChatGPTを使った方がいい理由としては

  • GPT-4を試したい
  • APIクレジット消費したくない

になる。なので

  • 試行錯誤をChatGPT側で
  • テキスト生成をPlaygroundで
  • 清書を高性能GPT-4さんで締めていただく

とかがアリなのかもしれない。

ただAPIクレジットといっても大量の文章の埋め込み変換やファインチューニングに手を出さない限りPlaygroundをちまちま使っているだけなら常人には気にならない程度だと思う(流血しながら)。

GPTで有り金溶かした人の顔

実際の使用例でいうとAI相手に会話を繰替えしてゆく、という使い方ではなく、生成されたテキストを入力テキストに組み込んで改変したり、結果を調整するためにアノテーションを付けたり、会話の全体の内容を何回も書き換えてテキストを作り変えていくことで作文をする。

GPTとして使う

GPTこと生成系事前学習済みTransformerさんがチャット風アプリケーションになった衝撃でびっくりし過ぎてしばらく「AIに適切な指示を出すことで俺たちは問題を解決をする!」という視点で使っていたんだけど、APIを中心に遊んでいたら「要は会話風にテキストを生成できる部分が重要だな」という認識になった。

一方プロンプトエンジニアリングでがんばる勢のシステマチックなアプローチはWeb3の分散アプリケーション特性のように、一旦「ここまで自然言語でがんばらなくてよくない?」という冷め方を今後すると思う。ハンマーを持つと全部釘に見える法則のようだ。

ただ「LangChain Agentでジョバンニたちの到着時刻を探索させる」や「ChatGPT自身をAPIサーバーにする」「ChatGPTで大喜利エンジニアリング」のようなことができるのがとても面白い。

それにGPTはテキストからテキストを生成できるので、それによってキャンバスに絵を書くようにテキストで論理パズルができるのも面白い。

見聞きした中では落合陽一も同じような主張をしていて「爆誕した「GPT-4」の何がスゴいのか?」という動画の中で「Google検索の変わりに使うんじゃなくてテキスト生成して遊ぼう」と言ってPlaygroundを直接使っていた。

僕の場合はChatGPTを技術的な調べもののGoogle検索や書籍を探すためのキーワードを探すのにも使っていて「エラーや方法をChatGPTに尋ねる」→「公式ドキュメントを見に行く」という順序にしてる。

今後生成系AIがキーボードやIMEのようなレベルの書き道具としてとして使えると思う。スマホで予測変換を使いこなすようになったように、テキスト生成機能があることが前提にデザインしたエディタなどのソフトウェアを使うのが楽しみであるし、自分でも作りたい。

まとめ

つまりは「ChatGPTとの会話で指示を与えて結果を得て目的を達成する」ということはほどほどにして「会話風テキストを作るパーツによって色々応用が効く」という部分を楽しんでいる。

Internet Computer Dapp開発入門

Internet Computer (IC) とは

興味のない人向けに説明するとInternet ComputerはスマートコントラクトでDappを開発できるブロックチェーンです。

Dappはいわゆる分散型アプリケーションのことで、ブロックチェーンと連携するWebアプリケーションのことです。

自分も名前は知っていたものの有象無象の1つでしょぐらいの認識だったので今回ドキュメントを通して読んでみました。

internetcomputer.org

Internet Computerの特徴

Internet ComputerはフロントエンドをSPAとして、バックエンドとデータ層をスマートコントラクトとして、フルスタックのWebアプリケーションをデプロイ可能です。

つまり新手のPaaSとして使えます。

厳密にはAsset Canisterという仕組みでフロントエンドも静的ファイル入りのスマートコントラクトとしてデプロイされていて、呼び出しに応じてHTTPのリクエスト/レスポンスを介在するBoundary nodesというエッジが居るようです。

これらのアーキテクチャがWasmを中心に構成されているのが興味深い点です。 「Swiftがこの先生きのこるには」などで話題にしたように「未来のサーバーレスへのデプロイはWasmが中心になるのでは」という夢を描いている人にもおすすめ*1

利用事例

DSCVR (分散型 Reddit)Distrikt (分散型 Twitter) そしてGmail代替のDmailなどがICによってホストされているようです。

Canister

CanisterはICにデプロイする最小単位のソースコードで、スマートコントラクトとして機能します。

Canister smart contracts | Internet Computer

SDKを使ってコードを書き、デプロイ時にWasmにコンパイルします。

独自言語Motoko*2かRustを第一にサポートしていて、MotokoがネイティブでRusがブリッジの関係にあります。

stackoverflow.blog

それぞれの制約などの比較表がここにあります。

Choosing a programming language | Internet Computer

開発チームは両言語を対等にサポートするよう努めているようですが、学習目的ならRustに慣れている人以外はまずはMotokoを選ぶのがよいです(Rustのcrateをブリッジするレイヤーでたぶんハマるので)。

Internet Identity(認証フレームワーク)

Internet IdentityはブラウザのWebAuthn APIで構築された認証フレームワークです。

認証が独立しているのでユーザー視点で見るとDappを利用するためのブラウザ拡張やウォレットアプリを使った「Connect Wallet」系の操作が不要になります(ICPトークンを利用するためのウォレットは別途あります)。

例えばMacbookChromeでサイト上のボタンを押したらTouch IDを使用してログイン完了、というUXが実現できます。

Bitcoin連携

Internet ComputerにはBitcoinトランザクションを送信できるような連携機能が付いているようです。

Bitcoin Integration — Coding Bitcoin | Internet Computer

該当部分のソースコード を読んでみたところ、共有のCanisterとしてBitcoin用のAPIが実装されているのだという理解をしました。

デプロイ

testnetに相当する専用ネットワークはなく、メインネットに以下のようにエイリアス張って開発しています。

Staging Environment | Internet Computer

メインネットに公開するにはCyclesを支払ってデプロイします。Cyclesはガス代に利用するトークンの名称です。

通常ICPトークンを取引所などで入手して、それをCyclesに交換します。

Mainnet deployment | Internet Computer

ただ現在はDiscord経由でfaucetが機能しており、申請するともらえます。

Getting Started with Free Cycles | Internet Computer

実践編

動くサンプルコードがGitHubにあるのでそれを実際にビルドするのがよいです。

git clone https://github.com/dfinity/examples dfinity/examples

Canisterについて知りたいのならコード量の少ない以下のプロジェクトを掘ってみてください(Rustな人は rust/ ディレクトリに置き換えてください)

❯ du -sh motoko/* | sort
    16K       motoko/calc/
    16K    motoko/counter/
    16K    motoko/echo/
    16K    motoko/factorial/
    16K    motoko/hello-world/
    16K    motoko/http_counter/
    16K    motoko/simple-to-do/
    16K    motoko/whoami/
    16M    motoko/invoice-canister/
    20K    motoko/actor_reference/
    20K    motoko/hello_cycles/
    20K    motoko/pub-sub/
    20K    motoko/quicksort/
    28K    motoko/classes/
    28K    motoko/dip721-nft-container/
    36K    motoko/threshold-ecdsa/
    44K    motoko/basic_bitcoin/
    44K    motoko/basic_dao/
    44K    motoko/ledger-transfer/

個人的なおすすめは「encrypted-notes-dapp」というノートアプリケーションでマルチバイトを保存できなかったりするんだけど、フルセットのCRUDアプリケーションの作り方がわかります。

そしてこのリポジトリは全体的にSvelte好きな人たちによってフロントエンドが書かれていて、USの新しいもの好きな人たちの間ではSvelteのシェアが高いという噂は本当だったのか…… と関心した。

hello

helloプロジェクトの構造がこんな感じです

❯ tree motoko/hello
motoko/hello
├── Makefile
├── README.md
├── dfx.json
├── package-lock.json
├── package.json
├── src
│   ├── hello
│   │   └── main.mo
│   └── hello_assets
│       ├── assets
│       │   ├── favicon.ico
│       │   ├── logo.png
│       │   ├── main.css
│       │   └── sample-asset.txt
│       └── src
│           ├── index.html
│           └── index.js
└── webpack.config.js

src/hello がバックエンドで hello_assets がフロントエンドです。

dfx build すると main.moソースコードがWasmにコンパイルされ、src/declarations/hello/ 以下にJavaScriptから読み込めるインターフェイスを吐いてくれるので、それをフロントエンドで使えます。

定義元のイメージ

actor {
    public func greet(name : Text) : async Text {
        return "Hello, " # name # "!";
    };
};

呼び出し先のコード

import { hello } from "../../declarations/hello";
const greeting = await hello.greet(name);
  1. 書いたコードがWasmになりブロックチェーンネットワーク上で動く
  2. データ永続化もネットワーク内で解決する(Canisterコード上で変数に持つ)
  3. フロントエンドは自動生成されたHTTPクライアントで対話(RPC)

この構図が理解できればEthereumなどと同様に後は一般的なWebアプリケーションと同じアーキテクチャです。作りたいものに応じてサンプルコードをgrepしていけばいいと思います。

疑問点(1): Webアプリケーションとしてのパフォーマンスについて

例えば分散型TwitterであるDistriktの個別ステータスページなんかはPageSpeed InsightsのレポートでLCP30秒ぐらいを出してるけど、はたしてこれはHTTPでブロックチェーンの奥のコードを多段呼び出ししている構造上の問題も含め早くなるんですかね? という部分が一番気になります。

ICに関わらずDappと呼ばれるものの挙動は現状そうなりがちであるけど……

あとはSPAのSSRに相当する手立ては・・? とか

GAFAの支配から逃れ、データを真に所有するためにはしかたがないんやと言われたらまぁ我慢しますけど。

疑問点(2): フロントエンドをデプロイできることの利点は?

前述のフロントエンドをデプロイする先によって制約が生じているけど、アーキテクチャ的には単にHTTP呼び出しなのでフロントエンドだけ別のインフラに乗せることも可能です。

ではその時にCanisterにすることによって得られる恩恵は? という部分。たとえばDapp開発元の手によって管理更新されているとしても、一般的には分散アーキテクチャになっているのでそれがイコール望ましい状態なのかと。

疑問点(3): どこまでが分散アーキテクチャ?

例えばMetamaskに設定したエンドポイントが繋がらなくなっても、エンドポイントBに置き換えてEthereumネットに接続してDappを利用するということはできそうなのだけど、ICでホストされたアプリケーションはic0.app/api のHTTPコールによってすべての機能が動いているように見えるのだけど ic0.app がダウンした時はどうなるの、とか。

まとめ

Internet ComputerはWasmとブロックチェーンを駆使した今時のプラットフォームで、アプリケーション(Dapp)の動作環境になることを全面に打ち出しています。

アプリケーション開発は非常に手軽で、誰でも気軽に試してみることができます。

ユーザーとしてもウォレットなしで試せるアプリケーションが多くてよいですが、分散構造に伴うUXにはまだ懸念点があります。

しかしまぁ今後5年ぐらいはまだまだこのプラットフォームも生きているだろうし、今のうちに遊んでみるのもよいのではないかと思っています。

その他の参考にした記事

qiita.com

*1:WasmでのデプロイはCloudflare Workersなんかもそうです: Introducing workerd: the Open Source Workers runtime

*2:V8/Wasmガチ勢のAndreas RossbergがMotokoを開発している(た?)らしい。

最近のDHH「サーバーレスをやめろ」

(インターネットやめろジェネレーターで作成)

Ruby on Rails生みの親であり最強の逆張りおじさんであるところのDHHが昨年あたりからしきりに脱パプリッククラウドの主張をしている。

これは彼らの会社が運用しているBasecampやHEYのインフラをAWSから自社保有のベアメタルサーバーへ移行しようとしているからで、実際に移行作業は進んでおり、今後5年間で700万ドルのサーバー費用を節約できるだろうという見込みがあるようだ。

world.hey.com

world.hey.com

あとタイトルに「サーバーレスをやめろ」と書いたけどDHHのファンボである筆者の誇張表現であり、サーバーレスというキーワードに関しての言及は正確には以下のポストを読んで欲しい。

world.hey.com

この文章における「the computing cycles」とは、一台のコンピュータが持つ計算能力全体を指します。つまり、そのコンピュータが持つCPUの処理速度と、メモリ、ストレージ、ネットワークなどのリソースを含めた、総合的な計算能力を指しています。

この文章では、サーバレスによって提供される個々の機能を必要なときに必要なだけ実行できるというメリットがある一方で、コンピュータ全体の計算能力が必要な場合には、サーバを所有することが最適であるという点を強調しています——とChatGPTが言っていました。

彼らのサービスは、他のユーザーに100万円配りはじめたりするアカウントがいるわけでもないし、週末に急遽テレビ出演が差し込まれるようなイベントもないだろうし、ただ契約した企業や個人がアクセスしてくるだけなのでクラウドが持つ弾力性をあまり必要としないという前提がありその主張も頷ける。

加えてBasecampは長い歴史を持つサービスでオンプレ環境を長年並行して運用しているはずなので、AWSから全部エイヤと移動するという話でもなくてどちらに寄せるかを検討したという文脈も加味する必要がある。

MRSKへの道

脱パプリッククラウドするぞと言っても自社サーバーでどういうインフラを構築するのかについては宣言後も試行錯誤していたみたいで、コンテナベースのデプロイにするという基本方針はあったと思うが(HEYのインフラで既にKubernetesを使ってる)、これは要はプライベートクラウド化に近いリアーキテクチャであるのでクラウドネイティブ関連の代替製品を検討したり、SUSE Rancherの高額見積りにブチ切れたりしていたらしい。

いろいろあった末「コンテナアプリケーション向けのCapistrano」の位置付けであるMRSKという自作ツールにやりたいことを落とし込むことでこれを達成するつもりらしい。流石Ruby on Rails生みの親であり最強のBig TechアンチであるところのDHHである。

そして先日このツールのリリースについてのステートメントが書かれていた。

world.hey.com

github.com

彼はプロダクトをブチ上げる時は決まってスクリーンキャスト動画を公開していて、今回も例に漏れずアップロードされていた。

www.youtube.com

(MRSKの読み方は動画によると「マスク」に近い発音のようだけど心の中でムラサキって呼んでた)

MRSKは要は「SSHしてdocker startして本番サーバー運用」が実現できるRuby製のCLIで「概念的距離の圧縮や〜(妄想的DHH理解)」と同じ考え方でできたのだと思う。

自分の知識の中だとDokkuというツールにコンセプトが似てるなと思ったけど、PaaS的なインターフェイスを意識しているDokkuと比べると、MRSKはより抽象度が低くて「サーバーとDockerがあってあとはそれを操作するだけ」というレイヤーの違いがある。

起動したコンテナへのアクセスをどうやって振り分けるのかというのもTraefikという軽量リバースプロキシに丸投げしており、Railsにおける「CoffeeScriptやImport Mapsの仕様がちょうどいいから活用」ぐらいのノリに見える。

(Traefikと各プロセスが協調する図: https://doc.traefik.io/traefik/providers/docker/ より)

※デプロイサーバーが複数ある場合は手前にロードバランサを配備する必要があって、そこも自分たちで運用する。

感想

まとめるとDHHは「クラウドに課金している費用でデカいサーバー買ってコンテナを運用した方が良い」という意見をとなえている。

自分はHotwireの感想の時と同じくBasecampに近ければ近いほど同じ戦略がフィットしそうだなと思った。

そして脱クラウドを指向して内々で実践するだけでなく、自分のソリューションをOSSに昇華して第三者が再現できる状態にまで行動をするのがDHHのカッコイイところだよなと思った。見習いたい。

2022年のインターネットをふりかえる

2022年の技術トピックをふりかえる でプログラミングその他はふりかえったので、インターネット的なこともふりかえることにした

ブログ論系

Web日記は止まるなどを投稿するとなぜかいつも週刊はてなブログ編集部に刺身☆ブーメランさん(誰)とセットで紹介されるようになってて、それはそれでありがたいことではあったんだけど、この話題に反応する人々はいつもの老人会的な面々なので、もっと若者向けを狙っていきたい弊ブログとしてはしまった、またやってしまった・・的な気持ちになっていた。

b:id:laisoを停止したのもこのままこのへんのコミュニティーの一員であり続けるのも飽きてきたなぁと思ったのであって2023年はもうちょっと変化が欲しいなと思っている。

突然最近やってる日記の書き方で三行日記をはじめてすぐやめたり。

あとは最終出社画角画像とは何かがたくさん読まれたようだけど何でこれを投稿するモチベーションが出たのか謎。なぜか六本木ヒルズ勤務を自慢するなと怒っている人が一定数居た(僕は荷物の搬入でしか訪れたことない)

オフライン

ひさしぶりに日本行ったことを書いたが自分の中の物価がバグってしまっていることに気付いてハッとした。

物価がバグるとは何かというと物を購入する時に「日本円でいくらだな→高い/安い」というフローをいつも通っているんだけど為替レートのダイナミックな変動とか日本での暮らしを忘れ過ぎて商品にたいして自分が支払う妥当な価格が分からなくなってしまっていた。

Web3

上半期ぐらいはWeb3の話題が活発で、Web3のここがすごいやWeb5について投稿していたがこの辺に注目していた人たちは今はジェネレーティブなAI技術の方面を話題にしていそうではある。

僕はマリモや4コマ漫画のNFTグッズのトークンを買ったり、ライブラリを試したりや技術記事を読んだりを相変らずしてるけどとくに便利なものっは作れそうにない。

Twitter

最近のTwitterの使い方のように癖が強めの利用法をしていたんだけど、タイムラインをごちゃごちゃにする仕事などに上がる一連の買収騒動に乗じてこれはやめるチャ〜ンスと思ったので更新しないようにした。

ただアカウント消すと社会との繋りが経たれてしまうような心配もあるのでどうしようかと考えている。

Mastodonなどの代替プラットフォームもそんなに新鮮味を感じなかったので、今後どうなるのか注目している。

最近読んで意外に良かった本(1)『なぜ、あなたの仕事は終わらないのか スピードは最強の武器である』メタバース本3連発『テクノロジーが予測する未来』あたりをピックアップしたが他にもたぶん100冊ぐらいはノンフィクションの本を読んでいて、Android端末でのオーディオブック環境がたいへん役にたった。

感想を書いてない中で特に気にいっているのはジェームズ・クリアー式 複利で伸びる1つの習慣という本で内容は忘れてしまったけど習慣をどうやってコントロールするかみたいなライフハックとか自己啓発書めいた本だったと思う。

動画

中田敦彦のYouTube大学チャンネルについてはメインチャンネルはあまりチェックしてなくてトークチャンネルの方がおもしろいと思う。ポットキャスト的に倍速にして音声だけで聴いてる。

STREET FIGHTER Vの競技シーンもシーズン3のCAPCOM Pro Tourぐらいからチェックしていて(同じゲーセンに来てた人たちが出てくるから)、格ゲーチェッカーに出てくるような大会は全部見てる。EVO 2022覇者のカワノ選手のサイン入りTシャツをなぜか持ってる。2月にあるであろうEndingWalkerと日本のプレイヤーの対決が楽しみ。

YouTubeのリコメンドにはVTuberとゲーム実況、SFV、ビジネス系動画あたりがよく出てきて釣りサムネ切り抜き動画っぽいチャンネルは推薦オフになるように整理してる。

漫画

Kindleで200冊ぐらいは購入した気がする。ラインナップをみたらおまえらみんなタイムリープしてるな的な面子だった。これがゲーム的リアリズムよ(知らん)。

年末に東京卍リベンジャーズ(1) (週刊少年マガジンコミックス)を一気読みして、ヤンキー漫画のぶっ殺すには、「転倒させ立ち上がれなくする」「暴行して意識をなくす」「刺殺・銃殺」ぐらいの3段階ぐらいの死の概念があるな、というようなことをのんびり思っていた。

アニメ

オッドタクシーを楽しく観た。

ゲーム

十三機兵防衛圏 - SwitchEVE ghost enemies - Switch大逆転裁判1&2 -成歩堂龍ノ介の冒險と覺悟-をプレイした。

あとMacでできるSteamのゲームとしてVampire SurvivorsRust(所有権システムとかがない方)で遊んだ。

ソフトウェアと金

OSSへの寄付の月予算を$10にしたはそのまま続けた。来期はもっと増やしてもいいと思いはじめているけど、AquaSKK並に依存度の高そうなプロジェクトは今のところないのでそれなら時間を使ってAquaSKKをメンテナンスできる方が健全かなと思いはじめている。

Swiftがこの先生きのこるにはで示したようにiOSが廃れてしまったらmacOSを常用することはなくなってLinuxデスクトップに移行するんだけど、10年ぐらいはなさそうだし……

AquaSKKは一生依存しそうな一方、serverless-nextjsは最近は使ってない(各種PaaSがホスティングをしてくれるようになってきたので)。

Wear OSアプリ開発入門

まわりで流行っていたので Xiaomi Mi Smart Bandを購入して、3年ぐらい付けていて「腕に時計があると正確な時間が分かって便利なのでは????」ということに気付いたのだけど、そうなると次は自分で自由に機能をカスタマイズしたくなりスマートウォッチ的なものが欲しくなってきたのでGalaxy Watch5を買った。

Galaxy Watch5もしばらく使っていて、腕でモバイルOSが動いているとプログラムが動かせて便利なのではということが段々分かってきたのでこれからWear OS互換のスマートウォッチ向けのAndroidアプリ開発をはじめたい人への案内の記事を書くことにした。

バイスを選ぶ

スマートウォッチは色々なメーカーから出ていて選ぶのが大変なんだけど「自作Androidアプリが動く」の条件だと現実的にはWear OS 3系を搭載したSamsungのGalaxy WatchGoogleのPixel Watchぐらいしか選択肢はないと思っていて(情勢の伺える記事:2022年を振り返る。スマートウォッチ編)、自分の場合はPixel Watchが近場で売ってなかったのでGalaxy Watchにした。

Watch Faceを作る

Watch FaceというのはOSでいうデスクトップ環境の部分で、プログラムを作成して細かくカスタマイズ可能になっている。

簡易的なものはSamsungが提供しているWatch Face StudioをPCにインストールすると作成できる(Googleデベロッパーサイドにもsamsung.comからダウンロードせよと書かれている)*1

内部的には独立したAndroidアプリになっていてコードで記述することもでき、androidx.wear.watchface.Rendererをオーバライドして画面の描画命令を作っていく。

以下にサンプルレポジトリがある。

https://github.com/android/wear-os-samples/blob/main/WatchFaceKotlin/app/src/main/java/com/example/android/wearable/alpha/

Jetpack Composeでアプリを作る

Wear OS向けのマテリアルコンポーネントが用意されていて、Android Studioで開始できる。

developer.android.com

前述のリポジトリにもいくつかComposeのサンプルがある。

https://github.com/android/wear-os-samples

デバッグ環境を用意する

エミュレータと実機でデバッグできる。基本はエミュレータで開発し、実機でしか動作確認できないセンサー系のE2Eは実機を開発者モードに変更してやってる。

developer.android.com

エミュレータを使った開発風景。これは転倒を検知するイベントがGalaxy Watch5に備わっていてそれを使った機能をComposeで書いてる。

Viewを使ったサンプルコードが以下にある(動作確認のために実際に転倒しろと書いてある・・)

developer.samsung.com

Health Connect

Health ConnectはAndroidが提供するヘルスケアデータのハブとなるプラットフォームのことで、これを使うことでWatchで収集したデータを自分のアプリで活用できる。

developer.android.com

たとえばGalaxy Watchで収集したデータをGoogle Fitで集計して可視化したり、逆にサードパーティのアプリで入力したデータを自分のアプリで読み込むなどができる。

動作端末(Android)に以下のサービスを入れておく必要がある。

play.google.com

アプリのサンプルが例によってGitHubにある。

https://github.com/android/health-samples/

Health ConnectAndroid Phone向けの連携アプリで、Health ServicesWatch向けのComposabらないViewのプロジェクトで、Health Platformが歴史的経緯以下略みたいなやつ。

自分はWatch向けのアプリを書きたいのでHealth Servicesを参考にした。

コラム: 脱スマートフォン

スマートフォンを所持せずWatch単独でどこまでできそうかをここ最近試行錯誤していたが

ぐらいは余裕でこなせそうで、「移動時にスマートフォンタブレットを持ち運ばずにWatchのみで過す」という生活はすでに実現できそうだった。

今回買ったGalaxy Watch5はWi-Fi版にしたので単独で通信できないのだけど、次に何か入手する時はセルラー対応版にして、スマホを捨てて生活してみようと思う。

制約としてはディスプレイの小ささと入力系操作の貧しさがあるので、音声入出力とかUIで工夫しないといけなさそうではある。

*1:OSが合体したり色々あった https://business.nikkei.com/atcl/gen/19/00297/053100015/

2022年の技術トピックをふりかえる

それはベンツなんよ

総括

今年はコードをよく読むようにした。

技術的にはひき続きPaaSやクロスプラットフォームの動向に注目した。

デファクトの移り変わりを感じるので来年以降はGoやGraphQLに手を出していきたい。

去年のエントリ: 2021年に作ったモノや技術をふりかえる

今年やったこと

コード読み

去年はコードを書くことに注力していたので今年は一転コードを読んでいた。

プログラム雑談ポッドキャストを聞いていて「コード読み」っていう言葉がよく出てくるので聞きながらそういえば自分もこの分野が好きだなと思い出したので意識してやることにした。

丁度、最新技術のトレンドだけ俯瞰しているのに学びを感じなくなってきたのでより潜りたい気持ちがあったのでそれを満せたと思う。

IntelliJ IDEAで全言語のプログラミング環境が楽に揃っているのが心強い(Samuraismさんありがとう)。

読んだ成果はメモして主にzennに投稿している。

zenn.dev

ソースコードを読んでると「これってどうやるんだろう?」という時の具体的な語彙が増えていくのでリポジトリを検索してGitHub IssuesやDiscussionsに辿り付くことが多くなった。

そういう時に特定のGitHub Issues単位で更新を購読しておくと、コメントが付いた時にメールを受信するので、新機能の実装などの時にリリースされる前に一早く気付いてテストすることができるようになった。

最初にテストするので問題の発見も早くなるし、開発したばかりなので開発者が議論に参加している可能性も高くて良い。

Platform as a Service(PaaS)

Vercel Build Output

mozaic.fm(ep110 Yearly Ecosystem 2022)でも同じ話があったけど今年はPaaS各社が次々に独自のNext.jsアプリケーションのホスティングに対応しはじめた。

zenn.dev

zenn.dev

zenn.dev

これを実現しているのがVercelのBuild Output API (v3)で、どういうことかというとBuild Output APIでNext.jsのウェブアプリケーションをVercelにデプロイする時の中間ファイル形式が定まって公開されたので、それに従って各社が変換されたファイルをデプロイして動くように接続するっていうことがやりやすくなった。ということだと思う。

これはNext.jsに限ったことではなく、Nuxtでも応用されてVercel上でISRが動くような計画がされていた。

zenn.dev

さらにこの仕組みはVercelの中でホストされているAWS Lambdaを経由したランタイムのハックにも使うことができて、自分はSwiftやRailsを動かして遊んでいた(今ならWasmのがいいかも)

zenn.dev

zenn.dev

(ちなみに遊び過ぎてまたBANされてる)

Cloudflare Workers

2022年はCloudflare Workers周りに怒涛のアップデートがあって連日ひくぐらい新機能が発表されていた。

VercelがフロントエンドのAWSとたまに言われていたりするがCloudflareは直球にAWSと同じ領域にサービスをどんどん展開してきている。

サービスの中核にあるのはService bindingsというやつで、これを使っていい感じにサーバレスアーキテクチャやってくれということらしい。

zenn.dev

直近の関心事としてはtcpクライアントのAPIで、これがあるとHTTP経由でDBを呼び出すしかなかった部分がネイティブドライバーやORMを使えるように変わるので注目している。

zenn.dev

一方Deno Deployは既にTCPアウトバウンドに対応しているらしい(?)

deno.com

ただORMのPrismaはネイティブドライバーにはまだ対応していなかった。

zenn.dev

Web Standard APIs

Cloudflare WorkersやFastly Compute@EdgeのようにブラウザのWeb Standard APIsに近い環境のJavaScript実行環境を提供するPaaSがいくつか出てきて、それらはCDNのEdgeサーバーで動かすことを想定されているんだけど、ここでアプリケーションも動かしてしまう。という方向に発展してきた。

laiso.hatenablog.com

Deno DeployやバックエンドがCloudflare WorkersらしいVercelのEdge Functionsのこのカテゴリに入れていいかもしれない。

これからコンテナ仮想化技術になぞらえてJavaScript Containersと呼んでいくらしい。

laiso.hatenablog.jp

今まで「重い処理やライブラリをNode.jsのSSR側に逃がしてフロントエンドを高速化」という発想でいたので、逆にサーバー側も切り詰めないといけなくなって最初は戸惑った。

この流れにうまく乗ってWeb APIsファーストなアプリケーションフレームワークにしたのがRemixHonoでどんどん勢力を延していっている。

laiso.hatenablog.jp

BunではWeb Standardが使えるが、 逆に言えば、それら以外にWebアプリを作る手段がない。 つまり、Expressが動かないのだ。 これが重要なキーになる。 https://yusukebe.com/posts/2022/how-i-got-2k-stars/

初期のGoogle App Engineの時のように、一見不自由に制限された環境の中で新しいものができていく感じがわくわくする。

Bunについては気になったのでコミットログからソースコードを読んでいた。最初の方のドキュメントにはesbuildをzigで書き直すプロジェクトだったということが書かれていた。

自分はなんでここからNext.jsのサーバーが立ち上がるんだ、という部分が気になったので以下を調べていた。

zenn.dev

安データベースを求めて

昨年と同様に最小限のFirestoreとAlgoliaを使ってFirebaseは難しいと思いながらツール開発をしていたが、個人開発のコストはDB次第を投稿してからはSQLite系の活用に関心を持った。

LitestreamをCloud RunやVPSで動かしてみたり。fly.ioのディスク上やCloud Storage FUSEに直接置いてみたり。

辿りついた先が発展的バージョンのLiteFSで、これからはLiteFSを中心にバックエンドを開発していこうかなーと計画している。

zenn.dev

zenn.dev

その他にはAlgoliaのかわりにGoogle Driveを使って全文検索する仕組みを構築してる。

zenn.dev

ただ同時に、安さを求めて調査のためにクラウドサービスにバンバン課金しているので本末転倒感はある。

クロスプラットフォームなアプリケーションフレームワーク

ハイブリッド(WebView)アプリのアーキテクチャを考えていて、Ionic Portalを見つけたのであらためてハイブリッドアプリの意義を考えていた。

laiso.hatenablog.com

その結果一番必要なのはネィティブアプリのオンラインアップデートだなと思ったのでローカルWebViweアプリであるIonic Portalは使わなかった。

今のところオンラインアップデートを第一に考えるならExpoのEAS Updateに乗るのがベターそうではある。

WebView関連ではTauriのモバイル対応にも注目した。Tauri on mobile 現状確認会時点では本当に実現できるか怪しいと思っていたが半年後に完成させてきて驚いた。

zenn.dev

一方Hotwire Stradaはあれから音沙汰がない。こっちはこっちで厳しそうだがHEY Emailアプリは順調にアップデートしているしいつかリリースされるのかも。

laiso.hatenablog.com

新世代MPAs(Multiple-page applications)

AstroQwikのこと。

最初にIsland Architectureというキーワードを知ってそこから今までとは違う文脈でMPAが使われだしていたので気になって調べていた。

前MPAsは「SPAじゃないもの=PHPRailsのテンプレートエンジンを使ってサーバー側でHTMLを描画するもの」という意味で読んでいたがどうやらSPA→SSR→SSG→Jamstack→MPAと合流してきたらしい。

つまりSPAのJavaScriptアプリケーションをページごとに分解して生成、動的なCSRをIsland ArchitectureのようなHydrationが別途加わるので完全な静的サイトではなく動的なアプリケーションにもなる。

しかしこういうHydration戦略の他にもReactのSSR StreamingがありNext.jsのRSCがあり、HydrogenLiveViewシリーズやBlazorのようなWasmナニカを含めたら画面を作る技術の大渋滞がすごい・・

しかもWebフロントエンドのアーキテクチャって最近はどんどんモバイルアプリ系にも影響を与えてくるのが常なので、そのうちServer-Driven UIのようなシステムと合体してモバイルアプリもストリーミングレスポンスで画面全体を組み立てるようなアーキテクチャが普通になったりして……

PHPエンジニア業

閑話休題、趣味開発で最新技術がたくさん出てくるのは普段の仕事で使っているのが退屈な技術が中心であることの反動というのがあって、退屈な技術というのは悪い意味でもなくてBoring Technologyエッセイに出てくるような意味で、要は技術の種類より重視する問題があるということ(人手不足、とか)。フレームワーク乗り換える必要なしの考えにも通ずる。

boringtechnology.club

で退屈な技術筆頭であるLaravelアプリケーションを今年も書いていた。

今年は一緒に開発していたチームメイトがユニットテストのDB接続を全部スタブ定義するタイプのエンジニアで、Mocks Aren't Stubsなどを上げつつ改宗を促していたんだけど、まぁ自分の方が間違っている可能性もあるよな〜と思いしばらくモック多用スタイルで書いていた。

1年書いた感想としては、やはりモック多用は私たちに向いていなかったと思う。なぜならスクラッチからプロトタイピングしながら開発しているプロジェクトなので常にカバレッジが低くて、そこにモックによってテスト対象の粒度が細かくなったことによってモックテストを書いてあるが結合した結果は検証できてなくて、テストはパスするが動かないという場面によく立ち合って直していた。

モックは控えめに。

システムエンジニア

PHPエンジニア業の傍ら今年はよく要件定義や基本設計だけやって後は開発ラインに流すためにドキュメント書く、みたいな言わゆるSWEじゃなくてシステムエンジニア(SE)っぽいこともよくやっていた。

ドキュメント書いているうちに自分で実装できちゃうよな〜と思いながら形式的にこなしていたけど、なかなか思ったより難しくて苦労した。

何がそんなに難しく思うんだろうと考えていたんだけど、コードを書くことで業務知識の理解を担保していたんだなという部分だけスッポリ抜けている感じがして、あーはいはい、ここの仕様は分かりますが、よく分からん。コード読むか。みたいな虚無っぽいフローになっていた(自分でドキュメント書いてるのに)。

なのでSIerでこの辺の業務をソツなくこなせている人は優秀だったんだなという感想を持った。

シーケンス図やフローチャート書く時にMermaidを使ったがこれはVSCodeでコーディングできるのが快適だった。

laiso on Speaker Deckなどを見ても分かるとうり自分はプレゼン資料作りとか図解が苦手で、あまり満足のいくものが作れたことがない。

これは思考をテキスト=散文からスタートして、その後に構造化して、すべてが完了してから意図が伝わるよう図を付け加える。というやり方がうまくいっていない気がしていてて、最初からイメージで捉えて物事を考えたいなぁというのが現在のところ。

最近、なんでも図解という本を読んでいるんだけど、これぐらいのシンプルなルールなら真似しやすいのでやってみる。

インフラエンジニア業

ソースコードを書くなど単純な作業は外部に委託するなど柔軟な対応 をしているので、そのぶん保守系の開発やインハウスなAWSリソース管理などを重点的にやっていた。

今年の大きなテーマは2019年に構築したEKSクラスタのNodeを新バージョンに総入れ替えするついでにEC2インスタンスをEKSマネージドなNode Groupに移行するというものだったけど無事無事故で完遂できた。

最初の構築時にシステム基盤をECSかEKSかにするかをかなり迷ったけど、10個ぐらいの御互いに呼び出し合うアプリケーションを一人で管理しないといけないから、システム境界を曖昧なままにして必要であればEC2インスタンスやコンテナにシェルで入って泥くさい対応もできるようにする必要があったのでEKSにして良かった。

ただの偶然だけどJason Warnerが言ってた「まずAppsに分けろ」の方針になっていた。

来年やりたいこと

Go言語でWeb開発

「スタートアップの開発に参加するならgolang履修必須」程度に身の回りのプロジェクトで使われているぐらいに偏ってきたのでGoでひととうりのバックエンド書いて運用したい。

自分はちょうど10年前ぐらいにこの動機で片手間にRailsアプリの保守ができるようになった。

あとGraphQLも導入したい。

実践的なWebフロントエンド開発

自分は本業はテンプレートjQueryを使った管理画面エンジニアリングしかしていなく、SPA以降のアーキテクチャは趣味で書いたり学習していたりするだけなので実践的なスキルはあんまりない

Web Speed Hackathon 2022 を勝手に開催するをやっていたら専業フロントエンドエンジニアはこういう最適化をしているのね……と大変さが分かった。

これを業務でやるならもっと経験を積みたいなと思ったので来年は大きめのアプリケーションを作ってみたい。

モバイルアプリ開発の学び直し

モバイルアプリ開発はキャリアの半分をiOSエンジニアとして過ごしたので自分の中ではやればできる枠=後回しになっていたがもう数年も経つし「昔開発していたらしいマネージャー」ぐらいの感覚になっていて今の一線の開発現場に入るには学び直しが必要かなと思っている。

Androidアプリ開発も既存のソースコードちょろちょろいじるぐらいなら余裕だけど、ベストプラティクスを自分で考えたりするぐらいの余裕はない。

いい機会なのでJetpack Compose, SwiftUIの世代からまた入門したい

データ分析、統計処理、機械学習

学習意欲はあるはずがやりたいことと関心が結びつかないのであまりモチベーションが高くない状態。

数理系の基礎教養が不足していて理論に関心を持てない要因かもしれない。

最近活発なAI系サービスやツールも使ってみる、ぐらいのところから始めてみたい。

『世界で一番ゴッホを描いた男』とプログラマー

深センの大芬という街でゴッホの複製画を20年に渡り描く趙小勇という職人の男性に密着したドキュメンタリー(原題はChina’s van Goghs)。

215. 見てない映画を紹介します | Ossan.fm で知ってウォッチリストの中にあったので消化した。

身に覚えのあるクリエイターに打ち所悪く刺さる蟹工船的な作品、ぐらいの予備知識しかなかったが、実際に観てみると、なんとなく想像していたよりもはるかに面白かった。

プログラマーにも刺さると思う。

engineerとdeveloperでレスバが始まるやつじゃん

趙小勇は20年という長い期間ゴッホの複製画を描いて生計を立てている。複製画はオランダのアムステルダムなどのヨーロッパ方面に納品され販売されているらしい。

この仕事が儲かり、金になるからやっているというわけではなく、ゴッホの絵を描くことが好きだからやっている。

むしろ低賃金で全然金にならなく過労働なので職人は減っている。工房には趙小勇と同じく志しを持った絵描きたちが集まり日夜ゴッホを書いている。趙小勇の妻も同じ工房の職人。

さながら大規模システム開発現場の末端組織のSEのようである(本作内の複製画の商流に多重請負のような構造があるわけではない)。

趙小勇はキャリアが長いので後輩や弟子を指導する立場もある。成果物の品質を自身でチェックし改善したり、自分の望む技術に進んでよいのかとキャリアに悩む若手に助言をしたりとシニア的な振舞いもしている。

みんなの士気を高めるためにゴッホの映画上映会を開催したりする。TGIFに『ソーシャル・ネットワーク』再生するEMじゃん。

一方自分のキャリアにもかなり悩んでいて、このまま複製画を描き続ける人生でいいのかと日々自問自答している。

ゴッホの原画を自分の目で見ることでその答えがわかると考えた趙小勇は貧しい生活の中、大金をはたいてアムステルダムゴッホ美術館を行くことを決意した。

たぶんシリコンバレー行くぞみたいな心境だと思う。

出発前にパスポート手続きに帰郷し、親戚たちと過した後昔のことを思い出したのか趙小勇はカメラに向って自身に学歴がない=貧しくて学校へ通えなかったことを語る。

自分もCS学ばず高卒でプログラマーやっている立場なので分かるで〜と思いながら聞いていた。

そしてゴッホ美術館に出向く場面はこの作品の一番の見所であるんだけど、映像でしか表現できてなさそうなものを文字で説明するのは無粋なのでここは見てほしい。

僕が注目したのはアムステルダムで自分の複製画が納品先で実際に販売されているのを見た時の趙小勇の反応。自分の作品が市場でどのような価値を持っているものとして扱われているのか、というのを彼が期待していたものとギャップがあったようだ。

20年越しにそれが分かるというのもなんともせつない。

帰国した趙小勇はオリジナル作品の制作に乗り出すんだけど、この辺も見てて「代表的プロダクト」を残したい個人開発者の心理をついてるなーと思った。

kentarokuribayashi.com

ハッカーと画家」という有名なエッセイにハッカープログラマー含む)と画家は似ているという話が出てくる。

practical-scheme.net

本作品になぞらえると、意図せずして大企業に搾取されている形になってしまうOSSメンテナーの問題などにも通じるだろうか。