Mac上でPythonかGolangでGUI開発環境を整えたい

またまた無職になった。
ニート期間中に技術力を上げるため、就職活動しながら勉強することにした。





















# スクリプト言語の勉強
一昔前はPerl言語に熱中していたが、数年間離れた生活をしていた。
不倫したと思われたのか、一目Perl言語を見ただけでは理解できない感じにふてくされた態度を取られた。
構ってあげなかった私に問題があるのかもしれないが、このまま分かれようと思う。
一体いくらつぎ込んだのか分からないぐらい膨大な書籍代だが、私の一方的な貢ぎ方に問題があったと思って諦めることにする。
心機一転し、異なるスクリプト言語に本腰を入れようと思う。
しかし、まだ本命を決められないでいる。





















## 本命選び
今の考えは2点ある。

* Python
* Golang

テキスト処理をしたいが、それはPerl言語をさておき、上記2点は優劣付けがたいようだ。
ちょっと触った感じでは、Go言語の方が馴染みやすかった。
如何せん、ちょっとした処理とは言え、数週間や数ヶ月後には使い方を忘れているかもしれない。
それでもテキスト処理する日常は変わらない(しかも毎日使わないため、余計忘れる)。
そのため、GUI画面からであれば、処理内容を忘れていても、テキスト処理させるには問題ないだろうと判断した。

んで、GUIプログラミングであれば、Pythonに軍配が上がる。
Go言語のGUI開発は発展途上であり、Perl言語から逃げてしまった私には敷居が高い。
※Perl言語でのGUI開発にはTk言語と連携することで、簡単にGUI開発できたはず(PythonもTkとの連携である程度GUI開発できる)。

そのため、まずはPython言語の習得を目指す。
何より、Excelとの親和性も高いようで、応用範囲は多岐にわたるようだ。

Go言語で同じ事が出来るとしても情報が無いため、取り組み得ない。
大変残念だが、仕方ない。

この投稿を機に、Perl言語とは完全に決別する。
恨まずに成仏してくれ。






















## Python環境構築で早速躓く
Python3をインストールし、pip3やpygameもインストール済みだ。
プログラムを動かすが・・・。

```terminal:プロンプト
No module named 'pygame'
```

何でだよ。
Pygameインストール済みだぞ？


### 環境構築への悩み
好きで環境構築失敗しているわけではないのだが、普通にインストールするだけでは失敗するようだ。
※GUI開発環境だけでなく、普通にPythonをインストールするにも失敗していたようだ。

以下、インストールし直す。

```terminal:プロンプト
[Qiita@chesscommands ~] $ pip3 install pygame
Looking in indexes: https://pypi.python.org/simple/
Collecting pygame
  Using cached pygame-1.9.6.tar.gz (3.2 MB)
Building wheels for collected packages: pygame
  Building wheel for pygame (setup.py) ... error
  ERROR: Command errored out with exit status 1:
   command: /usr/local/opt/python@3.8/bin/python3.8 -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/private/var/folders/6j/3sb382wn1hq6d63_xbk_5m6w0000gn/T/pip-install-mv9vk7gl/pygame/setup.py'"'"'; __file__='"'"'/private/var/folders/6j/3sb382wn1hq6d63_xbk_5m6w0000gn/T/pip-install-mv9vk7gl/pygame/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' bdist_wheel -d /private/var/folders/6j/3sb382wn1hq6d63_xbk_5m6w0000gn/T/pip-wheel-mzz_891j
       cwd: /private/var/folders/6j/3sb382wn1hq6d63_xbk_5m6w0000gn/T/pip-install-mv9vk7gl/pygame/
  Complete output (219 lines):
  running bdist_wheel
  running build
  running build_py
  creating build
  creating build/lib.macosx-10.14-x86_64-3.8
  creating build/lib.macosx-10.14-x86_64-3.8/pygame
		・
		・
		・
In file included from src_c/gfxdraw.c:33:
  In file included from src_c/pygame.h:32:
  src_c/_pygame.h:216:10: fatal error: 'SDL.h' file not found
  #include <SDL.h>
           ^~~~~~~
  1 error generated.
  ---
  For help with compilation see:
      https://www.pygame.org/wiki/MacCompile
  To contribute to pygame development see:
      https://www.pygame.org/contribute.html
  ---
  error: command 'clang' failed with exit status 1
  ----------------------------------------
  ERROR: Failed building wheel for pygame
  Running setup.py clean for pygame
Failed to build pygame
Installing collected packages: pygame
    Running setup.py install for pygame ... error
    ERROR: Command errored out with exit status 1:
     command: /usr/local/opt/python@3.8/bin/python3.8 -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/private/var/folders/6j/3sb382wn1hq6d63_xbk_5m6w0000gn/T/pip-install-mv9vk7gl/pygame/setup.py'"'"'; __file__='"'"'/private/var/folders/6j/3sb382wn1hq6d63_xbk_5m6w0000gn/T/pip-install-mv9vk7gl/pygame/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' install --record /private/var/folders/6j/3sb382wn1hq6d63_xbk_5m6w0000gn/T/pip-record-gfvc3z2_/install-record.txt --single-version-externally-managed --compile --install-headers /usr/local/include/python3.8/pygame
         cwd: /private/var/folders/6j/3sb382wn1hq6d63_xbk_5m6w0000gn/T/pip-install-mv9vk7gl/pygame/
    Complete output (219 lines):
    running install
    running build
    running build_py
		・
		・
		・
    running build_ext
    building 'pygame.gfxdraw' extension
    creating build/temp.macosx-10.14-x86_64-3.8
    creating build/temp.macosx-10.14-x86_64-3.8/src_c
    creating build/temp.macosx-10.14-x86_64-3.8/src_c/SDL_gfx
    clang -Wno-unused-result -Wsign-compare -Wunreachable-code -fno-common -dynamic -DNDEBUG -g -fwrapv -O3 -Wall -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk -I/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/usr/include -I/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Tk.framework/Versions/8.5/Headers -I/usr/local/opt/tcl-tk/include -DENABLE_NEWBUF=1 -I/NEED_INC_PATH_FIX -I/usr/local/include -I/usr/local/opt/openssl@1.1/include -I/usr/local/opt/sqlite/include -I/usr/local/Cellar/python@3.8/3.8.6/Frameworks/Python.framework/Versions/3.8/include/python3.8 -c src_c/gfxdraw.c -o build/temp.macosx-10.14-x86_64-3.8/src_c/gfxdraw.o
    In file included from src_c/gfxdraw.c:33:
    In file included from src_c/pygame.h:32:
    src_c/_pygame.h:216:10: fatal error: 'SDL.h' file not found
    #include <SDL.h>
             ^~~~~~~
    1 error generated.
    ---
    For help with compilation see:
        https://www.pygame.org/wiki/MacCompile
    To contribute to pygame development see:
        https://www.pygame.org/contribute.html
    ---
    error: command 'clang' failed with exit status 1
    ----------------------------------------
ERROR: Command errored out with exit status 1: /usr/local/opt/python@3.8/bin/python3.8 -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/private/var/folders/6j/3sb382wn1hq6d63_xbk_5m6w0000gn/T/pip-install-mv9vk7gl/pygame/setup.py'"'"'; __file__='"'"'/private/var/folders/6j/3sb382wn1hq6d63_xbk_5m6w0000gn/T/pip-install-mv9vk7gl/pygame/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' install --record /private/var/folders/6j/3sb382wn1hq6d63_xbk_5m6w0000gn/T/pip-record-gfvc3z2_/install-record.txt --single-version-externally-managed --compile --install-headers /usr/local/include/python3.8/pygame Check the logs for full command output.
[Qiita@chesscommands ~] $
```

何でだよ。

clangの云々かんぬんだが、XCodeはインストール済みであり、コンソール版も導入済みだ。
しかし、バージョンが古いままなのが原因かもしれない。
バージョンアップする場合、OSごと上げる必要がある。
それは避けたい。
まだ、デフォルトシェルをZshにするには時期尚早だ。

と言うことで、他の対策を探す。

### エラー表示のURLを試す。
何をすれば解決するか分からないため、エラーに表示されているURLで解説しているプログラムをインストールすることにした。

```terminal:プロンプト
[Qiita@chesscommands ~] $ pip3 install pygame
Looking in indexes: https://pypi.python.org/simple/
Collecting pygame
  Using cached pygame-1.9.6.tar.gz (3.2 MB)
Building wheels for collected packages: pygame
  Building wheel for pygame (setup.py) ... error
  ERROR: Command errored out with exit status 1:
[Qiita@chesscommands ~] $ brew install sdl2 sdl2_gfx sdl2_image sdl2_mixer sdl2_net sdl2_ttf
[Qiita@chesscommands ~] $ brew install Caskroom/cask/xquartz	# インストール失敗
[Qiita@chesscommands ~] $ brew cask install atom	# やり直したら成功した(コマンド全く違うやんけ：xquartz)。
[Qiita@chesscommands ~] $ pip3 install git+https://github.com/pygame/pygame.git	# 普通に"pygame"だけじゃだめなのか。
Looking in indexes: https://pypi.python.org/simple/
Collecting git+https://github.com/pygame/pygame.git
  Cloning https://github.com/pygame/pygame.git to /private/var/folders/6j/3sb382wn1hq6d63_xbk_5m6w0000gn/T/pip-req-build-lblaxp95
Building wheels for collected packages: pygame
  Building wheel for pygame (setup.py) ... done
  Created wheel for pygame: filename=pygame-2.0.0.dev25-cp38-cp38-macosx_10_14_x86_64.whl size=2700971 sha256=a4345c1a9b5cedd13c4d0bb72fc2fe0440faab6b59c8b4a86d54f24497d70b8f
  Stored in directory: /private/var/folders/6j/3sb382wn1hq6d63_xbk_5m6w0000gn/T/pip-ephem-wheel-cache-tiw9vcxx/wheels/32/d1/04/414f72352cfabeed1483d1fd1209ce2f0c0354ce830b31e97a
Successfully built pygame
Installing collected packages: pygame
Successfully installed pygame-2.0.0.dev25
[Qiita@chesscommands ~] $ python -m pygame.tests
Error while finding module specification for 'pygame.tests' (ModuleNotFoundError: No module named 'pygame')
[Qiita@chesscommands ~] $
```

何でだよ。


### インストールできていない？
とりあえず、リスト表示。

```terminal:プロンプト
[Qiita@chesscommands ~] $ pip3 list
Package    Version
---------- -----------
pip        20.2.3
pygame     2.0.0.dev25
setuptools 50.3.0
wheel      0.35.1
[Qiita@chesscommands ~] $ pip list
Package    Version
---------- -------
pip        20.2.4
setuptools 49.2.1
wheel      0.35.1
[Qiita@chesscommands ~] $
```

まさかと思うが・・・。

```terminal:プロンプト
[Qiita@chesscommands ~] $ pip install git+https://github.com/pygame/pygame.git
Looking in indexes: https://pypi.python.org/simple/
Collecting git+https://github.com/pygame/pygame.git
  Cloning https://github.com/pygame/pygame.git to /private/var/folders/6j/3sb382wn1hq6d63_xbk_5m6w0000gn/T/pip-req-build-s0y_ogtz
Building wheels for collected packages: pygame
  Building wheel for pygame (setup.py) ... done
  Created wheel for pygame: filename=pygame-2.0.0.dev25-cp38-cp38-macosx_10_14_x86_64.whl size=2700817 sha256=4d6ef61530695b792fe8dc4e50981228b9681195c14b0d262994529fe71b20f2
  Stored in directory: /private/var/folders/6j/3sb382wn1hq6d63_xbk_5m6w0000gn/T/pip-ephem-wheel-cache-yjzzgpjo/wheels/32/d1/04/414f72352cfabeed1483d1fd1209ce2f0c0354ce830b31e97a
Successfully built pygame
Installing collected packages: pygame
Successfully installed pygame-2.0.0.dev25
[Qiita@chesscommands ~] $ pip3 list
Package    Version
---------- -----------
pip        20.2.3
pygame     2.0.0.dev25
setuptools 50.3.0
wheel      0.35.1
[Qiita@chesscommands ~] $ pip list
Package    Version
---------- -----------
pip        20.2.4
pygame     2.0.0.dev25
setuptools 49.2.1
wheel      0.35.1
[Qiita@chesscommands ~] $
```

んで、、、

```terminal:プロンプト
[Qiita@chesscommands ~] $ python -m pygame.tests
pygame 2.0.0.dev25 (SDL 2.0.12, python 3.8.6)
Hello from the pygame community. https://www.pygame.org/contribute.html
skipping pygame.tests.cdrom_test (tag 'interactive')
skipping pygame.tests.overlay_test (tag 'SDL2_ignore')
skipping pygame.tests.scrap_test (tag 'SDL2_ignore')
skipping pygame.tests.sndarray_test (tag 'ignore')
skipping pygame.tests.surfarray_test (tag 'ignore')
loading pygame.tests.base_test
	・
	・
	・
ModuleNotFoundError: No module named 'pygame.pypm'

======================================================================
ERROR: test_midis2events__missing_event_data (pygame.tests.midi_test.MidiModuleNonInteractiveTest)
Ensures midi events with missing values are handled properly.
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/chesscommands/.pyenv/versions/3.8.6/lib/python3.8/site-packages/pygame/tests/midi_test.py", line 344, in setUp
    import pygame.midi
  File "/Users/chesscommands/.pyenv/versions/3.8.6/lib/python3.8/site-packages/pygame/midi.py", line 35, in <module>
    import pygame.pypm as _pypm
ModuleNotFoundError: No module named 'pygame.pypm'

----------------------------------------------------------------------
Ran 1608 tests in 81.905s

FAILED (errors=8)

[Qiita@chesscommands ~] $
```

嘘だろ!?
エラーにはなっているが、進展があった。
pipとpip3は違うもの？

そもそもpython2を使う予定がないのに、、、

### Path確認
Pathを含むバージョン確認など。

```terminal:プロンプト
[Qiita@chesscommands ~] $ pyenv version
3.8.6 (set by /Users/chesscommands/.python-version)
[Qiita@chesscommands ~] $ cat /etc/paths
/usr/local/bin
/usr/bin
/bin
/usr/sbin
/sbin
[Qiita@chesscommands ~] $ pyenv global 3.8.6
[Qiita@chesscommands ~] $ pyenv local 3.8.6
[Qiita@chesscommands ~] $ pyenv rehash
[Qiita@chesscommands ~] $ whereis python
/usr/bin/python
[Qiita@chesscommands ~] $/usr/bin/python --version
Python 2.7.16
[Qiita@chesscommands ~] $ python --version
Python 3.8.6
[Qiita@chesscommands ~] $ pyenv version
3.8.6 (set by /Users/chesscommands/.python-version)
[Qiita@chesscommands ~] $
```

何でだよ。

最低でもlocal配下を優先して使うはずなのに、bin配下が優先されるのは何故？

環境変数確認

```terminal:プロンプト
[Qiita@chesscommands ~] $ echo $PATH
/Users/chesscommands/.python-version:/usr/local/opt/tcl-tk/bin:/Users/chesscommands/.pyenv/shims:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Applications/VMware Fusion.app/Contents/Public:/usr/local/go/bin:/usr/local/share/dotnet:~/.dotnet/tools:/Library/Frameworks/Mono.framework/Versions/Current/Commands:/Applications/MacVim.app/Contents/MacOS/
[Qiita@chesscommands ~] $
```

う〜ん。
おかしな部分は無いように思うのだがな・・・。
見やすいように、以下改行。

```text
/Users/chesscommands/.python-version
/usr/local/opt/tcl-tk/bin
/Users/chesscommands/.pyenv/shims
/usr/local/bin
/usr/bin
/bin
/usr/sbin
/sbin
/Applications/VMware Fusion.app/Contents/Public
/usr/local/go/bin
/usr/local/share/dotnet
~/.dotnet/tools
/Library/Frameworks/Mono.framework/Versions/Current/Commands
/Applications/MacVim.app/Contents/MacOS/
```

.bash_profileに `/usr/local/bin` は、1つも記入していない。
それなのに、存在する。
どういうこと？

以下、.bash_profileの内容抜粋。

```terminal:プロンプト
VIM=/Applications/MacVim.app/Contents/MacOS/
PATH=$PATH:${VIM}
PATH="/usr/local/opt/tcl-tk/bin:$PATH"
PATH="/Users/chesscommands/.python-version:$PATH"
export PATH
```

他のファイルでは、PATHをいじっておらず、このファイルだけで、しかも、たったこれだけの設定だけなのに、どこで設定されているのか分からないものが追加されているのは気持ち悪い。
他には、

```terminal:プロンプト
[Qiita@chesscommands ~] $ ll /etc/paths.d/
total 40
-r--r--r--  1 root  wheel  47 10  9 00:33 com.vmware.fusion.public
-rw-r--r--  1 root  wheel  15  9 28 16:20 dotnet-cli-tools
-rw-r--r--  1 root  wheel  24  9 28 16:20 dotnet
-rw-r--r--  1 root  wheel  61  9 27 10:29 mono-commands
-rw-r--r--  1 root  wheel  18  9 10 03:55 go
[Qiita@chesscommands ~] $ ll /etc/manpaths.d/
[Qiita@chesscommands ~] $ cat /etc/paths
/usr/local/bin
/usr/bin
/bin
/usr/sbin
/sbin
[Qiita@chesscommands ~] $ cat /etc/manpaths
/usr/share/man
/usr/local/share/man
[Qiita@chesscommands ~] $
```

う〜ん。
他の設定箇所はどこにあるのだろうか。

### 諦める。
ここまで読んでいる場合、最初の説明部分は忘れているかもしれないが、pygameのサンプル実行でエラーになっていた。
しかし、勉強用に読んでいる本のサンプルプログラムは実行でき、エラーにならなかった。
故に、それで満足することにする。



















## Go言語環境構築
冒頭で述べたとおり、Go言語のGUI開発は絶望だが、一応はある。
と言うことで、「やさしいGo言語入門」通り、コマンドを打ち込み、Go言語開発環境構築後に、GUI開発環境を導入する。

```terminal:プロンプト
[chesscommands@Qiita ~] $ go get golang.org/x/exp/shiny
package golang.org/x/exp/shiny: no Go files in /Users/chesscommands/go/src/golang.org/x/exp/shiny
[chesscommands@Qiita ~] $
```

何でだよ。
確かに、書籍では、Pathのshiny末尾に何かを記載するかのような記載だったが、具体的な記載は無かった。
だから省いていいと思ったのだが・・・ぬぅ。

```terminal:プロンプト
[chesscommands@Qiita ~] $ go get golang.org/x/exp/shiny/...
[chesscommands@Qiita ~] $ echo $?
0
[chesscommands@Qiita ~] $
```

嘘だろ。
省略するのかと思った記号を打ち込んだら成功した・・・のかな？

そして、書籍通りにサンプルプログラムを作ったが、うまく動かない。

```terminal:プロンプト
Failed to get state - detached from the process
Process exiting with code: 0
```

~~プログラム終了が異常終了になってしまう。
う〜ん。
しかし、一応は出来たように見えるので、問題ないと判断して置こう。~~

何せ、本格的なGUI開発からはほど遠く、初学者本の1ページ目を読んでいるのだから・・・先は長いが、無職だから時間はある。
技術力を身につけて、就職活動を頑張ろう。

書籍通りにプログラムを組んだ場合、ウィンドウが表示されないように感じた。

case文に ```paint.Event``` の振り分けを付け、 ```w.Publish()``` を呼び出す必要があるようだ。
これが何かはまた後で調べる。
　　[公式(?)ページ](https://godoc.org/golang.org/x/exp/shiny/screen)にはそれらしい説明が一切無かった。むしろ、付ける必要も無いような感じで説明していた。
以下全文。

```go:sample.go
package main

import (
	"fmt"
	"log"

	"golang.org/x/exp/shiny/driver"
	"golang.org/x/exp/shiny/screen"
	"golang.org/x/mobile/event/key"
	"golang.org/x/mobile/event/lifecycle"
	"golang.org/x/mobile/event/paint"
)

func main() {
	driver.Main(func(s screen.Screen) {
		w, err := s.NewWindow(&screen.NewWindowOptions{
			Title:  "sampleWindow",
			Height: 500,
			Width:  500,
		})
		if err != nil {
			log.Fatal(err)
		}
		defer w.Release()

		for {
			e := w.NextEvent()
			switch e := e.(type) {
			case lifecycle.Event:
				fmt.Printf("%v\n", e)
				if e.To == lifecycle.StageDead {
					return
				}
			case key.Event:
				fmt.Printf("%v\n", e)
				if e.Code == key.CodeEscape {
					return
				}
			case paint.Event: // ここが必要。
				w.Publish()

			case error:
				log.Print(e)
			}
		}
	})
}

```


参考：[GoLangを触ってみた#その4](https://triobog.hateblo.jp/entry/2016/05/07/180000)





















# 感想
簡単にGUI開発に取りかかれるPythonがいい(環境構築にはべらんぼうな時間をかけてしまったが)。
動機付けしやすいのは、GUI開発だからな。
コンソール上でちまちまするのも良いのだが、目的意識を見失いやすいため、動機付けをはっきりするためにもGUI開発で小さいゲームを作って自信を付けたい。
無理矢理努力しなければプログラミングしないのだからプログラマーに向いていないと言われればそれまでだが・・・。

学びやすいのはGo言語だよな(IDEの自動整形がいい)。
そして、習得はどちらも難しい。

まさか、環境構築で数週間費やすとはな・・・。
以上。

追伸。
PATHに、"~/.dotnet/tools"が含まれているのも気持ち悪い。
無駄でゴミなPathだと思うのに、消せない。気持ち悪い。