2022/01/30

Unity Editorの使い方がさっぱり分からん (3) - Importは毎回か

会社で Oculus の話で盛り上がっていたとき(持ってなかった私以外)、VRChat でアバターがどうのこうのという話をしていた。
もちろん、私は興味を持たないまでも情報だけは仕入れていた。
で、手に入った今、アバターなるものを作ってみようではないかと思った。

 

Oculus Developer Hub の SDKコーナーに「Oculus Avatar SDK」というのがあったので条件反射的にダウンロードをクリック。
その後で説明文を読み、今は「Meta Avatar SDKを使ってね」という一文に気付く。。。

Meta Avatars SDK は隣のタブ「Other Packages」にあったのだが、ダウンロードしてもくるくる回ったままで一向に終わらない。
サイトを見るとダウンロードボタンがあって、押すと「MetaAvatarsSDK.unitypackage」というファイルがダウンロードできた。
インストールといっても Unity のパッケージなのね。
このファイルをダブルクリックすると Unity が起動するのだが、なんだかよくわからない。何もしていない?

Meta Avatars SDK for Unity (1)|インストール・サンプル動作確認などの初期環境構築 - デニッキ!
https://xrdnk.hateblo.jp/entry/2022/01/04/004851

どうやらプロジェクトを作った後に行うと、そのプロジェクトに対して Import するということらしい。
まあ、アバターなんて毎回いるものでもないから、そういうしくみなのだろう。

Newtonsoft.Json.dll の重複エラーは↑の人と同じく出た。
たぶん DLLファイルを削除しても良いし、 Import のときに出てくるファイルから DLL だけ取り除いてもよいのだと思う。

Standalone版(PC版のこと?)と Android版の両方を設定するらしい。
PCの方は使わないからなくてもよいのかな?

この人のまねをしたつもりになりながら進めていったのだが、ビルドすると Oculus.Platform がない、と怒られる。
これは PC版の設定をしなかったからか、と追加したけどダメ。
Visual Studio Community をアンインストールした祟り(?)だと思ってインストールしたが、ダメ。

 

もう思い当たるものが無いんだけど~、と記事を読み返すと、最初の方で Oculus Integration のインポートという作業をされている。
私も昨日 Package Manager にあるのを確認したし、今回も My Assets に出てくるのを確認した。
ん? もしかしてこれも My Assets に出てくるだけじゃなくて Import が必要??

・・・はい、そうでした。
Import すると時間がかかって処理され、ビルドを行うと成功した。
文章で分からなかった「上部メニューの Oculus > Avatars > Edit Settings を選択」も、Import するとメニューに Oculus が出てく来た。

image

とにかく、追加機能は基本的にプロジェクトに対して Import していくということね。

image

ポーズが変なのは、コントローラとゴーグルを同じ手で持っているため。


しかし、5年くらい前に組み込み開発が満足に出来る程度と考えて購入した PC では Unity のビルドが非常にきつい。
このサンプルだって、ビルドだけで 20分以上かかっているのだ。

パソコンの組み立て販売で「クリエイティブ向け」というのがあるが、こういうので楽々ビルドできるようなスペックなのだろうな。

Unity Editorの使い方がさっぱり分からん (2) - SceneはX-Z平面か

前回、表示が変になった(自分でしたのだが) Scene を元に戻す方法が分かった。
タブを削除して追加するという方法なので、正しいかどうか分からんが簡単だ。

では、改めて Scene がどういう風に見えているのか確認しよう。

本を買った方がよいのだろうか。
ツールの使い方が全部で共通なのか、Oculus などの個別で違うのかがよくわからんので、判断を下せないところだ。


右上のは Orientation と出てきたので、方向を表しているのだろう。
そういえば、なんで入学したときとかの集会はオリエンテーションって呼ぶのだろうね。何も染まってない群衆に方向付けをする作業だからか?

 

たぶん、これは見えているままを表していると思う。
左が x軸の正方向、上が y軸の正方向。
Frontという表示が左方向矢印になっているので、x軸の正方向が正面ということだろう。

image

ここで Orientation の xの赤い部分をクリックすると表示が変わった。
y軸はそのままでこちら側に Front が向いた形だ。
z軸の左側が正方向。つまり、ボールと床の接点が原点(Oってやつね)で、下の画像でいえばそこから右下の平面が X-Z平面の第1象限になる、という認識で良いのか。

image

なんとなくだけど、私の中では z軸が垂直方向を表すイメージだったからちょっと意外だった。

たぶん、スクリプトの PlayerController.cs で Input.GetAxis() しているところも "Horizontal" と "Vertical" が Vector3 コンストラクタの第1と第3に割り当てて第2はゼロになっているのも X-Z平面だからだろう。


ツールバーの View Tool 以外を選んでいる状態でオブジェクトをクリックしていじると、直接パラメータが変更できるのね・・・。
変更だから、Scene のタブを閉じて追加みたいなことをしても元に戻らん。

Hierarchyペインの方にアスタリスクが付いていると変更されて保存していないという状態のようだから、該当する Sceneのメニューから Discard changes すると元に戻るようだ。

image 

Unity Editorの使い方がさっぱり分からん (1) - Sceneを元に戻したい

わからんシリーズだ。

前回、Oculus のチュートリアルに従って Unity のアプリを作った。

初めてのVRアプリを構築する | Oculus開発者
https://developer.oculus.com/documentation/unity/unity-tutorial/?locale=ja_JP

Build Your First VR App | Oculus Developers
https://developer.oculus.com/documentation/unity/unity-tutorial/?locale=en_US

さっき気付いたけど、ページのロケールは右下から変更できるのだな。

 

動いただけでは面白くないので、Unity Editor の真ん中のところでぐりぐり動かしていた。
いたのだが、床が遠くの方に行ってしまった.....

image

元に戻したいのだが、操作方法がさっぱり分からん。

 


フローとしているツールバー。

image

どのツールを選択しているときでも、右ドラッグするとマウスカーソルが目の形になって視点を変えられるようだ。

image

ホイールで表示倍率が変わっているような気がするのだが、いじ繰り回していたせいで水平線しか見えない状態になってしまった。。。
保存せずに開き直したら直ってくれるかと思ったが、変わらず。

グリッドすら表示されなくなった。これがズームのせいなのか、どっかいじってオフにしてしまったのかも区別が付かない。

image

たすけてー

ちなみに、タブを Scene から Game にするとちゃんと出てくるから、オブジェクト?が壊れているわけではないだろう。


あ、 Scene タブを Close して、Add Tab で Scene を追加すると元の状態に戻った!

image

Scene は直接アプリの動作には関係しないから、単に今の Scene タブの状態を保存しているだけということかしらね。

VRゴーグルを買いました (2)

2回目です。

hiro99ma blog: VRゴーグルを買いました
https://blog.hirokuma.work/2022/01/vr.html

私はふだん眼鏡を装着しているのだが、ゴーグルのカバー部分がどうしてもぶつかるのだ。

image

押し込めはするのだが、少し痛いし、ゴーグルを外すときに眼鏡も持って行かれてしまう。
ゴーグル内にレンズを取り付ける方法もあるようだが、PC と行ったり来たりするには不便だ。

カバーを外してやっているのだが、ゴーグル側のレンズが凸状なので距離感を間違えると眼鏡とぶつかってしまう。
なのでまぬけな図柄になるのだが、外したカバーを眼鏡の方に装着してゴーグルを近づけるようにしている。重たいんだけど、ぶつかるのが嫌なときはそうしている。

ゴーグルのレンズ周辺に取り付けるカバーも売られているようだ。
あとは、眼鏡のフレームが小さめになっているというVR向け眼鏡というものもあるそうだ。いろいろあるねぇ。
コンタクトレンズにすれば解決するのだろうけど、ちょっと抵抗があるのだ。。。


さて、開発をやろう。

まだ納得がいかんのは、Android Studioでインストールした build-tools を使っている場合、複数インストールされていても最新のバージョンが使われているところだ。

Player 設定で gradle を custom にできるので、 Main と Launcher をチェックしてテンプレートファイルをプロジェクトにコピーさせ、buildToolsVersion を指定するとエラーが出なくなった。

image

プロジェクトを作るたびに更新しないといけないのがネックだが、build-tools を選択できるというのは安心できる。
複数 build-tools をインストールする必要はあまりないのかもしれないが、たとえば React-Native では 0.67.0 でも 29.0.2 を指定しているので、やむを得ずってことがあるだろう。

毎回やるのが面倒なら、本体の方を書き換えてしまうのもありだろう。

C:\Program Files\Unity\Hub\Editor\<バージョン>\Editor\Data\PlaybackEngines\AndroidPlayer\Tools\GradleTemplates

Unity のためにやるんだから、Android SDK の方を変更するよりは私の精神衛生上よいのだ。


コピーされたテンプレートを見ていて気付いたがまだ jcenter が入っているのだ。
まあ Unity Editor が 2020.3 だから仕方ないか。
しかし 2022年2月1日で jcenter はアクセスできなくなると聞いているので、心配だ。が、Androidの方には「既存は無期限でダウンロードできる」と書いてあるな。

image

とはいえ、無期限というのをいつまで信用できるかわからないし、更新なんかはもうされないだろう。

 

そうなると、Beta 版が気になってくるわけですよ。

image

お仕事で使うわけでもないし、いいよね。

  • jcenter はそのままだった
  • JDK や SDK の設定は残っていた
  • NDK の設定はクリアされていて、r21.3.6528147 を求められた
  • Oculus Integration は My Assets に入ったままだった(よかった...)
  • buildToolsVersion は 32.0.0 だとまだエラーになった(テンプレートを 29.0.2 にしたら通った)

前のバージョンでプロジェクトを作っているので、新規でやってみらんと分からんな。

 

せっかくインストールした Beta版だが、やはり LTS版に戻すことにした。
Learn で用意されているプロジェクトが Beta版だと使えない(表示もされない)からだ。
まあ、違いが分かるわけでもないし、Beta版じゃないとできないこともわからないからよいのだが、NDKをまたインストールし直すのが手間だな(ストレージに空きがないので絞りに絞っている)。

2022/01/29

VRゴーグルを買いました

なんとなくVRゴーグルを買ってしまった。
目を使うデバイスはあまり興味がなかったのだが、一度使わせてもらったら興味を持ったというところだ。

買ったのは、Oculus Quest2
Oculus社を Facebook社が買収して、Facebook が Meta に社名を変更したので名前がどうなったのかよくわからんが、ページには Oculus Quest2 と書いてあるからそう呼ぼう。


Facebookアカウントを作り、Oculusアカウントを作って Facebookアカウントと関連付ける。
Quest2 ではない Android端末に Oculusアプリをインストールし、そちらも Facebookアカウントでログイン。
Quest2 の起動時にも Facebookアカウントでログイン。
開発者モードにするには、Android の Oculusアプリと Quest2 を Bluetoothで連携し、デバイスのページから開発者モードのスイッチをONにする。

するのだが、事前に Oculusアカウントの方だと思うが開発者申請のような作業をしておく。
かねはかからないのだが、電話番号かクレジットカードの登録がいるようだった。


サンプルアプリを動かしてみよう。

Oculusスタートガイド(Unity) | Oculus開発者
https://developer.oculus.com/documentation/unity/unity-gs-overview/

Unity じゃなくてもできるのかもしれないが、せっかくチュートリアルがあるので従おう。

私は既に Android Studio をインストールして使っているので、これらをインストールした。

  • Oculus Developer Hub
  • Unity Hub
    • Unity Editor 2020.3.26f1

Unity は Android向けだけ使えれば良かったのだが、デフォルトで Windows(あるいはインストールしたOS)が使えるようになっているようだった。

開発とテスト用にデバイスを有効にする | Oculus開発者
https://developer.oculus.com/documentation/unity/unity-enable-device/

ここから手順に従ってアプリを作っていくのだが、作ったプロジェクトはデフォルトで「現在のプラットフォーム」で立ち上がるようだった。

image

EDITOR VERSIONをクリックすると選択できたので、Android を選択して OPEN するのがよいだろう。

image

タイトルに「Android」と入っていれば、Android 向けになっているはずだ。

image

Windows向けのを作らないので選択肢から削除したいのだけど、できるのかわからんかった。

 

Oculus統合パッケージのインポート | Oculus開発者
https://developer.oculus.com/documentation/unity/unity-import/

メニューの Window > Asset Store で何か登録するらしいのだが、引っ越したらしい。

image

Package Manager からやってくれと書いてあるので、メニューの Window > Package Managerを立ち上げる。
では、次は・・・。

image

うーん??
「oculus」で検索しても Oculus XR Plugin しか出てこないが、これではない気がする。

英語版の方を見ると、この記述は Unity Editor 2019.4.x のものらしい。
今は 2020.x が最新だから無視して良いのだろう。

image

2020.x だとこうなる。

  1. Unity で新しく 3Dプロジェクトを作る
  2. Unity Asset Store(ブラウザ版)を開いて "Open in Unity"をクリックする...と書いてあるが、 Add My Assets しかないので押した。FREE と書いてあるしまあよかろう。
  3. image

  4. サイトの方では購入したようなメッセージが出てきたので Unity Editor に戻る。
  5. Package Manager で My Assets を見ると Oculus Integration が出てくる。更新がいると思う。
    image
  6. Upgradeボタンがあるなら押すらしい。出てなかったからわからん。代わりに右下にあった Download をクリックするとダウンロードが始まった。
  7. Import Unity Packageウィンドウがどうのこうのらしいが、Importボタンが出ていたのでクリックした。ああ、クリックしてしばらく待つと Import Unity Packageウィンドウが表示された。こっちにも Importボタンが出ていたので押す。なんかすごく時間がかかる。いろいろ立ち上げたり別のことしていたとはいえ20分以上かかるとは。
  8. OK とかすると、あれ、OpenXR って出てきたな。Restart を求められたのでボタンをクリック。
  9. もう1つ別のプラグインもアップデートされて、Restart を求められたのでボタンをクリックして再起動した。

すごく時間がかかった。
それはともかく、このページは英語の方が新しいのだけど、日本語の時とリンクは同じだ。そしてページ自体に言語切替がなくて、Oculus アカウントの言語設定が反映されているように見える。

Import Oculus Integration Package | Oculus Developers
https://developer.oculus.com/documentation/unity/unity-import/

さっきまで日本語ページを見ていたので、説明が古かったかもしれない。


プロジェクトの設定。

Configure Unity Settings | Oculus Developers
https://developer.oculus.com/documentation/unity/unity-conf-settings/

  1. File > Build Settings.
  2. Platform を Android にする
  3. Texture Compression を ASTC にする。
    image
    とかゴニョゴニョしていたら、また Importing が始まってしまった。なんでだ??
  4. Run Device は設定がいるらしい。チュートリアルでは Unity Editor のインストール時にチェックしておくよう書いてあったのだが、既にインストールしていたのでやってなかったのだ。
    image
    Edit > Preferences の Android項目で設定できるのだが、いろいろうるさい。JDK は 1.8.0 じゃないと warningが出るし、 11とかにすると選択もできない。NDK も最新版はダメで r19 じゃないとダメ...いや、r19.0.5232133 じゃないとダメだそうだ。 obsolete なのに......
    image
    Android SDKはともかく、JDK と NDK は Editor に任せた方がよかったかもしれんが、選択肢が SDK & NDK だから片方だけってわけにはいかんのだ。
    image
    ここまで設定すると Run Deviceがアクティブになるので、Oculusを選択する。
  5. Development Buildはチェックを外すそうだ。パフォーマンスの関係らしい。

プロジェクトの設定も行う。

  1. Edit > Project Settings > Player
  2. Company Name や Product Name, Version を更新したければする
  3. その下の方のタブを Android にして、Other Settings > Identification の Package Name を変更したければする
  4. Version、Bundle Version Code、Minumum API Level、Target API Level などもお好きなように
  5. 左の項目を Player から XR Plugin Management に変更
  6. インストールのボタンがあるのでクリック
  7. しばらく待つとチェックボックスが出てくるので、Oculus をチェック。そうするとしばらく待つことになる。まあまあ待つ。もはや10分以内なら「まあまあ」程度だ。
  8. 左のペインに Oculus が増えているので、選択
  9. 何か変更したければするとよいらしい
  10. 続いてレンダリングの設定。 左のペインで Player を選択
  11. Android タブの Other Settings > Rendering
  12. Color Space を Linear に変更。まあまあ待つ。
  13. Auto Graphics API はチェックしないままでよい。 Oculus Quest は Vulkan をサポートしているが実験扱いのようで、OpenGL ES 3.0 を使うことを推奨しているらしい。
  14. Multithreaded Rendering はチェックをしたままで良い。
  15. Low Overhead Mode というオプションがあるらしいのだが、見つからんかった。
  16. はい、次は Quality設定。左のペインで Quality を選択
  17. Pixel Light Count は 1
  18. Texture Quality は Full Res
  19. Anisotoropic Textures を Per Texture に変更
  20. Anti Aliasing は 4x
  21. Soft Particles はチェックを外す
  22. Realtime Reflections Probes はチェックあり
  23. Billboards Face Camera はチェックを入れたままで良いのかな

お疲れ様でした・・・。
これ、毎回プロジェクトを新規作成するたびにやるのだろうか・・・。
きっと、Ocurus 用テンプレートとかあるに違いない。

ようやく最後にサンプルとして表示する中身を設定する。
もう、かいてあるとおり二やるだけだ。

Build Your First VR App | Oculus Developers
https://developer.oculus.com/documentation/unity/unity-tutorial/

で、最後に Build and Run。

・・・エラーになった。

UnityでAndroidのbuild時に「Gradle build failed. See the Console for details」エラーが出た時の解決法 - Qiita
https://qiita.com/tak001/items/e7a5f21742d463a37a39

なるほどねー。
私の環境では複数バージョンの build-tools が入っているんだけど、どうやって選択しているんだろうか。

 

書いてあるとおりにやってやり直して、ようやくインストールされた。
わーい。

image

しかし・・・このボールはどうやって動かすんだろうか。

ああ、右手のコントローラしか使っていなかったので左手は電池を抜いていたのだが、左コントローラのスティックで動かせた。

 

疲れた。
そして、チュートリアルをやっている過程で私の PCがストレージ不足に陥ってしまった。
プロジェクトのディレクトリは 2.5 GBもないのだが、ダウンロードしたりして AppData とかが多くなったのだろうか。あるいは単に今までがギリギリくらいだったのか・・・。

2022/01/26

[android] QR Read/Gen

前回つくった Android アプリがようやく承認された。
まあ、数年ぶりだったので、ほぼ新規での審査と同じだったから時間がかかったのだろう。

https://github.com/hirokuma/android-qrcode-genread

 

特にいじったわけでもなく、自分の署名を付けただけです。

QRcode Read/Gen - Google Play のアプリ
https://play.google.com/store/apps/details?id=com.hiro99ma.qrgenread

ボタンが2つある。

  • 1つがクリップボードを読み取ってQRコードにして表示するボタン
  • カメラを起動してQRコードを読み取ってクリップボードにコピーするボタン

 

・・・あ、いま気付いたけど、QRコードを読み取った場合は画像を更新しないので、紛らわしいな。
カメラからスキャンした場合は画像を消してカメラアイコンを表示するようにした。

他の QRリーダと違ってカメラがすぐ起動したり、スキャンした結果からブラウザを立ち上げたりはしないが、シンプルで私が使うには十分だ。

2022/01/22

[android] QRコードを読み書きしたい

最近 QRコードを扱うことが多い。

GooglePlayで検索するとたくさん出てくるのだが、なんか決め手に欠ける。
勉強がてら作ってみるか。

https://github.com/hirokuma/android-qrcode-genread

 

自分で解析するわけではなく、誰かが作ったライブラリを使う。
ZXing のライブラリが有名なので、それを使うことにした。

ただ、ライブラリ単体だと使うのが面倒そうだったので、 com.journeyapps:zxing-android-embedded を使った。
gradle のここだ。
最初は com.google.zxing を使おうとしたのだけど、android-core と android-integration があって、IntentIntegrator ドキュメントに「別のアプリがいります」と書いてあったのでやめてしまった(書いてあるとおりインストールが求められる)。

 

あとはもう、あちこち見ながら作った。
MainActivity に参照したリンクを書いているので、気になる方はそちらをご参照ください。

持っている Android 端末にいちいち Android Studio を使ってインストールするのが面倒なので Google Play にアップしようとしたのだが、カメラを使うことになるのでプライバシーポリシーがいるのだね......
特に広告も入ってないので、ジェネレータを使わせてもらった。ありがたや。

App Privacy Policy Generator
https://app-privacy-policy-generator.nisrulz.com/

2022/01/16

[golang][grpc] gRPCサンプル

以前もやったけど、忘れてしまったのでやり直すことにした。

hiro99ma blog: [golang][grpc]protocの準備
https://blog.hirokuma.work/2021/11/golanggrpcprotoc.html

grpc の examples だけやりたいのに全部 clone したくないので、わざわざ fork してリポジトリを作った。
という名目で、README にやることを書き残した。探すのが面倒なのだ。

https://github.com/hirokuma/grpc-go-examples

ちなみに、fork してからブランチやタグを削除するのに以下のサイトが役立った。
ローカルのタグを削除して push --tags とかすれば同期されるのかと思ったけど、そうはいかないようだった。
一度 git tag で全部出して、改行を削除してから push して消した後にローカルを削除した。たぶん一度に格好良くやる方法はあるのだろうけど、まああんまりやる操作じゃないからよかろう。

リモートのタグを一括削除するときは–deleteを使おうと思った話 | WEB EGG
https://blog.leko.jp/post/should-use-delete-option-to-delete-git-branch-or-tag/

gitでブランチやタグを一括削除する - Qiita
https://qiita.com/wagase/items/2248e39460cae2768dd2

そのまま動かす tutorial 1 と、rpc に SayHelloAgain を追加した tutorial 2 を commitしている。
gRPC の Quick start と内容は同じで、ツールのバージョンを上げたり、proto ファイルを更新したりしているだけだ。


greeter_client は flag を使っているので、コマンドライン引数に --name と --addr を指定できるようになっている。
flag は go.mod にも出てこないので golang の標準ライブラリなのだろう。
"--help" と "-h" は何も指定しなかったらヘルプ出力をしてくれた。指定するとエラーにはならずオプションとして使えるようになる。
ショートのオプション名も付けたかったら、たぶん Var 付きの関数を使って複数割り当てるしかないのだろう。

 

便利なのだけど、まだ使いこなせてないなー。

2022/01/10

[golang] makeはいつ使うのか

プログラミング言語Goを読んでいる。

組み込み関数について説明があまり載っていないようだ。
説明するまでもないのか、章として説明するようなものでもないということなのか。


new と make

C++だと、new はヒープ領域にメモリを確保するものだった。コンストラクタを呼び出したりもしてくれる。
Cだと malloc()系の関数で、これもヒープ領域に確保する。
Javaはnew しかなかったっけか。覚えてない。

Goの場合、メモリを割り当てるという意味では newmake がある。
ただ、これがどうメモリを当てるかというのは new とか make とか、あるいは var とかで決定されるわけではないそうだ。

new

It's a built-in function that allocates memory, but unlike its namesakes in some other languages it does not initialize the memory, it only zeros it.

これが new の説明だ。
初期化はしないけどゼロにはするそうだ。ゼロにするのは初期化とは言わないのか?
ともかく、malloc() して memset()でゼロクリアするようなものだろう。

引数として型だけしか取らないようだ。

make

It creates slices, maps, and channels only, and it returns an initialized (not zeroed) value of type T (not *T).

さて、make は new と違って初期化はするがゼロ埋めするわけではないそうだ。
あるいは、ゼロにするとは限らないという意味だろうか。

 

そもそも、slice 変数を作ったとして、初期値を代入しないのであれば与えたいのは最初に確保しておくメモリサイズくらいしかないだろう。ゼロで埋めておいても特によいことはないと思う。 map もそうだろう。値を追加されてからが勝負(?)だ。 channel もゼロで埋めるんじゃなくて何か特殊なことをしないといけないような気がする。そういうのをひっくるめて「初期化」と呼んでいるんだろう。

そうなると、むしろ new はいつ使うんだろう。構造体か配列くらいか? 構造体も宣言時に代入で初期化できるし、複雑なものであれば New() のようなメソッドを用意する方がよいだろう(たぶんその中でも new は使わないんじゃなかろうか)。
配列のようにサイズが最初から決まっているならゼロでクリアされているというのはありがたい気がする。

 

new も make も使わずに var で宣言しただけの場合はどうなるかというと、その型における「ゼロ値」が代入されるそうだ。構造体であってもそのここの変数は「ゼロ値」で初期化されるのだろう。
「Go には未初期化の変数というものはない」ということなので、どちらかといえば new が異色なのか。でも未初期化にならないと言うことは配列であっても初期化されるはずだから、new はいらないんじゃないの・・・?

例は書いてあるのだけど、どうもピンとこない。
変数名を付けたくないけどメモリだけはほしい、みたいなときに使えるとかも書いてあった。

 

まあ、 new を使いそうになったら「new じゃなくてよいのでは?」と考えるようにしておこう。

2022/01/08

[golang] vscode と golang の import(2022/01/08)

今の私は、Ubuntu 20.04 で vscode 1.63.2 を使っている。
go のバージョンはこちら。

$ go version
go version go1.17.6 linux/amd64

 

Microsoft の go extension をインストールしているのだが、うまく動いているような動いていないような、よくわからないときがある。
プロジェクトの設定によるような、よらないような。。。

つまり、よくわかってなのだ。


formatOnSave

よくわからんやつの代表格。
設定項目は、"editor.formatOnSave" と、各言語向け設定の中にある "editor.formatOnSave" だけだと思っている。

01: {
02:     "[go]": {
03:         ....
04:         "editor.formatOnSave": false,
05:         ....
06:     },
07:     ....
08:     "editor.formatOnSave": false,
09:     ....

関連項目に "go.formatTool" もあると思う。

で、どちらにも false を指定している(おそらく共通設定の formatOnSave は個別の言語設定に項目があるなら使われないと思う)のだが、保存すると import が埋められてしまうので、設定が効いていないか別の項目が影響しているかだと思う。

Formatting
https://code.visualstudio.com/docs/languages/go#_formatting

特にそういう情報は載っていない。

 

settings.json で「 "go" 」と書いて Tabキーで自動補完?させると、こういう項目があった。

01:     "[go]": {
02:         "editor.codeActionsOnSave": {
03:             "source.organizeImports": true
04:         },
05:     },

これを false にすると、ファイル保存時に import が更新されなくなった。
つまりあれは format しているわけではなく import の整理をしているだけなのだ。

 

ではこの状態で vscode のコマンドで Format Document すると import が更新されるかというと、されない。
そう、 format は整形だけで、 import の整理とは別なのだ。
別のコマンドで「Organize imports」というのがあるので、そちらを実行すると importが整理された。

キーバインドはこうなっていた。設定した記憶がないので、vscode のデフォルトだろう。

01: {
02:   "key": "shift+alt+o",
03:   "command": "editor.action.organizeImports",
04:   "when": "editorTextFocus && !editorReadonly && supportedCodeAction =~ /(\\s|^)source\\.organizeImports\\b/"
05: }

Go言語用というわけでもないと思うのだが、どういうしくみなんだろうね?

 

Format Tool で "goimports" を指定しておくと format時に importも整理されていたのだが、最近はLanguage Serverなるものを使うのがデフォルト設定になっていて、その場合は Format Tool の設定は無視されるらしい。
「Use Language Server」を false にすると Format Document 時に importが整理された。

import を自動で更新してくれると便利でよいのだが、勝手にソースファイルが変更されるのが嫌なときもあるのだ。単純に「勝手に変わるのは気持ち悪い」というだけかもしれんが、まあそういうものだ。


あとは、文字色だけ付けるモードがあるとありがたい。
import が足りないとかそういうのはチェックせず、単に予約語などに色を付けるだけのモードだ。保存するたびに CPU負荷が上がるところを見ると、簡易的なコンパイルなり何なりを実行しているのだと思うけど、私の場合はそういうのいらないからさっさと動いてくれ、ということが多いのだ。

 

Microsoft の Extension を外して、 "Go Custom Format" で goimports などを指定すればだいたいよさそうな気がする(Format Document、ではなく extensionのコマンドで format することになるが)。
色を付けるのは vscode の設定だけでよさそう。もしかしたら今まで golang で使った設定が残っているだけかもしれんけど。

そんなに毛嫌いしなくても良いと思うのだが、Save して数秒間チェックしてから保存されたりすると、何もしないでいいから保存を先にしてくれ~といいたくなってしまうのだ。

 

あまり難しく考えず、遅いときだけ Extension を disable にしておく、でもよいのかもしれんし、Language Server を使わなくしただけで軽くなったような気がしなくもない。 gopls がないと起動するときに怒られるが、インストールしておくと使われてしまいそうなので、同じ名前の空のファイルを作って実行権限でも与えておくと良いだろう。そこまで毛嫌いしなくてもよいとは思うが。

[golang]結局「プログラミング言語Go」を買った

前回、買うかどうかくよくよしていたが、買った。紙の方。

プログラミング言語Go - 丸善出版 理工・医学・人文社会科学の専門書出版社
https://www.maruzen-publishing.co.jp/item/b304432.html

ネイティブのバイナリを作るし、もう少し慣れれば私の C言語以外の主要言語に格上げされることだろう。

 

私にとってこの本の良いところは、だいたいのところをカバーしていそうなところ(まだ読み切ってないので)と、プログラミング言語を扱ったことがある人向けというところだ。初学者向けだと、わかりやすく説明しているだけなのか言語仕様なのか判断できないことがあるからだ。あとは読んでいて「そういうのは分かってるから中身だけ書いてくれ」と思ってしまいそうだからというのもある。

電子書籍にするかどうかは少し迷ったところである。
紙媒体にしたのは、私が電子書籍だと読まないからだ。

この本として気をつけることは、go のバージョンが v1.5 になっていることだろう。
新しくなった部分は自分で取り込むしかない。


こうやって情報がまとまっていて助かるところは、調べようともしなかった情報に気付くことだと思う。

たとえば「ルーン(rune)」なんてものは存在すら知らなかった。%c なんだから文字コードだろう、などと決めつけてはいかんということだろう。
C言語だと「文字列」というのは「\0で終わるデータ」くらいのイメージしかないので、なんかこう Unicode とかそういうのはライブラリにお任せするのだが(そもそも私は文字列をあまり扱わないのだけど...)、言語仕様に入ってるなら知っておかないといかんよね。

 

しかし、それは目を通さないと情報に気付かないということでもある。
この本は約400ページくらいあり、絵や図はそこまで多くないし、コードもそこまでないので、つまり情報量がかなり多い本になる。密度が濃いといえばよいか。

なので、読むのにも時間かかるし、負担が結構かかりそうだ。
ああ若いときに読みたかったわ。。。