2010年1月30日土曜日

HDR-XR500Vで撮る、仙台市の八木山動物公園「おさるの焼き芋イベントなど」

先日、今年初めてHDR-XR500Vを持ち出して撮影して来ました。
仙台市の八木山動物公園に行ったのですが、ちょうど期間限定イベントの「おさるの焼き芋」やってたんですよ。

焼き芋って、なんとサル山の中で・・・まさかの焚き火開始。えっ現場で焼いちゃうわけですか。
めちゃくちゃ火が出ているんですが、お猿さんを怖がらせてしまうのでは!!

と、思いきや、全然大丈夫でした。
解説のナレーションによれば、なんでも、既に一回同じイベントをやっており、お猿さんはその一回で完全に慣れてしまった上に、火を恐れるどころか、逆に焼き芋がもらえる事を学習しており楽しみにしているとのこと。

しかし、見ている大勢の人間の方が大丈夫じゃなかった!!
焼き芋を焼いているスタッフの方すら逃げ出すほどに大量の煙が発生し、観客の皆様が良い感じにいぶられてしまったんです。
HDR-XR500Vにも、燻製の香りがついてしまったほど。

大きなカメラ(HDR-FX1000やHDR-AX2000)が欲しいなぁと思う事も多いですが、混雑する場所に来ると一気に大型カメラへの気持は萎えて、普通の小型ハンディカムの進化に感謝したくなりますね・・・。

当たり前ですが、ハンディカムくらい小さいカメラだと、しっかりファインダーに接眼して顔の前でコンパクトに構えれば、他の方の邪魔になりにくいのが大きな美点ですね。三脚立てるのなんか、場の空気的にも絶対ありえないので、HDR-XR500Vの強烈手振れ補正ありがたいどころの話じゃないですね。サウンドも5.1chドルビーデジタルできっちりしているのもポイント高し。

HDR-XR500Vの設定ですが、ホワイトバランスを太陽光に固定した以外は、フルオートでしたが、やはり極めて優秀でした。晴れた日の朝ということで、現場はかなり明暗差の激しいシーンが多かったのですが、見たままの感じでバランス良くまとめてくれて感動します。
こういう事が続くと「フルオートがここまで優秀ならマニュアルなんていらないのではないか」と錯覚してしまうのですが、そう思っていると、当日は全然大丈夫でしたけれど、油断していると魔が差すようにフルオートが破綻するシーンが現れたりするもんで、言い切っちゃいけない。

さて、ハイビジョン時代の真骨頂と言えるのは広角レンズによる、いわゆる「引きの画」ですよね。
1920X1080ドットを活かした高情報量の勝負。

新型のHDR-XR550V(メモリモデルはHDR-CX550V)ならば、標準で広角29.8mm撮影可能という夢を実現しておりますが、さすがにHDR-XR500Vではそうはいかないので、ワイドエンドコンバージョンレンズを使っています。

ちなみに、HDR-XR550Vは、ビットレート17Mbpsモードを備えていますが、ソニーによれば、これって実はHDR-XR500Vなどが最高画質として備える16Mbpsモードと同じで、単純に表記を変えただけだそうです。[情報ソースはこちら(なかほどの記事)]

サウンド分も入れると17Mbpsだし、実際にパナソニックは既に17Mbpsと言っているので、ソニーもそれに合わせて17Mbpsと呼称するという事でしょうね。
ネットを見ると、17Mbpsに強化されたと言われていたりしますが、強化ではなくて、そもそもHDR-XR500Vの最高画質モードは17Mbpsだったんです、というのが本当のところですね。

掲載した画像は、PSPの壁紙にした時に綺麗に見える920X518ドットにしております。

2010年1月29日金曜日

SQLCLRで、テーブルレイアウト情報をテーブル形式で取得する関数を作る (第二弾)


今回の記事は、以前このブログで書かせていただきました、「SQL CLRにおいて、テーブルレイアウト情報をテーブル形式で取得する関数を作る」という記事の第二弾です。

前回は、テーブルのレイアウト情報を3つのシステムテーブル(sysobjects、syscolumns、systypes)から取得していましたが、よりシンプルな書き方が可能なINFORMATION_SCHEMA.COLUMNSから取得してみます。

INFORMATION_SCEMAでは足りない情報は、systypesから補足します。
なお、環境は適宜、ご自分の環境に読み替えて下さいませ。

■ 基本となるSQL文 ■

SELECT
CAST(M.ORDINAL_POSITION AS int) AS [FIELD_NO],
M.COLUMN_NAME AS [FIELD_NAME],
M.DATA_TYPE AS [FIELD_TYPE],
CAST(ISNULL(M.CHARACTER_MAXIMUM_LENGTH,T.length) AS int)
AS [FIELD_LENGTH],
CAST(ISNULL(M.CHARACTER_OCTET_LENGTH,T.length) AS int)
AS [FIELD_BYTE],
ISNULL(M.COLLATION_NAME,'') AS [FIELD_COLLATION]
FROM データベース名.INFORMATION_SCHEMA.COLUMNS AS M
LEFT JOIN master.dbo.systypes AS T
ON(M.DATA_TYPE COLLATE Japanese_BIN = T.name COLLATE Japanese_BIN)
WHERE M.TABLE_NAME = 'テーブル名';





■ SQL CLRのソース ■
無料版のVisual C# 2008 Expressでプログラムを書けます。

//*******************************************************
//* テーブル情報用の構造体
//*******************************************************
private struct stc_TableInfo
{
public Int32 FIELD_NO; //フィールドの順番
public string FIELD_NAME; //フィールド名
public string FIELD_TYPE; //フィールドの型
public Int32 FIELD_LENGTH; //フィールドのサイズ(定義値)
public Int32 FIELD_BYTE; //フィールドのサイズ(バイト値)
public string FIELD_COLLATION; //文字列の場合は照合順序
}

//------------------------------------
//テーブル情報取得関数
//------------------------------------
[Microsoft.SqlServer.Server.SqlFunction(
FillRowMethodName = "SQLCLR_GetTableInformation_StreamRow",
TableDefinition =
"FIELD_NO int,FIELD_NAME nvarchar(max),FIELD_LENGTH int,FIELD_BYTE int,FIELD_COLLATION nvarchar(max)",
DataAccess = DataAccessKind.Read
)]
public static IEnumerable SQLCLR_GetTableInformation(SqlString p_svr,SqlString p_db,SqlString p_tbl)
{
List<stc_tableinfo> useList_rec =
new List<stc_tableinfo>(); //結果格納エリア
 //<>は半角で入力です。
stc_TableInfo use_rec; //データ取得エリア
string str_con; //接続文字列格納エリア
string str_sql; //クエリー文字列格納エリア
SqlConnection obj_con = null; //SQL-Server接続クラス
SqlCommand obj_cmd = new SqlCommand(); //SQL-Serverコマンド
SqlDataReader obj_red = null; //SQL-Serverデータリーダー

try
{
//SQL接続文字列設定(context connection = trueはだめ)
str_con = "Data Source=#####SVR#####;User Id=XXXX;Password=XXXX";
str_con = str_con.Replace("#####SVR#####", (string)p_svr);
obj_con = new SqlConnection(str_con);
obj_con.Open();
obj_cmd.CommandTimeout = 60;
obj_cmd.CommandType = CommandType.Text;

str_sql = "SELECT ";
str_sql+= "CAST(M.ORDINAL_POSITION AS int) AS [FIELD_NO], ";
str_sql+= "M.COLUMN_NAME AS [FIELD_NAME], ";
str_sql+= "M.DATA_TYPE AS [FIELD_TYPE], ";
str_sql+= "CAST(ISNULL(M.CHARACTER_MAXIMUM_LENGTH,T.length) AS int) ";
str_sql+= " AS [FIELD_LENGTH], ";
str_sql+= "CAST(ISNULL(M.CHARACTER_OCTET_LENGTH,T.length) AS int) ";
str_sql+= " AS [FIELD_BYTE], ";
str_sql+= "ISNULL(M.COLLATION_NAME,'') AS [FIELD_COLLATION] ";
str_sql+= "FROM #####DB#####.INFORMATION_SCHEMA.COLUMNS AS M ";
str_sql+= "LEFT JOIN master.dbo.systypes AS T ";
str_sql+= "ON(M.DATA_TYPE COLLATE Japanese_BIN = T.name COLLATE Japanese_BIN) ";
str_sql+= "WHERE M.TABLE_NAME = '#####TBL#####'; ";

str_sql = str_sql.Replace("#####DB#####", (string)p_db);
str_sql = str_sql.Replace("#####TBL#####", (string)p_tbl);
obj_cmd.CommandText = str_sql;
obj_cmd.Connection = obj_con;
obj_red = obj_cmd.ExecuteReader();

//SQL-Serverから取得したデータを結果エリアに格納する
//@@@@@@@@@@[LOOP-START]@@@@@@@@@@
while (obj_red.Read())
{
use_rec.FIELD_NO = obj_red.GetInt32(0);
use_rec.FIELD_NAME = obj_red.GetString(1);
use_rec.FIELD_TYPE = obj_red.GetString(2);
use_rec.FIELD_LENGTH = obj_red.GetInt32(3);
use_rec.FIELD_BYTE = obj_red.GetInt32(4);
use_rec.FIELD_COLLATION = obj_red.GetString(5);
useList_rec.Add(use_rec);
}
//@@@@@@@@@@[LOOP-END ]@@@@@@@@@@

}
catch (System.Exception obj_err)
{ //例外が発生したらSQL-Serverにthrowして実行を強制停止する。
throw obj_err;
}
finally
{
if (obj_con != null)
{
obj_con.Close();
obj_con.Dispose();
}
if (obj_red != null)
{
obj_red.Close();
obj_red.Dispose();
}
obj_cmd.Dispose();
}

return useList_rec; //ストリーム部にデータを送信する。
}
//ストリーム部(1レコードあたりの処理を記述しているのに注意)
private static void SQLCLR_GetTableInformation_StreamRow(
object obj_delivery, //関数部から1レコード受け取り用
out SqlInt32 FIELD_NO,
out SqlString FIELD_NAME,
out SqlString FIELD_TYPE,
out SqlInt32 FIELD_LENGTH,
out SqlInt32 FIELD_BYTE,
out SqlString FIELD_COLLATION
)
{
stc_TableInfo use_receive = (stc_TableInfo)obj_delivery;
FIELD_NO = (SqlInt32)use_receive.FIELD_NO;
FIELD_NAME = (SqlString)use_receive.FIELD_NAME;
FIELD_TYPE = (SqlString)use_receive.FIELD_TYPE;
FIELD_LENGTH = (SqlInt32)use_receive.FIELD_LENGTH;
FIELD_BYTE = (SqlInt32)use_receive.FIELD_BYTE;
FIELD_COLLATION = (SqlString)use_receive.FIELD_COLLATION;
}





■ SQL-Server 2008 (Express)側の定義 ■

-- *******************************************************
-- SQLCLRの関数インターフェース
-- *******************************************************
-- ----------------------------------------------
-- テーブルレイアウト情報を取得する
-- (パラメータ説明)
-- @p_svr : サーバー名
-- @p_db : データベース名
-- @p_tbl : テーブル名
-- ----------------------------------------------
CREATE FUNCTION SQLCLR_GetTableInformation(
@p_svr nvarchar(max),
@p_db nvarchar(max),
@p_tbl nvarchar(max)
)
RETURNS TABLE(
FIELD_NO int,
FIELD_NAME nvarchar(max),
FIELD_TYPE nvarchar(max),
FIELD_LENGTH int,
FIELD_BYTE int,
FIELD_COLLATION nvarchar(max)
)
AS EXTERNAL NAME ASSEMBLY_SQLCLR.CLS_SQLCLR.SQLCLR_GetTableInformation;
GO

HDR-XR500Vを元にして、HDR-XR550Vを考える





実は、前触れがあったのですが、通勤途中の車内で体調不良を起こしてしまい、寝込んでいましたが。
今は、なんとか落ち着いてきたのでブログを更新させていただきます。

気になるのは、やはりソニーのHDR-XR550V
ありとあらゆる面において、理想に近い最高のハイビジョンカメラに仕上がっているようです。
レンズも家庭用ビデオカメラとしては奇跡的と言っても過言ではない、29mm広角ズームレンズを採用し、私も所有しているHDR-XR500Vで実現された「虹彩絞り」も継続採用で、まさに金メダル二冠達成です。

ただ、センサーや画作りの傾向はHDR-XR500Vと同じ感じなので、HDR-XR500Vを元にしてHDR-XR550Vを考えてみようかなと思います。

まず、画質ですが、HDR-XR550Vを待つまでもなく、既にHDR-XR500Vでかなりのハイレベルに到達しています。
世界初の裏面照射センサー「エクスモアR」は、1/2.88型センサーとは思えないくらいダイナミックレンジが広く、映像処理エンジン「BIONZ」の適切な処理もあって、極端な明暗差の存在するシーンでも、暗部と明部をうまく平均的に写してくれますし、青空を背景にしても被写体が暗く落ち込んだりしないなど、「家庭用ビデオカメラじゃだめだろうなぁ」とあきらめていたシーンが安定して撮影できてしまうパフォーマンスを持っています。

大型機と比較すると、レンズ性能がもう少し欲しいなぁと思う事はありますが、価格やサイズを考えるとこのあたりが当面の終着地点として納得しなければならないかな、と思える点もあります。

HDR-XR500Vが革命機種であることは間違いなく、小型の家庭用ビデオカメラに対する見方を完璧に転換させた歴史に残る名機と言えるでしょう。

ただし、HDR-XR500Vには、大きな大きな泣き所が存在します
それは、以下の点であり、今回のHDR-XR550Vは、この泣き所を全て解消しているのが圧巻です。

(泣1)絞りとシャッター速度を直接マニュアル操作できない。(550Vは可能!!)
(泣2)機能の切り替えが液晶モニタ経由なので不便。(550Vは「おまかせオート」で解決)
(泣3)オートフォーカスが遅い(550Vは高速化されている)
(泣4)最大ビットレート16Mbpsなので、精神的に不安。(550Vは24Mbpsなので精神的に安心)
などなど。

正直、最大ビットレートに関しては、実用上は16Mbpsでも十分だと感じましたが、圧縮ノイズが出るにしても、24Mbpsモードじゃないとあきらめがつかない精神的な面ってありますよね。
まぁ、いらなければ使わなければ良いだけですし、あるのに越したことは無いです。

(追記)
ネットを見ると、HDR-XR550Vの登場で、HDR-XR500Vを売却する方の話を散見いたしますが、HDR-XR550Vは、広角になった代わりに望遠が弱まっています。

余計なお世話なのは承知の上で、動物園とか運動会とか、被写体が遠くにあり、比較的望遠寄りでないと困りそうなシーンの撮影のために、できれば
HDR-XR500Vは残しておくのがベストだと思います。

画質的に言っても、HDR-XR550Vにテレコンバージョンレンズを装着するよりは、HDR-XR500Vの方がGレンズのマスターそのまま使うなら美しいと思いますし、ハードディスク/メモリスティックのハイブリッドなので、SDカードが使えないというのは痛いものの、まだまだ記録メディア的にも現役。

ソニーが最強・最高クラスの理想に近いビデオカメラ発表!!その名はHDR-XR550V

ななな・・・。
ソニー、とうとう、やってくれた!!
ついに、最強・最高クラス、理想に近いとんでもないビデオカメラを発表してくれました。

その名はHDR-XR550V
私が所有するHDR-XR500Vの泣き所を、ほぼ全部潰しております。

ついに待望のマニュアル操作モード搭載!!
そして、ビットレートは24Mbps対応!!
大騒ぎなのが、家庭用ビデオカメラの夢だった「広角レンズの標準搭載」です。
なんと、なんと、標準で29.8mm達成。
HDR-XR500Vも、ワイドコンバーターをかぶせれば行けましたが、ワイドコンバーターは問答無用でマスターレンズよりは画質が劣化してしまうため気になる点でした。

さらに、メモリーモデルのHDR-CX550Vは、電子ビューファインダー搭載とSDカードにも対応

やったソニー。電子ビューファンダーが無いと、暗い場所では他人の迷惑になってしまうから絶対必須の機能ですもんね。さすがに分かっている・・・!! 
やはりソニーはビデオカメラのトップメーカーだ。

このカメラ、引き続き大注目して行きたいと思います!!

2010年1月23日土曜日

SQLCLRで、テーブルレイアウト情報をテーブル形式で取得する関数を作る

今回の記事では、SQLCLRで、テーブルレイアウト情報をテーブル形式で取得する関数を作ってみます。

テーブルレイアウトそのものをテーブルの形式で求めるというのは、このブログでも以前書かせて頂きましたが、それをSQLCLRで関数化してしまうと、かなり応用が利いて便利だと思います。

関数には、サーバー名、データベース名、テーブル名を指定出来るようにしてあります。
環境につきましては、私のものなので、ご自分の環境に適宜読み替えて頂ければと思います。
なお、SQL-Server 2008との接続文字列ですが、「context connection = true」を使いたいのは山々なのですが、これを使ってしまうと、アセンブリ(DLL)からシステムテーブルにアクセスが禁止されてしまい使えませんでした。



■ SQLCLR関数側ソース ■



//*******************************************************
//* テーブル情報用の構造体
//*******************************************************
private struct stc_TableInfo
{
public Int16 FIELD_NO; //フィールドの順番
public string FIELD_NAME; //フィールド名
public string FIELD_TYPE; //フィールドの型
public Int16 FIELD_LENGTH; //フィールドのサイズ(バイト単位)
public string FIELD_COLLATION; //文字列の場合は照合順序
}

//------------------------------------
//テーブル情報取得関数
//------------------------------------
[Microsoft.SqlServer.Server.SqlFunction(
FillRowMethodName = "SQLCLR_GetTableInformation_StreamRow",
TableDefinition = "FIELD_NO smallint,FIELD_NAME nvarchar(max),FIELD_LENGTH smallint,FIELD_COLLATION nvarchar(max)",
DataAccess = DataAccessKind.Read
)]
public static IEnumerable SQLCLR_GetTableInformation(SqlString p_svr,SqlString p_db,SqlString p_tbl)
{
List useList_rec = new List(); //結果格納エリア
stc_TableInfo use_rec; //データ取得エリア
string str_con; //接続文字列格納エリア
string str_sql; //クエリー文字列格納エリア
SqlConnection obj_con = null; //SQL-Server接続クラス
SqlCommand obj_cmd = new
SqlCommand(); //SQL-Serverコマンド
SqlDataReader obj_red = null; //SQL-Serverデータリーダー

try
{
//SQL接続文字列設定(context connection = trueはだめ)
str_con = "Data Source=#####SVR#####;User Id=xxx;Password=xxx";
str_con = str_con.Replace("#####SVR#####", (string)p_svr);
obj_con = new SqlConnection(str_con);
obj_con.Open();
obj_cmd.CommandTimeout
= 60;
obj_cmd.CommandType = CommandType.Text;
str_sql = "SELECT ";
str_sql += "T.colid AS [FIELD_NO], ";
str_sql += "T.name AS [FIELD_NAME],";
str_sql += "T2.name AS [FIELD_TYPE],";
str_sql += "T.len
gth AS [FIELD_LENGTH],";
str_sql += "ISNULL(T.collation,'') ";
str_sql += "AS [FIELD_COLLATION] ";
str_sql += "FROM #####DB#####.dbo.sysobjects AS M ";
str_sql += "INNER JOIN #####DB#####.dbo.syscolumns AS T ";
str_sql += "ON(M.id = T.id) ";
str_sql += "INNER JOIN #####DB#####.dbo.systypes AS T2 ";
str_sql += "ON(T.xusertype = T2.xusertype) ";
str_sql += "WHERE M.id = OBJECT_ID('#####DB#####.dbo.#####TBL#####') ";

str_sql = str_sql.Replace("#####DB#####", (string)p_db);
str_sql = str_sql.Re
place("#####TBL#####", (string)p_tbl);
obj_cmd.CommandText = str_sql;
obj_cmd.Connection = obj_con;
obj_red = obj_cmd.ExecuteReader();

//SQL-Serverから取得したデータを結果エリアに格納する
//@@@@@@@@@@[LOO
P-START]@@@@@@@@@@
while (obj_red.Read())
{
use_rec.FIELD_NO = obj_red.GetInt16(0);
use_rec.FIELD_NAME = obj_red.GetString(1);
use_rec.FIELD_TYPE = obj_red.GetString(2);
use_rec.FIELD_LENGTH = obj_red.GetInt16(3);
use_rec.FIELD_COLLATION = obj_red.GetString(4);
useList_rec.Add(use_rec);
}

//@@@@@@@@@@[LOOP-END ]@@@@@@@@@@

}
catch (System.Exception obj_err)
{ //例外が発生したらSQL-Serverにthrowして実行を強制停止する。
throw obj_err;

}
finally
{
if (obj_con != null)
{
obj_con.Close();
obj_con.Dispose();
}

if (obj_red != null)
{
obj_red.Close();
obj_red.Dispose();
}
obj_cmd.Dispose();
}

return useList_rec; //ストリーム部にデータを送信する。
}
//ストリーム部(1レコードあたりの処理を記述しているのに注意)
private static void SQLCLR_GetTableInformation_StreamRow(
object obj_delivery, //関数部から1レコード受け取り用
out SqlInt16 FIELD_NO,
out SqlString FIELD_
NAME,
out SqlString FIELD_TYPE,
out SqlInt16 FIELD_LENGTH,
out SqlString FIELD_COLLATION
)
{

stc_TableInfo use_receive = (stc_TableInfo)obj_delivery;
FIELD_NO = (SqlInt16)use_receive.FIELD_NO;
FIELD_NAME = (SqlString)use_receive.FIELD_NAME;
FIELD_TYPE = (SqlString)use_receive.FIELD_TYPE;
FIELD_LENGTH = (SqlInt16)use_receive.FIELD_LENGTH;
FIELD_COLLATION = (SqlString)use_receive.FIELD_COLLATION;
}


■ SQL-Server側 ■



-- *******************************************************
-- SQLCLRの関数インターフェース
-- *******************************************************
-- ----------------------------------------------
-- テーブルレイアウト情報を取得する
-- (パラメータ説明)
-- @p_svr : サーバー名
-- @p_db : データベース名
-- @p_tbl : テーブル名
-- ---------------
-------------------------------
CREATE FUNCTION SQLCLR_GetTableInformation(
@p_svr nvarchar(max),
@p_db nvarchar(max),
@p_tbl nvarchar(max)
)
RETURNS TABLE(
FIELD_NO smallint,
FIELD_NAME nvarchar(max),
FIELD_TYPE nvarchar(max),
FIELD_LENGTH smallint,
FIELD_COLLATION nvarchar(max)
)
AS EXTERNAL NAME
ASSEMBLY_SQLCLR.CLS_SQLCLR.SQLCLR_GetTableInformation;



■ レイアウトがテーブル化されていると便利な例 ■

テーブルレイアウトがテーブル化されていると、クエリーでさまざまな操作が可能になります。たとえば、フィールド名を一行に並べて表示するという事も、再帰クエリーと組み合わせれば一文で可能です。



WITH
CTE_SOURCE
AS
(
SELECT
ROW_NUMBER() OVER(ORDER BY FIELD_NO) AS "KEY_NO",
ROW_NUMBER() OVER(ORDER BY FIELD_NO)+1 AS "NEXT_KEY_NO",
CAST(FIELD_NAME AS nvarchar(max)) AS "FIELD_NAME"
FROM
SPDB.dbo.SQLCLR_GetTableInformation('ASPIRE1410\sqlexpress','tempdb','##T_TEST')
),
CTE_TARGET
AS
(
SELECT
MAX(KEY_NO) AS "KEY_NO"
FROM CTE_SOURCE
),
CTE_CORE
AS
(
--アンカー部
SELECT
KEY_NO AS "KEY_NO",
NEXT_KEY_NO AS "NEXT_KEY_NO",
FIELD_NAME AS "LIST"
FROM CTE_SOURCE
WHERE KEY_NO = 1
--再帰部
UNION ALL
SELECT
T.KEY_NO AS "KEY_NO",
T.NEXT_KEY_NO AS "NEXT_KEY_NO",
M.LIST + ',' + T.FIELD_NAME
AS "LIST"
FROM CTE_CORE AS M
INNER JOIN CTE_SOURCE AS T
ON(M.NEXT_KEY_NO = T.KEY_NO)
)
SELECT
M.LIST
FROM CTE_CORE AS M
INNER JOIN CTE_TARGET AS T
ON(M.KEY_NO = T.KEY_NO)
OPTION (MAXRECURSION 0);


Nintendo DS版「ドラゴンクエスト4」やっぱり面白い

ドラゴンクエスト9によって、すっかりドラクエ熱が復活してしまい、今度は同じNintendo DSの「ドラゴンクエスト4」をプレイ中です。

■ 個人的に一番好きなドラクエは「4」■

個人的に、一番好きなドラクエは4なんです。
堀井雄二節といいますか、短いテキスト、短い展開の中で、非常に濃密なストーリーを語ってしまう手腕は見事としか言いようがないです。

特に、本編とも言える「第5章 導かれし者たち」のシナリオは秀逸も秀逸。

どんな悪をも倒せるが、まだ幼くて力の弱い勇者。その勇者を、命がけで魔物の襲撃から守る村の運命には、もう涙が流れてしょうがないです。
ドラクエ4は、絶望のあとに訪れる希望がテーマになっている感があり、盛り上がり方がハンパじゃありません。

■ 実はファミコン版は未プレイ ■

実は、オリジナルのファミコン版は所有はしているものの、未プレイなんです。
ドラゴンクエスト4の初プレイは、プレイステーション版でした。
1500円になってもいいから、PSPでアーカイブス版を買うぞーと思っていたら、そっちよりも先にNintendo DSで発売されてましたね。

■ やはりPSPかDSが良いですね■

プレイステーション版も良いけれど、DS版は、いつでもどこでもプレイできるのは絶対的に大きい。
ゲーム内容は、2画面で情報量が多いというアドバンテージがありますが、とにかくどこでも遊べるという点において圧倒的に進化していると言ってしまいます。いやーこれはスペックがどうとか数字の問題を超えてますよね。


個人的には、もはや携帯ゲーム機で出るのか出ないのかがゲームを買うか買わないかの運命の分かれ道ですね。

PS3は、地デジレコーダーとして購入する「かも」ですが、以前所有していた時に、ゲームソフトは沢山買ってみたものの、結局はゲーム中断がサポートされない不自由さが嫌になり、PSPばかり遊んでスルー状態になってましたからねぇ・・・。
復活するかどうかは微妙。

2010年1月21日木曜日

ファミコン探偵倶楽部/うしろに立つ少女クリアしました

ファミコン探偵倶楽部/うしろに立つ少女」ですが、ようやくクリアしました。

いや、実のところ、買った当時には一回クリアしているのですが、内容を記憶喪失かというくらい、綺麗さっぱり全部忘れている始末でしたから、まさかの完全新作レベルで楽しめました

この作品は、ファミコン/ディスクのアドベンチャーゲームの大傑作として語り継がれているのですが、確かにそれほどの事がある完成度。

学校に出没するという血まみれの少女の霊。興味本位でそれを調べ始めた少女が殺害されてしまう・・・。

かなりスピード感のあるサスペンスで、ほどよくオカルト風味のスパイス。
次から次へと新しい展開が起こり、ミスリーディングやどんでん返しなど、さまざまなテクニックが投入されております。
当時のファミコンゲームらしく、ドラマや映画とは別種の「ゲームらしい」としか言いようが無い遊び心のあるシーンもあって、当時既にここまでのゲームが作られていたとは・・・衝撃を受けました。

衝撃といえば、クライマックスの展開は何の文句も無く百点満点。
さまざまなゲームを遊んできた今でも、「うわっ」と本当に声をあげそうになるほど、頭パカーンってやられました

総毛立つというのでしょうか。思わずプレイを中断して、友達に「すげぇぞこのソフト」メールを送信してしまうほどでしたね。

グラフィックスに関しても、PSPのように何でもかんでもダイレクトに全て描けてしまうというのも良いのですが、ファミコンの制限があるグラフィックスは、プレイヤーの想像力を掻き立てる面もあって、こういうサスペンス作品にはかえってプラスなのかも。
もちろん、省略された描画が何でも良いわけではなく、それを活かし、恐怖心を煽るテクニックを持つクリエイターさんの手腕に脱帽です。

それにつけても、任天堂のアドベンチャーゲームって良作ばかりな気がする。
手元には、ファミコン昔話・新鬼が島とかまだまだあるし、これからも楽しみ。

こうなれば、次世代DSやWiiなどにも、沢山アドベンチャーゲームを作って欲しいなぁ。

仕事で疲れた頭を休める地デジレコーダー。PS3へも期待大。

今日の仕事もかなりきつかった・・・。
今は、ちょっと某ヨーロッパの会社を相手にしてプログラム開発しているのですが、時差が8時間もあるので、日本側が良い具合に疲れ始める時間に、向こうが元気バリバリで出社して来るので気力を埋めるのが大変。それと、何か問題が発生したら、解決のタイムリミットが向こうの出社時間まで!!という流れなので、息詰まる攻防戦。良く言えば、毎日ありえないスリルに満ち溢れています。

そんな中、帰宅して頭を休めるのに良いなぁと思うのが、2時間ドラマの録画。
良くも悪くも分かりやすい内容のものが多いし、たまに下手な映画よりも面白い作品もあるし、満足度も高いです。

録画は、そろそろアナログをやめて、地デジ中心にしているのですが、うちのレコーダーはチューナーが一つしか無いので、そろそろもう一台レコーダーが欲しいところ。
ちょうど、いよいよ3月に地デジレコーダーとして生まれ変わる(?)PS3には大期待。

PSPに「おでかけ」が出来るのが、とにもかくにも、最強。
PSPに映像がダビング出来るならば、場所を選ばずに観られるわけだし、ブラウン管テレビにも出力して観られる(はず)。楽しみが広がりそう。

最近PS3にハマっている親友とも、先日この話題で盛り上がったのですが、もう絶対に買うそうです。
私も買う方向ではいるのですが、発売してすぐに・・・とはいかないかも。

■ゲームはどうしよう?■

PS3のゲーム・・・どうしましょう。
手持ちのタイトルは全て売却してしまったとはいえ、ダウンロード専売タイトルは残っているし、これらを中心に遊ぶつもりです。

パッケージソフトは・・・。うーん。今や、あんまり欲しいものがないんで、買う予定は無いです。
PSPとDS、それにレトロゲーム機があれば、面白いゲームには不自由しないし。

2010年1月19日火曜日

ドラゴンクエスト9クリアしました

年末年始からずっとハマっていたNintendo DSの「ドラゴンクエスト9」ですが、ようやくクリア出来ました。

■全体の感想■

伝統の分かりやすさと、流行の3Dキャラ走り回りビュー炸裂の戦闘シーンは、さすがはドラクエ。安心感もあって本当に楽しかったです。
こういう良作が沢山あるDSは、本当にありがたいゲーム機だなぁと。じんわり。

シナリオ面においては、昔から御大・堀井雄二節を楽しませて頂いている者としては、今回も作ってくれて感謝です。

ただ、好み的な話をすると、一番良かったのは、人助けをしながら旅をするあたり。
ここは文句なく好き。

終盤の展開は、万人向けにせざるを得ない国民的RPGではしょうがないでしょうが、結構エグいはずの展開が、ややオブラートにくるまれた感じがして、ちょっとだけ惜しい。

いや、あえて、いちいち全ては描写しない、高度なワザなのかも。

次回作は早々とWiiである旨が発表されましたが、次世代DSの性能が満足行くもので、また、一千万台とか売れるなら、次世代DSに変更という目は無いのかな。

DSやPSPのような、自由な場所でのゲームプレイに慣れると、もう・・・

2010年1月16日土曜日

がんばれウィルコム、がんばれW-ZERO3シリーズ!!


このところウィルコムのピンチが色々と伝えられますね。
どうなるか分からないですが、潰れたり、撤退したりしないで欲しい(欲しいって言われても困るでしょうけれど)。

通信キャリアの中では、正直、ウィルコムしか好きなところが無いので、他のキャリアには行きたくないのです。ウィルコムが無くなってしまうと、路頭に迷ってしまいます。

■W-ZERO3大好き!!■

私がウィルコムが好きな理由は、ずばり、W-ZERO3シリーズを生み出してくれたからです。

思えば、携帯電話というデバイスそのものが大嫌いで大嫌いで、でも必要に迫られて10年間もDoCoMoのケータイをしぶしぶ所有していました。

W-ZERO3が登場してくれた時は、キャリアが縛りつけを放棄した太っ腹っぷり、その夢のような自由度の高さに惚れ込み、初めて望んで買える端末の登場に、浮き立ちましたし、ほんっとに嬉しかったなぁ・・・。
友達や家族が「なんだウィルコムって?聞いたこともないぞそんな会社。やめとけ」と止めたのを振り切って契約しましたっけ。

まぁ、正直に打ち明けると、いきなり当日からシステムがフリーズ連発して、私と連絡が取れなくなった家族に大ブチキレされたのも、今となっては良い思い出・・・と言いたいですが、W-ZERO3は、通信部分が独立したモジュールになっているので、全機種がいつでも好きな時に「最先端の現役化」出来るわけで、いつでも当時を再現可能ですけど。

まぁ、フリーズといっても、フリーソフト入れまくって、アプリケーションをメモリの限界を超えて起動したり利用したり出来るのに甘えて、バンバンやりすぎた自己責任の部分も大きいんです。
でも、W-ZERO3は何といっても自由なパソコン電話なので、なかなか大人しくしていられない!! 無線LANで自宅内のNASに接続中とか、LinuxにSSH2でリモートアクセスとか、無茶も休み休みしろ状態ですから。

■ちょっとPHSならではのメリット■

PHSというと、通信速度が遅いとか、圏外になりやすいとか、ネガティブな印象が強いのではないかと思います。でも、最近の端末は必ずしもそうとは限らないのですが、PHSは電磁波(SAR値)とても低いというメリットがありました。もっとも電磁波の害自体が証明されていないわけですから、ことさら問題視するつもりは無いですが、あくまでも参考話程度で。
W-ZERO3[es]など、当時私が同時に所有していたDoCoMoの人気端末と比較して、なんと1/50程度の低電磁波(SAR値)だったりしました。

PHSは、電波が弱いゆえのメリットがあるわけです。病院でも使えるし、いざとなれば、通信モジュール(W-SIMモジュール)を抜けば、電波を完璧にストップできます。これはW-SIMシステムを持つウィルコムにしか出来ないワザと言えるでしょう!!

それと、音声通話の美しさは、固定電話クラスです。PHS同士だと、しゃべっている人のうしろで流れるテレビの音声とか、物音とか、そういうものまで聞こえる再現性なんですよ。
このメリットは、毎日享受してます。
低SAR値で(精神的に、という側面が強いですが)電磁波の害を比較的気にせず、美しい音声で好きな人と長電話できる!! これぞPHSの醍醐味。
問題は、相手がDoCoMoやauばかりでなかなかウィルコムがいてくれない事ですけどね、まぁしょうがない。


■これからのW-ZERO3■

以前もこのブログで書かせて頂きましたが、個人的には、電話はW-ZERO3しか買いたくないので、新機種は気になるとかいうレベルではないのです。
ただ、今回のHYBRID W-ZERO3はパスです。端末に対する不満を書いてしまった事もありますが、そればかりでなく、そもそも、今使っているWillcom 03が今年の夏までの2年縛りになっているので動けないというのもあります。
新規でもう一回線引いてやれーとか思われるでしょうが、もう既にウィルコムを複数回線契約しているんですよ。もう一回線増やす余力はちょっと無いです。

だから、まだ見ぬ次のW-ZERO3の購入は考えています。
むしろ、今後が楽しみ!!
Windows Mobile 7搭載になるか、アンドロイド搭載になるか、フルキーボード搭載になるか、テンキーのみか、3G継続なのか、いよいよ次世代PHS=XGPが来てくれるのか。
それに、くどいようですが、新しいW-ZERO3を買っても、気の向くままに今までのW-ZERO3に戻せるので、新端末リスクも無いと言えるか・・・(あ、そうなれば、もしかすると、HYBRID W-ZERO3も夏ごろに買っていたりするかも・・・?)

とにかく、これからもW-ZERO3を使い続けたいのです。がんばれウィルコム。がんばれW-ZERO3!!

2010年1月15日金曜日

激震!!PS3がレコーダーになる!!トルネのインパクト!!!

ソニーが、満を持してメモリカード記録のハイエンド・ハンディカム「HDR-AX2000」を発表。
これは、まさか・・・と思っていたら、PS3史上最大の激震情報も来ておりました。

なんと、日本では不可能だろうなぁ・・・と、はなっからあきらめていた、PS3を地上波デジタル録画対応にする純正の周辺機器「トルネ」が発売決定となりました。

数量限定でハードディスク250GBのPS3同梱パックが発売されますが、PS3なので、内蔵ハードディスクを自由に交換できるし、さらに外付けHDDにも録画可能。
決定的なのは、録画番組をPSPに転送して、いつでもどこでも観られるんですよ。いわゆる「おでかけ」機能というやつですか!!

PSPに「おでかけ」できるレコーダーをまともに買ったら、ハイエンドPCくらいのお値段がしてしまうので、このインパクトはまさに絶大と言えるでしょうね。

しかも、PSPからのリモートプレイで離れた場所からも操作可能という、PS3-PSP連動メリットをフル活用。

レコーダー専用機よりは機能が落ちるでしょうけれど、操作が直感的で分かりやすい感じですし、メカ音痴の家族でも平気で操作できそうなのが良い感じ。
今、自宅にあるレコーダーは、機能が豊富な代償として操作も複雑でして、細かい操作は私が代表してやらざるを得ず、非常に困っておりました。

PS3は、ゲーム面では、現在のところ、個人的には大きく期待はずれです。
PSPのように中断をサポートしてくれれば良いのですが、それができない古いユーザー拘束タイプのままだし、フルハイビジョンに対応しきれず(高度なグラフィックスのゲームは、解像度を落として作るのが主流)、ゲーム面での性能においては、ライバルのマイクロソフトXbox360よりも大きく劣ってしまう現実・・・と、なかなか厳しい状況があります。

けれど、レコーダーになるのならば、その魅力は水準以上に取り戻せるのではないか・・・と思います。
いや、これぞソニーならでは、プレイステーションプラットフォームならでは、という展開であり、まさに見事としか言いようがなく、もしかすると大化けするかも・・・。
3月に発売予定ということで、注目しております。

2010年1月13日水曜日

仕事

不景気といいますが、落ち込んでいる暇など無く・・・。
とにかく、会社が一人一人に求める能力は、加速をつけて高まっていますね。

システム開発も、もはや、設計だけ、製造だけやればいい、というのはもう私の周りでは無くて、下手すると、従来まではチームでやってたプロジェクトを全部一人でやれ、という勢いです。

しかも、時間は短く!
学校はゆとり教育でも、社会は昔の「モーレツ日本」が復活してるんですよね。

ところで、プログラム開発の仕事を希望する方に、アドバイスがあります。

開発能力も確かに大切なのですが、この仕事はリアルで戦場になります。
トラブル発生の時に、精神面が耐えられるかどうかが重要です。

決められた時間内に、絶対に結果を出さないといけないプレッシャー。
これに打ち勝って生き残れ!

2010年1月11日月曜日

お湯をつかってパンを焼いてみました

毎日パンを焼いている私ですが、最近どうもパサパサだなぁ・・・と悩んでいました。

ふと思いついて、水ではなくて、体温より少し高めくらいのお湯を使ってみたところ、復活!

仙台といえども、冬は水温がキンと落ちるんで、影響が大きかったみたいです。

これでまたおいしいパンを、人様に配ったり、自分で食べたり出来ます。ホッ。

うーむ。水温までは考えてなかった!

W-ZERO3とiPhone

今回の記事では、ウィルコムW-ZERO3シリーズと、iPhoneについて書かせて頂きたいと思います。

■人気に納得iPhone■

実は先日、親戚一同が会する出来事がありまして、ある方が持っていたiPhoneの地図アプリが大活躍。
スピードの速さ、ダブルタッチのインパクト。
この端末で何でも出来たら、そりゃみんな欲しくなるだろうな、と痛感。

Googleのアンドロイドが騒がれるのも、ようやくライバルらしいライバルが登場してくれたから、というのもあるんでしょうね。

ライバルと言えば、他があまりにも弱い。
残念ながら・・・PSPじゃ、ゲーム面ですらも、もう相手にもされてないっぽい・・・悲しい。

まぁPSPも可哀想で、そもそもゲームボーイの対抗を想定してたのに、いまやDSからスマートフォン、果ては大型機の相手まで、無理がありすぎかも。

かといって、多機能面では負けないはずのWindows Mobileはどうかといえば、こっちもこっちで厳しいという現実。
まず基本設計がマズイのか、スピードが絶対的に不足。
サクサクな電話に慣れた人々からは無視された存在っぽい。

おそるべしアップル。

■ウィルコムW-ZERO3■

人気では、もはやiPhoneに銀河系の彼方よりも遙かに遠く及ばない感のあるW-ZERO3ですが、日本におけるスマートフォンを切り開いた功績は揺るがないし、一般的な人気の高低は別として、私はこのシリーズじゃない電話は買いたくないなぁ・・・ってくらい好き。

ポイントは、W-ZERO3ってのは実は電話として見ちゃいけないマシン。
超小型パソコンであり、なんと電話にもなるぞ、こりゃ面白いなぁ、というスタンスなんですよね。
ここを理解して納得してないと、何じゃこりゃぁ解約だぁ!という末路になるわけです。

シャープは必死でパソコン色を薄めて、ケータイ色にしようと努力してますが、パソコン電話というスタイルを理解してもらえないまま売ったらマズイ端末だと、私は思います。

■W-ZERO3を切り替える■

このほど、最新のWillcom03から、一つ前のAdvanced/W-ZERO3[es]、通称アドエスにメイン端末を切り替えました。

全面タッチより、物理キーとタッチパネルの合わせ技が便利だなぁと。

切り替えたといっても、普通の電話とは違うのです。

ウィルコムW-ZERO3の場合は、アンテナも含めた通信部分が、W-SIMというカード型モジュールになっているので、誰の世話にもならず、ファミコンのカセットのように、自由自在に端末を自分で切り替えられるんですよ!

W-ZERO3のみならず、nicoとかWillcom9とか、W-SIM対応端末にならば、いつでもセット可能。

仮にですけれど、任天堂がOKして、W-SIMスロット付きのニンテンドーDSが発売されたらば、DSがその日からまんま電話になるんですよ。
でもちろん、いつでもW-ZERO3に戻れる。

どうですか、あまりにも思い切ったシステムですよね。すげぇ。

もっとも、ウィルコムはお金が無いので、手を広げて色々するのは無理っぽいですけど。

2010年1月9日土曜日

SQL-Serverで、テーブルレイアウトそのものをテーブルデータとして扱う方法


今回の記事では、SQL-Serverにおいて、テーブルのレイアウト情報そのものを、テーブルとして扱う方法について書かせて頂きたいと思います。

SQL-Serverにおいて、テーブルのレイアウトを知りたいと思ったら、sp_helpコマンドなどがあります。
ですが、テーブルそのものとして情報を扱えたら、比較や検索などで世話がありません。

たとえば、MAINDBというデータベースに、以下のようにT_TESTテーブルを作ったとします。


CREATE TABLE MAINDB.dbo.T_TEST
(
F01 text,
F02 uniqueidentifier,
F03 date,
F04 time,
F05 datetime2,
F06 datetimeoffset,
F07 tinyint,
F08 smallint,
F09 int,
F10 smalldatetime,
F11 real,
F12 money,
F13 datetime,
F14 float,
F15 sql_variant,
F16 ntext,
F17 bit,
F18 decimal,
F19 numeric,
F20 smallmoney,
F21 bigint,
F22 varbinary,
F23 varchar(50),
F24 binary,
F25 char(50),
F26 timestamp,
F27 nvarchar(50), --unicodeなので実際は100バイト
F28 nchar(50), --unicodeなので実際は100バイト
F29 xml
);



このテーブルのレイアウト情報をテーブルそのものとして扱うには、以下のようなクエリーを書けば良いです。


-- -------------------------------
-- SQL-Server 2000でも通用する文法
-- -------------------------------
SELECT
T.colid AS "FIELD_NO",
T.name AS "FIELD_NAME",
T2.name AS "FIELD_TYPE",
T.length AS "FIELD_LENGTH",
ISNULL(T.collation,'')
AS "FIELD_COLLATION"
FROM MAINDB.dbo.sysobjects AS M
INNER JOIN MAINDB.dbo.syscolumns AS T
ON(M.id = T.id)
INNER JOIN MAINDB.dbo.systypes AS T2
ON(T.xusertype = T2.xusertype)
WHERE M.id = OBJECT_ID('MAINDB.dbo.T_TEST')
ORDER BY "FIELD_NO";

-- -------------------------------
-- SQL-Server 2008用
-- -------------------------------
SELECT
T.column_id AS "FIELD_ID",
T.name AS "FIELD_NAME",
T2.name AS "FIELD_TYPE",
T.max_length AS "FIELD_LENGTH",
ISNULL(T.collation_name,'')
AS "FIELD_COLLATION"
FROM MAINDB.sys.objects AS M
INNER JOIN MAINDB.sys.columns AS T
ON(M.object_id = T.object_id)
INNER JOIN MAINDB.sys.types AS T2
ON(T.user_type_id = T2.user_type_id)
WHERE M.object_id = OBJECT_ID('MAINDB.dbo.T_TEST')
ORDER BY "FIELD_ID";


これは、以下のように一時テーブルにも応用が出来ます。
たとえば、SELECT INTOを使って、フィールドの型も指定せずに作りまくった一時テーブルを、後から見直す・・・というような用途にも使えると思います。


-- -------------------------------
-- 一時テーブル(便宜上、あらかじめ定義しておきます)
-- -------------------------------
CREATE TABLE #T_TEST
(
F01 text,
F02 uniqueidentifier,
F03 date,
F04 time,
F05 datetime2,
F06 datetimeoffset,
F07 tinyint,
F08 smallint,
F09 int,
F10 smalldatetime,
F11 real,
F12 money,
F13 datetime,
F14 float,
F15 sql_variant,
F16 ntext,
F17 bit,
F18 decimal,
F19 numeric,
F20 smallmoney,
F21 bigint,
F22 varbinary,
F23 varchar(50),
F24 binary,
F25 char(50),
F26 timestamp,
F27 nvarchar(50), --unicodeなので実際は100バイト
F28 nchar(50), --unicodeなので実際は100バイト
F29 xml
);

-- -------------------------------
-- SQL-Server 2000でも通用する文法
-- -------------------------------
SELECT
T.colid AS "FIELD_NO",
T.name AS "FIELD_NAME",
T2.name AS "FIELD_TYPE",
T.length AS "FIELD_LENGTH",
ISNULL(T.collation,'')
AS "FIELD_COLLATION"
FROM tempdb.dbo.sysobjects AS M
INNER JOIN tempdb.dbo.syscolumns AS T
ON(M.id = T.id)
INNER JOIN tempdb.dbo.systypes AS T2
ON(T.xusertype = T2.xusertype)
WHERE M.id = OBJECT_ID('tempdb.dbo.#T_TEST')
ORDER BY "FIELD_NO";

-- -------------------------------
-- SQL-Server 2008用
-- -------------------------------
SELECT
T.column_id AS "FIELD_ID",
T.name AS "FIELD_NAME",
T2.name AS "FIELD_TYPE",
T.max_length AS "FIELD_LENGTH",
ISNULL(T.collation_name,'')
AS "FIELD_COLLATION"
FROM tempdb.sys.objects AS M
INNER JOIN tempdb.sys.columns AS T
ON(M.object_id = T.object_id)
INNER JOIN tempdb.sys.types AS T2
ON(T.user_type_id = T2.user_type_id)
WHERE M.object_id = OBJECT_ID('tempdb.dbo.#T_TEST')
ORDER BY "FIELD_ID";


実行結果は、記事冒頭のスクリーンショット画像のようになります。

今年のゲーム

今年は、のっけから難易度の高い仕事が続いているので、実のところお正月休みの最中もプレッシャーがズッシリかかった状態で、全く落ち着かない毎日でしたねー・・・。
思えば、毎年、友達と行くのが恒例になっていた仙台初売りも行かず仕舞い。
今年のお正月は、幸いにもAspire 1410とWindows7があったので、まったりと勉強したり、友達と軽く近場で遊んだり、ゲームしてるか・・・まぁ静かな感じで過ごしてました。新型インフルエンザも怖いし。

さて、ゲームですが、今年は、ニンテンドーDSで始まりました。
ソフトは、「ドラゴンクエスト9/星空の守り人」。やっぱりプレイしてしまいますねコレは。
主人公は、旅人でもなく、伝説の勇者の子孫でもなく、なんと天使!!
びっくりした。
でも、天使という設定は非常においしくて、人助けをするという行為が、もう水戸黄門に近いくらいに説得力があるわけですよね。
イベントも、何やら軽く涙がじわっと来るタイプの「良い話」が多くて、「あ、なんかこういうの待ってたかも・・・」という感じ。
私は、かつて、自分が女神となって人の死に関わる「ヴァルキリープロファイル」というゲームに劇的ハマリ方をした経験があるので、こっちにも感情移入しやすかったかも。(PS版。PSP版は発売日当日に買ったというのに、まだ開封せずに積んでいたりします・・・)

ドラクエ9の今回の旅の仲間は、かつてのドラクエ3のように、自作キャラクターなのですね。おっつけ、仲間個別のドラマやイベントは皆無か。
作品上のヒロインは仲間キャラクターではあり得ず、イベントキャラクターの妖精サンディになるのかな?
サンディは、今ちょうどNintendo 64でも遊んでいるんで、サンディースティックから来ている名前かな?とか思ってしまった。まぁそれは無関係でしょうけど。サンディは、なぜかいわゆるギャル語でしゃべるので斬新。Nintendo 64といえば、「ゼルダの伝説/時のオカリナ」の妖精ナビィもそうですけど、行き先とかを適宜サポートしてくれる「旅のお供」キャラって、ほんわか安心感があっていいなぁ。

今回のドラクエ9は、やたらとキャラクター育成に凝る事が可能になっていて、そこそこ極めようと思ったら、一年や二年では足りないくらい遊べるのでは・・・。
称号とかスキルとか、気が遠くなるくらいキャラ強化ポイントがあって、是非ともドラクエ10ではデータ引継ぎとか欲しいくらい

ニンテンドーDSの他は、「ファミコン探偵倶楽部/消えた後継者」をフルクリア。
主人公の失われた記憶が明らかになるクライマックスは、時代を超えて盛り上がり。
立て続けに続編の「ファミコン探偵倶楽部/うしろに立つ少女」を開始しました。
しかし、たまに出てくる3Dダンジョンシーンが厳しい。
ファミコン時代の3Dダンジョンって、グラフィックスがパッと見て分かりにくいのが難点で、マップそのものが狭くても、位置を直感的に把握しづらいため、異様なまでに難易度が上がっている印象。
このあたりは、さすがに3Dマシンのプレイステーションが欲しくなるところではありますねー・・・。
しかし、ミステリアスなシナリオ運びはさすがの一言。
任天堂は、やっぱり、アドベンチャーゲームを作るのも上手いもんだ。

X68000では、「カサブランカに愛を」「マーダークラブDX」「道化師殺人事件」などなど、名作PCアドベンチャーゲームタイトルの、そのさらに最高峰X68K版がズラリ揃っているというのに・・・まだ手が付けられない状態。
X68000に限らず、私と来たら、持っているだけで全然プレイしてないレトロゲームが大量にあって・・・本当にもったいないことしてるなぁ・・・。当時はゲームを売るという考えが全くなくて、幸か不幸か、レトロゲームは無傷でズラリ揃っている状態だったりします。今となっては、タイムカプセルを開けるような楽しさがある反面、数が多すぎて再封印しそうな危険も・・・。

さて、私のメインゲーム機といえば、真打PSPですが、年末年始は、予想外に新しく加わったニンテンドーDSに良いところを持っていかれたなぁ。音楽プレイヤーとしては毎日大活躍だから起動率は100%なんですけれどね。欲しくて欲しくて満を持して買ったアドベンチャーゲームの「428」も、まだ開封すらしていない状態で・・・うう申し訳ない。
買いたいソフトは沢山あるんですが、買っても遊びきれないのがもう分かっているので、予定は立てていないです。

2010年1月6日水曜日

Windows Power Shellを使って、SQL-Server 2008のデータ型に対応した、DataTableのデータ型を調べてみる

今回の記事では、タイトル通りなのですが、Windows Power Shellを使い、SQL-Server 2008のデータ型に対応した.NET Frameworkライブラリの「DataTable」のデータ型を調べてみます。

Windows Power Shell上で、自作のコマンド(関数)「CheckType」を入力すると、
型の対応表がCSV形式でもって、C:\Test\Type.txtファイルに出力される・・・という方法でやってみました。



-- 最初に行うSQL-Server 2008 (Express)側の準備
-- ******************************************
-- 主要な型だけを集めたダミーテーブルを作る
-- ******************************************
CREATE TABLE ##T_TYPE
(
"binary " binary,
"timestamp " timestamp,
"varbinary " varbinary,
"bit " bit,
"tinyint " tinyint,
"date " date,
"datetime " datetime,
"datetime2 " datetime2,
"datetimeoffset " datetimeoffset,
"decimal " decimal,
"money " money,
"smallmoney " smallmoney,
"float " float,
"uniqueidentifier" uniqueidentifier,
"smallint " smallint,
"int " int,
"bigint " bigint,
"real " real,
"varchar " varchar,
"char " char,
"nchar " nchar,
"ntext " ntext,
"text " text,
"nvarchar " nvarchar,
"time " time,
"xml " xml
);

--ダミーデータの挿入
INSERT INTO ##T_TYPE("int ") VALUES(111111);



Windows Power Shell側で用意するコマンド(関数)

function global:CheckType()
{
[Data.SqlClient.SqlConnection]$obj_con = $null;
[Data.SqlClient.SqlCommand]$obj_cmd = $null;
[Data.SqlClient.SqlDataAdapter]$obj_adp = $null;
[Data.DataSet]$obj_ds = $null;
[Data.DataTable]$obj_tbl = $null;
[IO.StreamWriter]$obj_W = $null;
[Text.Encoding]$enc_sjis = $null;
[Int32]$i = 0;
[String]$str_rec = "";
try
{
$obj_con = $(New-Object Data.SqlClient.SqlConnection("接続文字列"));
$obj_cmd = $(New-Object Data.SqlClient.SqlCommand);
$obj_adp = $(New-Object Data.SqlClient.SqlDataAdapter);
$obj_ds = $(New-Object Data.DataSet);
$obj_tbl = $(New-Object Data.DataTable);
$obj_con.Open(); #接続開始
$obj_cmd.CommandType = 1; #Text
$obj_cmd.CommandTimeOut = 60;
$obj_cmd.CommandText = "SELECT * FROM ##T_TYPE;";
$obj_cmd.Connection = $obj_con;
$obj_adp.SelectCommand = $obj_cmd;
$obj_ds.EnforceConstraints = $false;
$obj_adp.Fill($obj_ds);
$obj_ds.EnforceConstraints = $true;
$enc_sjis = [Text.Encoding]::GetEncoding("Shift_JIS");
$obj_W = $(New-Object IO.StreamWriter("C:\Test\Type.txt",$false,$enc_sjis));
$obj_tbl = $obj_ds.Tables[0];
$obj_W.WriteLine("SQL-Server型 ,DataTableのデータ型");
#@@@@@@@@@@[LOOP-START]@@@@@@@@@@
for($i=0; $i -lt $obj_tbl.Columns.Count; $i++)
{
#データ型を全てShift_JIS形式テキストファイルに出力する。
$str_rec = $($obj_tbl.Columns[$i].ToString()) + ",";
$str_rec+= $($obj_tbl.Columns[$i].DataType.ToString());
$obj_W.WriteLine($str_rec);
}
#@@@@@@@@@@[LOOP-END ]@@@@@@@@@@
}
catch [Exception]
{
Write-Output $Error[0].ToString();
}
finally
{
$obj_W.Close();
$obj_W.Dispose();
$obj_con.Close();
$obj_con.Dispose();
$obj_cmd.Dispose();
$obj_adp.Dispose();
$obj_ds.Dispose();
}
}



コマンドの実行結果(テキストファイルに出力)

SQL-Server型 ,DataTableのデータ型
binary ,System.Byte[]
timestamp ,System.Byte[]
varbinary ,System.Byte[]
bit ,System.Boolean
tinyint ,System.Byte
date ,System.DateTime
datetime ,System.DateTime
datetime2 ,System.DateTime
datetimeoffset ,System.DateTimeOffset
decimal ,System.Decimal
money ,System.Decimal
smallmoney ,System.Decimal
float ,System.Double
uniqueidentifier,System.Guid
smallint ,System.Int16
int ,System.Int32
bigint ,System.Int64
real ,System.Single
varchar ,System.String
char ,System.String
nchar ,System.String
ntext ,System.String
text ,System.String
nvarchar ,System.String
time ,System.TimeSpan
xml ,System.String



この型の違いは、たとえぱ、SQL CLRでストアドプロシージャを組む時なんかに役立ちそうですね。

それにつけても、昨年購入したモバイルノートの「Aspire 1410」ですが、64bit Windows7と共に、本当にお役立ちです。
SQL-Server 2008 Expressも、Visual C# 2008 Expressも、バリバリ使えますし。
勉強目的で購入したはずなのに、いつの間にかメインマシンになってますよ!!

2010年1月1日金曜日

2010年がやって来た!!あけましておめでとうございます!!








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

ついに、今までずっと未来の世界だと思っていた「2010」に、本日をもって現実時間が追いついてしまいましたね。

皆様にとっても良い年になりますようにお祈り申し上げます。

話は変わりますが、新年一回目のブログは、うちの年越しそば(うどん)と新年初のお雑煮の写真です。
おもち、ずんだ、あんこ、全部手作りでやってみました!!

それと、仙台光のページェントの写真も追加いたします。
例によってスローシャッターで撮影しながらカメラを動かす事によって効果をつけたりしてます。

さて、今年はどんな年になるんだろう・・・。
昨年は仕事で社長賞をいただいたり、色々思い出深い年になりましたが、まぁそんな良い事ばかり続かないのは承知の上。とにかく頑張るしかないですね。