2013年3月24日日曜日

Visual Studio 2012でXP用のプログラム

デフォルトだと、VS2012で作成した実行ファイルはXPで動かないのかよ…
こんなことに1時間もハマッてしまった…

ここに詳しくかいてあった。
http://blogs.msdn.com/b/vcblog/archive/2012/10/08/10357555.aspx

しかもサポートされたのはSP1からかよ…

 まあ、これで一安心と思ったが、ここでもう一ハマリしてしまった。
「プロジェクトのプロパティ」でビルドツール を"v110_xp"にして作成しても、XPで起動すると未だに「有効なWin32アプリケーションではありません」と出てしまう。

上のリンクのコメント欄での議論を読むとわかるのだが
原因は、プロジェクトのプロパティ- リンカー - システム - サブシステムの項目が空欄になっていたことだった。

新規プロジェクトを作成するとき私は「空のコンソール」を選ぶのだが、これだとサブシステムの項が空欄になる。
7ではこのままでも動くのだが、XPではしっかり指定しないとダメなようだ。


もうハマり疲れた

2013年3月18日月曜日

Fossil SCM

個人的なプロジェクトではソース管理ソフトにFossilを使っている。

使用感はこちらの方のブログ Scenery and Fish - fossil-scm によくまとめられていて、自分も同意見。

自分の環境だとWindowsのコマンドプロンプトからコミットメッセージを日本語で入力しても、文字化けせずに上手くいっているみたいだ。
ただやはり不安なので、エディタでUTF-8nで入れている。

しかし、UTF-8nで入れても、コマンドプロンプトでログを表示させると、文字が、ひらがな漢字にかかわらず、"・"になってしまったりすることがある。
ブラウザから見ればちゃんと表示されるので気にはしていないが。

そのせいか、GitにエクスポートするときにWindowsだと上手くいかなかった。
Linuxに移してからエクスポートしてみたら上手くいった。
コピペするだけで簡単にリポジトリをコピーできる仕組みで良かった。


ソースコードの文字コードは…
  • Shift-JISだと、日本語のコメントが文字化けする。
  • UTF-16(UCS-2 LE)だと、バイナリとして扱われてしまい、Fossilからソースが見えない。他のリビジョンとの差分が表示されない。
  • UTF-8nなら大丈夫。





追記:

Fossil1.25だとUTF-8nでコミットメッセージを入力すると、文字化けするようだ。
Fossil1.25のChange logを見てみると以下の文を見つけた。
Correctly deal with BOMs in check-in comments.
チェックインコメントでBOMを正しく扱えるようになった、ということだが、これのせいでBOM無しUTF-8がおかしくなったのだろうか…

ソースの文字コードは今まで通りで大丈夫なようなので、そのうち修正されることを願って、今はコミットコメントはBOM有りUTF-8で書こう





 さらに追記:

VC++はソースコードの文字コードとしてBOM無しのUTF-8nには対応していない。(http://msdn.microsoft.com/ja-jp/library/xwy0e8f2.aspx)
なので、VC++使いはFossilでたまにBOMがゴミとして表示されるのは我慢してBOM有りUTF-8で保存するべし。

2013年3月15日金曜日

GLSLでreturnすると極端に遅くなる

GLSLのフラグメントシェーダで(バーテックスシェーダは試してない)main関数の途中でreturn文を入れると、極端に遅くなる。
200fpsだったのが100fpsくらいまで落ちる。
if文で分岐して、実際にその文が実行されなくても遅い。

なぜだ
キャッシュミスが起きてるのかな

2013年3月9日土曜日

Visual Studio 2012 C/C++のインテリセンスがハングアップする原因と回避方法

以下のようなコードを書いているときに、それは起こった
コード::
私は個人プロジェクトではヘッダに関数・クラス定義を書いてしまうのだが、既にいくつかメンバ関数を定義してあるクラスに、新たにメンバ変数を追加しようとしたらインテリセンスが止まってしまった (myvarのところにセミコロンが無いのは書いている途中だったから。myfuncの中身が空なのは後で定義しようと思っていたから)

VSのステータスバーに「ソリューションのファイルを解析しています…」と表示され、インテリセンスの実体であるvcpkgsrv.exeが凄い勢いでメモリを食い始め、システムがスラッシング状態になってしまいVSをシャットダウンすることすらできなくなってしまった。

その後なんとか復旧し、色々試してみると、上のコードのような状況つまり、中身がセミコロンだけの関数のすぐ上(手前)に、セミコロンを付けずに変数を宣言しようとするとインテリセンスがおかしくなることがわかった。
これの回避方法は
  • 関数定義の後にセミコロンを付けるようにする
  • IDEオプションのインテリセンス自動更新の無効化をTrueにする
  • そもそも中身がセミコロンだけの関数を定義しない
の3つあった。

一番良いのは関数の中身をセミコロンだけにしないことだ。
関数定義の後にセミコロンを付けるのも悪くない。
2つめの自動更新の無効化は、明示的に呼び出さないと(デフォルトだとCtrl + Space)インテリセンスが働かなくなるので、呼び出す前に"int myvar;"と最後のセミコロンまでしっかり書き終えてしまえば良い。


追記
上記の状況以外でもハングアップしました。もう原因がよくわかりません。取り敢えず、ヘッダオンリをやめて、しばらく使ってみます。

2012年12月15日土曜日

Requests 0.14.2 のインストールに失敗する

Pythonの使いやすいHTTPライブラリのRequestsをpipでインストールしようとすると失敗する。

2012年12月15日現在pipでRequestsをインストールしようとすると、最新のバージョン0.14.2がダウンロードされるのだが、以下のエラーで失敗してしまう。

ImportError: cannot import name chardet2

エラーメッセージでググってみると、どうもPython3でRequestsの0.14.2をインストールしようとすると失敗してしまうようだ。GitHubのIssueで議論されていたので、次のバージョンでは改善されると思う。今のところの解決策は0.14.1をインストールすることだ。

pip install  requests==0.14.1

でOK

2012年11月27日火曜日

std::array を sizeof()

背景
  • C++で書いていても、OpenGLなどのC用のAPIを使っていると、生の配列を受け渡す必要が出てくる。
  • sizeof( Cの配列 )は便利。
  • std::vectorを使って、受け渡しが必要なときは.data()メンバ関数を呼べば良いかと思ったが、std::vectorはsizeof()が使えない。vec.size() * sizeof(typename)すれば良いが、多次元配列の場合は?


そこでstd::arrayはどうなんだろうと思ってsizeof() してみたら上手くいくようだ。
コード:

おお! C配列の完全上位互換として使って良さそう。



しかし多次元配列ならやはり、C配列そのまま使うのが一番楽かもしれない。
  • std::arrayを入れ子にして多次元配列を実現しても.size()やsizeofで全体の大きさは取得できない。
  • boost/multi_arrayなら.size(), sizeofが有効で、複雑な走査もできるが、初期化がC配列のように簡単にはできないので、わざわざ使うのが億劫に感じてしまう。



2012年2月10日金曜日

2012年2月10日時点でのClojure + SLIMEの環境の作り方

EmacsでSLIMEを使ったClojureの開発環境の作る方法を色々調べていたら、ググッて最初の方にヒットする日本語ブログは少し情報が古いようで、今ではもっと楽な方法が用意されていたので、ここに書いておく。

現時点で一番簡単な方法はSwank Clojureのページに書いてあるが、Leiningenの"jack in"コマンドを使う方法のようだ。
ポイントは、必要なのはclojure-modeとLeiningenとSwank Clojureだけで、SLIMEは自分でインストールや設定をする必要がないということだ。

想定環境はWindows。
最初に必要なものは、clojure-modeをインストールするためのpackage.elと、Leiningenのstandalone.jar。
現時点での最新はleiningen-1.7.0-standalone.jarだ。
Clojure本体も無くても良いみたい。JDKはもちろん必要。
 
始めに、package.elを使ってclojure-modeをインストールする。
 インストール時に6つくらい警告が出るが無視する。
package.elの使い方は他のブログ様で沢山紹介されてるので、それらを参照されたし。"package.el marmalade"等でググれば出てくると思う。

 次に、Leiningenを使ってSwank Clojureをインストールする。Leiningenの使い方も他で沢山紹介されているので省略するが、Windows環境でのポイントは、
  1. einingen-1.7.0-standalone.jarとWindows用バッチファイルをダウンロードし
  2. そのバッチファイルをPATHの通った場所に置き
  3. 環境変数に自分で作ったLeiningen用のディレクトリへのパス"LEIN_HOME"と
  4. leiningen-1.7.0-standalone.jarそのものへのパス(ディレクトリではなくて)"LEIN_JAR"を設定することだ。
そして 
lein plugin install swank-clojure 1.4.0
とコマンドプロンプトで打つと、Swank Clojureがインストールされる。

あとは、Leiningenで適当なプロジェクトを作って、その中のソースをEmacsで開いて 
M-x clojure-jack-in
と打つとSLIMEが使えるようになる。



オフィシャル以外に参考にしたページ:
http://mikiokun.blogspot.com/2011/06/table-of-contents-cygwineshellmaven.html

2011年7月13日水曜日

Ubuntu11.04 CPUの動的クロック調整

Ubuntu11.04では最初からこの機能が有効になっているようで、
/sys/device/system/cpu/cpu0/cpufreq/以下にそれらの情報がある。
Ubuntuソフトウェアセンターにもあるcpufrequtilsというツールをインストールすると、より簡単に表示や設定ができる。
cpufreqdというデーモンをインストールすれば温度監視など、より細かいルールでクロック変化させることができるようだ。
私の場合はそこまで細かく設定する必要は無かったので、cpufrequtilsだけを使った。

prompt$ cpufreq-infoで現在のcpuの設定・状態を表示
prompt$ cpufreq-set で設定

prompt$ cpufreq-set -u 最大クロック設定
prompt$ cpufreq-set -u 最小クロック設定
prompt$ cpufreq-set -g 変化のルール設定 

ルールには
  • conservative  (緩やかに変化)
  • ondemand     (必要になったら急速に変化)
  • performance (常に最大)
などがある。

2011年7月9日土曜日

Python IDE Spyderについて

python(x,y)というpythonディストリビューションを使っている。

scientific-orientedなディストリということで
  • 数値計算
  • 高機能なプロット(グラフ化)
  • OpenGL
  • Qt
などがすぐに使えるようになって、この他にも盛り沢山だが、
その中でも特に私の目を引いたのはこのspyderというIDE。
現在書いてるコードにインタラクティブに反応する
  • Object Inspector(どんな関数、クラスか教えてくれる)
  • Variable Explorer(リストなどの複雑な変数の中身を見れる)
  • デバッガ
  • インタラクティブpythonシェル
  • コード補完
などがあってとても便利。
ただ、インタラクティブシェルで勝手にmatplotlibとQt関連のクラス・関数が
全てトップの名前空間に展開されるので便利な補完機能が
全然活かせなくなってしまうのはどうかと思ったあ。
どこかのバッチファイルあたりで設定してあるんだろうから探して直したいんだけど
なかなか見つからない…

2010年11月10日水曜日

Windowsにおけるgl.hとopengl32.dll

グラフィックボードのドライバをアップデートすると,OpenGLのバージョンも上がったりして新しい機能がサポートされたりする.
しかし,gl.hとopengl32.dllが更新されるわけではない.

ずっと不思議に思っていたんだけど,OpenGL公式wikiを読んでやっと謎が解けたので書いておく.


  • opengl32.dllはnvogl32.dll(nvidiaカードの場合.amdはatioglxx.dll)を呼んでるだけ.
  • opengl32.dllとopengl32.lib(libと関係するgl.hも)はシステムファイルなのでマイクロソフトから提供されるのを使うしかない.
  • マイクロソフトはDirectXをオススメしたいのでOpenGLは放置気味.
  • gl.hとopengl32.dllが更新されないために直接新しい機能を提供する関数が呼べない
  • だから新しい機能を使うにはwglGetProcAddress()というメンドくさいことをしなくちゃいけない
  • (´・ω・`)


ということみたいです.

2010年10月22日金曜日

レンダーターゲット切り替え

FBOを使っていて,レンダリング先の切り替えを考えたときに複数の方法が思い浮かぶ.
レンダーターゲット切り替えについてnvidiaの人が語っていて,その部分抜粋したのが以下


Next Generation Rendering with OpenGL

When using multiple rendering destinations, there are several ways to switch between them.

  1. Using multiple FBOs, with a separate FBO for each texture, switching between them using glBindFramebufferEXT(). This is the most straightforward approach, and it is at least twice as fast as having to switch contexts.
  2. Using a single FBO with multiple texture attachments. This requires that the textures have the same format and dimensions. Textures can be switched between using glFramebufferTexture(). This is slightly more lightweight than using multiple FBOs, so it may be faster.
  3. Using a single FBO with multiple texture attachments and attaching the textures to different color attachments. glDrawBuffer() is used to switch between the attachments. 

と、いうことで、レンダ先テクスチャが全て同じフォーマットであれば、使うFBOは一つにして、それに関連付けるテクスチャをglFramebufferTexture()で切り替えることでレンダーターゲットの切り替えとすることだそうです.

2010年10月20日水曜日

FBOとPBO

今までいまいちFBOとPBOの違いがよくわからなかった。
動作が違うのはなんとか理解したが、やれることが結構被ってるような気がしていた。
しかしここ


http://hacksoflife.blogspot.com/2006/10/vbos-pbos-and-fbos.html


 にとても良くそれらの違いがまとめてあったので自分なりの言葉でまとめてみる。

つまり…

PBO :
今までglReadPixels()やglDrawPixels()、glTexImage2d()などで行ってきた、フレームバッファやテクスチャに、データを送ったり持って来たりしていた操作の、より効率的な方法を提供するもの。
  • OpenGLドライバが格納データを管理する。
  • データをフレームバッファから読み込んだりをOpenGLが非同期に実行する
  • VBOと同じような動き
  • 単純にglReadPixels()するよりは早くなる。
持ってきたデータをテクスチャとして使いたいときは、結局テクスチャオブジェクトにコピーしなけばならないので下で説明するFBOを使ったほうが良い。

フレームバッファからデータを読み込む動作が非同期で行われるのを最大限活用するためには、一度読み込みコマンドを実行したら、しばらくPBOには触れずに違う処理をしているのが良いらしい。
間を置かずにのPBOへ何かしら命令すると、先程の読み込みが終わるまで待たなければいけないから。


FBO:
フレームバッファ無視して、直接テクスチャにレンダリングできる。デプス値とかも書き込める 。
  • ので、環境マッピングとかにはPBOより効率的
  • しかし古いグラフィックボードでは使えない。PBOは使える

こんなところでしょうか。本当にざっと読んだだけなので少し間違ってるところもあるかも。
まとめると、FBO使っとけということか。