generated at
Webでシェルを実行するwebshを作った
発表者 次郎
デザイン新しくした (追記 2020/2/1)
初期UI

目次
自己紹介
webshとは
デモ
作った経緯
開発の話
今後の課題
まとめ

自己紹介
サーバサイドエンジニア (Go)
最近は家でも仕事でもCIで自動化フロー組んだりしている
GoNimでCLIツールを作ったりするのが趣味

webshとは
ブラウザからシェルが実行できるWebアプリ
シェル芸botDockerイメージを利用してる
#シェル芸 でツイートする前の検証ができる

デモ
正弦波泳法.sh
muscular shout 正弦波泳法 -p front-relax|tee >(cat) >(cat) >(cat) >(cat)|tee >(cat) >(cat) >(cat) >(cat)|awk '{PI=4*atan2(1,1);for(i=0;i<(sin(NR/25*PI*2)+1)*5;i++){printf " "}{print $0}}'|textimg -asl25 -d5

ちょっとまて
SGWebがあるでしょ
はい
何だこのやる気のない画面は
フロントエンド何もわからないので勘弁して

作った経緯
SGWebは最新のシェル芸botに追従してなかった
あとNimWebアプリを作って運用したかった
これが一番大きい

開発の話
長くならないように努めます
長くならないとは言っていない

システム構成
こんなかんじ
貧乏なのでサーバ1台で運用してる
初めはAWSを考えてた
高い

開発言語
nim Nimを使ってる
フロントエンドもバックエンドもNim
フロントエンドSPAフレームワーク: pragmagic/karax
Webフレームワーク: dom96/jester
インフラはAnsibleで管理

Nimって何
> 構文はPythonライクで、静的型付け言語であり、コンパイルすることでC、JS、ObjectC、C++のコードを出力することができる言語
ネイティブコードを吐ける
超高速
競合はGo, Rust
2019年9月に 1.0.0 がリリースされた最近の言語 (12年目)
ちなみにGoは10年目
このあたりの記事で雰囲気が伝わる
今年のアドベントカレンダー

とりあえずNim触ってみてほしい
スイスイ書けて楽しいよ
とりあえず unko.tower を実装してみたので動かしてみて
Nim Playgroundでコードを試しに動かせる
nim
import strutils proc unkoTower(n: int): string = var rows: seq[string] # 先端の追加 let topPad = " ".repeat(n+2) rows.add(topPad & "人") # うんこの段を追加 for i in 1..n: let pad = " ".repeat(n - i + 1) let row = "(" & " ".repeat(i * 2 + 1) & ")" rows.add(pad & row) # 結合して返却 return rows.join("\n") echo unkoTower(3)

しれっとNim製のコマンドがいくつかいる
僕がいれた
rect 矩形を切り取ったり貼り付けたりするコマンド
$ unko.shout | rect crop -x 10 -y 5 -W 6 -H 10
>
edens 独自の辞書を使用して文字列をエンコーディングする
$ edens kakikokera <<< かきとこけら
> 杮杮杮柿柿柿杮杮杮柿柿柿柿柿柿杮杮柿柿柿杮柿杮杮杮杮杮柿柿柿杮杮杮柿柿柿柿柿柿杮杮柿柿柿杮杮柿杮杮杮杮柿柿柿杮杮杮柿柿柿柿柿柿杮杮柿杮柿杮柿柿柿杮杮杮柿柿柿杮杮杮柿柿柿柿柿柿杮杮柿柿杮柿柿杮杮杮杮杮柿柿柿杮杮杮柿柿柿柿柿柿杮杮柿柿杮柿柿柿杮杮杮杮柿柿柿杮杮杮柿柿柿柿柿杮柿杮柿柿柿杮柿柿杮
$ edens unko <<< かきとこけら
> ウンウこうんこんウウンウこうんこんコウンウこうんこコうウンウこうんここウウンウこうんここんウンウこうここんん
maze ランダムに迷路を生成するコマンド
$ maze -H:21
text
####################################### # # # # # # # # # ### ####### ### # # ### # ##### ####### # # # # # # # # ################### # ##### ####### # # # # # # # # ### ##### # ####### # # ### ####### # # # # # # # # # # # # # # # # # # ### # # # # # ### # ##### ####### # # # # # # # # # # # ### # ##### ##### # ### # ##### ####### # # # ### ################# ######### # # ### # # # # # # # # # # # # ##### ########### ##### # # # # ### ### # # # # # # # # # # # # # # # # # # # # ### # # # # # # # # # # # # # # # # # # ### #######################################

今後の課題
UI周り
フロントエンド何も分からない
パフォーマンス
2コアじゃ詰まりすぎる
札束で殴れ
バグ
シェルのパイプの最初のコマンドでファイルを開くと固まる
なんで起きるのかわからん
セキュリティ対策
インフラは非公開にしてるので僕がやるしかない

まとめ
webshの紹介
改善点があればissuesまたはPRください
webshの実装まわりの話
はじめてのおつかいならぬ、はじめてのWebアプリ
Nimの紹介
Nimは良い言語
流行ってほしい

終わり