Slide 1

Slide 1 text

(Pݚमୈظ %": :VUBLB,BUP 
 3% %&4".*4 %&4".*4ࣾ಺ݚम

Slide 2

Slide 2 text

ݚमܭը ճ ೔࣍ ༧ఆ λΠτϧ ୈճ Ր (Pͷجຊ ୈճ Ր ؀ڥߏஙͱ(JU (JU)VCͷجຊ ୈճ Ր جຊߏจ ୈճ Ր ߏ଄ମɺεϥΠεɺϚοϓ ୈճ Ր ඪ४ϥΠϒϥϦ͸΍Ί͙Γ ୈճ Ր ϞδϡʔϧγεςϜͱ֎෦ϥΠϒϥϦ ୈճ Ր )FSPLV(Pೖ໳ ୈճ Ր "84-BNCEB(Pೖ໳ ୈճ Ր ฒߦॲཧϓϩάϥϛϯά ୈճ Ր ୯ମςετٕ๏ ୈճ Ր σʔλϕʔεΞΫηε ୈճ Ր 'ZOFʹΑΔ(6*ΞϓϦέʔγϣϯ։ൃ ୈճ Ր ࣾ಺(PϓϩδΣΫτͷίʔυղઆ

Slide 3

Slide 3 text

˞ લճͷ13ͷ 
 ղઆλΠϜ

Slide 4

Slide 4 text

ຊ೔ͷΰʔϧ w 🚩ΰʔϧ w (Pʹ͓͚Δ(6*ΞϓϦ։ൃͷݱঢ়Λ஌Δ w 'ZOFΛ༻͍ͨ(6*ΞϓϦͷ։ൃํ๏ΛֶͿ w ❌ΰʔϧͰ͸ͳ͍ w πʔϧΩοτͷൣғΛ௒͑Δػೳͷ࣮ݱ

Slide 5

Slide 5 text

(6* 
 ΞϓϦέʔγϣϯ

Slide 6

Slide 6 text

(Pʹ͓͚Δબ୒ࢶ ϥΠϒϥϦ πʔϧΩοτΤϯδϯ (JU)VC˒ GZOFJPGZOF ಠࣗ L HJUIVCDPNUIFSFDJQFRU 2U L HJUIVCDPNXFCWJFXXFCWJFX ϒϥ΢βܥ L HJUIVCDPNBOEMBCTVJ MJCVJ L HJUIVCDPNNBYFODFDIBSSJFSFHPBQQ ϒϥ΢βܥ L HJUIVCDPNXBJMTBQQXBJMT ϒϥ΢βܥ L HJUIVCDPNBTUJDPEFHPBTUJMFDUSPO &MFDUSPO L HJUIVCDPNTDJUFSTELHPTDJUFS ϒϥ΢βܥ L HJUIVCDPNNBUUOHPHUL (5, L HJUIVCDPNHPULHPULHUL (5, L HJUIVCDPNEUZMNBOHPXE ϒϥ΢βܥ 4PVSDFIUUQTHJUIVCDPNBWFMJOPBXFTPNFHPHVJ˞ಛఆ04޲͚͸আ֎

Slide 7

Slide 7 text

(Pʹ͓͚Δબ୒ࢶ w ͍·ͷͱ͜Ζ(P޲͚ͷ(6*πʔϧΩοτͷܾఆଧ ͸ͳ͍ w Ϧιʔεޮ཰ͷྑ͞΍ΫϩείϯύΠϧͷ͠΍͢͞ͳ Ͳͷຊདྷͷ(Pͷར఺੍͕໿͞ΕΔ΋ͷ΋গͳ͘ͳ͍ w ࠓ೔ͷϋϯζΦϯ͸'ZOF W Λར༻͢Δ͕ɺൃల ్্ͳͷͰ༷ʑͳ੍໿͕͋Δ͜ͱΛཧղ্ͨ͠Ͱར༻ ͢Δඞཁ͕͋Δ

Slide 8

Slide 8 text

($$ͷಋೖ

Slide 9

Slide 9 text

؀ڥߏங ࣍ͷ63-Λ։͖ɺz*OTUBMMBUJPO4PVSDFGPSHFzͷϦϯΫΛΫϦοΫ͠·͢ 
 IUUQNJOHXXPSHEPLVQIQEPXOMPBENJOHXCVJMET Πϯετʔϥʔ͕μ΢ϯϩʔυ͞ΕͨΒ࣮ߦ͠</FYU>ΛΫϦοΫ͠·͢ 1 2

Slide 10

Slide 10 text

؀ڥߏங l"SDIJUFDUVSFzͷϓϧμ΢ϯΛlY@zʹมߋ͠·͢ Ҏޙ</FYU>ͰਐΊɺऴΘͬͨΒ<'JOJTI>Ͱด͡·͢ 1 2

Slide 11

Slide 11 text

؀ڥߏங ΤΫεϓϩʔϥʔΛ։͖ɺҎԼͷϑΥϧμ·ͰҠಈ͠ɺύεදࣔཝͷۭ͍͍ͯΔͱ͜Ζ ΛΫϦοΫ͠·͢ 
 $a1SPHSBN'JMFTaNJOHXXaY@QPTJYTFISU@WSFWaNJOHXaCJO બ୒͞ΕͨύεΛӈΫϦοΫ͠<ίϐʔ>Λબ୒͠·͢ 1 2

Slide 12

Slide 12 text

؀ڥߏங <8JOEPXT><1BVTF#SFBL>ΩʔͰઃఆͷৄࡉ৘ใΛදࣔ͠ɺ͔ͦ͜Β<γ εςϜৄࡉઃఆ>Λ୳ͯ͠ΫϦοΫɺଓ͍ͯ<؀ڥม਺ / >ΛΫϦοΫ͠·͢ Ϣʔβʔ؀ڥม਺ͷl1BUIzΛબ୒͠ɺଓ͍ͯ<ฤू & >ϘλϯΛΫϦοΫ͠ ·͢ 1 2

Slide 13

Slide 13 text

؀ڥߏங <৽ن / >ΛΫϦοΫ͠ೖྗཝʹઌఔίϐʔ͍ͯͨ͠ύεΛషΓ෇͚ɺ <0,>ΛΫϦοΫ͠·͢ ؀ڥม਺ը໘ͷ<0,>ϘλϯɺγεςϜͷϓϩύςΟը໘ͷ<0,>Ϙλϯ ΛΫϦοΫ͠ɺҰ࿈ͷը໘Λด͡·͢ 1

Slide 14

Slide 14 text

)FMMP XPSME

Slide 15

Slide 15 text

΍ͬͯΈΑ͏ 74$PEFΛىಈ͠ݚमϦϙδτϦΛ։͖·͢ Ϣʔβʔ໊ϑΥϧμҎԼʹʮEBZIFMMPʯϑΥϧμΛ࡞੒͠ɺͦͷத ʹҎԼͷ಺༰ͰʮNBJOHPʯΛ࡞੒͠·͢ package mai n import ( "fyne.io/fyne/v2/app " "fyne.io/fyne/v2/widget " ) func main() { a := app.New( ) w := a.NewWindow("Hello" ) w.SetContent(widget.NewLabel("Hello, world!") ) w.ShowAndRun( ) } ౷߹λʔϛφϧͰʮgo mod tidyʯͱʮgo run .ʯΛ࣮ߦ͠·͢

Slide 16

Slide 16 text

΍ͬͯΈΑ͏ ʮ)FMMP XPSMEʯͷจࣈྻΛʮ)FMMP ੈքʯʹมߋͯ͠࠶࣮ߦ͠·͢ จࣈ͕౾෗ʹͳͬͯ͠·͏ͷͰɺҎԼͷߦΛapp.New()ͷલʹૠೖ͠·͢ ΋͏Ұ౓࣮ߦͯ͠ɺਖ਼͘͠දࣔ͞ΕΔ͜ͱΛ֬ೝ͠·͢ os.Setenv("FYNE_FONT", "C:\\Windows\\Fonts\\YuGothM.ttc") F y n e に 内蔵 さ れ て いる フ ォ ン ト は N o t o S a n s だ が、 日本語 に 対応 し た C J K で は な く 標準 の も の な の で 、 環境変数 F Y N E _ F O N T で 変更 す る

Slide 17

Slide 17 text

ϨΠΞ΢τ

Slide 18

Slide 18 text

)#PY 7#PY package mai n import ( "fyne.io/fyne/v2/app " "fyne.io/fyne/v2/container " "fyne.io/fyne/v2/widget " ) func main() { a := app.New( ) w := a.NewWindow("Hello" ) w.SetContent(container.NewHBox ( widget.NewLabel("Label 1") , widget.NewLabel("Label 2") , ) ) w.ShowAndRun( ) } package mai n import ( "fyne.io/fyne/v2/app " "fyne.io/fyne/v2/container " "fyne.io/fyne/v2/widget " ) func main() { a := app.New( ) w := a.NewWindow("Hello" ) w.SetContent(container.NewVBox ( widget.NewLabel("Label 1") , widget.NewLabel("Label 2") , ) ) w.ShowAndRun( ) }

Slide 19

Slide 19 text

)#PY7#PY w.SetContent(container.NewHBox ( widget.NewLabel("Label 1") , container.NewVBox(widget.NewLabel("Label 2"), widget.NewLabel("Label 3")) , )) )#PY 7#PY HBoxͷ൪໨ͷ߲໨ʹVBoxΛ௥Ճ͍ͯ͠Δ

Slide 20

Slide 20 text

5BC w.SetContent(container.NewAppTabs ( container.NewTabItem("Tab 1", widget.NewLabel("Label 1")) , container.NewTabItem("Tab 2", widget.NewLabel("Label 2")) , )) Մม௕Ҿ਺ͳͷͰ͍͘ΒͰ΋ λϒΛ௥ՃՄೳ

Slide 21

Slide 21 text

#PSEFS (SJE w.SetContent(container.NewBorder ( widget.NewLabel("TOP") , widget.NewLabel("BOTTOM") , widget.NewLabel("LEFT") , widget.NewLabel("RIGHT") , widget.NewLabel("Content") , )) w.SetContent(container.NewGridWithRows(3 , container.NewGridWithColumns(3 , widget.NewLabel("Row 1, Column 1") , widget.NewLabel("Row 1, Column 2") , ) , container.NewGridWithColumns(3 , widget.NewLabel("Row 2, Column 1") , widget.NewLabel("Row 2, Column 2") , ) , ))

Slide 22

Slide 22 text

΢ΟδΣοτ

Slide 23

Slide 23 text

#VUUPO message := widget.NewLabel("" ) w.SetContent(container.NewVBox ( widget.NewButton("Click me", func() { message.SetText("Clicked!" ) }) , message , )) ԡ͞Εͨͱ͖ʹݺ͹ΕΔؔ਺ ΛҾ਺ͱͯ͠౉͢ ޙͰ஋ʹΞΫηε͢Δ߲໨͸ 
 ม਺ʹͱ͓ͬͯ͘

Slide 24

Slide 24 text

'PSN id := widget.NewEntry( ) password := widget.NewPasswordEntry( ) message := widget.NewLabel("" ) w.SetContent(container.NewVBox ( widget.NewForm ( widget.NewFormItem("ID", id) , widget.NewFormItem("Password", password) , ) , widget.NewButton("Login", func() { if password.Text != "password" { message.SetText("Not authorized" ) retur n } message.SetText("Welcome, " + id.Text ) }) , message , )) Formͷ࡞੒

Slide 25

Slide 25 text

"DDPSEJPO w.SetContent(widget.NewAccordion ( widget.NewAccordionItem("Accordion 1", widget.NewLabel("Label 1")) , widget.NewAccordionItem("Accordion 2", widget.NewLabel("Label 2")) , widget.NewAccordionItem("Accordion 3", widget.NewLabel("Label 3")) , )) ͲΕ͔ͭΛ։͘ͱ 
 ଞͷ։͍͍ͯΔ߲໨Λด͡Δ

Slide 26

Slide 26 text

$BSE w.SetContent(container.NewHBox ( widget.NewCard("Card 1", "Subtitle 1", widget.NewLabel("Label 1")) , widget.NewCard("Card 2", "Subtitle 2", widget.NewLabel("Label 2")) , ))

Slide 27

Slide 27 text

ͦͷଞॾʑ w.SetContent(container.NewHBox ( widget.NewForm ( widget.NewFormItem("Check", widget.NewCheck("Check", nil)) , widget.NewFormItem("Radio", widget.NewRadioGroup(radioOptions, nil)) , widget.NewFormItem("Select", widget.NewSelect(selectOptions, nil)) , widget.NewFormItem("Hyperlink", widget.NewHyperlink("Hyperlink", nil)) , ) , widget.NewForm ( widget.NewFormItem("ProgressBar", widget.NewProgressBar()) , widget.NewFormItem("Slider", widget.NewSlider(0, 100)) , widget.NewFormItem("Toolbar", widget.NewToolbar ( widget.NewToolbarAction(theme.ContentAddIcon(), nil) , widget.NewToolbarAction(theme.ContentCopyIcon(), nil) , widget.NewToolbarAction(theme.ContentClearIcon(), nil) , widget.NewToolbarAction(theme.ContentCutIcon(), nil) , )) , ) , )) ˞͜ΕͰશ෦Ͱ͸ͳ͍

Slide 28

Slide 28 text

μΠΞϩά

Slide 29

Slide 29 text

μΠΞϩάͷجຊ w.SetContent(container.NewVBox ( widget.NewButton("Info dialog", func() { dialog.NewInformation("Info", "Message", w).Show( ) }) , widget.NewButton("Confirm dialog", func() { dialog.NewConfirm("Confirm", "Message", func(b bool) { fmt.Println(b) }, w).Show( ) }) , widget.NewButton("Error dialog", func() { dialog.NewError(errors.New("Message"), w).Show( ) }) , widget.NewButton("Custom dialog", func() { dialog.NewCustom("Custom", "OK", widget.NewIcon(theme.FyneLogo()), w).Show( ) }) , )) :FT/Pͷ݁Ռ͕CPPMͰฦΔ

Slide 30

Slide 30 text

ϑΝΠϧૢ࡞μΠΞϩά w.SetContent(widget.NewButton("File open dialog", func() { dw := a.NewWindow("Dialog window" ) dw.Resize(fyne.NewSize(500, 350) ) dialog.NewFileOpen(func(f fyne.URIReadCloser, err error) { defer dw.Close( ) if err != nil || f == nil { retur n } defer f.Close( ) fmt.Println("file:", f.URI() ) }, dw).Show( ) dw.Show( ) })) ϑΝΠϧૢ࡞ܥμΠΞϩά͸ 
 େ͖ͳදࣔྖҬ͕ඞཁ 
 ผ΢Οϯυ΢Ͱ։͘ͷ͕ 
 ͓͢͢Ί NewFileOpen()
 NewFileSave()
 NewFolerOpen() 
 ͷछྨ͕͋Δ

Slide 31

Slide 31 text

ͦͷଞ

Slide 32

Slide 32 text

$BOWBT raster := canvas.NewRasterWithPixels ( func(_, _, w, h int) color.Color { return color.RGBA { R: uint8(rand.Intn(255)) , G: uint8(rand.Intn(255)) , B: uint8(rand.Intn(255)) , A: 0xff , } } ) w.SetContent(raster ) w.Resize(fyne.NewSize(150, 100)) circle := canvas.NewCircle(color.RGBA{G: 128} ) circle.StrokeColor = color.Gray{Y: 0x99 } circle.StrokeWidth = 5 w.SetContent(circle ) w.Resize(fyne.NewSize(150, 100)) w ͘͝؆୯ͳਤܗ΍ը૾ͷඳը͕Ͱ͖Δ

Slide 33

Slide 33 text

ύοέʔδϯά w ΞΠίϯΛઃఆ࣮ͨ͠ߦϑΝΠϧΛ࡞੒͢Δ͜ͱ͕Ͱ͖Δ w Πϯετʔϧํ๏ 
 go install fyne.io/fyne/v2/cmd/fyne@latest
 
 (࣮ߦόΠφϦ͕ <ϗʔϜσΟϨΫτϦ>/go/bin/ ҎԼʹ֨ೲ͞Ε·͢) w ࣮ߦํ๏ ద౰ͳΞΠίϯΛ༻ҙͯ͠ʮ*DPOQOHʯͱ͍͏໊લͰอଘ͠·͢ ౷߹λʔϛφϧͰʮ~\go\bin\fyne packageʯʻ5BCʼʻ&OUFSʼ 
 Λ࣮ߦ͠·͢˞ ˞$PNNBOE1SPNQUͷ৔߹ 
 ɹ%USERPROFILE%\go\bin\fyne package

Slide 34

Slide 34 text

࿅श

Slide 35

Slide 35 text

࿅श໰୊ w ࿅श՝୊<ϑΥϧμ໊EBZDMPDL> w ݱࡏ࣌ࠁΛʮʯͷΑ͏ʹදࣔ͢Δ࣌ܭΞϓϦΛ࡞͍ͬͯͩ͘͞ w ώϯτ w.ShowAndRun()ΑΓ΋લͷஈ֊Ͱ࣌ܭͷදࣔΛߋ৽͢Δ ΰϧʔνϯΛ্ཱͪ͛Δඞཁ͕͋Γ·͢ w ࿅श՝୊<ϑΥϧμ໊EBZHPPHMF> w ΩʔϫʔυΛೖྗ͢ΔͱɺͦͷΩʔϫʔυͷ(PPHMFݕࡧ݁ՌΛϒϥ΢ βͰ։͘πʔϧΛ࡞͍ͬͯͩ͘͞ w ώϯτ ϓϩάϥϜ͔Βϒϥ΢βΛ։͘ํ๏ 
 exec.Command("rundll32", "url.dll,FileProtocolHandler", url).Start()

Slide 36

Slide 36 text

ίʔυΛॻ͖ऴ͑ͨΒ w ʮϢʔβʔ໊QSBDUJDFʯϒϥϯνͰ࡞ۀ͍ͯ͠Δ͜ͱΛ֬ೝ͍ͯͩ͘͠͞ w 74$PEFͷҰ൪ࠨԼʹදࣔ͞Ε͍ͯ·͢ w มߋΛεςʔδ͠ɺίϛοτ͍ͯͩ͘͠͞ w 74$PEFͷࠨϝχϡʔͷʮιʔε؅ཧʯ͔Βૢ࡞ w ίʔυΛ(JU)VCʹϓογϡ͍ͯͩ͘͠͞ w 74$PEFͷҰ൪ࠨԼͷϒϥϯν໊ͷ͙͢ӈʹ͋ΔΞΠίϯ͔Βૢ࡞ ্ਤ w ϓϧϦΫΤετΛ࡞੒͍ͯͩ͘͠͞ w ʮιʔε؅ཧʯͷ্෦ʹΞΠίϯ͕͋Γ·͢

Slide 37

Slide 37 text

࣍ճ༧ࠂ w ࣍ճ͸࠷ऴճʮࣾ಺(PϓϩδΣΫτͷίʔυ ղઆʯͰ͢ w ෼͔Βͳ͔ͬͨͱ͜Ζ΍࣭໰ͳͲ͸ɺࣾ಺ 4MBDLHPQIFSTνϟϯωϧʹ౤ߘ͍ͩ͘͞ w ຊ೔ͷ಺༰ΛΑΓਂ͘ཧղ͍ͨ͠ํ͸ɺ'ZOFͷ υΩϡϝϯτͳͲΛಡΜͰΈ͍ͯͩ͘͞ 
 IUUQTEFWFMPQFSGZOFJP