Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
もしも、社内標準言語がBASHに統一されたら
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Kentaro Hayashi
August 10, 2020
Programming
55
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
もしも、社内標準言語がBASHに統一されたら
https://moshi-bash-slide.netlify.app/
Kentaro Hayashi
August 10, 2020
Other Decks in Programming
See All in Programming
Oxcを導入して開発体験が向上した話
yug1224
4
310
Composerを使ったサプライチェーン攻撃の様子を眺めてみる #phpstudy
o0h
PRO
2
250
JavaDoc 再入門
nagise
0
330
AIで効率化できた業務・日常
ochtum
0
130
ふつうのFeature Flag実践入門
irof
7
3.9k
Semantic Version 単位で戦略を柔軟に変えて、パッケージアップデートを自動化する
daitasu
1
230
Agentic UI
manfredsteyer
PRO
0
160
キャリア迷子上等 ─ "ない道"は自分で作ればいい
16bitidol
3
2.1k
気づいたらRubyで100作品 ー クリエイティブコーディングが生活の一部になるまで / 100 Ruby Sketches Later: How Creative Coding Became Part of My Life
chobishiba
3
570
Oxlintのカスタムルールの現況
syumai
6
1.1k
タクシーアプリ『GO』の バックエンド開発のおける AI利活用と若者のすべて
pyama86
3
2k
OSもどきOS
arkw
0
560
Featured
See All Featured
Skip the Path - Find Your Career Trail
mkilby
1
150
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
380
Color Theory Basics | Prateek | Gurzu
gurzu
0
360
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.5k
A Modern Web Designer's Workflow
chriscoyier
698
190k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
62k
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
200
Ten Tips & Tricks for a 🌱 transition
stuffmc
0
130
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
0
410
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
270
The Cult of Friendly URLs
andyhume
79
6.9k
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
340
Transcript
もしも、社内標準⾔ 語が BASH に統⼀さ れたら
はじめに
Bash でいいものを作ったので⾃慢しに来まし た 将来なにかの間違いで社内標準⾔語がBash に 統⼀されたら⼤変ですよね。その時になって 慌てないよう、Bash ⼒を鍛えておきましょ う。
BASH とは Bourne Shell のフリーソフトウェアによる代替 版。Bourne-again shell の頭⽂字 1989 年⽣まれ
ヒストリ機能や補完機能を持っている 近年のLinux 等で標準のシェルとして使われて いる。 sh に⽐べたらナウい
きっかけは NETCAT netcat と組み合わせればワンライナーでサーバを⽴ てることができる。 コマンドを叩けば、標準⼊出⼒が socket と繋がる。 while true;
\ do { echo -e 'HTTP/1.1 200 OK\r\n'; cat test.sh; } |\ nc -l 8080; done
ものたりない
もっと複雑な事がしたい
netcat をそのまま使っても、リクエストを解析して レスポンスを返すみたいなことができない。この ままだと複雑なことができなくて悲しい。 ⼀部の安全でないnetcat では オプション という ものがあるらしい。これを使えばbash に処理を⼀
任できそう。
しかしデフォルトで⼊っているnc コマンドには がなかった・・・。
GNU NETCAT ならいけそう
⼊れてみる これを使えば、bash だけでWeb サーバ作れるんじゃ ね? bash 縛りとか楽しそう。 $ brew install
netcat # GNU netcat $ netcat -lp 8080 -e /bin/bash hoge.sh # 良 $ netcat -lp 8080 -e /bin/bash
BASH 縛り WEB サーバの構想 どこまで厳密な意味でbash 縛りとする か・・・ ビルトインコマンド限定? cat やsed
はあり? awk はあり? listen するためにnetcat 使うのずるくない?
検証
BASH だけで LISTEN できるのか? にアクセスす れば、こちらからコネクションを張ることは できるらしい bash でTCP 通信
でもlisten はできない
結論(縛りプレイのルール)
ルール 1 bash はシステムにデフォルトで⼊っているバージ ョンを使⽤する
ルール 2 標準で使えるコマンドはだいたい使⽤可能 ↑ ただ し、「プログラミング⾔語」に属するものはNG (awk やperl はNG )
ルール 3 TCP でlisten するために他のシンプルなコマンド (nc など)に頼るのはOK (でもhttpd とかはズルい のでダメ)
ルール 4 bash で書かれたライブラリは使ってもOK (結局テ ンプレートエンジンしか使わなかったけど)
更に⼟⽇の頑張りを経て
良いものができました https://github.com/kentaro-hayashi/bashweb
実演
実装してみて感じた細かいこと
bash はweb に向いていない 世間のフレームワークの素晴らしさを知った Controller とView とRouting の実装までして疲れ たので、model(ORM) は⼿を付けなかった
【⾟み】bash の関数は値を返せない 返せるんだけど終了コードのみ これは関数というよりサブルーチン 参照渡しはできなくない 関数を別の変数に代⼊するのはできる☺
【⾟み】bash のバージョンが古いので連想配 列がない 連想配列がないので⿊魔術のような記法 に・・・ 【⾟み】関数のスコープはグローバルスコー プ 【⾟み】上位スコープでreadonly として宣⾔さ れた変数名は下位のローカルスコープで再定
義できない
【⾟み】PASH を間違えて書き換えてハマった 【⾟み】read コマンドは改⾏を待ち受けるの で、改⾏で終わらないリクエストのときは待 ちぼうける 【⾟み】配列の扱い(意外とファイルを1 ⾏ず つ配列に⼊れるのは⾯倒くさい)
変数展開機能、知らなかった 【⾟み】サブシェルが起動してしまうと変数 を定義しても無駄になるので注意(しかも発 動条件がわかりにくい) シェルの変数展開 bash で,サブシェルが起動される条件
連続したリクエストを受信する と CONNECTION がはれない問題
静的な画像ファイルの配信にも対応させて、ウキ ウキしながらHTML 中にimg タグを書いた。
しかし、画像が表⽰されない。
画像取得時にTCP Connection がはれていないのが原 因でした。
netcat を使った既存の仕組みはこう。
これだと、なにかのリクエストを処理している間 は他のリクエストに返事ができない。 (accept できないのでガン無視状態)
よくあるサーバプロセスなどはこんな感じだと思 うけれど、netcat はそういうふうにできていない。
NETCAT から TCPSERVER に乗り 換えました
tcpserver (D.J.Bernstein )ならちゃんとaccept 後に fork してくれる。 http://cr.yp.to/
ようやく写真を表⽰することができました
結び
サーバ書くと勉強になる 意外と楽しい 今度はもっと低いレイヤーからチャレンジし ても良いかも
完