リモートデスクトップでDaemon Toolsを使う

リモートデスクトップでPCを操作しているときに、Daemon ToolsでISOをマウントしようとすると
「仮想デバイスが追加できません。」というエラーメッセージが表示され、マウントに失敗。
それだけではなく、仮想デバイスがいつの間にか増えていて削除も出来ない状態に。

一通り検索をしてみたが、解決手法を日本語で解説したサイトが見つからなかったので本家フォーラムに記載されていた対処法を翻訳してみました。

  1. スタートメニューを開く → プログラムとファイルの検索 → gpedit.msc と入力してエンター
  2. コンピューターの構成 → 管理用テンプレート → システム → リムーバブル記憶域へのアクセス
  3. 「すべてのリムーバブル記憶域:リモートセッションでの直接アクセスを許可する」を有効化

どうやらこれはDaemon Tools固有の問題ではなく、Windows標準のローカルセキュリティポリシー設定の問題であるとのこと。
他のディスク焼きツールや物理的な光学ドライブでも同様の症状が発生するらしい。

先ほどのフォーラムの方にはありませんでしたが、Microsoft公式の情報に

ローカル グループ ポリシー エディター設定の更新を適用するには、コマンド プロンプト画面で「gpupdate.exe」と入力してから、Enter キーを押します。

という記載があったので、前述の設定のあとにこれを行った方が確実でしょう。

Luaの基本文法

はじめに

Luaは強力で高速、軽量に動作する組み込み可能なスクリプト言語です。
今回はLuaの基本文法について記述していきます。

コメントアウト

一行コメントアウト

Luaコメントアウトを行うにはハイフンを並べて使用します。

-- comment

また、文頭に#を使用してもコメントアウトを行うことが可能ですが、その場合は行頭に配置しないと使えない為注意が必要です。

複数行コメントアウト

複数行のコメントアウトを行う場合はハイフンの直後に開き長括弧()を使用します。
この場合、コメントアウトは対応する閉じ長括弧(
)がある部分まで続きます。

--[[
	comment
]]

複数行コメントアウトで処理を実行されないようにする場合は、閉じ括弧の直前にもハイフンを二つおく事をお勧めします。

--[[
	(処理部分)
--]]

この記法はデバッグの際に大変役立ちます。
処理部分のコメントアウトを外したいときに、開き括弧の前にもうひとつハイフンを加えると

---[[
	(処理部分)
--]]

というように、コメントアウト開始部分と終了部分が一行コメントアウトとして扱われるので簡単にコメントアウトをはずす事ができるわけです。

データの扱い

変数

C言語では、変数を宣言する際に型名を記述する必要がありました。
しかし、Luaではその必要がありません。

a = 0		-- 整数
b = 3.14	-- 実数
c = "Hello"	-- 文字列

上記のように記述するだけで、aという変数を宣言することが出来ます。
セミコロンは必要ありません。
また、Luaでは変数は全てグローバルとして扱われてしまうため注意が必要です。
ローカルとして宣言したい場合は、変数宣言時に

local a=0

のように、変数名の前にlocalと記述してやる必要があります。
C言語にはない特徴として、Luaでは多重代入を行うことが出来ます。
多重代入を行う際は

a , b , c = 1 , 2 , 3

のように記述します。
この書き方を用いてスワップを行うことも可能です。

a , b = b , a

上記のように書くことで、変数aと変数bの数値の入れ替えが出来ます。
C言語のように他に一時保存用の変数を用意する必要が無いので、うまく使いこなしましょう。

演算子

算術演算子
+		-- 足し算
-		-- 引き算
*		-- 掛け算
/		-- 割り算
^		-- 累乗
%		-- 剰余

LuaではC言語とは違い、算術演算子に累乗が含まれています。
上記の演算子を用いた計算例は以下を参照してください。

x = 9 + 2	-- 11
x = 9 - 2	-- 7
x = 9 * 2	-- 18
x = 9 / 2	-- 4.5
x = 9 ^ 2	-- 81  ( 9 * 9 == 81 )
x = 9 % 2	-- 1   ( 9 / 2 == 4 あまり 1 )

また、残念ですが+=演算子や++演算子Luaでは使うことが出来ません。

x = x + 2

のように記述して対応しましょう。

関係演算子
A == B		-- AはBと等しい
A ~= B		-- AとBは等しくない
A <  B		-- AはB未満
A >  B		-- BはA未満

左辺と右辺の不等を表す演算子の使用には注意してください。
C言語では!=ですが、Luaでは~=となります。
書き間違えやすい箇所なので、特に意識して記述するようにしましょう。

制御文

if文

Luaでif文を記述する際は

if 条件式 then
	条件が真のときに実行される文
end

というように記述します。
この書き方はCとは大きく離れているため、少し違和感を感じるかもしれませんが、慣れてください。
また、条件が偽のときにも処理を行いたい場合は

if 条件式 then
	条件が真のときに実行される文
else
	条件が偽のときに実行される文
end

という形になります。
endはelseの前には入りませんので注意してください。
条件が偽のときに、さらに条件式を用いて真偽で判別を行うには

if 条件式A then
	条件が真のときに実行される文
elseif 条件式B then
	条件式Aが偽で条件式Bが真のときに実行される文
end

と記述しましょう。
C言語ではelseとifの間にスペースを入れますが、Luaでは入れませんので注意が必要です。
また、if〜else文同様にendの位置には気をつけるようにしましょう。

for文

処理を規定回数実行するにはfor文を使用します。
例えば、処理を10回実行するには以下のように記述します。

for i = 1 , 10 doend

iの数値が10以下の間、文は実行されます。
iは一回のループにつき1ずつ加算されます。
もし、一回のループで加算される数値を1以外にしたい場合は

for i = 1 , 10 , 一回のループでiに加算する数値 doend

となります。
また、途中でfor文のループを抜けるには

break

を使用します。

while文

条件式が真のとき、常に処理を続行したいときにはwhile文を使用します。
文法は

while 条件式 do
	条件式が真のときに実行され続ける処理
end

のようになります。
またこちらもfor文と同様、途中でwhile文のループを抜けるには

break

を使用します。

Luaで擬似switch文を実装する

Luaにはswitch文に該当する構文がないので基本的にはifelseを使用して進めていく形になりますが、比較回数が増えれば増えるほど無駄が発生してしまいます。
そこで今回はLuaのテーブルを利用して簡単な擬似switch文を作ってみます。


まずはswitch文として使う変数を宣言します。
予期しない誤動作を防ぐためにローカル変数とした方が安全でしょう。

local switch = {}

次に、C言語のswitch文のcaseにあたる部分を実装していきます。
先ほどのテーブル型の変数に関数を代入しましょう。

switch[値]=function()
	文
end

Luaのテーブル型を利用した実装なので、値には文字列を使用する事も可能です。
文字列を使う場合はダブルクォーテーションでくくるのを忘れないようにしましょう。

最後にswitch文を動かす為に今回作成した関数を記述します。

switch[式]()

以上で、式の結果に応じて実行結果を分ける事ができます。

ここまでのコードを纏めると以下のようになります。

local switch={}
switch[値1]=function()
	文1
end
switch[値2]=function()
	文2
end
switch[式]()

iOS での OpenGL ES について

この記事は後で詳しく書き直します。



以下、メモ

http://nantekottai.com/2012/06/04/strip-unnecessary-codes-from-opengl-game-template/
ここを参考にして、諸々の削除を行う。

その際に、

  • (void)setupGL


[self loadShaders];
も削除する。

上のURLだとそこが漏れてたのでメモ。

tolua++ - Reference Manual 翻訳 (Overloaded operators)

tolua++ - Reference Manualの章をOverloaded operators(演算子オーバーロード)を日本語訳しました。
翻訳ミスを見つけた場合はご一報いただけると助かります。

演算子オーバーロード

toluaは以下の算術演算子を自動でバインドする事が出来ます。

operator+   operator-   operator*   operator/
operator<   operator>=  operator==  operator[]

関係演算子に関しても、toLuaは自動で戻り値の0をnilに変換する為、C言語のfalseはLuaのfalseとなります。

例えば、上記のコードで仮定すると

Point add (Point& other);              // add points, returning another one

の代わりに

Point operator+ (Point& other);        // add points, returning another one

を持っています。

この場合、Luaではシンプルに

p3 = p1 + p2

と記述することができる筈です。


添字演算子演算子[])もまた、数値のパラメータを受け取った際にLuaへエクスポートすることができます。その場合、toluaは戻り値の参照を基本の形でも受け入れます。Luaから参照が返ってきた場合、プログラマーは数値を取得あるいは設定できます。戻り値が参照ではなかった場合、プログラマーは数値を取得することだけが可能です。Vectorクラスで以下の演算子をバインドすると仮定した場合の例がわかりやすいでしょう。

double& operator[] (int index);

この場合、Luaでは"value = myVector[i]"や、C++オブジェクトをアップデートする"myVector[i] = value"とも書くことができます。
しかし、もし結合演算子

double operator[] (int index);

だった場合、"value = myVector[i]"とだけ書く事が出来ます。

自由な関数(すなわち、クラスのメンバではない物)の演算子オーバーロードは非対応です。

Visual Studio 2012のC++プロジェクトをWindows XPに対応させる

Visual Studio 2012リリース当初は、コンパイルして生成されるバイナリがXPに対応していませんでしたが、
11月にリリースされたアップデートを適用することで対応させることができます。
Microsoftのソフトウェアアップデートからは現状適用することができないので、サイトから直接ダウンロードしてアップデートする形になります。
ダウンロードリンクは以下。

Visual Studio 2012 Update1 (vsupdate_KB2707250)

ダウンロードしたvsupdate_KB2707250.exeを実行するとVisual Studio 2012をアップデートすることができます。
アップデート前に再起動を要求される場合があるので、他に起動しているソフトがあれば保存して終了しておきましょう。



アップデートが完了しても生成されるバイナリがそのままXPに対応するわけではなく、手動でいくつか設定を行う必要があります。

VisualStudioのソリューションを開いて、プロジェクトのプロパティを開きます。
構成を「すべての構成」に変更し、

  • 構成プロパティ>全般のプラットフォーム ツールセット

をv110からv110_xpに変更します。

以上でXP対応のバイナリを生成することができるようになりました。