2018年11月14日 (水)

OpenGL 最初の一歩

前回の続きです。

まず、新しいプロジェクトを作ります。テスト版の作業です。
メニューから「ファイル」-「新しいプロジェクト」とクリックして、出てきたウィンドウの
場所を
..¥Visual Studio 2013¥OpenGL¥
名前を test0 とし
上部の選択肢から「インストール済み」-「テンプレート」-「visual C++」
-「CLR」と展開して「CLR コンソール アプリケーション」をクリックして
「OK」をクリックしてください。
(「コンソール アプリケーション」でなくする方法は、後述します。)

以下のソースを test0.cpp にコピペしてください。
----
#include "stdafx.h"
#include <gl/freeglut.h>

void display(void)
{
  glClear(GL_COLOR_BUFFER_BIT);
  glFlush();
}

void initGL(void)
{
  glClearColor(0.0, 0.0, 1.0, 1.0);
}

int main(int argc, char *argv[])
{
  glutInit(&argc, argv);
  glutInitDisplayMode(GLUT_RGBA);
  glutCreateWindow(argv[0]);
  glutDisplayFunc(display);
  initGL();
  glutMainLoop();
  return 0;
}
----

#include <gl/glut.h>
ではなく
#include <gl/freeglut.h>
でなくてはならないといけません。
「include ファイルを開けません。'gl/glut.h':No such file or directory」という
エラーメッセージに、私はこれで2日悩みました。

また #include "stdafx.h" というのはすべてのインクルードファイルの
前に記述しなければならないそうです。

そしてビルドしてみてください。 win32 か x64 にどちらか
環境にあった方にしてください。
Releases/Debug はどちらでも構いません。両方ビルドしても構いません。

そして問題なくビルドされたら、メニューから「デバッグ」-「デバッグなしで開始」
してみてください。青い四角いウィンドウが表示されたら成功です。

しかしコンソール画面も表示されるのはじゃまです。
これを表示しないようにしてみたいと思います。まず
int	main(int argc, char *argv[]) を
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst,
	LPSTR lpszCmdLine, int nShowCmd) に書き換えます。
そして argc, argv を __argc, __argv に書き換えます。
(元の main 関数を /* */ でコメントして、コピペで書き直すと
いいかもしれません。)

すると以下のようになります。
----
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst,
	LPSTR lpszCmdLine, int nShowCmd) {
	glutInit(&__argc, __argv);
	glutInitDisplayMode(GLUT_RGBA);
	glutCreateWindow(__argv[0]);
	glutDisplayFunc(display);
	initGL();
	glutMainLoop();
	return 0;
}
----
そして右側の ソリューション エクスプローラ の test0 (プロジェクト)を
右クリックして「プロパティ」-「構成プロパティ」-「リンカー」-「システム」
と開いて「サブシステム」の右端へマウスを持っていって、クリック、下向き記号が
あらわれたらそれをクリック、 Windows(/SUBSYSTEM:WINDOWS) を選択、

そしてビルドし直し、メニューから「デバッグ」-「デバッグなしで開始」を
実行、以上です。

OpenGL 準備編

ここでは OpenGL の Visual Studio 2013 での入門を、覚え書き程度に書いておきます。
なお私の環境では 64bit の windows10 なので、32bit のOSでは細かいところが
違うかもしれません。また Visuai Studio 2013 の基本的な設定は、
(Windows sdk 7.1、x64 環境など)済んでいるという前提です。

インストールの仕方は以下のページを参考にしました。
「GLUTによる「手抜き」OpenGL入門」
https://tokoik.github.io/opengl/libglut.html
(の「2.3 Windows 系 OS にインストールする」より)

まず以下のページから「freeglut-3.0.0.tar.gz」をダウンロードします。
http://freeglut.sourceforge.net/

これを展開するのに、例えば「lhaplus」などで展開することが出来ます。
https://forest.watch.impress.co.jp/library/software/lhaplus/
私はドキュメントフォルダに「 Visual Studio 2013 」があったので
そこに展開したフォルダ「freeglut-3.0.0」を「切り取り」「貼り付け」しました。


これだと sln ファイルが含まれてないので「CMake」を使いました。
https://cmake.org/download/
「Download Latest Release」をクリックし、64bitプログラミングがしたいのなら
cmake-3.13.0-rc3-win64-x64.msi をダウンロードし、
(32bit プログラミングなら cmake-3.13.0-rc3-win32-x86.msi を)ダブルクリックし、
インストール、デスクトップにある CMakeアイコンをダブルクリックして、起動します。
「Browse Source」に freeglut-3.0.0 フォルダを指定、
(C:¥Users¥(ユーザー名)¥Documents¥Visual Studio 2013¥freeglut-3.0.0 )の形になります。
なお、以下では C:¥Users¥(ユーザー名)¥Documents などのパスは ...¥ などと省略することにします。)
「Browse Build」にその下の build というフォルダを指定します。
(...¥freeglut-3.0.0¥build)
「Configure」をクリック Visual Studio 2013 を選択、
「Use default native compilers 」を選択、「Finish」をクリックします。
そして「Generate」をクリックすると、sln ファイルなどが生成されます。


freeglut.sln は「Browse Build」に指定したフォルダの中に生成されます。
これをダブルクリックして Visual Studio 2013 を起動してください。
そしてメニューの「Release/Debug」はデバックするかどうかで適当に決めてください。
64bit で、ビルドする場合は「win32」をクリックして x64 を選択してください。
もし x64 が出てこない場合は「新規作成」をクリックしてください。
(CMake で選択したものに合わせてください。)
そしてメニューから「ビルド」-「ソリューションのビルド」をクリックして
実行してください。

以下の4つのヘッダファイル
glut.h freeglut.h freeglut_std.h freeglut_ext.h
が「Browse Source」で指定したフォルダの include\GL にあるので
(例: ...¥Documents¥Visual Studio 2013¥freeglut-3.0.0¥include¥GL )
それを 32bit OS 版では
C:¥Program Files¥Windows Kits¥8.1¥Include¥um¥gl
( gl というフォルダがなければ作成してください。)
64 bit版では
C:¥Program Files (x86)¥Windows Kits¥8.1¥Include¥um¥gl
にコピーしてください。

「Browse Build」で指定したフォルダの中の lib フォルダの中の Release/Debug
フォルダの中の freeglutd.lib, freeglut_staticd.lib を
OSが 32bit 版なら
C:¥Program Files¥Windows Kits¥8.1¥Lib¥winv6.3¥um¥x86 に
OSが64bit版なら、CMake に合わせて
Win32 版は
C:¥Program Files (x86)¥Windows Kits¥8.1¥Lib¥winv6.3¥um¥x86
x64 版は
C:¥Program Files (x86)¥Windows Kits¥8.1¥Lib¥winv6.3¥um¥x64
にコピーします。

また「Browse Build」で指定したフォルダの中の bin フォルダの中の Release/Debug
フォルダの中の freeglutd.dll を同様に OSが 32bit 版なら
C:¥Windows¥System32 に
OSが 64bit版なら、
Win32 版は
C:¥Windows¥SysWOW64
x64 版は
C:¥Windows¥System32
にコピーします。

これで準備は完了です。 なお OSが 64bit のとき、 win32 版と x64 版と共存させる
ことも可能です。私はCMake x64 版を先にインストールしていたので
それのアンインストール、CMake win32 版のインストール、
freeglut-3.0.0.tar.gz の解凍をし直して、
freeglut-3.0.0 を freeglut-3.0.0-86 に変更して
...¥Documents¥Visual Studio 2013 にコピペして
CMake し直し等しました。

次回は簡単なプログラムを作って見たいと思います。

2018年6月 6日 (水)

マウスクリック無効化(前回の続き)

タイマーを止めたあと、マウスクリックイベントを停止するサンプルです。
onclick に null を代入しています。

----

<!DOCTYPE html>
<html>
<head>
	<title>global test timer</title>
	<meta charset="UTF-8">
	<script>
		"use strict";

	// 広域変数
		var testValue=0,timer;
		var message,addCount;	//

		// 初期化関数
		function init() {
//			alert("init");
			message = document.getElementById("message");
			message.textContent=testValue;

			addCount = document.getElementById("addCount");
//			alert(document.getElementById("addCount"));
//			alert(addCount);
//			alert("init2");


			addCount.onclick=click;

//			alert("start");

			timer = setInterval(tick, 100);
		}

		function tick(){

			if(testValue < 5){
				message.textContent=testValue;
				}else{

				message.textContent="end";
				addCount.onclick=null;

				clearInterval(timer);
			}

		}

		function click(e){
			testValue++;
			alert(testValue);	//debug
		}


	</script>
</head>
<body onload="init()">
	<button id="addCount">click test</button>
		<p id="message"></p>
</body>
</html>

--
http://www3.synapse.ne.jp/wtz/programming/html5/globalTestTimer2.html
----

2018年6月 4日 (月)

javascript はシングルスレッドだそうです。タイマーを使えば一応解決。

javascript はシングルスレッドだそうです。マルチスレッドではありません。
例えば下記のプログラムは期待通りの動きをしません。

----

<!DOCTYPE html>
<html>
<head>
	<title>global test</title>
	<meta charset="UTF-8">
	<script>
		"use strict";

		// 広域変数
		var testValue=0;
		var message;

		// 初期化関数
		function init() {
			message = document.getElementById("message");


			message.textContent=testValue;
//			alert("start");

			while(testValue < 5){
				sleep(1000);
				message.textContent=testValue;
			}

			message.textContent="end";
		}
	</script>
</head>
<body onload="init()">
	<button onclick="testValue++">click test</button>
	<p id="message"></p>
</body>
</html>

--

http://www3.synapse.ne.jp/wtz/programming/html5/globalTest.html

----

body の button 要素の中身を
<button onclick="testValue++;alert(testValue)">click test</button> に
書き換えてみれば、大域変数 testValue の値は変化していってるのがわかると思います。

これを解決するにはタイマーを使えばよいようです。 script の中を以下のように書き換えます。

----

	<script>
		"use strict";

		// 広域変数
		var testValue=0,timer;
		var message;

		// 初期化関数
		function init() {
			message = document.getElementById("message");


			message.textContent=testValue;
//			alert("start");

			timer = setInterval(tick, 100);
		}

		function tick(){

			if(testValue < 5){
//				sleep(1000);
				message.textContent=testValue;	//debug
			}else{

				message.textContent="end";
				clearInterval(timer);
			}

		}


	</script>

--

http://www3.synapse.ne.jp/wtz/programming/html5/globalTestTimer.html

----

実際のところ、上に書いたような alert 関数を今回も使ってみれば
testValue の値自体は増加し続けているのがわかると思います。
これを避けるには onClick を使用せず getElementById 関数を使って
onclick に関数を設定し、終わったら null を代入しなおせばいいのですが、
それは次回に。(端折って書いてるのでわかりにくくてすいません。)

2017年5月15日 (月)

ubunntu 16.04 で chrome でパスワードを聞かれないようにしたい

ubuntu 16,04 で google chrome を起動すると、毎回パスワードを聞かれるので、それをやめさせたい。
左上のボタンから pass と入力し「パスワードと鍵」を起動する。
「ログイン」を右クリックして「パスワードの変更」を選択、
元のパスワードを入力、新しいパスワードを空行のまま入力し、「続ける」をクリック、で、パスワードを聞かれずに chrome を起動するようになるようです。

「ubuntu16.04 chrome キーリング」で検索するとよいようです。

ubuntu 16.04 windows10 を Grub Customizer で前回起動したエントリーを有効化

ubuntu 16.04 と windows 10(Windows Boot Manager) を Grub Customizer でデュアルブートしています。
しかし、Grub Customizer の「一般」タブの「デフォルト エントリー」を「前回起動したエントリー」を選んでも、なぜか機能しませんでした。
それで色々調べたら /etc/default/grub の頭の方に GRUB_DEFAULT="saved" という一行があり、さらに GRUB_SAVEDEFAULT="true" を指定し、update-grub すると「前回起動したエントリー」が機能するようになりました。
(なお引用符は必要ないようです。)

「ubuntu GRUB_DEFAULT 」などで検索すると色々出てくるようです。

(注:windowsを選ぶと 次回からGRUB メニューが表示されず windows に乗っ取られるようです。)

2016年7月 3日 (日)

起動時の音楽が鳴らない。

windows 10 での起動時の音楽が鳴らないようなので、いろいろ検索した結果、
「高速スタートアップを有効にする」状態では、
「Windows スタートアップのサウンドを再生する」にチェックをいれても
「再起動」時には再生され、その後(の次?)までは音楽が鳴るが
それ以降では再生しないようで、これは「仕様」だそうです。
しかたがないので高速スタートアップは使用しないようにすることにしました。

なお、「高速スタートアップを有効にする」はカーソルをデスクトップ画面の最左下に
持って行って、右クリックして「コントロールパネル」をクリック、
「大きいアイコン」を指定して「電源オプション」をクリック、
「電源ボタンの動作を選択する」をクリック、
「現在利用可能ではない設定を変更します」をクリックするとウィンドウの下部にある
シャットダウン設定を変更できます。

「Windows スタートアップのサウンドを再生する」は、タスクトレイの
「音量」アイコンを右クリックして「サウンド」をクリックすると真ん中あたりに
出てきます。音量アイコンがない場合は、タスクバーを右クリックして
「タスクマネージャー」をクリックして、(「プロセス」タブをクリックして)、
ずーっと下に移動して「エクスプローラー」を見つけて右クリックして
「再起動」をクリックすると表示されるようです。

この辺、いろいろとやりかたはあるのでいろいろ検索してみてください。

2016年6月 3日 (金)

Cortana入門

いろいろあって windows 7 のインストールディスクが読めなくなって、
windows 10 に乗り換えることになった。
なんとか使い慣れたところ、Cortana(コルタナ)を使いたくなった。
でもどうやって使ったらいいのかわからない。

結論から言うと左下の入力欄の右端のマイクボタンをクリックしてから
マイクに向かって質問をいうとよいようである。
「好きな食べ物はなんですか?」とか聞くと回答を読み上げてくれるのが嬉しい。
「好きな本はなんですか?」と聞くとマニアックな本を取り上げてくれるが
siri の二番煎じという気もしないでもない。

また意味がわからないと Edge の Bing に投げ飛ばすのもちょっと不親切な気もする。

2016年4月20日 (水)

Process Explorer 16.12

Process Explorer 16.12 の日本語化パッチは Process Explorer 日本語化 - さよならストレス などにあるが、かんじんの英語版はリンク切れになっている。

そこで「Process Explorer 16.12 technet」で google 検索したところ、Process Explorer 16.12をダウンロードする - 技術的情報 - FileHippo.com に見つかった。

2016年3月26日 (土)

mllink$ 「64bit アセンブラに挑戦」の続き

ところで mllink$ あるいは mllink$.lnk というファイルが出来てると思います。
これはショートカットではなく ml64.exe が link.exe へオプションを渡すための
レスポンスファイルです。
エディター(メモ帳など)で開いてみると
--
/OUT:test64.exe
test64.obj
/subsystem:windows
/entry:Start
--
などとなっているのがわかります。

(ml64.exe のパス)\link.exe @mllink$.lnk

でリンクしてくれます。

あと、環境変数 LIB にライブラリのパスを設定しておけば、拡張子Lib のファイルを
コピーしてくる必要はありません。

set LIB="C:\Program Files\Microsoft SDKs\Windows\v7.1\Lib\x64"

と書いたバッチファイル(例えば setlib.bat )を用意して
実行しておけばよいでしょう。

2016年3月23日 (水)

64bit アセンブラに挑戦

私の visual studio 2010 は、以下のページを参考に

http://d.hatena.ne.jp/torutk/20100927/p1

64bit 化されているので 64bit アセンブラ(ml64.exe)がインストールされています。
それで 64bit アセンブラプログラミングに挑戦してみたくなりました。

まず、「ドキュメント ライブラリ」にフォルダ '64asm' を作り
そこにソースファイル test64.asm を以下のように作ります。
----
; サンプル x64 アセンブリー・プログラム

; Chris Lomont 2009 www.lomont.org

extrn ExitProcess: PROC ; システム・ライブラリーの外部関数

extrn MessageBoxA: PROC

includelib "user32.lib"

includelib "kernel32.lib"

.data

caption db "64びっと", 0

message db "いやっほーい", 0

.code

Start PROC

sub rsp, 28h ; シャドウ領域、スタックをアライメントする

mov rcx, 0

lea rdx, message

lea r8, caption

mov r9, 0

call MessageBoxA

mov ecx, eax

call ExitProcess

Start ENDP

End



; /entry:Start



; fastcall(新しい関数呼び出し規約)

; 引数はrcx、rdx、r8、r9、r10、r11

; 戻り値はrax

; 浮動小数点数の戻り値はxmm0

----
上のソースは
http://mbdev.hateblo.jp/entry/2013/05/14/212139
からコピーしたものです。(以下も参考にしました。)

そして同じ場所に以下の内容の 'test.bat' を作ります。(場合によってパスが違うかもしれません。)

----
"C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\amd64\ml64.exe" test64.asm /link /subsystem:windows /entry:Start
----

そして「コマンドプロンプト」(windows のバージョンによって違うようなので検索してみてください。私のは windows 7 です)を立ち上げて

cd "C:\Users\[ユーザー名]\Documents\64asm"

と入力してみてください。エクスプローラーで直接辿っても構いません。
dir と入力してみて、先に作った2つのファイルがあればOKです。

そこでコマンドプロンプトから test と入力してみてください。
LINK : fatal error LNK1104: cannot open file 'user32.lib'
と user32.lib がないと怒られてしまいます。

そこで "C:\Program Files\Microsoft SDKs\Windows\v7.1\Lib\x64" から user32.lib を
64asm フォルダにコピーします。
そこでもう一度コマンドプロンプトから test と打ち込んで見てください。
今度は kernel32.lib がないと怒られてしまいます。
それでもういちど同じ場所からコピーしてきます。
そして test と入力してみてください。今度はうまくいったようです。
ためしに test64 と入力してみてください。メッセージボックスがあらわれるなら成功です。
あるいは test64.exe をクリックしてみてください。

付記:現在実行するとエラーが出るようです。目下調査中。
どうやら休止状態から復帰するとおかしくなるようです。

続きを読む »

2016年3月20日 (日)

クリックイベントのプロパティ?一覧

----
<!DOCTYPE HTML>
<html lang="ja">
<head>
<meta charset='UTF-8'>
</head>
<body>

<span id='t' style='color:blue; border-width:1px; border-style:solid;'>ここをクリック</span>

<div id='elements'></div>

<script type="text/javascript">
"use strict";
	var t = document.getElementById('t');
	var elements = document.getElementById('elements');

	t.onclick=click;

	function click(e){
		var	s='';

		for(var o in e){
			s+=o+' : '+e[o]+'<br />';
		}

		elements.innerHTML=s;
	}
</script>
</body>
</html>

----

ここをクリック

2016年3月19日 (土)

クリックしても反応しない。(FireFox)

しばらく前に買った「ゲームで学ぶ JavaScript 入門 HTML5&CSS も身につく!」と
いう本。大変勉強になるのだが 15puzzle が初期画像は出るのだが
数字をクリックしても何も反応が出ない。

私は普段 firefox を使っているのだが、他のブラウザ、IE11,opera12.18,
Google chrome (現最新バージョン) 49.0.2623.87 m (64-bit) では動くのだが
firefox (最新バージョン)45.0 でだけ全く反応がありません。

内容は初期化関数で

----        function init() {
            var table = document.getElementById("table");

            for (var i = 0 ; i < 4 ; i++) {
                var tr = document.createElement("tr");
                for (var j = 0 ; j < 4 ; j++) {
                    var td = document.createElement("td");
                    var index = i * 4 + j;
                    td.className = "tile";
                    td.index = index;
                    td.value = index;
                    td.textContent = index == 0 ? "" : index;
                    td.onclick = click;
                    tr.appendChild(td);
                    tiles.push(td);
                }
                table.appendChild(tr);
            }

            for (var i = 0 ; i < 1000 ; i++) {
                click({ srcElement: {index: Math.floor(Math.random() * 16)}})
            }
        }
----

というふうに数字の並んだ table を作って行き、数字の書かれた枠をクリックしたら
関数 click を呼び出すというもの。
で、その中身はどうなっているかというと、頭だけ引用すると
----

         function click(e) {
            var i = e.srcElement.index;

----

となっている。

でネットで散々調べた末に
「JavaScript - ブラウザ毎のイベント発生元取得テスト」
http://tsoft-web.com/sub/tips/event/
というページにたどりつき、「クリック後、大体こんな感じで取得」のサンプルページを
表示させ、「click me」と書かれた部分をクリックすると、
「e.srcElement = not exists」とあるではないか。

そこで上に引用した 15puzzle の2ヶ所の 'srcElement' を 'target' に
書き換えたところ、まともに動くようになった。
他のブラウザでもちゃんと動くようで解決した。

なお、srcElement にしか対応していないブラウザ上でも動かすには、上の一行を

            var i = (e.srcElement ||e.target).index;


とすればよいようだ。

2015年6月27日 (土)

インターネットにつながらなくなった

ubuntu 14.10 がある日、インターネットにつながらなくなりました。
それで色々検索したところ以下で解決しました。

/etc/network/interfaces の中身が
----
auto lo
iface lo inet loopback
---- となっていたので
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet dhcp
-----と2行くわえて 端末から
sudo ifdown eth0 && sudo ifup eth0
を実行したところ見事につながるようになりました。

続きを読む »

2015年6月23日 (火)

ファイル名を指定して実行 管理者特権

スタートメニューに表示される「ファイル名を指定して実行」が
「このタスクは管理者特権で作成されます。」と表示されていたのが
いつの間にか表示されなくなっていました。

そこで色々と試していたのですが、UACを変更して、元に戻したら
UAC変更を有効にするにはコンピュータを再起動させる必要があります、と
メッセージが表示されたのでそうしたら、管理者特権で無事表示されました。

これが正しい対応だったかどうかはわかりませんが、嬉しい結果でした。