2010/05/06

無線レーザーマウス「Logicool M505」買いました








Aspire 1410で使っていたエレコムのUSB有線マウスが断線してしまったので、初めて無線マウスを買いました。

店頭で実際に試用してみて、最も気に入った「Logicool M505」にしました。
値段も3980円と手ごろで嬉しい。

■実際にM505を手にとってみて■

デザインはオーソドックスなのですが、ダークメタリックの塗装が高級感あって良いですねぇ。
何と言っても両サイドに入れられた曲線が想像以上に手に心地良い。
今使っているナスビ型マウスよりも良いんじゃないかと。

電源は単三乾電池二本。最初からパッケージに付いてくるので手間もありません。

過去の記事に書かせて頂いた通り、最初はエレコムのM-BT4BLにしようと思ったんですが、店頭で試用してみたところ、ちょっと張り出し部分が大きい。持ち運びとかでマウス全体を掴んだ時に、気をつけないといちいち張り出し部分が指に食い込んで痛い・・・んでやめました。ネットで調べてデザインは気に入ったんですが、合う合わないは実際に使ってみないと分からないもんですねぇ・・・。

さて、このLogicool M505なんですが、ボタンが3つしかないシンプルなものだなぁ・・・と思ったらさにあらず。ネットから設定ソフトをダウンロードしさえすれば、ホイールを左右に倒すアクションに好きなキーを設定可能なんでむしろ慣れたらかなり便利に感じかも知れないぞ・・・。

初期状態では、左右スクロールが設定されているのですが、あまり使わないかなぁと思い、とりあえず現状ではFirefoxブラウザの「進む」「戻る」キーを割り当ててみました。

■実際にM505を使ってみました■

このM505はBluetoothじゃないタイプなので、レシーバーをUSBに差し込む必要があります。でもレシーバーは小さくて邪魔にならない上に、色々なPCに使える美点が嬉しい。
さて、レシーバーをAspire 1410に差し込むと・・・。
へえっ。差すだけでOKなんですねぇ。何もしてないのにいきなり使える!!。

おおー。当たり前ですが無線になりましたからねー、Aspire 1410を突然移動させても全くこたえないですねぇ。今まではマウスのケーブルが変なところにあると、モノを引っ掛けてしまって片付けに負われたりしましたが・・・。

M505は、初期状態ではカーソルの動きが速すぎて感覚に合いませんでしたので、マウス速度設定で速度を落としてちょうどよくなるように調節しました。

それと、使う場所を選ばない。
おおおー・・・今まで使っていたマウスは赤色LEDのオプチカル式だったため、軽く反射するテーブルの上とかでは簡単にアウト(カーソルが動いてくれない)になってました。
それにひきかえ、レーザー式は多少の反射などものともせずに使える。
この出来なかった事が出来るようになるっていうのは、どんなジャンルでも感動しますね。

ホイールもスムーズに回転してくれてますね。それに、かすかなクリック感が奥に感じられてフィーリングも気に入ったかな。

あと、赤色LEDだとうっかり光が目に当たると眩しくてウゲッとなりましたが、レーザー式の光線は見えないんですね。こりゃあいいや。

うーん。Logicool M505か。まだ使い始めですけれど、良いマウスを買えたんではないかと思います。

2010/05/05

幻想的な場所

ノーベル賞にもつながったクラゲ研究で有名な加茂水族館。
ここにいるんですが・・・想像の数倍も幻想的なクラゲの競演に引き込まれっぱなしです。

暗所なので、ちょっとW-ZERO3の内蔵カメラじゃダメか・・・と思ったんですが、一刻も早く友達に見せたくて、トライアンドエラーで何とかかんとか撮影してみました。

ブログにも、是非とも掲載させて頂きたいと思います。

菜の花の生食!

山形県の庄内から、記事を書かせて頂いております。

菜の花祭りというイベントに来てみたら、何と、菜の花の生食をやっておりました。

ずばり、そのまま菜の花をマヨネーズにつけて食べるだけ!
しかも、癖がなくておいしいんですよ。

もちろん、何でもいけるわけではなく、ちゃんと生食用に栽培された花みたいなんです。
そのへんに咲いている菜の花を、いきなりパックっとしてはダメなんでしょうが・・・。

天気も良くて、菜の花の絨毯のもと、マッタリしております。

仙台空港に、エンジンパーツで作られた伊達政宗像が






ドライブの途中で立ち寄った仙台空港。
驚くほどに近代的な造りといいますか、相当に高級感溢れる立派な空港になっていて、見て歩くだけで結構盛り上がりました。

おっ、これは!?と思ったのは、航空機エンジンのパーツで作られた伊達政宗像。
素材も素材なんで、なんかSFに出てくる戦闘ロボットみたいな感じ。カッコ良い!!

今回の写真は、久々にハイビジョンカメラのHDR-XR500Vを「1200万画素のデジカメモード」にして撮影してみました。

モードはフルオート撮影で、ワイド・エンド・コンバージョンレンズをかぶせて広角にしています。

PC関係で色々欲しくなった・・・

親友と会ってドライブしたのですけれど、その際に「ブルーレイレコーダーいつ買おうか」って話題をしてみたら、うわー所有してないのは私だけでした。
うむむ。もうみんなブルーレイなんか普通に楽しんでいるんだなぁと。
私なんか、ブルーレイに関する機材は何一つ持ってない。レコーダーはもちろん、PS3も無いし。

しかし、ブルーレイディスクレコーダーはちょっと高くてまだ買いづらい。
すぐにじゃないけれど、まずは、手持ちのCULVノートパソコンAspire 1410を地デジレコーダー化してみるところからスタートしたいなぁと。

地デジの視聴から編集までいけるバッファローのWチューナー搭載DT-H55/U2W。
これなんかいいなぁ。
ブルーレイドライブは、やはりポータブル。バッファローのポータブル型のブルーレイドライブを付けたらどうだろうか。もっとも、そもそもAspire 1410でキチンと動くのかなぁ・・・というのは分からないのですけど。

あー、でも、地デジより先に解決しないとならない問題が発生してるんでした。
Aspire 1410に付けている、エレコムの有線の光学式マウスが断線気味なんです。
色々調べてみたところ、同じくエレコムのBluetoothレーザーマウスM-BT4BLシリーズが良さそう。
デザインも気に入ったし、Amazonだと3000円を切っているのも素敵。

(追記)
Aspire 1410の後継機らしい情報が出ていました。確定かどうかは別として一定の目安にはなりそう。
その情報によれば、気になるCPUは・・・なんとCore i5-520UM (1.06GHz)らしい。
Core i3の線もあるらしいが・・・。
うーむ。現在のがセレロンSU2300 (1.2GHz)なんで、クロックは下がってますねぇ・・・。
いや、1クロックあたりの性能は上がっているのでトータルでは速いのは間違いないでしょうが・・・。
ちなみに、520UMだったとすると、2次キャッシュが256KB * 2。3次キャッシュが3MB。
微妙な数字だなぁー。

2010/05/04

EF 20mm F2.8 USMで撮る桜







キヤノンEF 20mm F2.8 USMで撮影した桜の写真です。

このレンズ、同じ超広角のシグマ15mm F2.8 EX Diagonal FishEyeと比べると、あれほどの秀でたパンチ力は一見して無いようだけれど、適度な距離感覚が心地良くてやっぱり好きですねぇ。

ここに掲載させて頂いた写真は、全てEOS KISS X2のマニュアルモードで撮影しております。

しかし、今年のゴールデンウィークは、理想的な青空が続いてくれたのでホント嬉しかった。
今日から終盤戦ですけれど、これからどうなるのかな。

シグマ15mm F2.8 EX Diagonal FishEyeで撮る桜











今季は色々と気に入った桜の写真が撮れました。
シグマ15mm F2.8 EX Diagonal FishEyeレンズも、桜の撮影に大活躍してくれました。

桜を撮影する場合は、もちろん100mmなどは安定した定番レンズ。
しかし、ブワーッと大空に向かって全身を伸ばしている桜を相手にする時は、やはり超広角レンズの出番と言えるでしょうね。
それに、シグマ15mm F2.8は、被写体にレンズが激突するくらいまで近寄れるんですよね。
被写体をクローズアップしながらも、背景を省略することなく広く画角に取り込める。
この表現力あらばこそ、というシーンも多いです。

キヤノンのEF 20mm F2.8 USMは、シグマ15mm F2.8 EX Diagonal FishEyeの良きライバル。
荷物を少なくしなければならず、どっちか一本だけ持ち出すって場合は、相当に悩みます。

今回掲載させて頂いた写真は、全てカメラはEOS KISS X2。撮影モードはマニュアルです。

しかし・・・。EOS 7Dが欲しい欲しい言っている私ですが、桜撮影している時はカメラがどーのこーのなんて話すっかり忘れてた。
うーむ。

流行の?つけ麺を作ってみました


個人的には、あまりラーメンは食べない私。おっつけ話題にも乗り切れないところがあったんですが、親友がとてつもなくつけ麺にハマっておりまして、影響されてちょっと家で作ってみました。
ごめんなさい。なんか誘われてもお店に食べに行く気にはならなくって。
なんかこう・・・ラーメン屋さんってあまり行きたく・・・ホントごめんなさい。
きっと治すから。
とにかく、こういうのって、タレが命なんですよね。
自作するよりも何か手っ取り早いものはないか・・・と探したところ、ミツカン酢のごましゃぶそのまんまで意外といけました。

2010/05/03

Windows Power Shellにおいて、バイト数単位で文字列を切り取る関数を作る



ゴールデンウィーク真っ只中、皆様いかがお過ごしでしょうか。
私たちの場合は、超早朝行動・午前中行動基本・高速道路完全スルーで、今のところ悲劇的な混雑はギリギリで回避成功中。でも終盤戦は結構きつそう・・・。

さて、今回の記事ですが、Windows Power Shellにおいてバイト数単位で文字列を切り取る関数を作ってみます。
基本方針は、今までSQL-Server 2008向けにSQLCLR(C#言語)で作っていた関数を、Windows Power Shellに移植するというものです。

実行例などは、スクリーンショットを参照いただければと思います。

Windows Power Shellは、本当にパッと見は、なんとなーくC#言語っぽい感じもしますが、当然のことながら「Windows Power Shell用スクリプト言語」なので全然別物になってます。
しかし、何とか書き換える事が可能になっているというのが嬉しいところ。
ただ、比較演算子がLinuxのシェルスクリプト(bash)方式で、最初は馴染みにくいんじゃないかなと思います。

a==bならa -eq b
a!=bならa -ne b
a>bなら a -gt b
a<bならa -lt b
a>=bならa -ge b
a<=bならa -le b


正直に言って、最初Linuxのシェルスクリプトをやった時、出会ったこの仕様は涙目でした・・・。
ちなみに論理演算子もこんな感じで、一例を挙げますと・・・
&&は-and
||は-or

となります。

■コード■
(テキストエディタで書けます)
(インデントは消えています)
(64bit Windows 7用です)

#set-executionpolicy remotesignedで実行して下さい。

#--------------------------------------
#バイト単位での文字列抽出
#(パラメータ説明)
#p_value : 文字列
#p_start : 開始位置(0スタート)
#p_length: 長さ
#--------------------------------------
function global:SubStringB(
[string]$p_value = "",
[Int32]$p_start = 0,
[Int32]$p_length = 0
)
{
#----------------------------
#変数定義
#----------------------------
#結果格納エリア
[string]$str_result = "";
#----------------------------
#処理
#----------------------------
try
{
$str_result = $(fnc_Core_StringB $p_value $p_start $p_length);
}
catch [Exception]
{
$Error[0];
}
return $str_result;
}

#--------------------------------------
#バイト単位で右側から文字列を切り出し
#(パラメータ説明)
#p_value : 文字列
#p_length: 長さ
#--------------------------------------
function global:RightB(
[string]$p_value = "",
[Int32]$p_length = 0
)
{
#----------------------------
#変数定義
#----------------------------
#結果格納エリア
[string]$str_result = "";
#位置
[Int32]$int_start_location = 0;
#----------------------------
#変数定義
#----------------------------
try
{
$int_start_location =
[Text.Encoding]::GetEncoding("Shift_JIS").GetBytes($p_value).Length -
$p_length;
$str_result = $(fnc_Core_StringB $p_value $int_start_location $p_length);
}
catch [Exception]
{
throw $Error[0];
}
return $str_result;
}

#--------------------------------------
#バイト単位で左側から文字列を切り出し
#(パラメータ説明)
#p_value : 文字列
#p_length: 長さ
#--------------------------------------
function global:LeftB(
[string]$p_value = "",
[Int32]$p_length = 0
)
{
#----------------------------
#変数定義
#----------------------------
#結果格納エリア
[string]$str_result = "";
#----------------------------
#処理
#----------------------------
try
{
$str_result = $(fnc_Core_StringB $p_value 0 $p_length);
}
catch [Exception]
{
throw $Error[0];
}
return $str_result;
}

#--------------------------------------
#文字列をバイト単位で切り出すコア関数
#(パラメータの説明)
#p_value : 文字列
#p_start : 開始位置(0スタート)
#p_length: 長さ
#--------------------------------------
function global:fnc_Core_StringB(
[string]$p_value = "",
[Int32]$p_start = 0,
[Int32]$p_length = 0
)
{
#----------------------------
#変数定義
#----------------------------
#List<string>は使えないのでArrayListにしています。
#文字列バイナリの切り出しエリア
[Collections.ArrayList]$bytList_substring = $(New-Object Collections.ArrayList);
#結果格納エリア
[string]$str_result = "";
#文字列のバイナリ変換用配列
[byte[]]$bytArr_value = $null;
#バイナリ変換された文字列と1:1で対応するステータス配列
[byte[]]$bytArr_status = $null;
#開始位置
[Int32]$int_start_location = 0;
#終了位置
[Int32]$int_end_location = 0;
#インデックス
[Int32]$i = 0;
#Shift_JISのエンコーダー
[Text.Encoding]$enc_sjis = [Text.Encoding]::GetEncoding("Shift_JIS");

#----------------------------
#処理
#----------------------------
try
{
#文字列をバイナリの配列に変換
$bytArr_value = $enc_sjis.GetBytes($p_value);
#文字列のバイナリ配列と1:1で対応したShift_JISステータス配列を作成
#0x01=全角の1バイト目、0x02=全角の2バイト目、その他=0x00と設定されます。
$bytArr_status = $(fnc_Create_SJIS_StatusArray $bytArr_value);

#開始位置設定
if($p_start -lt 0)
{ #スタート位置がマイナスの時は0に補正
$int_start_location = 0;
}
else
{
$int_start_location = $p_start;
}

#終了位置設定
$int_end_location = $int_start_location + $p_length - 1;
if($int_end_location -gt $bytArr_value.Length - 1)
{ #終了位置が全体の最終位置を突破していたら、最終位置に補正
$int_end_location = $bytArr_value.Length - 1;
}
#切り出し先頭部分の調整
if($int_start_location -gt 0)
{ #切り出し先頭が0より大きい場合検査開始。
#この16進数値はfnc_Create_SJIS_StatusArray()で設定済
if($bytArr_status[$int_start_location] -eq 0x02)
{ #切り出し先頭が、全角を断ち割った2バイト目にかかっていた場合は補正
#半角スペース(16進数)で補正
$bytArr_value[$int_start_location] = 0x20;
}
}
#切り出し末尾部分の調整
if($int_end_location -lt $bytArr_value.Length-1)
{ #末尾が全体の最終位置でなかった場合検査開始。
#この16進数値はfnc_Create_SJIS_StatusArray()で設定済
if($bytArr_status[$int_end_location] -eq 0x01)
{ #切り出し末尾が、全角を断ち割った1バイト目にかかっていた場合は補正
#半角スペース(16進数)で補正
$bytArr_value[$int_end_location] = 0x20;
}
}
#切り出し末尾部分の調整
#@@@@@@@@@@[LOOP-START]@@@@@@@@@@
for($i = $int_start_location; $i -lt $int_end_location + 1; $i++)
{
#文字列のバイナリを再構成
#[Void]を付けないと配列内容が表示されてしまうので注意
[Void]$bytList_substring.Add($bytArr_value[$i]);
}
#@@@@@@@@@@[LOOP-END ]@@@@@@@@@@
#バイナリから文字列に変換
$str_result = $enc_sjis.GetString($bytList_substring.ToArray());

}
catch [Exception]
{
throw $Error[0];
}
return $str_result;
}

#--------------------------------------
#Shift_JIS文字列のバイナリ配列と1:1対応のステータス配列作成
#全角文字の1バイト目=0x01、2バイト目=0x02、その他=0x00で設定
#(パラメータの説明)
# $bytArr_value : ステータス配列を作りたいバイナリ配列
#--------------------------------------
function global:fnc_Create_SJIS_StatusArray(
[byte[]]$bytArr_value = $null
)
{
#----------------------------
#変数定義
#----------------------------
#ステータス配列
[byte[]]$bytArr_result = $(New-Object byte[] $bytArr_value.Length);
#インデックス
[Int32]$i = 0;
#Shift_JIS全角文字出現フラグ
[Int32]$int_zenkaku_flg = 0;

#----------------------------
#処理
#----------------------------
try
{
#@@@@@@@@@@[LOOP-START]@@@@@@@@@@
for($i = 0; $i -lt $bytArr_value.Length; $i++)
{
if($int_zenkaku_flg -eq 1)
{ #前回、全角の1バイト目が出現したので今回は必ず2バイト目
$bytArr_result[$i] = 0x02;
#全角出現フラグのクリア
$int_zenkaku_flg = 0;
}
elseif(
(($bytArr_value[$i] -ge 0x81) -and ($bytArr_value[$i] -le 0x9F)) -or
(($bytArr_value[$i] -ge 0xE0) -and ($bytArr_value[$i] -le 0xFF))
)
{ #全角文字の1バイト目が出現した
$bytArr_result[$i] = 0x01;
$int_zenkaku_flg = 1;
}
else
{ #全角でない場合
$bytArr_result[$i] = 0x00;
}
}
#@@@@@@@@@@[LOOP-END ]@@@@@@@@@@
}
catch [Exception]
{
throw $Error[0];
}
return $bytArr_result;
}

2010/05/02

SQL-Server 2008 Expressで、文字列をバイト数単位で切り出しする。




今回の記事は、SQL-Server 2008 Expressにおいて、文字列を「文字単位」ではなくて「バイト数単位」で切り出す関数を作ってみます。

実はこれ、以前当ブログでやっていた記事の繰り返しだったりします。

この機能を今後応用して行く記事を書かせていただく予定があるのと、当時よりも少しコードを改善したため、再び今回の記事とあいなりました次第です。
改善点は、SQL-Server 2008からNullデータが入ってきた時にもエラーにならない点です。

プログラムの構成は、合計5本です。

まずは、直接SQL関数と紐付けて利用するSQLCLR関数が3本。

(1)任意の位置をバイト数単位で切り出せるSQLCLR_SubStringB()
(2)右からバイト数単位で切り出せるSQLCLR_RightB()
(3)左からバイト数単位で切り出せるSQLCLR_LeftB()

次は、内部的な共通関数が2本。
(1)処理のコアに当たるプライベート関数fnc_Core_StringB()
(2)全角文字が半分に断ち割られた時に対応するためのfnc_Create_SJIS_StatusArray()
です。

全角文字をバイト数単位で切り出す時にやっかいなのが、半分で断ち割られた時にどうするか?
という問題です。
半分に断ち割られた文字が、意図しないものに文字化けしてゴミとして表示されてしまうわけです。
このゴミを半角スペースで補正するのが今回の処理の肝の一つになっています。

ここの手法は、私が力技的に無理やり考えたものなので、スマートとは言えませんけれど・・・。
ご容赦下さい。

なお、今回の実行例では、64bit版での利用が可能になった事を利用してさっそくExcelのワークシートからデータを読み込むようにしています。

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

■実行例■

Microsoft.ACE.OLEDB.12.0プロバイダについては以前の記事をご参考になさって下さい。

--実行例
--(データはExcelワークシートから直接読み込むようにしています。)
SELECT
M.F2 AS [元々の項目],
dbo.SQLCLR_SubStringB(M.F2,1,10) AS [2桁目から10バイト切り出し],
dbo.SQLCLR_RightB(M.F2,10) AS [右から10バイト切り出し],
dbo.SQLCLR_LeftB(M.F2,10) AS [左から10バイト切り出し]
FROM OpenRowSet('Microsoft.ACE.OLEDB.12.0',
'Excel 8.0;DATABASE=C:\TEST\TEST.XLS;IMEX=1;HDR=NO',
'SELECT * FROM [Sheet1$]') AS M;


■コード■
(インデントは消えています)
(全角の<>は半角に読み替えお願いします。)
(無償版のVisual C# 2010でプログラムを書いています)

//*******************************************************************************
// * ローカル関数
//*******************************************************************************
//*******************************************************
//*文字列をバイト単位で切り出すコア関数
//*(パラメータ)p_value=文字列,p_start=開始位置(0スタート)、長さ
//*******************************************************
private static string fnc_Core_StringB(string p_value,Int32 p_start, Int32 p_length)
{
List<byte> bytList_substring = new List<byte>(); //文字列バイナリの切り出しエリア
string str_result = ""; //結果格納エリア
byte[] bytArr_value; //文字列のバイナリ変換用配列
byte[] bytArr_status; //バイナリ変換された文字列と1:1で対応するステータス配列
Int32 int_start_location = 0; //開始位置
Int32 int_end_location = 0; //終了位置
Int32 i = 0; //インデックス
Encoding enc_sjis = Encoding.GetEncoding("Shift_JIS"); //Shift_JISのエンコーダー
try
{
bytArr_value = enc_sjis.GetBytes(p_value); //文字列をバイナリの配列に変換
//文字列のバイナリ配列と1:1で対応したShift_JISステータス配列を作成
//0x01=全角の1バイト目、0x02=全角の2バイト目、その他=0x00と設定されます。
bytArr_status = fnc_Create_SJIS_StatusArray(bytArr_value);

//開始位置設定
if (p_start < 0)
{ //スタート位置がマイナスの時は0に補正
int_start_location = 0;
}
else
{
int_start_location = p_start;
}

//終了位置設定
int_end_location = int_start_location + p_length - 1;
if (int_end_location > bytArr_value.Length - 1)
{ //終了位置が全体の最終位置を突破していたら、最終位置に補正
int_end_location = bytArr_value.Length - 1;
}
//切り出し先頭部分の調整
if (int_start_location > 0)
{ //切り出し先頭が0より大きい場合検査開始。
if (bytArr_status[int_start_location] == 0x02) //この16進数値はfnc_Create_SJIS_StatusArray()で設定済
{ //切り出し先頭が、全角を断ち割った2バイト目にかかっていた場合は補正
bytArr_value[int_start_location] = 0x20; //半角スペース(16進数)で補正
}
}
//切り出し末尾部分の調整
if(int_end_location < bytArr_value.Length-1)
{ //末尾が全体の最終位置でなかった場合検査開始。
if (bytArr_status[int_end_location] == 0x01) //この16進数値はfnc_Create_SJIS_StatusArray()で設定済
{ //切り出し末尾が、全角を断ち割った1バイト目にかかっていた場合は補正
bytArr_value[int_end_location] = 0x20; //半角スペース(16進数)で補正
}
}
//切り出し末尾部分の調整
//@@@@@@@@@@[LOOP-START]@@@@@@@@@@
for (i = int_start_location; i < int_end_location + 1; i++)
{
bytList_substring.Add(bytArr_value[i]); //文字列のバイナリを再構成
}
//@@@@@@@@@@[LOOP-END ]@@@@@@@@@@
//バイナリから文字列に変換
str_result = enc_sjis.GetString(bytList_substring.ToArray());

}
catch (System.Exception obj_err)
{
throw obj_err;
}
return str_result;
}
//*******************************************************
// Shift_JIS文字列のバイナリ配列と1:1対応のステータス配列作成
// 全角文字の1バイト目=0x01、2バイト目=0x02、その他=0x00で設定
//*******************************************************
private static byte[] fnc_Create_SJIS_StatusArray(byte[] bytArr_value)
{
byte[] bytArr_result = new byte[bytArr_value.Length]; //ステータス配列
Int32 i = 0; //インデックス
Int32 int_zenkaku_flg = 0; //Shift_JIS全角文字出現フラグ
try
{
//@@@@@@@@@@[LOOP-START]@@@@@@@@@@
for (i = 0; i < bytArr_value.Length; i++)
{
if (int_zenkaku_flg == 1)
{ //前回、全角の1バイト目が出現したので今回は必ず2バイト目
bytArr_result[i] = 0x02;
int_zenkaku_flg = 0; //全角出現フラグのクリア
}
else if((bytArr_value[i] >= 0x81 && bytArr_value[i] <= 0x9F) ||
(bytArr_value[i] >= 0xE0 && bytArr_value[i] <= 0xFF)
)
{ //全角文字の1バイト目が出現した
bytArr_result[i] = 0x01;
int_zenkaku_flg = 1;
}
else
{ //全角でない場合
bytArr_result[i] = 0x00;
}
}
//@@@@@@@@@@[LOOP-END ]@@@@@@@@@@
}
catch (System.Exception obj_err)
{
throw obj_err;
}
return bytArr_result;
}

//*******************************************************************************
//* SQL関数
//*******************************************************************************
//*******************************************************
//public class CLS_SQLCLRの中にあります。
//バイト単位での文字列抽出
//*******************************************************
[Microsoft.SqlServer.Server.SqlFunction]
public static SqlString SQLCLR_SubStringB(SqlString p_value, SqlInt32 p_start, SqlInt32 p_length)
{
string str_result = ""; //結果格納エリア
try
{
if (!(p_value.Equals(SqlString.Null)))
{
str_result = fnc_Core_StringB((string)p_value, (Int32)p_start, (Int32)p_length);
}
}
catch (System.Exception obj_err)
{
str_result = obj_err.Message;
}
return (SqlString)str_result;
}

//*******************************************************
//public class CLS_SQLCLRの中にあります。
//バイト単位で右側から文字列を切り出し
//*******************************************************
[Microsoft.SqlServer.Server.SqlFunction]
public static SqlString SQLCLR_RightB(SqlString p_value, Int32 p_length)
{
string str_result = "";
Int32 int_start_location = 0;
try
{
if (!(p_value.Equals(SqlString.Null)))
{
int_start_location = Encoding.GetEncoding("Shift_JIS").GetBytes((string)p_value).Length
- (Int32)p_length;
str_result = fnc_Core_StringB((string)p_value, int_start_location, (Int32)p_length);
}


}
catch (System.Exception obj_err)
{
throw obj_err;
}
return str_result;
}

//*******************************************************
//public class CLS_SQLCLRの中にあります。
//バイト単位で左側から文字列を切り出し
//*******************************************************
[Microsoft.SqlServer.Server.SqlFunction]
public static SqlString SQLCLR_LeftB(SqlString p_value, Int32 p_length)
{
string str_result = "";
try
{
if (!(p_value.Equals(SqlString.Null)))
{
str_result = fnc_Core_StringB((string)p_value, 0, (Int32)p_length);
}
}
catch (System.Exception obj_err)
{
throw obj_err;
}
return str_result;
}


■SQL-Server関数インターフェース■
(環境はご自分のものと読み替えお願いいたします)


-- ----------------------------------------------
-- 文字列を任意の位置でバイト単位の切り出しを行う
-- (パラメータ説明)
-- @p_value :文字列
-- @p_start :スタート位置(0スタート)
-- @p_length:長さ
-- ----------------------------------------------
CREATE FUNCTION SQLCLR_SubStringB(@p_value nvarchar(max),@p_start int,@p_length int)
RETURNS nvarchar(max)
AS EXTERNAL NAME ASSEMBLY_SQLCLR.CLS_SQLCLR.SQLCLR_SubStringB;
GO

-- ----------------------------------------------
-- 文字列を右側から指定バイト分切り出す
-- (パラメータ説明)
-- @p_value :文字列
-- @p_length:長さ
-- ----------------------------------------------
CREATE FUNCTION SQLCLR_RightB(@p_value nvarchar(max),@p_length int)
RETURNS nvarchar(max)
AS EXTERNAL NAME ASSEMBLY_SQLCLR.CLS_SQLCLR.SQLCLR_RightB;
GO

-- ----------------------------------------------
-- 文字列を左側から指定バイト分切り出す
-- (パラメータ説明)
-- @p_value :文字列
-- @p_length:長さ
-- ----------------------------------------------
CREATE FUNCTION SQLCLR_LeftB(@p_value nvarchar(max),@p_length int)
RETURNS nvarchar(max)
AS EXTERNAL NAME ASSEMBLY_SQLCLR.CLS_SQLCLR.SQLCLR_LeftB;
GO

桜の「国立みちのく公園」を、EF 100mm F2.8L MACRO IS USMと、EF 20mm F2.8 USMで撮る









必死で仕事を終わらせ、ゴールデンウィーク休日出勤を回避。
桜の季節の「国立みちのく公園」に行って来ました。

どうしてもここの桜を観たいから連れて行ってくれ、という連れのリクエストに応えて来てみましたが・・・なるほどここは素晴らしい。
この季節はめちゃくちゃ混むのが分かっていたので、かなりビビリ気味でしたけれど、多少の混雑を乗り越える価値あり。

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

EF 20mm F2.8 USMで撮影した、シバザクラと桜が同一画角に入っている写真は、今回特にお気に入りです・・・。

だんだん、100mmと20mmをコンビで持ち出す頻度が高まってきた気がするぞ。

2010/05/01

ついに、64bit版 SQL-Server 2008 Expressにおいて、Excelワークシートを直接テーブルとして読み込む事が出来るようになりましたぁ!!





うわぁっ!! や、や、やったぁっ!! 出来たぁ!!
皆さん、ついにこの時がやってまいりましたよ!!
ついに、64bit版Windows 7と、64bit版SQL-Server 2008 Expressにおいて、Excelのワークシートを直接テーブルとして読み込む事が可能となりました!!

SQL-Serverは、とてつもなくスゴイやつでして、OpenRowset()関数やリンクサーバーなどを使う事により、Excelワークシートを直接テーブルとして扱えるという必殺技があるのですが、64bit環境ではだめでした・・・。
それは、キーパーソンとなる「Microsoft.JET.OLEDB.4.0」というプロバイダが64bit非対応である事がその原因です。このため、過去の記事でも、Excelを使うため色々苦しみました。
過去の記事を読み返してみると・・・Aspire 1410から、32bitシステムの自作PCに接続して、遠隔でExcel読ませるとか・・・相当な無茶苦茶やってましたねぇ・・・。プライベート利用だからこそ許される荒業ですよ。

このほど、ついにマイクロソフトが64bit対応プロバイダを公開してくれました。
まだベータ版なのですが、そんな事言ったってもう使う以外の選択肢はありません。

ただし、Microsoft.JET.OLEDB.4.0ではなくて、Microsoft.ACE.OLEDB.12.0になるので注意が必要です。
それともう一つ。MS-Accessの古いバージョンのエンジンがインストールされていると、削除を求められます。

そんなこんなでインストールが済むと、SQL-Server 2008 Expressに、Microsoft.ACE.OLEDB.12.0プロバイダが登録されました。

Excelといっても、無償版のOpenOffice 3.2のCalcでワークシートを作る事が出来るので、ExcelプリインストールモデルじゃないAspire 1410の私でも全然問題ないです。
Calcでテストデータ作って、Excel形式でセーブ。

さて、いよいよSQL-Server 2008からクエリーを発行する時がやって来た。

SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 'Excel 8.0;DATABASE=C:\TEST\TEST.XLS;IMEX=1;HDR=YES;', 'SELECT * FROM [Sheet1$]') AS M;

(追記) 上記のクエリーだと、ワークシートにヘッダー行が無いため、データの一行目がHDR=YESでヘッダーになっちゃいますね。 HDR=NOにして、ヘッダーは自前で用意しようとすると以下のようなクエリーになりますね。
SELECT
F1 as [Game_ID],

F2 as [Game_Name]
FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0',
'Excel 8.0;DATABASE=C:\TEST\TEST.XLS;IMEX=1;HDR=NO;',
'SELECT * FROM [Sheet1$]') AS M;


おお・・・。うまく出た・・・。今までの苦労よ、さようなら!!
ありがとう、マイクロソフト。
マジに涙が出そう。
まさにゴールデンウィーク!!

おおっ!!最新のSQL-Server 2008 R2のExpress版が公開されてました。さっそく、アップグレード!!



おおおーっ!! なんと、無償版SQL-Server 2008 Expressにも、最新のR2が来ておりました!!
SQL-Server 2008 R2 Express RTM(製品となる前の最終版)です。

さっそく、64bit版をAspire 1410にインストールして、手持ちのSQL-Server 2008 Expressをアップグレードしました。一時間くらいはかかったかな。

GUI管理ツールのManagament Studioを起動すると、初回は準備か何かで遅いけれど、二回目からは起動が速い!! 明らかに無印バージョンよりも速くなってます。
個人で使う上では、R2の機能はあまり関係ないかも知れないけれど、Managament Studioの起動が速くなっただけでもメリットがデカイ。

燦然と輝くR2のロゴ。

しかし、ほんと、ゴールデンウィークに合わせて、無償版の大物ソフトが怒涛のように来てくれて・・・感涙です。
ゴールデンウィークかぁ・・・。
飛び石部分を埋めたいな・・・と休暇の申請をしようとしたら、どうしても仕上げないといけないプログラムが出てきて却下食らい、やや凹み気味だったんですが、今回のソフトラッシュで晴れ晴れしました。
そのプログラムも納期通り仕上げられたし、あとは休み中に呼び出し来ない事を祈るのみ。