研究1日目

別に特記するほどの事もなく、気付けば4年生になったので、私も例にもれず研究室で研究をすることになった。
私はGPAが低かったので希望のとこには入れず、最も不人気の研究室に入った。いってみれば、負け組だ。

前情報によると、そこは法律を扱っていて自然言語処理とか機械学習とかを使うらしい。
わざわざ情報学部に入った人たちが、法律を好むとは思えないので不人気なのも納得できる。かくいう私も全く興味はない。

と、前振りを書いたが、 実はこの記事を書いている時点で既に、研究室に入ってから4か月が経っている。

実態がどうだったかというと、研究内容は割と想像通りである。 法律の翻訳をするAIを作ったり、法律の要約をしたり、データベースを作ったり、そんな感じだ。 確かに研究内容は私の興味をそそらないのだが、今は視野を広げるという意味でとても良い機会だと納得させている。

予想に反していたのは、私がその研究室の人をとても好きであるという事だ。 法律を扱うというから、とても古風でおかたい人をイメージしていた。(実際、見た目や風格はそんな感じだ) だが実際に話してみると、本当に良い人だった。 しゃべる言葉には風格というか威厳というか、そういったものが乗っかっていて、にもかかわらず変な嫌みがないというか、頑固さを感じなかった。 もう60近いだろうに、Twitterをよく見てたり、最近のトレンドを私よりも知ってらっしゃる。

あと、とにかく教授の求めるレベルが高い。 ちょっとあいまいな部分とかがあるとめちゃくちゃ突っ込まれる。泣いてやろうかってくらい。 でも正論すぎてぐうの音もでないのだ。考え方とか、話し方とか、とにかく学びが多い。 下手に優しい研究室に比べれば、私にとってははるかにうれしい環境である。(実際に比べたわけではないからわからないが)

研究内容はあれこれ考えたが、やはり法律には興味が無いという事で相談をしたところ、なんだかんだあってVRをやることになった。
私がゲーム開発に慣れていたり、アルバイトでARを扱っていたからその辺から話が飛んでこうなった。
寛大な対応には感謝しかないが、この研究室でVRは初なのでやや不安はある。

そんなこんなで、いよいよ研究が始まる。
研究室では所信表明と題して、初めて皆の前で発表を行った。その時のスライドとレジュメをここに載せておこうと思う。 初めてにしては意外と良く出来た。(少し気合を入れすぎた気もするが)

drive.google.com

drive.google.com

そういえば、明日は米津さんのライブがフォートナイトでやるらしい。楽しみだな。

WSL2で「プロセスはコード 4294967295 で終了しました」エラーへの対応

Windows Insiderにていつも通りWSL2を起動しようとしたらエラーが...

プロセスはコード 4294967295 で終了しました

やったこと

docs.microsoft.com

上記ページの「最新の WSL2 Linux カーネル更新プログラム パッケージをダウンロード」から最新版のプログラムをダウンロードしてインストール。
しかし、解決しなかった。

PowerShellにて、wsl -l -vを実行すると下記のような結果に。

  NAME      STATE           VERSION
* Ubuntu    Stopped         1

どうやらWSL2がインストールできていないようだ。

続いて、Windows Updateを確認してみる。(本当はこっちは先にやるべき...)
なんと更新があった。

現在のWindowsのバージョンが、ビルド20180。 アップデート後は、ビルド20185。 → 効果なし

Windowsのバージョンが関係ないなら、Ubuntuのバージョンが1である事が原因だろうという事で下記のコマンドを実行。

$ wsl --set-default-version Ubuntu 2
WSL 2 との主な違いについては、https://aka.ms/wsl2 を参照してください

$ wsl -l -v
  NAME      STATE           VERSION
* Ubuntu    Stopped         1

バージョンは以前1のまま変わらず...

続いて--set-versionでも試してみる。

$ wsl --set-version 2
変換中です。この処理には数分かかることがあります...
WSL 2 との主な違いについては、https://aka.ms/wsl2 を参照してください
仮想ディスク システムの制限により、要求された操作を完了できませんでした。仮想ハード ディスク ファイルの圧縮と暗号化が解除されている必要があります。また、仮想ハード ディスク ファイルをスパースに設定することはできません。

いくらか調べたところ、%USERPROFILE%\AppData\Local\Packages\CanonicalGroupLimited.*というフォルダの圧縮と暗号化を解除する必要がある模様。
エクスプローラーで該当のファイルを探し、右クリック > プロパティを開き、全般タブの詳細設定ボタンを押す。
「内容を圧縮してディスク領域を節約する」のチェックを外してOKを押す。
続いて出たダイアログで「変更をこのフォルダー、サブフォルダーおよびファイルに適用する」を選んでOK。(※数時間かかるので注意)

上記作業の後、もう一度--set-version

$ wsl --set-version 2
変換中です。この処理には数分かかることがあります...
WSL 2 との主な違いについては、https://aka.ms/wsl2 を参照してください
変換が完了しました。

$ wsl -l -v
  NAME      STATE           VERSION
* Ubuntu    Running         2

数分を要しましたが、どうやら上手くいったみたい。
これでUbuntuを起動。無事起動できた。やったね。

参考

qiita.com

qiita.com

TexでpdfにコンパイルするとI can't find the format file `platex.fmt'! エラーが出る

Texのインストールの際に必要なファイルが欠けていました。

コマンドラインにて

$ updmap-sys

を実行すると、不足ファイルがあれば表示されます。

$ mktexlsr

を実行すればなおりました。

$ updmap-sys

でもう一度確認してみると良いでしょう。

【Unity】シーンを切り替えるエディタ拡張の作り方

f:id:tmls:20200711142713g:plain

シーンが増えてくると毎回Assetsフォルダからダブルクリックしてシーン移動するのは面倒ですよね。
そんな時はシーンを簡単に切り替えられるウィンドウを作ってしまいましょう。

エディタ拡張

Unityにはエディタ拡張という便利なものがあります。
独自で作ったスクリプトでUnityをカスタマイズできる機能ですね。

今回はこれを使ってシーン遷移用に独自のウィンドウを作ってみましょう。

下準備

「Editor」という名前のフォルダを作成します。
いつものように、Projectビューから右クリック > Create > Folderで作りましょう。
名前が「Editor」であれば場所はどこでも大丈夫です。

次にEditorフォルダの中に新しくスクリプトを作成します
右クリック > Create > C# Scriptです。
名前は何でも良いですがこの記事では「SceneWindow.cs」として進めます。

作成した「SceneWindow.cs」を開きましょう。
(ここでクラス名とファイル名が一致しているかも念の為確認してください。)

スクリプト作成

↓のスクリプトをコピペしましょう。
SceneWindowと書かれている場所は自分のクラス名に書き換えてください。

using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEditor;
using UnityEditor.SceneManagement;
using UnityEngine;
using UnityEngine.SceneManagement;

public class SceneWindow : EditorWindow
{
    // ボタンの大きさ
    private readonly Vector2 _buttonMinSize = new Vector2(100, 20);
    private readonly Vector2 _buttonMaxSize = new Vector2(1000, 100);

    //! MenuItem("メニュー名/項目名") のフォーマットで記載してね
    [MenuItem("MyGame/SceneWindow")]
    static void ShowWindow()
    {
        // ウィンドウを表示!
        EditorWindow.GetWindow<SceneWindow>();
    }

    void OnGUI()
    {
        // レイアウトを整える
        GUIStyle buttonStyle = new GUIStyle("button") {fontSize = 30};
        var layoutOptions = new GUILayoutOption[]
        {
            GUILayout.MinWidth(_buttonMinSize.x),
            GUILayout.MinHeight(_buttonMinSize.y),
            GUILayout.MaxWidth(_buttonMaxSize.x),
            GUILayout.MaxHeight(_buttonMaxSize.y)
        };

        // Titleボタンを作る
        if (GUILayout.Button("Title", buttonStyle, layoutOptions))
        {
            // シーンを保存するか確認
            if(!EditorSceneManager.SaveModifiedScenesIfUserWantsTo(new Scene[]{SceneManager.GetActiveScene()})) return;
            // Titleシーンを開く
            OpenScene("Title");
        }
    }

    // シーンを開ける関数
    private void OpenScene(string sceneName)
    {
        var sceneAssets = AssetDatabase.FindAssets("t:SceneAsset")
            .Select(AssetDatabase.GUIDToAssetPath)
            .Select(path => AssetDatabase.LoadAssetAtPath(path, typeof(SceneAsset)))
            .Where(obj => obj != null)
            .Select(obj => (SceneAsset) obj)
            .Where(asset => asset.name == sceneName);
        var scenePath = AssetDatabase.GetAssetPath(sceneAssets.First());
        EditorSceneManager.OpenScene(scenePath);
    }
}

使い方

ここまで来たらシーン遷移のウィンドウが使えます。
Unityの上のバーに「File」や「Edit」と並んで「MyGame」が増えていると思います。
そこから、「SceneWindow」を選択すればウィンドウが現れシーン遷移出来るボタンが使えます!

コード解説

using

最初に様々なusingがありますが、必要なものなので書いておきましょう。
中でもusing UnityEditor;は少し特別で、これを書いたスクリプトファイルはEditorフォルダの中に入れておく必要があります

public class SceneWindow : EditorWindow

EditorWindowというクラスを継承しています。
こうすることでUnityのWindowを作る事ができます。

[MenuItem("MyGame/SceneWindow")]

[ ]で囲われていますが、これはアトリビュートといいます。
アトリビュートは基本的に、関数や変数の宣言の直前に書きます。
今回はShowWindow()という関数の前に書いています。

このMenuItemアトリビュートをつけると、Unityの上の方にある「File」や「Edit」と同じような項目を増やすことが出来ます。
MenuItem("メニュー名/項目名")のように書きます。

f:id:tmls:20200711150152p:plain

void OnGUI()

ウィンドウに表示するものの設定はこのOnGUI()関数内で行います。
Unityが描画を行うタイミングで呼び出すので、これは必ずのこの名前にしてください。

GUIStyle buttonStype = ...

ボタンの見た目の調整はGUIStyleを使うことで決める事ができます。
今回は、フォントサイズを30に設定しています。

var layoutOptions = new GUILayoutOption[]

ボタンの配置(レイアウト)はGUILayoutOptionを使う事で設定できます。
実際には複数の設定をすることが多いので、GUILayoutOption[]で指定します。

今回はボタンの最小サイズ、最大サイズを設定しています。

if (GUILayout.Button("Title", buttonStyle, layoutOptions))

GUILayout.Button関数を使うとボタンを作る事ができます。
引数には、ボタンに表示する文字、GUIStyleGUILayoutOption[]を指定します。

ボタンをクリックすると返り値がtrueになるので、if文の中身はボタンが押されたときの動作を書くことが出来ます。

if(!EditorSceneManager.SaveModifiedScenesIfUserWantsTo(new Scene[]{SceneManager.GetActiveScene()})) return;

シーンの移動前に現在のシーンを保存するか尋ねます。(現在シーンに変更が無ければ尋ねません)

いつもの↓の画面ですね。
f:id:tmls:20200711153538p:plain

Cancelを押すとfalse、それ以外はtrueを返します。

OpenScene("Title");

「Title」という名前のシーンを開きます
OpenScene関数は独自実装ですが、やや複雑なので説明は飛ばします。
引数の値を変える事で開くシーンを変える事ができます。

ボタンを増やすには

// Titleボタンを作る
if (GUILayout.Button("Title", buttonStyle, layoutOptions))
{
    // シーンを保存するか確認
    if(!EditorSceneManager.SaveModifiedScenesIfUserWantsTo(new Scene[]{SceneManager.GetActiveScene()})) return;
    // Titleシーンを開く
    OpenScene("Title");
}

↑のコードがボタンを1つ作成している部分です。
これをコピペするなり、関数化して"Title"となっている部分を書き換えればボタンを増やせます!

おまけ:ゲーム再生ボタンを作りたい!

EditorApplication.ExecuteMenuItem("Edit/Play");

と書くことで現在のシーンの再生ができます。
タイトルシーンに移動 → ゲームを再生
みたいにすれば、さらに手間を省けるかもしれないですね!

this exceeds GitHub's file size limit of 100.00 MBが出たときの対応

GitHubpushしようとしたときに以下のエラーが出ることがあります。

this exceeds GitHub's file size limit of 100.00 MB

100MB以上のファイルをpushしようとしているのが原因です。
GitHubでは100MB以上のファイルを扱うことができません。

状況によって対応方法が変わってきます。

100MB以上のファイルをgitの管理からはずしても問題ない場合

100MB以上のファイルをコミットから除去することで解決できます。
以下のコマンドで100MB以上のファイルのコミットを確認することができます。

git log -p XXXX(対象ファイル名)

対象コミットによって対応方法が変わります。

対象のコミットが直前のコミットのとき

--amendというコマンドを利用することで直前のコミットに変更を加えることができます。
↓のサイトに書かれている手順に従ってください。
これ以上説明することがありません。 qiita.com

対象のコミットが2つ以上前のコミットのとき

--amendコマンドが直前のコミットしか変更できないので、rebaseを使用します。

対象コミットが何個前にあるかを確認します。

$ git log --oneline

01d06e1 7章の修正
14dc8dd 7章resultファイル
d0f15a6 7章ソースコード一通り
9735ec4 6章一通り

今回は「6章一通り」と書かれたコミットが100MB以上のファイルを含んでいるとします。
この場合修正したいコミットは4つ前なので、4つ分rebaseを行います。

git rebase -i HEAD~4

するとファイルが開かれると思います。
修正を加えたいコミットのpickeに書き換えて保存してください。
↓のようになります。

e a75c554 6章一通り
pick b0a30e5 7章ソースコード一通り
pick 0f61aa3 7章resultファイル
pick eec0ec3 7章の修正

# Rebase ac2e739..817b252 onto ac2e739 (5 commands)
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
# d, drop = remove commit
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out

↓のようなログがでたら成功です。

Checking out files: 100% (38/38), done.
Stopped at 9735ec4...  6章一通りStopped at 9735ec4...  6章一通り
You can amend the commit now, withYou can amend the commit now, with

  git commit --amend   git commit --amend 

Once you are satisfied with your changes, runOnce you are satisfied with your changes, run

  git rebase --continue  git rebase --continue

これで、--amendを使ってコミットの修正ができるようになりました。 対象ファイルをgitコミットから除去します。

$ git rm --cached XXXX(対象ファイル名)

--amendを使ってコミットに変更を加えます。

$ git commit --amend -CHEAD

rebaseを完了させます。

git rebase --continue

以上で100MB以上のファイルをコミットから取り除くことができました。
pushしてみてください!

git push
gitignore

さらに、今後同じ過ちを犯さないように↓のコマンドを実行して,.gitignoreに100MB以上のファイルを追加しておくことをおすすめします。

$ find . -size +100M | sed -e 's/^\.\///' >> .gitignore

100MB以上のファイルをgitでどうしても管理したい場合

Git Large File Strage (LFS)というものがあります。 1GB/月 の帯域を無料で利用できます。
それ以降は課金が必要で、5.00USDで50GB/月 の帯域が購入できます。
↓のサイトの手順に従ってください! qiita.com