‘Program’ カテゴリーのアーカイブ

あけましておめでとうございます

2017 年 1 月 1 日 日曜日 by amano

あけましておめでとうございます。今年もよろしくお願いします。

今年は、Firefox 57(2017/11/28) で XUL/XPCOMベースの機能拡張のサポートが終了し WebExtensions に一本化するそうなので、NicoLive Helperも艦これタイマーも使えなくなります。WebExtensions に対応していない人気のアドオンを切り捨ててまで本当に WebExtensions オンリーにしてしまうのか、それとも撤回するのか気になるところですが、撤回するだろうと高をくくっているのもアレなので、WebExtensions化しようかなぁと考えています。

Firefoxで対応しているWebExtensionsの機能が全然足りないのでNicoLive Helperはまだ移行そのものが無理で、まずは艦これタイマーでWebExtensionsへの移行を実験してみようと思います。こちらならある程度は動かせそうという目処があるので。

NicoLive HelperのWindows/Mac版はXUL RunnerがあったのでFirefox機能拡張と同じコードをほぼそのまま動かすことで手軽にリリースできましたが、WebExtensions化すると全く別々のコードになるので手軽な移植もできず、Firefox 57リリースに合わせてWin/Mac版のメンテナンスを終了します。

 

アプリやソースコードを公開すること

2014 年 5 月 10 日 土曜日 by amano

自分が何かアプリを作るときは既存のアプリで妥協できるものがないという状態なので、第一に自分が欲しいものを作る、第三者からの要望があればそれが是と思えば自分で進んで実装をする、そう思わないところは改良したい人が改良してパッチ送ってくれれば採用するかもね、というスタンスであるので、開発始めてろくに機能も載っていない段階からバイナリを公開して良いアイデアがあればドンと来いと待ってみたり(いわゆるlean startup的な)、どこかでMITライセンスもしくはGPLでソースコードを公開する。

NicoLive Helperも上記のスタンスで公開して4年半になるが、この間にパッチ(Linux用のコメント読み上げ)送ってくれた人は1人だけで、要望はくるけどパッチを送ってくる人が全然いないならソースコードを公開する意味ってないねと、艦これタイマー for Firefoxについては当初はソースコードを公開する予定はなかった。そういうことで、NicoLive Helperのソースコードは全てライセンス表記があったけど、艦これタイマーの方はソースコードにライセンス表記はいれてなかった。
そういうところに、(NicoLive Helperのソースは公開しているから艦これタイマーも)希望すれば公開してくれるのではないかという思惑があったとのことで大湊提督とyoshfuji提督より要望をもらい、正式にMITライセンスによる公開を開始。このお二人はいわゆるOSS畑の人達で、NicoLive Helperの成果からコピペして勢いだけで作ったもので自分でもいろいろと改善点と思うところを、いいように改良してくれたなぁと思い、現在ではyoshfuji提督版のコアに切り替えてUIはそのままという風にマージが行われた。
こういうのはオープンソースならではのメリットだと思う。

一方で(自分がアドオン公開しなければ作られることはなかっただろう)各種艦これ系Firefoxアドオンは艦これタイマー for Firefoxのコードを流用もしくはコピーしているのだけれども、MITライセンスで公開したコードを元にしているのであればライセンス表記せずに使っているのはライセンス違反だし、ソース公開前であればリバースエンジニアリング(といってもzip展開するだけなのでアレだが)に基づくコピーなので著作権的にどうなのよと思うので、こういうライセンスや著作権を気にしない人種ばかりならアドオン自体を公開しないで自分もしくは身近な人だけで便利に使っていればよかったかなと思わなくもない。

 

C++とマルチスレッドとメモリリーク

2009 年 9 月 21 日 月曜日 by amano

関数のエピローグでデストラクトしてくれるからこれでいいやと自動変数としてクラスを作っておいたら、スレッドが終了するときにデストラクタが呼ばれてないなぁと、よく考えたら_endthreadex()のところで終了するからエピローグが呼ばれないってことか…。
で、エピローグが呼ばれるようにラッパー関数を用意して、この関数単体ではメモリリークしていないことを確認したのだけど、どう呼ぶかでなんかちょびっとリークしますな…。
(さらに…)

OpenGLプログラミング(カメラ移動)

2009 年 9 月 6 日 日曜日 by amano

最初はOpenGLにも(ゲーム機みたいに)カメラ用の関数あるんだろう程度にしか思っていなかったのだけど、全然見つからないのでなんだろう…と各地のサイトをうろついてると、「あー、行列の設定でやるってことね」と把握。で、手軽に視点、参照点を使えるようにgluLookAt()があると。

if( g_input->isButtonPressed( 0, XINPUT_GAMEPAD_DPAD_LEFT ) )	g_camera_x -= 0.1;
if( g_input->isButtonPressed( 0, XINPUT_GAMEPAD_DPAD_RIGHT ) )	g_camera_x += 0.1;
if( g_input->isButtonPressed( 0, XINPUT_GAMEPAD_DPAD_UP ) )	g_camera_z -= 0.1;
if( g_input->isButtonPressed( 0, XINPUT_GAMEPAD_DPAD_DOWN ) )	g_camera_z += 0.1;

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
LookAtGL( g_camera_x, g_camera_y, g_camera_z, 0, 0, 0, 0, 1, 0 );
※↑gluを使わずに視点、参照点から行列を設定する関数

おー、カメラが動くようになったどー。

OpenGLプログラミング(テクスチャマッピング)

2009 年 9 月 6 日 日曜日 by amano

テクスチャのロードはどうしようかなぁ、GDI+使っちゃうとWindows専用になっちゃうし…ってことで、PNGをlibpng使ってロードするように。きちんとロードできているか試しにglDrawPixels()で描いてみたところ、画像が崩れるのでおかしいなぁと調べてると、どうやらこの関数はwidthが4の倍数じゃないときちんと描いてくれないな。
とかやっていたら、glpngという便利なモノを発見。本家サイトがなくなってるので、ここのやつを使った。

pngInfo pnginfo;
GLuint texture = pngBind( "d:\\miku\\miku_bonus_files\\miku_sd.png", PNG_NOMIPMAP, PNG_ALPHA, &pnginfo, GL_CLAMP, GL_LINEAR, GL_LINEAR );

ってやるだけでOpenGLテクスチャを作ってくれるすぐれもの。

あとは、

glBindTexture( GL_TEXTURE_2D, texture );
glBegin( GL_TRIANGLES );
glTexCoord2f( 0, 0 ); glVertex3f( -1.0,  1.0, 0);
glTexCoord2f( 0, 1 ); glVertex3f( -1.0, -1.0, 0);
glTexCoord2f( 1, 0 ); glVertex3f(  1.0,  1.0, 0);
glTexCoord2f( 1, 0 ); glVertex3f(  1.0,  1.0, 0);
glTexCoord2f( 0, 1 ); glVertex3f( -1.0, -1.0, 0);
glTexCoord2f( 1, 1 ); glVertex3f(  1.0, -1.0, 0);
glEnd();

と書くと、三角形x2を使った四角形にロードしたPNGが貼り付けられて表示される。

OpenGLプログラミング(準備)

2009 年 9 月 3 日 木曜日 by amano

Direct3DとOpenGLどっちにしようと迷ったあげくOpenGLで遊ぶことに。なんかの拍子にPS3で3Dやるかもしれないしネ。
OpenGLは昔にちょろっとポリゴン出したくらいの初心者同然なので、OpenGL本家サイトやGoogle頼りに基本から。
(さらに…)

TextBoxコントロールのスクロールを操作する

2007 年 1 月 11 日 木曜日 by amano

C#(.NET (Compact) Framework)のTextBoxコントロールは複数行のテキストを扱えるがスクロールを操作するメソッドが見当たらない。IRCのチャット表示領域で、末尾に新着テキストを追加していってもスクロールバーはずっと最上段にいて新着を表示できない、Selectメソッドでカーソル動かしてもスクロールバーは動かない、さて困った…ってところでググっていたのだけど、C#からWin32 APIを呼べるのくわーと知ったので(←C#は初めて使用)、直接エディットコントロールを操作することに。
まずは、エディットコントロールを操作するにはウィンドウメッセージを送りつけなくてはならないので SendMessage APIを呼べるようにクラス内で宣言する。

[DllImport("coredll.dll")] extern static int SendMessage(IntPtr handle,
uint msg, uint wparam,uint lparam);

Windows Mobile 5.0がターゲットなのでcoredll.dllだけど、通常のWindowsなら kernel32.dll で。
すると、SendMessageが使えるようになるので、エディットコントロールにまつわるウィンドウメッセージ(EM系)を使ってスクロールさせてしまえばよい。
IRCの新着テキストを末尾に追加してそこまでスクロールできればよいので、

ChatTextBox.Select(ChatTextBox.Text.Length, 0);

末尾にカーソルを移動させて、

SendMessage(ChatTextBox.Handle, 0x00B7, 0, 0);

EM_SCROLLCARET(0x00b7)メッセージでキャレット位置までスクロールさせる。( ゜Д゜)ウマー