Unityから起動されるVisualStudioのバージョンを指定するやり方

やあ子供たち。今日はUnityのお話だよ。
ひょんなことからUnityから立ち上がるVSのバージョンが2015となってしまっていたのでこれをVS2017 Community Edition が起動するように手動で直したんだ。なので今回はそのやり方のメモだよ。(自分用のな)
 
<UNITY上の操作>
Edit>Preferences>External Tool>External Script Editor
だ。
このPreferencesのダイヤログウィンドウは横幅サイズが小さくなっている場合が
あるが、広げると、External Script Editorとして何が選べるのかを選択できる
コンボボックスが見つかるはずだ。

<何を指定すればよいのか>
しかし、今回、設定したいVS2017が、コンボボックスの選択肢にない。。
そこでおじさんがやった操作は以下のようだよ。
仕方ないから「Browse..」を選択する。すると、.exeを、選択させるための、
いわゆるFileOpenDialogが出てくる。
でここで、どの.exeを選べばVS2017と認識してくれるのかという事なんだけれども。
で、そこで、↓この過去日記

が役に立ったよ。これによれば、VS2017 がどのフォルダに
インストールされているか、過去のVisualStudioと比べて、いかに今までと違う
場所にインストールされているか、そして、devenv.exeの場所がどこにあるか、
が、書かれているのでこれを参考に、
今回は、
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE
の下にある、devenv.exeを指定してみたところ、
見事に、上述のコンボボックスで、VS2017が選べるようになり、その状態で、
プロジェクトビューでC#スクリプトをダブルクリックすると、ちゃんとVS2017 が
起動してくるようになった。
はい、つまり、上述「Browse..」では、ずばり、「設定したいVSのバージョンの、
devenv.exeを指定してあげればよい」というわけだったらしいので。
じゃ今日はこんなとこで。チャオ!

緊急寄稿:VisualStudio2017におけるワード単位の強調表示を無効化する方法(C++)

やあ子供たち。VS2017にしてからずっとどうにかならないものかと思っていたのが、この表題の、ワード単位での強調表示の無効化だった。これは、エディタの画面(言語はC++)で、縦棒カーソル(キャレット)が、何かコンパイラとして意味のある単語の上もしくは付近にあると、勝手にその単語が軒並みハイライト表示されるという機能だ。

 

f:id:nurs:20190220230134p:plain

上の方でハイライトしているin2にカーソルキャレットを近づけたところ。ハイライトのおかげでキャレットが全く見えない。

f:id:nurs:20190220230303p:plain

同じくcalcForwardにカーソルを近づけたところ。自分のカーソルがどこにあるのかさえわからない。


これでとくに困るのが、おじさんの色設定の場合だと、ハイライトの白っぽい色とキャレットの白っぽい色とがごちゃ混ぜになって、つまりは「カーソルがどの位置にいるのかわからなくなる」という迷惑至極な状況になる。

そして今回はついにこの問題を解決する設定を見つけたので共有するぞ。
それは以下の場所にあるぞ。

f:id:nurs:20190219234046j:plain

オプション>テキストエディター>C/C++>詳細設定>参照の強調表示の無効化

ハイライトが消えた!夢のようだね。
おっとそれではここで宿題だよ。上記の方法だと、#if、#else、#endifといった、ディレクティブキーワードの上にカーソルが乗った場合は相変わらずキーワードがハイライトしてしまうよ。それをも防ぐ方法を探し中だ。見つけた人がいたら、教えてくれ!

では今日はここまで。チャオ!

【スマブラ】早期購入特典でパックンフラワーをダウンロードしたよ

やあ子供たち。スマブラやってるか。おじさんのとこでは早期購入特典でパックンフラワーのダウンロードを完了したので、メモしておくぞ。

ダウンロード番号のお知らせが届いたまではよかったが、ダウンロードが開始された旨のメールが来てないながらも、周囲のお友達情報によると少なくとも本日現在で、もうダウンロードは開始されているということだったので、急遽ダウンロードを試みたよ。

さてさてダウンロードのやり方についての情報がなかなか見つけられず、スイッチ初心者にはなかなかきついものがあったとはいえ、実際は以下のように簡単なことだった。

  1. 控えておいたダウンロード番号を確認できるようにしておく。
  2. スイッチの電源を入れる。
  3. 赤い方のリモコンのホームボタンを押して、スイッチのホーム画面に行く。
  4. ニンテンドーeショップへ行く。(スマブラの中からもeショップに行けるようなので混乱したが、そっちからeショップに入るわけではなかったということらしい。)
  5. すると、下の方のメニューに「番号の入力」という項目があるので、
    これを選択して、控えておいたダウンロード番号を入力します。
  6. そしたら、ちゃんとダウンロードできて、スマブラを一度終了してまた開始すれば、「パックンフラワー参戦!」の画面が一瞬出て、遊べるようになったよ。

と思ったら、ありましたね、よくある質問のページに。
はい、というわけで、今回はこの辺でチャオ!

2次元点群の直線y=ax+b近似問題を確率的勾配効果法で解いてみたよ。

やあ君たち。AI勉強しているか。とは言っても既存のディープラーニングフレームワークの使い方とかではなくて、そういうものの中で動いている、数学的な原理について理解を深めているかっていうことを聞いてみたんだけれども。

なのでおじさんはそういう本を買って、しかもおじさんにしては珍しく、買った本をちゃんと読み進めたりしているわけなんだ。ディープラーニング計算の核とも言えるところのロジックを、どうしても知りたくてね。さて今日はその中の、確率的勾配降下法についての研究成果の紹介となります。

確率的勾配降下法の説明となると、Nielsen先生のブログや、おじさんが買った本や、他の人たちのブログなんかをいくら読んでも、決まって、放物面の底の部分を玉がころころ転がっているような概念的な説明しか見つけられなくて、どうしてもしっくりこなかったので、もっと問題を単純化して、そこで語られている説明をもとに、実際にその問題を解いてみようという実験をしてみたよ。

どういう問題を選んだのかというとそれは、2次元XY平面上に分布した、サンプル点群の位置を、最もよく近似する直線を求める、いわゆる直線近似問題だ。理系の子供たちであれば誰でも大学の教養課程や物理実験なんかで一度はやるはずだから、馴染みのある問題かと思う。しかしこれは最も簡単なニューラルネットワークなんだって、気付いていただろうか。そう、ずばり、xを入力したら、yが出力される、という、入力が一つ、出力が一つの、単一ニューロンモデルと見ることができるんだね。y=ax+bのaは、重みwに相当し、bはそのままオフセット値となる。

そう、つまり、(x, y)の膨大な数の組み合わせを教師データとして学習させて、それを最もよく再現する最適なaとbを求めましょうという、ニューラルネットワーク(単一ニューロン)のトレーニング問題そのものなのだ。

(後日ここに数式の説明なんかを書く)

ではさっそくコードの紹介になります。今回の実験には自分が最も使い慣れているC++(VS2017)を使いました。何故ならとにかく速く計算実験をして、本やブログで語られている説明が正しく、ちゃんと使えるのかどうかを確かめたかったので。
これまでもね、このAI関連の勉強をするたびに、「じゃこれからは俺もpython覚えなきゃな」とか、pythonの勉強始めちゃって、かといって毎日実用で使うわけでもないから忘れては挫折する、という繰り返しを何度もやってきたんだけど、そうじゃなかったよ。巷の有名なフレームワークの使い方を覚えたい場合はいざ知らず、こういう根本の計算原理を確かめたいそこの君にアドバイス
批判してくる同僚や仲間に流されるな!自分をしっかり持つんだ!
「言語は何でもいいんだよ。」

#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>
#include <functional>
using namespace std;

// 正解のy=ax+bにおける、aとbの値。
// 点群セットの作成に用います。
// 以下二つの推測ロジックにはこの二つの値を、
// 点群セットのみから、推測させることで、ロジックの実用性を
// 吟味します。
const float aa = 388.76f;
const float bb = 0.37f;

float true_func(const float x)
{
	float y = aa*x + bb;
	return y;
}

int main(void)
{
	// 2次元XY平面上にランダムに分布した、点のセットを作成します。
	// generate random points around true_func
	const int num_sample = 1000;
	typedef pair<float, float> XY;
	vector< XY > sample_vec;
	{
		auto& l = sample_vec;
		l.reserve(num_sample);
		for (int i = 0; i < num_sample; ++i)
		{
			float x = rand() / (float)RAND_MAX * 10;
			float y = true_func(x) + (rand() / (float)RAND_MAX * .2-.1);
			l.push_back(make_pair(x, y));
		}// i
	}
	// 決定論的な手法(最小二乗法)により、最適なa, bを求めます。
	// calculate a and b direct manner
	{
		float a, b;
		auto& l = sample_vec;
		auto tak = [](vector<XY> samp_vec, function <float(XY)> core) ->float {
			auto& l = samp_vec;
			return accumulate(l.begin(), l.end(), .0f, 
				[core](float sum, XY cur) { return sum + core(cur); });
		};
		float m_00 = tak(l, [](XY cur)->float{return cur.first * cur.first; });
		float m_01 = tak(l, [](XY cur)->float{return cur.first; });
		float m_10 = m_01;
		float m_11 = (float)l.size();
		float v_0 = tak(l, [](XY cur)->float{return cur.first * cur.second; });
		float v_1 = tak(l, [](XY cur)->float{return cur.second; });
                // ごめん↑ここは普通のfor文とかでいんだけど、ラムダを受け取るラムダの実験してた。
		float detA = m_00*m_11 - m_01*m_10;
		a = (m_11 * v_0 - m_10 * v_1)/detA;
		b = (-m_01 * v_0 + m_00 * v_1)/detA;
		cout << "a is: " << a << endl;
		cout << "b is:" << b << endl;
	}
	// 確率的勾配効果法
	// gradually improve a and b using stochastic gradient descent.
	{
		float a = 1; // 初期値は適当に決めた
		float b = .5; // 初期値は適当に決めた
		for (int i = 0; i < 10; ++i)// エポック数=10
		{
			// 単位バッチ処理
			auto l = sample_vec;
			while (!l.empty())
			{
				int id = floor(rand() / (float)RAND_MAX * l.size());
				auto it = l.begin();
				advance(it, id);
				float x = it->first;
				float y = it->second;
				float delta_kai_for_a = a*x*x + b*x - x*y;
				float delta_kai_for_b = a*x + b - y;
				float step = .01;
				a += -delta_kai_for_a * step;
				b += -delta_kai_for_b * step;
				l.erase(it);
			}// while
			cout << endl;
			cout << "a is: " << a << endl;
			cout << "b is:" << b << endl;
		}
	}
	getchar();
	return 0;
}

そして、上記コードの出力結果は以下のようになりました。

Definitive Method( LeastSquare ) RESULTS:
a is: 388.76
b is:0.370044
Stochastic gradient descent RESULTS:
 (a is: 388.184  b is:4.9497)
 (a is: 388.711  b is:0.758383)
 (a is: 388.755  b is:0.403251)
 (a is: 388.762  b is:0.368382)
 (a is: 388.763  b is:0.360369)
 (a is: 388.767  b is:0.366939)
 (a is: 388.759  b is:0.366983)
 (a is: 388.762  b is:0.368995)
 (a is: 388.768  b is:0.366368)
 (a is: 388.76  b is:0.364617)
a is: 388.76
b is:0.364617

2番目の確率的勾配降下法の計算の収束過程では、都度、点と直線との値の誤差の総和を一緒に打ち出すようにしてみるのも面白いかも知れないね。
あと、これはあくまで、たたき台のコードだよ。実際には、ステップの大きさを、変数ごと、あるいはその時点での計算誤差の大きさによって、細かく調整しないといけないというノウハウもあるようだ。それに初期値も体系的にあたりをつけて何セットかやるのが通例のやり方のようだし。そこはま当然、奥深いノウハウが随所で語られているようだよ。
というわけで、今回の緊急寄稿はここまで。
チャオ!

単語登録「短縮よみ」を活用しよう

やあ子供たち。若いころはあまり気が付かないかも知れないが、睡眠時間、6時間とった場合と8時間とった場合との差を、とくに翌日の自分の考え方や、気分の安定具合などについて、注意深く観察してみるといいぞ。結論から言うと、全く違った一日を過ごしている自分に気付くはずさ。それを1年、2年、10年と続けたら、人生の方向性が270度くらい変わってしまうかもしれないほどだから気をつけろ!
さて、今日は、短縮よみ単語登録のネタだよ。とうとうおじさんのブログもここまで堕ちたかと思ったかも知れないが、これは一見くだらない裏技のようだが確実に有効なTIPSなので、あえて記事にしてみたよ。「お世話になっております」とか、「ありがとうございました。」だとか、決まりきった言い回しのタイピングは、どんなにブラインドタッチが超人級に上達したとしても、楽にできれば、それにこしたことはない。そこで、単語登録機能の活用だ。
「おせ」と打てば「お世話になっております。」と変換されるようにしておくととても便利。一日に何度も打ち込む「お世話になっております。」だからこそ、可能な限り楽をして、より本質的な、本文を打ち込む作業を、より速く、開始できるようになる。
ところが、そうやって考えておいた単語登録のセットを、マシンが変わるたびに、いちいち登録しなおすのは面倒以外の何物でもない。
そこで、一括登録機能を活用しよう。一括登録機能では、以下のように、タブ区切りで、「読み」「単語」「品詞」を、1エントリ1行とした、テキストファイルを読み込むことで、一瞬で登録が終わるぞ。
操作としては、まず以下のようなテキストを用意し、タスクバー右下のMSIME変換>単語登録>ユーザー辞書ツール>ツール>テキストファイルから読み込み
を選択して、これを読み込ませるだけだ。

おせ	お世話になっております。	短縮よみ
おつ	お疲れ様です	短縮よみ
いj	以上、よろしくお願いします。	短縮よみ
ごれ	ご連絡ありがとうございます。	短縮よみ
ごへ	ご返信頂け、ありがとうございました。	短縮よみ
おい	お忙しい中、	短縮よみ
すみ	すみませんが、	短縮よみ
よろ	よろしくお願いします。	短縮よみ
ゆに	Unity	短縮よみ
あん	Unreal	短縮よみ
ひょ	表題の件で、	短縮よみ
おじ	お時間を頂け、	短縮よみ
まこ	誠に、	短縮よみ
あり	ありがとうございました。	短縮よみ

こういうテキストファイルを、自分が使うどのマシンからも見える場所に置いておいて、読み込んでしまえば、とても便利なことになるね。さあこれで、明日から、メール作成の鬼になろう。メール作成でライバルに差をつけろ!(まそこまでの効果はないかな)
チャオ!

Excelのフィルタ機能でソート後、強制的に画面位置が先頭行に移動してしまう問題について

やあ子供たち。元気でやっているか。社会人になったなら、やることリストと、やったこと/使った時間の実績リストはどんな形であれどこかに記録しておきたいものだよな。その際に、手法にこだわっちゃだめだよ。周囲の目ばかり気にしてかっこよすぎる手法を追い求め過ぎて結局始まらなかったり、ちょっとさぼったらすっかりやり方を忘れてしまったりでは話にならないよ。身近にある当たり前の道具を効果的に使うことが大事だ。
さて、今日はエクセルで、フィルタ機能と、ウィンドウ枠の固定機能を併用したときに、フィルタのソート機能を実行すると、画面の位置が、先頭行に勝手に移動してしまって、困る場合の対処法についてのメモだよ。
Excelでは困ったことに、図のように、例えば65行目を選択した状態で、ソートしたい行について、フィルタのボタンをクリックし、




更に下図のように、A→Zで並び替え(おじさんはいつもここで、ショートカットキー「S」を利用しているよ)を実行した際に、画面が、先頭行に勝手に移動してしまうという性質がある。つまり、65行にカーソルがあるのだからそこをそのまま表示しておいてほしいのだけれども、先頭行部分に画面が勝手に移動してしまうのだ。
これがとても不便で、例えばおじさんはね、毎日やることをExcelに書き溜めようとする中で、新しい行を追記しては全体のソートしなおしという操作をよくやるわけなんだけれども、いちいち先頭に戻られてはやってられないというわけだ。



そこで、本日のメモなんだが、それはずばり、
「上記ソート操作直後に、リターンキーもしくは矢印キーのいずれかを押す」、だ。
これで、もともと選択していたカーソルの位置に、画面の位置が戻ってくるぞ。というわけで、本日のExcelチップスは以上だよ。
チャオ!

GLSLシェーダーコードをVSで快適に編集しよう

やあ子供たち。これからどんどん寒くなるね。風邪などひかないように気を付けような。
さて、おじさんはまたちょっと最近GLSLで遊んでいるんだが、頂点シェーダーやフラグメントシェーダーを編集する際にも、VisualStudio2017であたかもC++のソースを編集するときのように、キーワードやコメントの色が自動でついたり、設定したキーボードショートカットが機能するようにしたかったんだ。
GLSLのシェーダーは、一般的に、C++のソースの中に書いてもいんだけど、ランタイムに処理されることから、一般的には、.vshや、.fshの拡張子でもって、ソースコードとは独立したテキストファイルとして存在させるのが常だよな。
ところがそんな拡張子はVSちゃんは全く知らないのでデフォルトだとキーワードの色付けとか全くされず、コメント付け外しのショートカットも全く機能せず、メモ帳と変わらない感じになってしまうんだわ。っていうか、おじさんの環境では、.vshの方はそうなっていたんだが、.fshの方は、そうなってなかったので、前にどう設定したものか忘れた!
なんてずっと悶々としていたんだが、今日やっとそのやり方が見つかったので、メモしておくぞ。
ではいくぞ。その設定は、それはVisualStudio2017のメニューから、
ツール>オプション>
テキストエディター>ファイル拡張子 

とクリックを進めて辿り着ける画面で、拡張子を、.vsh/.fshとして、エディターを、Microsoft Visual C++にして、「追加」ボタンを押す。そして、.vsh、.fshそれぞれについて、そのような設定が、されていれば、OKというわけさ。
おっとそうだ、よかったらGLSLを誰でも使いやすくするために、おじさんが考えたサバイバルキットVertexAttribArrayHelperについて、この過去記事を見てみてくれ。
ではまたな、チャオ!