Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
もしも、社内標準言語がBASHに統一されたら
Search
Kentaro Hayashi
August 10, 2020
Programming
58
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
Performance Optimization With LLMs
xleitix
0
140
Apple Intelligence を用いた個人情報誤送信防止、及びユーザーリクエスト体験の改善について
yukiny
0
350
半永久的に提供し続けられるプライベートクラウドを目指して ― 利用者の認知負荷を抑えるAPI抽象化とハードウェア世代交代の基盤設計
tomokon
0
500
Workers Cache を知る
syumai
0
370
ActionController meets Protocol Buffers
sorah
0
560
複雑なUIコンポーネントとの ⻑い付き合い⽅:波及するバグからテスト戦略を経て、安全な再設計へ
mixplace
0
430
気持ちぃ〜角丸 Squircle
ryu1013
0
310
UPDATE をやめる — EF Core でマスタをバージョン管理する
panda728
PRO
0
1.2k
ソニーのクラウド共通基盤の変遷とAI時代の開発スタイルに合わせた進化 / The Journey of Sony’s Common Cloud Platform and Its Evolution for AI-Native Development
kenjiyoneyama
0
280
TechTown - Creating Composable Callables in Contemporary C++
rollbear
0
130
個人開発者よ、Honoを使え(おじさんver)
tanahiro2010
2
260
re:Inventに行く前に知っておきたい現地参加のノウハウ
nokomoro3
0
440
Featured
See All Featured
Done Done
chrislema
187
17k
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
530
Ruling the World: When Life Gets Gamed
codingconduct
0
400
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.6k
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
220
KATA
mclloyd
PRO
35
16k
How To Speak Unicorn (iThemes Webinar)
marktimemedia
1
600
Automating Front-end Workflow
addyosmani
1369
210k
A better future with KSS
kneath
240
18k
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
890
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
68
58k
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
6
1.2k
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/
ようやく写真を表⽰することができました
結び
サーバ書くと勉強になる 意外と楽しい 今度はもっと低いレイヤーからチャレンジし ても良いかも
完