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
The Go Playgoroundで 外部パッケージ使いたい
Search
Hazumi Ichijo
October 19, 2018
Programming
7k
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
The Go Playgoroundで 外部パッケージ使いたい
Go(Un)Conference(Goあんこ)LT大会 4kg
https://gounconference.connpass.com/event/99487/
の発表資料です。
Hazumi Ichijo
October 19, 2018
More Decks by Hazumi Ichijo
See All by Hazumi Ichijo
RailsとRidgepoleの マイグレを120倍早くする
hazumirr
0
420
CIを整備してメンテナンスを生成AIに任せる
hazumirr
0
1.5k
病院の情報フローを理解して、 予約〜会計の見え方が変わった話
hazumirr
1
1.9k
Rubyのコード削除したい時 僕がやること
hazumirr
0
280
テーブル駆動テストと状態
hazumirr
5
2.2k
オンラインテストしようと思った その日に開始できる環境を目指して
hazumirr
0
1.1k
推薦によるプロダクト改善とマイクロサービスが噛み合った話
hazumirr
2
4.8k
ChatGPTで僕が知っていることまとめ
hazumirr
3
3.1k
プロダクトチームとどう 協業し分析環境を改善するか
hazumirr
2
1.6k
Other Decks in Programming
See All in Programming
『コードを書く以外の』エンジニアリング〜課金基盤移行プロジェクト推進のためのTips4選
yuriko1211
0
290
なぜ関数型プログラミングで「型」と「証明」が語られるのか #fp_matsuri
kajitack
3
800
【やさしく解説 設計編・中級 #1】一つの車に、運転手は一人 ~ある倉庫システムの事例から~
panda728
PRO
0
160
AIキャラアプリkaiwaの低遅延音声通話基盤をどう作ったか - AWS Gravitonで支える低遅延・低コストAI Agent基盤
mogamit
0
170
【やさしく解説 設計編・中級 #6】良いアーキテクチャとは ~ 一本の登り道の、行き先 ~
panda728
PRO
0
110
ビデオ通話が繋がる0.2秒で何が起きているのか
supurazako
2
130
Webフレームワークの ベンチマークについて
yusukebe
0
200
1B+ /day規模のログを管理する技術
broadleaf
0
130
なぜ型を書くのか? TSKaigi2026で改めて考える #tskaigi_smarthr
kajitack
0
340
「なぜそう決めたのか」を残し続ける仕組み ― Notion AI カスタムエージェント × Slack連携による設計判断の自動記録 - NIKKEI Tech Talk #47
niftycorp
PRO
0
260
act2-costs.pdf
sumedhbala
0
110
AI時代の仕事技芸論〜ソフトウェア開発で「遊ぶように働く」職人的熟達のすすめ(スクフェス仙台 2026バージョン)
kuranuki
0
600
Featured
See All Featured
First, design no harm
axbom
PRO
2
1.2k
Why You Should Never Use an ORM
jnunemaker
PRO
61
9.9k
So, you think you're a good person
axbom
PRO
2
2.1k
30 Presentation Tips
portentint
PRO
1
350
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
270
Measuring Dark Social's Impact On Conversion and Attribution
stephenakadiri
2
230
Designing Powerful Visuals for Engaging Learning
tmiket
1
450
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
220
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
55
3.4k
Testing 201, or: Great Expectations
jmmastey
46
8.2k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
2k
We Have a Design System, Now What?
morganepeng
55
8.2k
Transcript
©2018 Wantedly, Inc. The Go PlaygoroundͰ ֎෦ύοέʔδ͍͍ͨ Go(Un)Conference 4kg 19.Oct.2018
- Hazumi Ichijo
©2018 Wantedly, Inc. ࣗݾհ Ұᑍ!IB[VNJSS!SFSPTU 8FC"QQMJDBUJPO&OHJOFFS (P 3BJMT 3FBDUʜ ۴࿏ߴઐஜେֶ8BOUFEMZ
©2018 Wantedly, Inc. 1MBZHSPVOE JSC SBJMTDPOTPMF ࢼ͠ʹίʔυΛಈ͔͍ͨ͠ͱ͖
©2018 Wantedly, Inc. 1MBZHSPVOE JSC SBJMTDPOTPMF ࢼ͠ʹίʔυΛಈ͔͍ͨ͠ͱ͖
֎෦ύοέʔδ͑ͳ͍ɾɾɾ
©2018 Wantedly, Inc. package main import ( "fmt" "gopkg.in/guregu/null.v3" )
func main() { fmt.Println(null.StringFrom("PlayGround")) }
©2018 Wantedly, Inc. HPHFUΛ࣮ߦ͢Δ͚ͩͰ ύοέʔδͷґଘղܾͯ͘͠Εͨͣɾɾɾʁ
©2018 Wantedly, Inc. func compileAndRun(req *request) (*response, error) { //
TODO(andybons): Add semaphore to limit number of running programs at once. tmpDir, err := ioutil.TempDir("", "sandbox") if err != nil { return nil, fmt.Errorf("error creating temp directory: %v", err) } defer os.RemoveAll(tmpDir) src := []byte(req.Body) in := filepath.Join(tmpDir, "main.go") if err := ioutil.WriteFile(in, src, 0400); err != nil { return nil, fmt.Errorf("error creating temp file %q: %v", in, err) } https://github.com/golang/playground/blob/master/sandbox.go
©2018 Wantedly, Inc. func compileAndRun(req *request) (*response, error) { //
TODO(andybons): Add semaphore to limit number of running programs at once. tmpDir, err := ioutil.TempDir("", "sandbox") if err != nil { return nil, fmt.Errorf("error creating temp directory: %v", err) } defer os.RemoveAll(tmpDir) src := []byte(req.Body) in := filepath.Join(tmpDir, "main.go") if err := ioutil.WriteFile(in, src, 0400); err != nil { return nil, fmt.Errorf("error creating temp file %q: %v", in, err) } https://github.com/golang/playground/blob/master/sandbox.go
©2018 Wantedly, Inc. ݁ہϑΝΠϧʹॻ͖ग़ͯ͠Ϗϧυ͍ͯ͠Δ͚ͩͳͷͰ ॻ͖ग़͠ઌΛ(01"5)ҎԼʹ͢Δ HPHFUΛ࣮ߦ͢Δ ͜Ε͚ͩͰ͍͚Δʁʢ͍͚ΔΘ͚͕ͳͦ͞͏ʣ
©2018 Wantedly, Inc. https://github.com/rerost/playground/compare/e07747d8d2cee6639b14ba8021d453a6b8dd9edc...master
©2018 Wantedly, Inc.
©2018 Wantedly, Inc. ಈ͍ͯ͠·ͬͨɾɾɾ
©2018 Wantedly, Inc. https://play-dot-k8s-test-219404.appspot.com/ @hazumirr
©2018 Wantedly, Inc. ͳͥ͜ͷํ๏Ͱ্ख͍͔ͬͨ͘
©2018 Wantedly, Inc. ͳͥ͏·͘ߦͬͨͷ͔ 4BOECPY͕ίʔυͷ࣮ߦ࣌ͷΈ༗ޮʹͳ͍ͬͯͨ ػೳ͕γϯϓϧͩͬͨ
©2018 Wantedly, Inc. cmd.Env = []string{"GOOS=nacl", "GOARCH=amd64p32", "GOPATH=" + os.Getenv("GOPATH")}
if out, err := cmd.CombinedOutput(); err != nil { if _, ok := err.(*exec.ExitError); ok { // Return compile errors to the user. // Rewrite compiler errors to refer to progName // instead of '/tmp/sandbox1234/main.go'. errs := strings.Replace(string(out), in, progName, -1) // "go build", invoked with a file name, puts this odd // message before any compile errors; strip it. errs = strings.Replace(errs, "# command-line-arguments\n", "", 1) return &response{Errors: errs}, nil } return nil, fmt.Errorf("error building go source: %v", err) } ctx, cancel := context.WithTimeout(context.Background(), maxRunTime) defer cancel() cmd = exec.CommandContext(ctx, "sel_ldr_x86_64", "-l", "/dev/null", "-S", "-e", exe, testParam) https://github.com/golang/playground/blob/master/sandbox.go#L320-L339
©2018 Wantedly, Inc. cmd.Env = []string{"GOOS=nacl", "GOARCH=amd64p32", "GOPATH=" + os.Getenv("GOPATH")}
if out, err := cmd.CombinedOutput(); err != nil { if _, ok := err.(*exec.ExitError); ok { // Return compile errors to the user. // Rewrite compiler errors to refer to progName // instead of '/tmp/sandbox1234/main.go'. errs := strings.Replace(string(out), in, progName, -1) // "go build", invoked with a file name, puts this odd // message before any compile errors; strip it. errs = strings.Replace(errs, "# command-line-arguments\n", "", 1) return &response{Errors: errs}, nil } return nil, fmt.Errorf("error building go source: %v", err) } ctx, cancel := context.WithTimeout(context.Background(), maxRunTime) defer cancel() cmd = exec.CommandContext(ctx, "sel_ldr_x86_64", "-l", "/dev/null", "-S", "-e", exe, testParam) https://github.com/golang/playground/blob/master/sandbox.go#L320-L339
©2018 Wantedly, Inc. NaClͱ αϯυϘοΫεΛ࣮ݱ͢ΔͨΊͷͷɹ $ISPNFͷΣϒετΞͰ͞ΕΔ ΞϓϦέʔγϣϯΛ࣮ߦ͢ΔͷʹΘΕΔͷ
/B$M༻ʹϏϧυ͞ΕͨόΠφϦ͕ඞཁ<ཁग़య> https://ja.wikipedia.org/wiki/Google_Native_Client
©2018 Wantedly, Inc. ͳͥ͏·͍ͬͨ͘ͷ͔ /B$M ίʔυͷ࣮ߦͷࡍͷΈ༗ޮͩͬͨ /B$MͰ4BOECPY͕࣮ݱ͞Ε͍ͯͨ
(P͕/B$M༻ͷόΠφϦΛ࡞ΕΔʢ(004OBDMʣɹ
©2018 Wantedly, Inc. ͳͥ͏·͍ͬͨ͘ͷ͔
©2018 Wantedly, Inc. https://play-dot-k8s-test-219404.appspot.com/ ੬ऑੑෆ۩߹ͳͲΛݟ͚ͭͨΒڭ͍͑ͯͩ͘͞