人気ブログランキング |

体重と今日食べたもの

k1segawa.exblog.jp

ダイエット

ブログトップ

[Go] Windows10 ARM 64bit Raspberry Pi 3B+ インストール&起動 [windows arm v7] (3/4)

(2019/3/9追記)
Goをまったくインストールしていない環境でも実行出来るということ。これはWindow PCでもWinラズパイでも同じ。

(2019/3/5追記)
P.S.にWindows PCでクロスコンパイル、Winラズパイ上のVS Code画面を追加。P.S.2.にlife追加、P.S.3.にhttpなど追加。
(ここまで)

Google Go v1.12 が出たので、Winラズパイにインストールし、ビルドしてみる。ARMネイティブアプリが簡単に作れた (ストアアプリではない) 。

【手順】
以下のサイト様を参考に。

まずダウンロードは、以下のサイトへ。
download page をクリックし、Windows 32ビット用インストーラ版をインストール。64ビット版はWinラズパイにはインストール出来ませんでした。
a0034780_18074038.png
インストーラーはx86 on ARM エミュ上で動くので遅い。インストールディレクトリはデフォルトのC:\Go\とした。
インストール後、サイト様の通り、以下の手順で実行、ビルドを確認。環境変数は未設定で可能。

package main

import "fmt"

func main() {
fmt.Printf("Hello world\n")
}

とメモ帳で書いて、c:\<ユーザ名>\Documents以下にhello.goで保存。
管理者権限(不要かも)PowerShell(別にDOSでも良い)で開いて、c:\<ユーザ名>\Documentsに移動。PS(Powershell)だと以下の通り(DOSなら.\hello.go)。

go run ./hello.go
Hello world

と表示された。
ビルドもやってみる。

go build ./hello.go

1.8MBほどのhello.exeが作られた。
実行すると同様に出力。PS(Powershell)だと以下の通り(DOSなら.\hello.exe)。

./hello.exe
Hello world

これはランタイムなどすべて含むからで、この場合、たぶんi386用の実行形式と思われる(Window PCに持って行って実行したら実行出来た。i386用だった。そしてこの後出てくるWindows ARM版のはWindows PCでは実行できなかったので予想は正しかった)ので、x86 on ARM エミュで動いている。
なので、今度は環境変数を次のように設定する。

Powershellを管理者権限(不要かも)で開く。c:\Users\<ユーザ名>\Documentsに移動。
set GOOS=windows
set GOARCH=arm
set GOARM=7

go build ./hello.go

微妙にサイズの違うexeが作成された。PS(Powershell)だと以下の通り(DOSなら.\hello.exe)。
./hello.exe
Hello world

きちんと表示された。最初ダウンロードサイトにARMはLinuxしかないので、s390xなんてIBMホスト用リリースしてるんならWindows ARM版が先と思ったが、リリースされていないにもかかわらずちゃんとビルド出来たのでよしとする(ビルド自体は可能になったと、リリースノートに書いてあるようだ ー Go 1.12 リリースノート - Qiita)。でも出して欲しいよ。

下記サイト様によると、
OSはWindows/Mac/Linux、アーキテクチャは386/amd64/ARMで、この中にWindows ARMの組み合わせが無かったので。
Go のクロスコンパイル環境構築 - Qiita

最初GOARMを設定してなくて表示されず、次にGOARM=6でも表示されず、見直してGOARM=7に設定した。全部微妙にサイズが違うのできっと別物なのだろう。
GOARMについての参考サイト様はこちら。
golang のバイナリをRaspberry pi用にWindows 上でクロスコンパイルしてputtyで転送する

2つ上のサイト様はGo 1.3の頃なので今のGo 1.12では組み合わせも異なっているのかもしれない。出来てよかった。それとクロスコンパイルの準備という項目も今のところ必要ないようだ。

これ、Windows PCでこの設定で作れば、よくね?ネットワーク共有すればARMネイティブサクサク作れるんじゃ?

P.S.
Windows PCの方でgo(amd64)をインストールし、ビルドしたwindows arm 7 用exeがきちんとWindows ラズパイ上で実行された。これで遅いラズパイでなくても開発出来る。ラズパイ側でも開発出来るけどね。秀丸ストアアプリとかあるし。

以下に共有の設定・参照方法を示す(よく忘れるので)。
【Windows PC側共有設定】
0. goインストールすると、デフォルトでc:\Users\<ユーザ名>\goがPATHに追加されるので、goフォルダを新規作成。
1. ネットワーク共有でgoフォルダを共有
エクスプローラ>goフォルダ右クリック>アクセスを許可する >特定のユーザ...>ユーザ名
家内LANなのでユーザ名はWindows PCのログイン名を選ぶ(所有者となっているはず)
共有ボタンを押す
共有されたネットワークパス名(\\PC名\Users\<ユーザ名>\go)が表示される。
(PC名は覚えられないので共有したフォルダのプロパティで共有タブを開き、共有ボタンを押し、表示されたユーザ選択画面で再度共有ボタンを押し、表示されたダイアログの一番下の「コンピューター上の全てのネットワーク共有を表示します」のリンクをクリックすると現在共有中のディレクトリ名(goフォルダ)が参照出来る。そのまま開いとくといい。エクスプローラで\\localhostと入力してもPC名は出ない)

【Windows ラズパイ側共有参照】
1. エクスプローラのパス名入力エリアに上記のネットワークパス名を入力する
2. ユーザ名とパスワードを問い合わせてくるので、Windows PCで共有設定時に指定したユーザ名 - Windows PCのログイン名と、Windows PCのログインパスワードを入力
3. goフォルダの内容が見えるようになる
または
1. DOSプロンプトかPowershell上でネットワークドライブを指定
2. net use R: \\PC名\Users\<ユーザ名>\go (R:でなくてもいい)(起動後初回のみ。PSで2回目だと聞いてこない。DOSだと2回目はすでに定義済みエラーと出る)
3. ユーザ名を入力してください:Windows PCのログイン名
4. Windows PCのログインパスワード
5. goフォルダの内容が見えるようになる
6: R: (コマンドでネットワークドライブRに移動)
7. エクスプローラはR:では見えない(再起動して再度net use定義すると見える?Windowsわかんねー)

【あとは最初の手順でWindows PC側でgoフォルダ内にPS(DOSプロンプトでもいい)で移動し、notepad等を使ってhello.goを作成、環境変数をwindows/arm/7に設定してビルド】
【Windowsラズパイ側のコマンドプロンプトで ./hello.exe で実行する(DOSプロンプトなら.\hello.exe)と、Hello word と表示される】


P.S.2.
Visual Studio Codeもx86 on ARMエミュだが動く。ダウンロード41MB,インストール時162MB消費。go言語もサポートされているのでシンタックスハイライトとか余裕。
なんとか使える。【UHI-I,II,III】の記事内の対応(タイムラインの停止、スタートアップアプリの無効化、高速スタートアップの無効化、バックグラウンドアプリの無効化)をやっておけばね。あと2KモニタはDipslay=virtual 1024 x 768 ぐらいにしとく。WindowsのOSインストール時は、高解像度だと描画メモリ確保だけで、ラズパイのメモリオーバーでクラッシュの原因だから。
以下はc:\Go\src\time\time.goを開いた様子。
a0034780_07421105.png
Windows ARM普及させるならこういう開発ツールもストアアプリ化しないと。

C:\Go\doc\play\life.goをC:\Users\<ユーザ名>\goにコピーし、ビルドするとこんな感じ。PS上。
a0034780_11433980.png
毎秒20枚ぐらいの書き換え出来てそうなくらい普通に実行する。

以前は環境を気にしないとビルドやパッケージを使えなかったが、パッケージに関してもインストール時にC:\Go\srcに入っているソースでインポートできるようだ。ソースなのでわざわざARM用にビルドしなくてもよい。そしてgithub.comにアクセスして最新のリポジトリを取得しなくても、パッケージを使える。なのでgo get github.com/~などとやらなくてもよい。これを実行するにはgitのインストールが必要となるので、それも不要。ずいぶん敷居が低くなったなー

以下のサイト様のソースでimage パッケージをインポートしたソースをビルドしてみる(hello.goもfmt パッケージ使ってるけど)。
最初のソースをc:\Users\<ユーザ名>\goに新規作成しビルド。

PS上での実行結果がこれ。
a0034780_12554013.png
サイト様の解説通りに画像サイズが取得できている。

イメージ描画やGUIはプラットフォームに深く依存するので、共通の基盤はOpenGL辺りか。glfwやgxuiが共通性は高い。どちらにしてもインストールベースでどこまで出来るかはまだ調査中~。なので必要ならgoの便利ツールもあるし、Windows PCやMac側にgit入れて go get github.com/~を行う。ホスト側はVS Codeでgo をビルド実行出来るようにするとコンソールでとっ散らかった状態にならないのでいいのかも。Winラズパイには過負荷動作や容量的にどうかな。ホストがWinならWin32 ラッパーのライブラリWALKが軽いみたい。ホストでもWInラズパイでもリビルドだけで動くんじゃないかな。

いろいろGoの参考サイトはあるので、GUIは試行錯誤が必要。VS 2017 でARM64ネイティブも年末サポートされたしなー

engi (スプライト) : Go言語でゲーム開発 - Qiita

なるほど。goはgoで書かれていて、コンパイルするgoは1.4なのね。go1.12src.tar.gz解凍してsrc\go\ReadME.mdのInstalling Go from source見てわかった。なので、srcにあるall.batが返すエラーコードが1.4のディレクトリが無いと言っているのか。


P.S.3.
image/draw
net/http
のパッケージは以下のサイト様のサンプルを実行。DOS上での実行結果は以下の通り。
a0034780_18204103.png


a0034780_18204593.png

動くのが普通みたいに、コピペ&ビルド&実行が余りにも手数が少なくて驚く。Windows ARM用にクロスコンパイルしてるのを全く意識しない。

Windows PC側で、サイト様にお借りするサンプルをブラウザで開き、コピーして秀丸に張り付け保存し、あらかじめGOOS/GOARCH/GOARMを定義してネットワーク共有ディレクトリで開いておいたPS(DOS)画面で、go build ./xxxxx.go (DOSなら.\xxxxx.go)のxxxxxを書き換え、Enter(ビルド)。続けてWindows ラズパイ側で、あらかじめネットワーク共有ディレクトリで開いておいたDOSプロンプト画面で.\xxxxx.exeと打つだけ(PSなら./xxxxx.exe)。
Windows PC上でブラウザ1画面+エディタ1画面+PS(DOS)1画面、Winラズパイ上でPS(DOS)1画面(+FIrefox Nightly1画面:httpサンプルの場合)。たったそれだけ。コンソール画面上でクロスコンパイル。Linuxじゃない。両方Windowsだ。環境設定も単にインストールするだけだったし、せいぜいc:\users\<ユーザ名>\goフォルダを作ったぐらい。こんなにWindowsで敷居が低いクロスコンパイル環境って無いんじゃ。ウィンドウやグラフィック、GUIのパッケージをインストールするためにgit on Windows入れてちょっと注意してWalkやglfw、ゲームエンジンならAzul3Dやengoをgo get github.com/〜等でリポジトリから取って来てビルドするくらい(容量的にWinPCだけでいい。まだやってないが)。文法に慣れるまでコーディングは大変だが、それを越えたら環境構築負荷が少なくて少なくて。エディタもVS Codeがビルド・デバッグまで対応しているので重い環境をインストールしなくてもいい。Go言語すごいな。


P.S.4.(ここは自分に向けて独白)
サンプルでいいから動かしてみよう。言語習得はまず真似から。興味のあるところから手を付けていっていい。もっと難しい事も出来るようになりたいと思えたら、そこからが力の掛けどころ。どうやればそれが出来るのか、調べて調べて調べまくってたどり着いた頃にはもうちょっとしたソースは書けるようになる。そこから興味を途切れさせないテーマを見つけ続けるのが継続するコツ。ゲームならスプライト・障害物判定や自動追尾・追っかけルーチン、仮想画面、スタミナや摩耗度付加などゲームをよりリアルになる属性を与えると継続の意欲が湧く。実際に使えるツールに近づけると勉強という与えられた受け身のものでなくなる。リアル化。自分で体験すると感動を呼ぶ。エクスペリエンス。ライブ。そして最後はグラフィックや完成度にはこだわらないこと。それがプレッシャーになり、自分を枠にはめてしまう。いつかやると思ってセーブしておけばいい。新しく一から作り直してもいい。別のゲーム・ツールを作ってもいい。冷静にならない。夢中になってやる。それが自分のような凡人でも何か一つ出来るようになる方法。

by k1segawa | 2019-03-04 18:29 | Raspberry Pi | Comments(0)