プログラミング
Show HN: Shirei、ネイティブGoのクロスプラットフォームGUIフレームワーク
Show HN: Shirei, cross-platform GUI framework in native Go (github.com)
要約
Shireiは、Go言語でUIを記述できるクロスプラットフォームGUIフレームワークです。HTMLやJavaScriptは不要で、macOS、Windows、Linuxで同一の外観を持つプログラムを生成できます。特に、依存関係なしで自己完結型のGUIプログラムをLinuxで作成する最も簡単な方法を提供します。Immediate mode APIを採用しており、UIウィジェットの状態管理を不要にします。
全文翻訳
Shirei
Shireiは、Go言語のためのクロスプラットフォームGUIフレームワークです。HTMLやJavaScriptではなく、GoでUIを記述できます。真にクロスプラットフォーム: 同じコードベースで、macOS、Windows、Linuxで同一の外観を持つプログラムが生成されます。また、依存関係を必要としない、Linux向けの自己完結型GUIプログラムを生成する最も簡単な方法でもあります。
※「Shirei」は「Simple Layout」の日本語発音に由来しています: シンプル・レイアウト → シレイ
動機
GUIアプリケーションをプログラミングする上で、Immediate mode APIが唯一の賢明な方法であることは経験上明らかです。残念ながら、うまく機能する良いライブラリやフレームワークがありません。一部は独自のバックエンドを実装する必要があり、一部はまともなクロスプラットフォーム対応がなく、一部は非ラテン文字のテキストを適切にサポートしていません。
「Immediate mode」にとって重要なのは何でしょうか?UIが毎フレームすべてをレンダリングすることでしょうか?いいえ。それは、データのみ(または主に)に基づいて、毎フレームどのように見えるべきかを記述することによってUIを構築することです。これがReactが成功した理由です。UIウィジェットを自分で管理したり、更新するためにその状態を追跡したりする必要はありません。ただ「この時点では、ここにボタンが欲しい。そして、そのラベルはこう表示したい。クリックされたら、これを実行したい」と言うだけです。このボタンは以前に存在しましたか?不要になったとき、それに何が起こりますか?これらの質問に答える必要はありません。これがReactの最も良い点であり、「Immediate mode」とはまさにこれです。「描画」することを可能にするAPIであっても、あなたが「描画」したすべての「もの」の状態を管理する責任があるのは良くありません。
特徴:
ネイティブ: Webページではなく、実際の実行可能プログラムです。典型的なバイナリサイズは約10MBです。
真の意味でのImmediate mode API: UIウィジェットを管理したり、データをウィジェットの状態と同期したりする必要は決してありません。
すぐに使える: レイアウトエンジンだけでなく、ボイラープレートなしですぐに使い始められる本格的なフレームワークです。
国際テキストの完全サポート: 複雑なシェーピング、双方向レイアウト、システムフォントへのアクセス、東アジア言語向けのIMEサポート(入力メソッドエディタ)。
柔軟なレイアウトとスタイリング: Webの良い点の一つは、UIの配置方法に多くの柔軟性があることです。標準的なウィジェットやコンテナのセットに限定されません。自分で作成できます。
人間とAIエージェントの両方にとって、学習しやすいAPIです。もし、作りたい小さなプログラムのアイデアがあり、時間がない場合は、最新のAIエンジンに shirei を使って作成するように依頼してみてください。驚くほどうまく使えることに気づくでしょう。
examples/の下にいくつかのサンプルプログラムがあります。一つだけ見るならhaystackから始めてください。
始め方
新しいフォルダにmain.goに以下をコピーしてください:
package main
import (
"fmt"
app "go.hasen.dev/shirei/app"
. "go.hasen.dev/shirei"
. "go.hasen.dev/shirei/widgets"
)
func main() {
app.SetupWindow("My App", 300, 100)
app.Run(RootView)
}
var count int
func RootView() {
Container(Attrs(Viewport, Background(220, 10, 97, 1)), func() {
Container(Attrs(Row, CrossMid, Pad(20), Gap(10)), func() {
Label(fmt.Sprintf("Counter: %d", count))
if Button(SymIPlus, "Increment") {
count++
}
})
})
}
その後、以下を入力します:
$ go mod init main
$ go mod tidy
$ go run .
学習
チュートリアル
オーディオ
コンテナ
ID
ドラッグアンドドロップ