Slide 1

Slide 1 text

/FPGFUDIϥΠΫͳ ࣗݾ঺հπʔϧͷ ZVZVGFUDIΛ࡞ͬͨ ゆゆ君(@Hyuyu_kun) in あくあたん工房 2022/11/25

Slide 2

Slide 2 text

とつぜんですが 2

Slide 3

Slide 3 text

自己紹介どうやってますか 3

Slide 4

Slide 4 text

LTなら1枚スライドを挟めばいいですが 4

Slide 5

Slide 5 text

5

Slide 6

Slide 6 text

名刺を渡す 6

Slide 7

Slide 7 text

自分のホームページを見せる 7

Slide 8

Slide 8 text

僕は 8

Slide 9

Slide 9 text

バイナリを渡します 9

Slide 10

Slide 10 text

デモします 10

Slide 11

Slide 11 text

yuyufetch 11 n GitHub • https://github.com/Hiroya-W/yuyufetch n 使い方 • インストールして • $ go install github.com/Hiroya- W/yuyufetch/cmd/yuyufetch@latest • 実行 • $ yuyufetch n きっかけ • Twitterでやっている人を見て作りたくなって作った

Slide 12

Slide 12 text

yuyufetch 12 n 好きポイント n Shell: Japanese n Uptime: 199244h1m0s

Slide 13

Slide 13 text

Neofetch 13 n システム情報を表示するツール n GitHub • https://github.com/dylanaraps/neofetch • 1つのBashスクリプトで書かれている n パソコン何使っているん?って 聞かれたら、とりあえずこれ見て って言えばOK

Slide 14

Slide 14 text

(余談) NiTch 14 n 他にも同じようなツールはある (の1例) n GitHub • https://github.com/unxsh/nitch • Nimを使って書かれている • Neofetch同様カスタマイズが可能

Slide 15

Slide 15 text

jp2a: JPEG/PNG to ASCII converter 15 n 画像をAAに変換するツール n GitHub • https://github.com/Talinx/jp2a • JPEGだけじゃなくてPNGにも対応している

Slide 16

Slide 16 text

jp2aの使い方 n ソースビルドするかDockerを使う方法(Dockerが楽だと思う) • $ docker run -t --rm -e COLORTERM="$COLORTERM" -v "$(pwd)":/app talinx/jp2a n オプション • --colors • 色付きで出力する。 • --size=WxH • 出力サイズ(幅は1文字が半角なのでW=2Hにするといい感じ)。 • --chars=… • AAに使う文字の組み合わせ。左側が黒に近い色、右側が白に近い色で使う。 • --background=dark, --background=light • 文字色の色味が変わる。背景色が暗いか明るいかで使い分けると良いと思う。 16

Slide 17

Slide 17 text

自動生成出来るようにしたいなと思ったり 17

Slide 18

Slide 18 text

自動生成出来るようにしたいなと思ったり 18 Neofetchはテキスト埋め込んでいるので別にいいかと思ったり

Slide 19

Slide 19 text

GoのCLIツールのリポジトリ構成(バイナリ配布) ! . ├── & bin │ └── , yuyufetch ├── 4 go.mod ├── 9 lib │ ├── ; informations.go # package yuyufetch │ ├── ; version.go # package yuyufetch │ └── ; yuyufetch.go # package yuyufetch ├── , LICENSE ├── ; main.go # package main ├── I Makefile └── K README.md 19

Slide 20

Slide 20 text

GoのCLIツールのリポジトリ構成(ライブラリ配布) ! . ├── & bin │ └── , yuyufetch ├── ! cmd │ └── ! yuyufetch │ └── 6 main.go # package main ├── = go.mod ├── 6 informations.go # package yuyufetch ├── , LICENSE ├── F Makefile ├── I README.md ├── 6 version.go # package yuyufetch └── 6 yuyufetch.go # package yuyufetch 20

Slide 21

Slide 21 text

CLI構造体で出力先と入力元を制御 21 // 定義 type CLI struct { Stdout io.Writer Stderr io.Writer Stdin io.Reader } func (cli *CLI) Run(args []string) error { // something } // メインプログラムで使う時 cli := &mytool.CLI{ Stdout: os.Stdout, Stderr: os.Stderr, Stdin: os.Stdin, } fmt.Fprintln(cli.Stdout, ”Hello") // テストで使う時 s := “-input=hoge –output=fuga” input := “piyo” want := “correct” var got bytes.Buffer cli := &mytool.CLI{ // 置き換える Stdout: &got, Stderr: &got, Stdin: strings.NewReader(input), } args := strings.Split(s, " ") err := cli.Run(args) if got := got.String(); got != want { fmt.Printfln("want %q, but got %q", want, got) }

Slide 22

Slide 22 text

flagパッケージ: CLIのオプションを作る 22 var showVersion bool fs := flag.NewFlagSet(args[0], flag.ContinueOnError) fs.BoolVar(&showVersion, "v", false, "show version") fs.BoolVar(&showVersion, "version", false, "show version") fs.Usage = func() { fmt.Printf("yuyufetch %s¥n¥n", version) fmt.Printf("Usage:¥n %s [Options]¥n¥n", "yuyufetch") fmt.Println("Options:") fs.PrintDefaults() fmt.Println("") } if err := fs.Parse(args[1:]); err != nil { return err } if showVersion { fmt.Fprintln(cli.Stdout, "yuyufetch", version) return nil }

Slide 23

Slide 23 text

ロゴの埋め込み 23 n jp2aの出力をそのままベタ書き… n エスケープシーケンスの扱い • ヒアドキュメント(``で囲む文字列)は、そのまま 表示される • ¥nや¥tは、改行やタブにならずそのまま • jp2aの出力をコピペした場合は、見えない文字で 挿入されている • エスケープコードを ¥x1b と書く場合は “” で 囲む文字列として書く

Slide 24

Slide 24 text

やりたいこと n このロゴを埋め込んでいるところをなんとかしたい • 自動生成したい n ターミナルサイズに応じてサイズ調整 • 文字列の折返しをしないようにして、ロゴが崩れないように n 色付け部分 • エスケープシーケンスをくっつけた文字列を生成する関数? 24

Slide 25

Slide 25 text

yuyufetchを作った話でした 25

Slide 26

Slide 26 text

ありがとうございました

Slide 27

Slide 27 text

参考文献 n みんなのGo言語 現場で使える実践テクニック n Hiroya-W/yuyufetch • https://github.com/Hiroya-W/yuyufetch n Goで書くテスタブルなCLIツールの作り方 • https://gihyo.jp/article/2022/11/tsukinami-go-03 27