Slide 1

Slide 1 text

γεςϜϥΠϒϥϦʹґଘ͠ͳ͍ LESSίϚϯυAPIͷ؆қ൛Λ࡞ͬͨ @WASANX25 2019/05/18 GO CONFERENCE 2019 SPRING

Slide 2

Slide 2 text

GOSS ▸ https://github.com/wasanx25/goss ▸ Go͔Βͦͷ··ςΩετΛ౉͚ͩ͢Ͱɺλʔϛφϧ্Ͱless Έ͍ͨʹදࣔ͢Δ func main() { data := "text, text\ntext,text" err := goss.Run(data) if err != nil { fmt.Println(err) os.Exit(1) } os.Exit(0) }

Slide 3

Slide 3 text

ͳΜͰ࡞ͬͨͷ͔ ▸ ࣗ෼Ͱ࡞ͬͨsreqͱ͍͏΋ͷ͕͋ΓɺͦͷͨΊʹ࡞੒ͨ͠ ▸ https://github.com/wasanx25/sreq ▸ GoͰCLIπʔϧΛ࡞Δͱ͖ʹɺlessίϚϯυΛଧͨͳ͍ͨΊʹͲ͏͢Δ͔ߟ͔͑ͨͬ ͨ ▸ ཧ༝͸ɺ ▸ CLIπʔϧ಺Ͱɺos/execΛ࢖༻͠ͳ͍ ▸ Fileʹॻ͖ࠐ·ͤͳ͍ ▸ ͦ΋ͦ΋OSʹless͕ೖͬͯͳ͍ ▸ Go͕ॻ͖͔͔ͨͬͨΒ

Slide 4

Slide 4 text

TCELLͱ͍͏OSSΛ࢖͍ͬͯΔ ▸ https://github.com/gdamore/tcell func main() { tui, err := tcell.NewScreen() if err != nil { fmt.Println(err) os.Exit(1) } if err = tui.Init(); err != nil { fmt.Println(err) os.Exit(1) } tui.SetContent(0, 0, 't', nil, tcell.StyleDefault) tui.SetContent(1, 0, 'e', nil, tcell.StyleDefault) tui.SetContent(2, 0, 's', nil, tcell.StyleDefault) tui.SetContent(3, 0, 't', nil, tcell.StyleDefault) tui.SetContent(0, 1, 's', []rune{'a','m','p','l','e'}, tcell.StyleDefault) tui.Show() time.Sleep(5 * time.Second) tui.Fini() } ▸ tui͸ɺtcell.Screen IntefaceΛ࣋ͭ

Slide 5

Slide 5 text

TCELL͸ςετ͕͠΍͍͢ ▸ ςελϏϦςΟ͕ߴ͍ ▸ Πϕϯτʹର͢Δςετ΍ɺWindowͷαΠζઃఆ͕Մೳ ▸ GetContents()ͰɺSetContent()ͨ͠಺༰ΛऔಘͰ͖Δ ▸ Screen InterfaceΛ֎෦͔Β஫ೖ͢Δ͜ͱͰɺςετ͕͠΍͘͢Ͱ ͖Δ

Slide 6

Slide 6 text

TCELLͷςετ ▸ ઌ΄Ͳͷ࣮ߦαϯϓϧΛ sample() ͱ͍͏ϝιουʹஔ͘ func sample(tui tcell.Screen) { tui.SetContent(0, 0, 't', nil, tcell.StyleDefault) tui.SetContent(1, 0, 'e', nil, tcell.StyleDefault) tui.SetContent(2, 0, 's', nil, tcell.StyleDefault) tui.SetContent(3, 0, 't', nil, tcell.StyleDefault) tui.SetContent(0, 1, 's', []rune{'a', 'm', 'p', 'l', 'e'}, tcell.StyleDefault) }

Slide 7

Slide 7 text

TCELLͷςετ func TestSample(t *testing.T) { tui := tcell.NewSimulationScreen("") if err := tui.Init(); err != nil { t.Fatal(err) } tui.SetSize(10, 2) sample(tui) tui.Show() cells, _, _ := tui.GetContents() var runes []rune for i, cell := range cells { runes = append(runes, cell.Runes...) if (i+1)%10 == 0 { runes = append(runes, '\n') } } slice := []string{ "test \n", "sample \n", } expected := strings.Join(slice, "") actual := string(runes) if actual != expected { t.Errorf("expected=%v, got=%v", expected, actual) } } ▸ GetContents()ͷୈҰҾ਺͸ɺ []tcell.SimCell type ▸ []runeͳͲΛϑΟʔϧυʹ࣋ͭ ▸ tui.SetSize()͞Εͨ৘ใʹج͍ͮͯ TERMͷWindowαΠζΛܾΊΔ ▸ ஫ʣจࣈͰຒ·Βͳ͔ͬͨͱ͜ Ζ͸εϖʔεͰຒ·Δ

Slide 8

Slide 8 text

ύοέʔδͷߏ੒ ▸ Drawer ▸ contentʢҾ਺Ͱ౉͖ͬͯͨςΩετΛѻ͏ʣ ▸ numberʢߦ൪߸Λѻ͏ʣ ▸ positionerʢWrite͢Δ৔ॴΛ؅ཧʣ ▸ ্هೋͭ͸ɺ͜ΕΛϑΟʔϧυͱͯͦ͠ΕͧΕ ࣋ͭ ▸ Event ▸ eventʢΩʔ΍TERMͷϦαΠζͷΠϕϯτΛ؅ཧʣ ▸ Offsetter ▸ offsetterʢॻ͖ࠐΉ಺༰ͷoffsetαΠζΛ؅ཧʣ ▸ Viewer ▸ viewerʢ্هΛ؅ཧͯ͠ɺ࣮ࡍʹදࣔͤ͞Δʣ

Slide 9

Slide 9 text

࣮ࡍͷλʔϛφϧͰݟΔߏ଄ମͷߏ੒ ▸ Offset͸ڞ௨Ͱ؅ཧ͢Δ ▸ Position͸DrawerͦΕͧΕͰ࣋ͭ ▸ eventʹΑͬͯoffset͕มಈ͢Δ ▸ ྫʣjΛଧͭͱ+1͞ΕΔ

Slide 10

Slide 10 text

No content

Slide 11

Slide 11 text

ࣗݾ঺հ ▸ @wasanx25 ▸ ຊۀ: Java, Kotlin, Spring Boot ▸ झຯ: Go, Ruby ▸ Go͸πʔϧ࡞Δ͙Β͍͔͠

Slide 12

Slide 12 text

͝੩ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠