2010年4月29日木曜日

SQL-Server 2008 Expressで、テキストを直接ファイルに書き出す関数を作る。(Visual Studio 2010 Expressも使用開始)




今回の記事は、SQL-Server 2008 Expressにおいて、テキストを直接ファイルに書き出す関数を作ってみます。

SQLCLR(C#言語)による関数の開発なんですが、今回より、プログラムの開発に、いよいよVisual Studio 2010 Express (Visual C# 2010 Express)を使ってみました。

まず、大きな注意点なんですが、対象のフレームワークを最新の.NET Framework 4に設定してしまうと、アセンブラのビルド(DLLの作成)そのものは正常に終了するのですが、肝心のSQL-Server 2008 Expressへの登録がうまくいきませんでした。
ひょっとして設定を色々と煮詰めれば良いのかも知れませんが、今回は対象のフレームワークを3.5にしたらうまく行ったので、それで対応することとします。

SQL-Server 2000では到底不可能な事ですが、SQL-Server 2008は、SQLCLRの威力が炸裂。
このように、クエリーから直接テキストファイルを書き出す事が可能です。
今回の関数SQLCLR_WriteText()は、指定したテキストを、一行一行ファイルに書き出します。上書きか追加かはパラメータで指定可能。
書き込み成功すると、書き込んだバイト数をint型で返します。
今回のは、あくまでログファイル作成のような使い方が出来れば良いなぁと思って作りました。
ちなみに文字コードはShift_JIS固定にしてます。

それと、今回ばかりは、Visual Studio 2010 Expressのテストも兼ねています。
なんか、かなり大丈夫そうですね!!

SQLCLRの登録などは過去の記事をご参考になさって下さい

■実行例■

SELECT SPDB.dbo.SQLCLR_WriteText('*** SQL-Server 2008 Expressいいなぁ ***','C:\TEST\TEST.TXT',0);
--0は上書き(新規)モード

SELECT SPDB.dbo.SQLCLR_WriteText('*** VisualStudio 2010 Expressいいなぁ ***','C:\TEST\TEST.TXT',1);
--1は追加モード

SELECT SPDB.dbo.SQLCLR_WriteText('*** Windows 7 (64bit)いいなぁ ***','C:\TEST\TEST.TXT',1);
SELECT SPDB.dbo.SQLCLR_WriteText('*** OpenOffice 3.2いいなぁ ***','C:\TEST\TEST.TXT',1);
SELECT SPDB.dbo.SQLCLR_WriteText('*** Firefox 3.6いいなぁ ***','C:\TEST\TEST.TXT',1);
SELECT SPDB.dbo.SQLCLR_WriteText('*** EOS 7D欲しいなぁ ***','C:\TEST\TEST.TXT',1);


■コード■
(インデントは消えています)
(無償版のVisual C# 2010でプログラムを書いています)

//*******************************************************************************
//* SQL関数
//*******************************************************************************
//------------------------------------
//テキストをファイルに書き出す関数
//------------------------------------
[Microsoft.SqlServer.Server.SqlFunction]
public static SqlInt32 SQLCLR_WriteText(
SqlString p_value,
SqlString p_path,
SqlBoolean p_mode
)
{
//結果格納エリア
Int32 int_result = 0;
//文字コード
Encoding enc_this = Encoding.GetEncoding("Shift_JIS");
//テキスト書き出し用
StreamWriter obj_SW = null;
//上書き・追加用
bool bol_value;
try
{
//書き込みバイト数
int_result = (enc_this.GetBytes((string)p_value)).Length;

if (p_mode.Equals(SqlBoolean.True))
{ //追加モード
bol_value = true;
}
else
{ //上書きモード
bol_value = false;
}
obj_SW = new StreamWriter((string)p_path, bol_value, enc_this);

obj_SW.WriteLine((string)p_value);

}
catch (System.Exception obj_err)
{
throw obj_err;
}
finally
{
if (obj_SW != null)
{
obj_SW.Close();
obj_SW.Dispose();
}
}
return (SqlInt32)int_result;
}


■SQL-Server 2008側の登録■
(環境はご自分のものに読み替えお願いいたします。)

-- .NET Frameworkは3.5が対象となります!!
-- *******************************************************
-- 作成したMY_SQLCLR.DLLをアセンブリ登録する
-- 権限は、外部ファイルを読み書き可能なEXTERNAL ACCESSにする。
-- *******************************************************
USE SPDB
GO
CREATE ASSEMBLY "ASSEMBLY_SQLCLR"
FROM 'C:\Users\morimori\MAIN_WORK\Program\SQLCLR\MY_SQLCLR\MY_SQLCLR\bin\Release\MY_SQLCLR.dll'
WITH PERMISSION_SET = EXTERNAL_ACCESS;
GO


-- *******************************************************
-- SQLCLRの関数インターフェース
-- *******************************************************
-- ----------------------------------------------
-- テキストをファイルに書き出す関数
-- (パラメータ説明)
-- @p_value : 書き出したいテキスト
-- @p_path : 書き出したいファイルのフルパス
-- @p_mode : モード(0=上書き,1=追加)
-- ----------------------------------------------
create function SQLCLR_WriteText(
@p_value nvarchar(max),
@p_path nvarchar(max),
@p_mode bit
)
RETURNS int
AS EXTERNAL NAME ASSEMBLY_SQLCLR.CLS_SQLCLR.SQLCLR_WriteText;
GO

三神峯の桜を、EF 100mm F2.8L MACRO IS USMと、EF 70-200mm F4L USMのLレンズコンビで撮る







仙台市の三神峯というところの桜を、キヤノンLレンズコンビで撮影してみました。
EF 100mm F2.8L MACRO IS USMと、このブログにはほとんど登場してなかったと思うんですが、ずっと以前に購入して、めったに持ち出さないEF 70-200mm F4L USMです。

我ながらついに出てきたかぁ・・・という感じです。

このレンズ買うとき、色々なものをあきらめて、むちゃくちゃ苦労したんで、落として傷つけたら・・・と思うと、怖くてなかなか持ち出せないんですよね。
レンズ交換の時は、緊張のあまり呼吸が止まるほどです。
ズームレンズではあるのですが、200mm F4の単焦点レンズ代わりとしても絶大な信頼をおいております。

三神峯の桜を、シグマ15mm F2.8 EX Diagonal FishEyeレンズと、EF 20mm F2.8 USMレンズで撮る





仙台市の三神峯というところの桜を、シグマ15mm F2.8 EX Diagonal FishEyeレンズと、キヤノンEF 20mm F2.8 USMの、超広角レンズペアで撮影してみました。

抜けるような青空の下、まさに願ったりかなったりの気象条件で桜を見る事ができた日でした。

カメラはEOS KISS X2。
撮影モードは例によって全てマニュアルです。

EF 20mm F2.8 USMは、超広角でありながら、絞り開放によるボケ味を狙ってみるのも面白いレンズですね。さわやかな色が出るレンズなので、桜の季節なかなか素晴らしいものがあります。

シグマ15mmもキヤノン20mmも、広い範囲に咲き誇る花を相手にすると、90mmや100mmには無い遠近感を武器に活き活きしてくるレンズですねぇ・・・。

Open Office 3.2を導入したら、表計算ソフトの起動が超高速でびっくり!! (あと少しPS3 Liunxを思い出す)



無償版のオフィス・スイート「Open Office 3.2」を、Aspire 1410にインストールしてみました。

これまでも、Excel 2000の進化バージョンという意識でもって、Calc(表計算)を使っていましたが、今回は明らかに起動が超高速になってくれて、より使いやすくなっている!!

確かに、起動が高速というのは、実際に今回の3.2が打ち出すセールスポイントになっているわけですけれど、なるほどこれはでかい。
Aspire 1410でも、1秒とかそのあたりでパッと起動してくれるのです。
今までって、なんかこう色々準備してるーって感じの待ち時間があったわけですよ。
(PS3 Linuxの時は、本当に起動してくれるか不安なくらい待ち時間あった思い出も・・・[過去の記事より(当時はFedoraでしたが、ubuntu 8.10だともっと軽快)])

でもそれって、無償かつJavaだし、スピードまで要求したら贅沢過ぎるよなぁ・・・と思ってやり過ごしてたんですけど、今回するりと解決されてて脱帽するしかなかった

まだちょっとVBAはExcelそのまんまでは動かない部分はあるけれど、ある程度は互換性も確保されているみたいで、単純なセル操作くらいだったらVBAまんまの知識でいけるかな?

会社みたいに、ハナっからVBAでバリバリとプログラミングするのを当然のように要求されちゃう、みたいなのは辛いですけど、家で使う分にはもうCalcで御の字。

前のバージョンもそうですけど、64bitのWindows 7でもガシガシ使えるのがありがたい。
特に、CULVノートって、モバイルなのに性能がある程度良くて、しかも値段が破格に安いってのが存在意義でもあるから、Officeプリインストールモデルを買うと意外に微妙になったりするし、Open Officeって、CULVノートにとっちゃえらく重要な存在ですなぁ・・・。

そうだ、PS3 Linuxの話を出したので、ちょっとだけ広げさせて頂きたい。
PS3は、新型ではLinuxインストールはそもそも出来ないわけですが、最新ファームウェアにしてしまうと、過去の機種でもLinuxが使えなくなるという仕打ちにあい、事実上PS3 Linuxは終了してしまいましたね。ファームアップしなきゃいいけど、もはやイレギュラー扱いなわけで。
というか、非難するとかそういうのじゃなくて、「そんなに辛かったのかな・・・ソニー・・・」と思うと、楽しかったあのPS3 Linuxの日々を思い返すとショックですね。

確かに、メモリはAspire 1410の1/16しか無くてメチャ少ないし、Cell B.E.は、そもそも最適化設計のソフト以外は駄目駄目な感じなやつだから、パソコンとしては不利な要素ばっかりだったけど。
でも、自分が好き(だった)ゲーム機がパソコンになって、色々新しい知識を得られるなんてそれだけで興奮ものでしたよ。それが大事。

PS3 Linuxあらばこそ、Windows XPや、電話のウィルコムW-ZERO3からPS3にリモート接続して、色々遊んだりできたしなぁ。

今は甘くとも、将来は進化するぞー。メモリ1GB版出て欲しいぞーとか将来に明るい希望を持ってやってたんですけどね。
どっかでまた方針転換しないかな。
PS3をWebサーバーにして自宅でWebサイト公開したりとか、Linuxパソコンにして勉強したりとか、本当にあの時のPS3はホント良かったなぁ・・・。もう言っても詮無き事だけど。

さて、PS3 Linuxを思い出すのもこのくらいにしておこう。

ついに来たぁ!! Visual Studio 2010 Express




ついに、無償版の.NET Framework対応プログラム開発環境「Visual Studio 2010 Express日本語版」が公開されました!!

やったぁ!! マイクロソフト今回もやってくれました。ありがとう!!

まずは、.NET Framework 4.0をインストールしておいて、次はいよいよVisual Studio 2010日本語版です。各言語がバラバラに提供されるのがExpressの特徴なので、ピンポイントでVisual C# 2010 Expressだけをインストールしてみました。

2008 Expressをアンインストールしなくとも共存出来るのが素敵。

インストールでは、なんか、色々入ってくるなぁ。SQL-Server 2008 システムCLR型とか。

あと、イメージカラーが青っぽくて、水の中に入っているような感じになってますね。
む。マークは「N」とか「∞(無限大)」マークですか
時代が時代なら、ネットスケープナビゲータとかシャープメビウスに何か言われてたかも。

デスクトップPCをスルーして、今やメインマシンのAspire 1410にインストールしているのですけれど、あらためてパソコンってすげぇなぁ・・・って思いますね。
アプリケーションをインストールしながら、画像処理ソフト起動したり音楽聴いたりしててもビクともしないし、こうしてブラウザ起動してブログ書いてても平気。

なんというか、これを下支えしてくれているOS、Windows 7には感謝しなくちゃなぁ・・・。

ゲーム機が多機能化してるって言っても、やっぱりパソコンの威力の前には・・・。

という話はともかくとして、まずは、Visual C# 2008 Expressで書いていたプログラムを2010で開いてみました

あー・・・やっぱり2010用にプロジェクトを変換しないといけないんですねぇ。
変換しちゃうともう2008に戻れないんだな。

まいいや。2010用に変換してみよう。バックアップも取れるみたいだし、いざとなりゃバックアップから2008に戻れそうだし。
プログラムをビルドしてみると、一応成功しました

うーん。もっともっと触りたいけれど、このままだと徹夜してしまう危険あり。
明日はゴールデンウィーク一日目にして、色々と用事もあるので、名残惜しいけれど、今回はここまでにして就寝しようかと思います。

にしても、良い時代だなぁ。今からコンピュータの勉強とかを始めようとする学生には、黄金時代どころじゃないもんね。真剣にうらやましい。

(追記)
プログラムファイル本体は、Windows 7 (64bit)の場合は以下にあります。
C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\VCSExpress.exe

2010年4月28日水曜日

SQL-Server 2008 Expressで、時間の計算を自由にできるようにしてみる





今回の記事では、SQL-Server 2008 (Express)において、時間の計算を自由にできる汎用的な関数を作ってみたいと思います。

時間の計算を便利にするという記事ならば、すでに以前の記事で書かせていただいておりますが、ちょっと汎用性が低かったのが気になっていました。

今回も、やはりキーパーソンはTime Span型
これを、SQL-Server 2008から、便利な形で使おうというのが基本方針となります。

たとえば、"08:15"という時間文字列同士の計算も、10.5という数値同士の計算も、混在した計算も、一つの関数で可能とします。
得られる結果も、時間文字列と数値のどちらでも好きな方でOK

というわけで、作ってみましたのが、SQLCLR_TS()という関数です。

パラメータがミソで、入力の単位と出力の形式を、TimeSpan型に合わせて指定可能としました。
10.5時間を分に換算したいという場合は
SQLCLR_TS(10.5,'FromHours','TotalMinutes');
とすれば良いようにしてみました。

"08:15"という文字を分に換算したいという場合は
SQLCLR_TS('08:15','','TotalMinutes');
とすれば良いようにしてみました。

時間の計算をする時は、一旦、出力の形式を、分(TotalMinutes)や秒(TotalSeconds)にしておいてから実行し、最後にその結果を好きな形に変換するというのが基本的な使用方法になりますね。

結果は、出力形式に応じて、数値だったり文字列だったり変わりますね。
これは、SQL-Serverが備えるsql_variant型という「なんでも型」を使う事で実現してみました。

SQLCLRの登録などにつきましては過去の記事を参考になさって下さい。

■実行例■
SELECT dbo.SQLCLR_TS('08:15','','TotalDays') as [08:15を日に換算];
SELECT dbo.SQLCLR_TS('08:15','','TotalHours') as [08:15を時間に換算];
SELECT dbo.SQLCLR_TS('08:15','','TotalMinutes') as [08:15を分に換算];

SELECT dbo.SQLCLR_TS(128.5,'FromDays','TIME') as [128.5(日)を、時間:分文字列に変換];
SELECT dbo.SQLCLR_TS(128.5,'FromHours','TIME') as [128.5(時間)を、時間:分文字列に変換];
SELECT dbo.SQLCLR_TS(128.5,'FromMinutes','TotalSeconds') as [128.5(分)を、秒に換算];
SELECT dbo.SQLCLR_TS(128.5,'FromSeconds','TotalMilliSeconds') as [128.5(秒)をミリ秒に換算];


--時:分形式の文字列で計算を行い、結果も時間:文字列で出す場合の例
--08:15が20回、0:30が10回、2:00が8回、0:15が1回を計算する。(計算は分に換算して行う)
SELECT
dbo.SQLCLR_TS(
Cast(dbo.SQLCLR_TS('08:15','','TotalSeconds') as float) * 20 +
Cast(dbo.SQLCLR_TS('0:30','','TotalSeconds') as float) * 10 +
Cast(dbo.SQLCLR_TS('2:00','','TotalSeconds') as float) * 8 +
Cast(dbo.SQLCLR_TS('0:15','','TotalSeconds') as float)
,'FromSeconds','TIME') AS [計算結果];


■コード■
(無償版のVisual C# 2008でプログラムを書けます)
(インデントは消えています)
(全角の<>は半角に読み替えて下さい)
//*******************************************************************************
// * ローカル関数
//*******************************************************************************
//------------------------------------
//TimeSpan用の日時分配列作成
//前回のSQLCLR_T()の時と同じ関数です。
//------------------------------------
private static Int32[] CreateTimeSpanSource(
Int32 p_day,
Int32 p_hour,
Int32 p_minute
)
{
//結果格納エリア
Int32[] intArr_result = new Int32[3];

try
{
//値の格納
intArr_result[0] = p_day; //日
intArr_result[1] = p_hour; //時
intArr_result[2] = p_minute; //分

//分の時間への繰上げ計算
intArr_result[1] = intArr_result[1]+
(Int32)Math.Floor((Double)intArr_result[2]/(Double)60);
//分の調整計算
intArr_result[2] = intArr_result[2] -
(Int32)Math.Floor((Double)intArr_result[2]/(Double)60)*60;
//時間の日への繰上げ計算
intArr_result[0] = intArr_result[0] +
(Int32)Math.Floor((Double)intArr_result[1] / (Double)24);
//時間の調整計算
intArr_result[1] = intArr_result[1] -
(Int32)Math.Floor((Double)intArr_result[1] / (Double)24) * 24;
}
catch (System.Exception obj_err)
{
throw obj_err;
}

return intArr_result;
}

//*******************************************************************************
//* SQL関数
//*******************************************************************************
//------------------------------------
//時間利用関数
//------------------------------------
[Microsoft.SqlServer.Server.SqlFunction]
public static object SQLCLR_TS(
SqlString p_value,
SqlString p_in_param,
SqlString p_out_param
)
{
//入力パラメータ受け取りエリア
string str_value;
//結果格納エリア
object V_result = null;
//書式チェック用1
Regex obj_rx1 = new Regex(@"^\d+\.\d+:\d+$");
//書式チェック用2
Regex obj_rx2 = new Regex(@"^\d+:\d+$");
//書式チェック用3
Regex obj_rx3 = new Regex(@"^(-)?\d+(\.\d+)?$");
//日時分文字列分解キャラクタ配列
char[] charArr_c = new char[] { '.', ':' };
//日時分文字列格納配列
string[] strArr_ts = new string[3];
//日時分計算配列
Int32[] intArr_ts = new Int32[3];
//時間コア
TimeSpan obj_core;
//インデックス
Int32 i;
try
{
str_value = (string)p_value;
//書式チェック
if (!(obj_rx3.IsMatch(str_value)))
{ //時間文字列が来た場合
if (obj_rx2.IsMatch(str_value))
{ //日の要素を補完
str_value = "0." + str_value;
}
else if (!(obj_rx1.IsMatch(str_value)))
{ //エラー
throw new System.Exception("値は数値または'日.時間:日'か'時間:日'形式でなければなりません。");
}
//日時分配列格納
strArr_ts = str_value.Split(charArr_c);
//日時分配列セット
//@@@@@@@@@@[LOOP-START]@@@@@@@@@@
for (i = 0; i < strArr_ts.Length; i++)
{
intArr_ts[i] = Int32.Parse(strArr_ts[i]);
}
//@@@@@@@@@@[LOOP-END ]@@@@@@@@@@
//日時の調整計算。自作関数CreateTimeSpanSource()による
intArr_ts = CreateTimeSpanSource(intArr_ts[0], intArr_ts[1], intArr_ts[2]);
//コアの作成
obj_core = new TimeSpan(intArr_ts[0], intArr_ts[1], intArr_ts[2], 0);
}
else
{ //数字が来た場合
switch (((string)p_in_param).ToUpper())
{
case "FROMDAYS":
obj_core = TimeSpan.FromDays(Double.Parse(str_value));
break;
case "FROMHOURS":
obj_core = TimeSpan.FromHours(Double.Parse(str_value));
break;
case "FROMMINUTES":
obj_core = TimeSpan.FromMinutes(Double.Parse(str_value));
break;
case "FROMSECONDS":
obj_core = TimeSpan.FromSeconds(Double.Parse(str_value));
break;
case "FROMMILLISECONDS":
obj_core = TimeSpan.FromMilliseconds(Double.Parse(str_value));
break;
default:
throw new System.Exception("入力側の指示エラーです。FROMDAYS,FROMHOURS,FROMMINUTES,FROMSECONDS,FROMMILLISECONDSです。");
}
}

//出力側指示チェック
switch (((string)p_out_param).ToUpper())
{
case "TIME": //時間:分の文字列に変換
V_result = (obj_core.Days * 24 + obj_core.Hours).ToString() +
":" +
obj_core.Minutes.ToString("00");
break;
case "TIME2": //日.時(23時):分の文字列に変換
V_result = obj_core.Days.ToString() + "." +
obj_core.Hours.ToString("00") + ":" +
obj_core.Minutes.ToString("00");
break;
case "TIME3": //日.時(23時):分:秒.ミリ秒の文字列に変換
V_result = obj_core.Days.ToString() + "." +
obj_core.Hours.ToString("00") + ":" +
obj_core.Minutes.ToString("00") + ":" +
obj_core.Seconds.ToString("00") + "." +
obj_core.Milliseconds.ToString("00").Substring(0, 2);
break;
case "DAYS": //日.時(23時):分:秒.ミリ秒のうち「日」を切り出し
V_result = obj_core.Days;
break;
case "HOURS"://日.時(23時):分:秒.ミリ秒のうち「時」を切り出し
V_result = obj_core.Hours;
break;
case "MINUTES"://日.時(23時):分:秒.ミリ秒のうち「分」を切り出し
V_result = obj_core.Minutes;
break;
case "SECONDS"://日.時(23時):分:秒.ミリ秒のうち「秒」を切り出し
V_result = obj_core.Seconds;
break;
case "MILLISECONDS"://日.時(23時):分:秒.ミリ秒のうち「ミリ秒」を切り出し
V_result = obj_core.Milliseconds;
break;
case "TOTALDAYS": //全て日に換算
V_result = obj_core.TotalDays;
break;
case "TOTALHOURS": //全て時間に換算
V_result = obj_core.TotalHours;
break;
case "TOTALMINUTES": //全て分に換算
V_result = obj_core.TotalMinutes;
break;
case "TOTALSECONDS"://全て秒に換算
V_result = obj_core.TotalSeconds;
break;
case "TOTALMILLISECONDS"://全てミリ秒に換算
V_result = obj_core.TotalMilliseconds;
break;
default:
throw new System.Exception("出力側の指示エラーです。TIME(時間:分),TIME2(日.時:分),TIME3(日.時:分:秒.ミリ秒),DAYS,HOURS,MINUTES,SECONDS,MILLISECONDS,TOTALDAYS,TOTALHOURS,TOTALMINUTES,TOTALSECONDS,TOTALMILLISECONDSです。");

}
}
catch (System.Exception obj_err)
{ //例外が発生したら、SQL-Serverに投げつけて強制終了させる
throw obj_err;
}

return V_result;
}




■SQL-Server関数インターフェース■
(環境はご自分のものに読み替えお願いいたします)
-- *******************************************************
-- SQLCLRの関数インターフェース
-- *******************************************************
-- ----------------------------------------------
-- 時間を計算する関数
-- (パラメータ説明)
-- @p_value : "日.時間:分"
-- もしくは、"時間:分。"
-- もしくは、数値
-- @p_in_param : @p_valueに数値を入力した場合に有効
-- どの単位の入力かを指示。
-- @p_valueに時間文字列を入力した場合は無視
-- (選択できるパラメータの意味)
-- FromDays =@p_valueは日換算
-- FromHours=@p_valueは時間換算
-- FromMintes=@p_valueは分換算
-- FromSeconds=@p_valueは秒換算
-- FromMilliSeconds=@p_valueはミリ秒換算
-- @p_out_param : どの単位に変換して出力するかを指示
-- (選択できるパラメータの意味)
-- TIME=時間:分の文字列
-- TIME2=日.時間:分の文字列
-- Days=日を切り取る
-- Hours=時を切り取る
-- Minutes=分を切り取る
-- Seconds=秒を切り取る
-- MilliSeconds=ミリ秒を切り取る
-- TotalDays=日に換算
-- TotalHours=時間に換算
-- TotalMinutes=分に換算
-- TotalSeconds=秒に換算
-- TotalMilliSeconds=ミリ秒に換算
-- ----------------------------------------------
create function SQLCLR_TS(
@p_value nvarchar(max),
@p_in_param nvarchar(16),
@p_out_param nvarchar(17)
)
RETURNS sql_variant

AS EXTERNAL NAME ASSEMBLY_SQLCLR.CLS_SQLCLR.SQLCLR_TS;
GO

2010年4月25日日曜日

デジタル花見が出来る!! プラズマテレビTH-P37X1と、ハイビジョンカメラHDR-XR500Vによる、三神峯の桜











朝早く起きて、仙台市の三神峯というところにクルマを走らせました。
ここは、とんでもなく素晴らしいお花見のスポット。とにかく広いので、気持ち良い。

ソニーのハイビジョンカメラHDR-XR500Vで撮影した映像を、自宅のプラズマビエラTH-P37X1で再生してみると、予想通り、そしていつも通り、信じられないくらい美しい映像が37型スクリーン上に浮かび上がりました。
すごい、すごい、すごいーっ!!

このTH-P37X1とHDR-XR500Vの組み合わせは、ベスト中のベストと感じており、もう映像というよりは肉眼で風景を観賞しているかのような錯覚が得られる・・・というような事は、このブログでも散々書いている通りです。
それが、桜の季節では、さらに話が一段階輝きを増しまして、そう、デジタル花見が出来るんですよ。

写真と違って、ハイビジョンはサウンドも魅力。
朝のさわやかな鳥の鳴き声、風の音が居間を包み込む・・・。

今朝、私が花見に行こうって誘ったのに、あまりに朝早過ぎるだろと来なかった家族も、このTH-P37X1に映し出された三神峯を前にして・・・
こんなにキレイなら、もうわざわざ行く必要ないわー。もっと撮ってくれば良かったのにー」だそうです。えっちょっとその言われ方も微妙ですが、まぁ、良い方向に解釈しよう。

TH-P37X1にちょっと近づいて、視野いっぱいに広がる桜。
居間で花見しながら朝食なんて、もう休日の贅沢にしてはズバ抜けだろうと。

しっかし、TH-P37X1で観ると、ほんと、HDR-XR500Vの実力が百パーセント発揮される感じです。
正直、もう大型のハイビジョンカメラは買わなくて良いどころか、ハイビジョンカメラそのものを買い替える気持ちはなくなり、もうずっとこのカメラでいいやと思いますね。

3CCDの必要性すらも、もう感じないくらい、ダイナミックレンジも色の再現性も十分ですよこれ。
空の色の微妙なグラデーションも、TH-P37X1で観ると見事に出ているし、「その場の風景をそのまま持ち帰る事が出来る、ドラえもんの秘密道具」そのまんまの威力で、とても21世紀を感じられる瞬間ですね。

うーん。HDR-XR500Vすごい。ビエラTH-P37X1幸せだのぅー。
HDR-XR500V以上の映像は、もう従来までのハイビジョンカムコーダーで望むべきものではなくて、本当に、EOS 7DなどのEOSムービーに行くしかないだろうなぁ

EFレンズで映画並みのハイビジョン映像撮りたいものだなぁ。

2010年4月24日土曜日

EF 100mm F2.8L MACRO IS USMレンズで撮る、夕方に佇む仙台の桜














待望の桜の季節。いてもたってもいられなくなり、夕方に仙台市内の桜を撮影に出掛けてきました。

カメラはEOS KISS X2。
レンズは、EF 100mm F2.8L MACRO IS USM一本のみ。
撮影モードは全てマニュアルです。

桜の写真ばかりでも、と思ったので、桜以外の写真も混ぜて掲載させていただいております。
待ちきれなかったこの季節ですが、いざ桜が咲き始まると、今度は急にあわただしく感じられますね。
あそこにも行きたい、ここにも行きたいって、ばたばたと。

さて、今日の天気ですけれど、とてもおかしな天気でした。

晴天だと思ったら急な大雨。すぐに晴れて油断させておいてまた雨。

光の調子がどんどん変化していくので、写真を撮っていても、これが同じ日に撮った写真なのだろうかと思うくらいに状態が違ってみえると思います。

異常気象といいますが、もう毎年何らかの異常が見られるようになるんだろうな。