ラベル おきつねさまのすくりぷと の投稿を表示しています。 すべての投稿を表示
ラベル おきつねさまのすくりぷと の投稿を表示しています。 すべての投稿を表示

2010/01/03

アレ対応版・・・


前の版で困難だった、ネットワークドライブ/フォルダ上のファイルアクセスも容易にする為、
対象ファイル読み込み処理だけ、ADODB.Streamから FileSystemObject.OpenTextFileに差し替えました。

以前のログにも記述した通り、ADODB.Streamでは、どう処理の順序を変えても、
ネットワーク先からローカルドライブへ、無条件にテンポラリってしまい、
大量のファイルを連続処理するのはおろか、1つのファイルだけでも多大な時間を要していたのです。

で、今朝・・・ つーか深夜だけどw 夜通しでFSO版を試作してみて、その問題の解消に至りました。
やっぱり餅は餅屋、ファイルアクセスなら、DB向けオブジェクト使うより、FSOってコトですかね・・・(^_^;)
って、書き込みとかはADOのままですケドww以下はアーカイブです。

X3FSIR.zip βReleaseArchive - 20100103 0739 launch -
▲ を、右クリックしてファイルとして保存してください。


とは云え まだまだ、

     アクマで暫定版デスから。結局こんなん出ました~w

'***** ↓↓↓ScriptTitle↓↓↓ *********************************************************
' X3FSIR.vbs - X3F ShootingInformationsReader
' FoveonX3 RAWファイルから、撮影情報を文字列として取得する。

' - Created by LazwardFox -

'

' Update -------- ----
' Release
' Update
' βRelease
' Update 20100103 0706 Source読み込み部のみ、ADODB.Streamから
' FileSystemObject.OpenTextFileに差し替えるコトで、
' ファイルへのアクセスを最小限化、LANファイルアクセス対応へ。
' Update 20091231 1814 0byteファイルに因るエラーへ対策。
' Update 20091231 0425 処理集約の誤りを修正。
' Update 20091230 0315 複数ファイル指定に暫定対応。
' Update 20091230 0130 撮影日時文字列化処理追加/テキストデータの範囲可変に対応。
' αRelease 20091226 2150 単一ファイル取得版、データも内容のまま列挙。
' 日本語/最適化準備中。
' DevStart 20091226 2040

'***** ↓↓↓ ObjectDecralations ↓↓↓ *************************************************
Option Explicit
Public My, Parameters, Fs, objADO ', MySh, objSMTP, objMx
Set My = WScript
With My
Set Parameters = .Arguments ' パラメーター取得
If Parameters.Count <= 0 Then ' パラメータなし起動の無効化
.Quit
End If

Set Fs = .CreateObject("Scripting.FileSystemObject")
Set objADO = .CreateObject("ADODB.Stream")
'Set MySh = .CreateObject("WScript.Shell")
'Set objSMTP = .CreateObject("CDO.Message") ' SMTP Object
'Set objMx = .CreateObject("MSXML2.XMLHTTP") ' URL Check
End With

'***** ↓↓↓ Decralations ↓↓↓ *************************************************
'Public ThisScriptFull, ThisScript, Start
Const vbWq = """"

' Const - Letters
Dim vbWCrLf, vbTc, vbNullB
vbWCrLf = vbCrLf & vbCrLf
vbTc = vbTab & vbCrLf
vbNullB = chr(&h00)

' Const - Date/Times


'***** ↓↓↓ LocalDecralations ↓↓↓ *************************************************
Dim X3FSet

'***** ↓↓↓MainRoutine↓↓↓ *********************************************************
'On Error Resume Next

'X3FSet = Array("X3F",, 264, 1500, "VERSION_BF", "BURST", "TIME", "1970/1/1")
X3FSet = Array("X3F",, 0, 1800, "VERSION_BF", "BURST", "TIME", "1970/1/1")
BPS Parameters, X3FSet


' ----- ExitProcess
Set Fs = Nothing
Set objADO = Nothing
My.Quit

'***** ↓↓↓Functions↓↓↓ *********************************************************
' X3FSIs
'------------------------------------
' Binary Pickup to Strings
' バイナリファイル中 範囲を指定し、任意の文字列群を抽出する。

' - Created by LazwardFox -

' Fs、objADO、cnvDateTime

' Update
' Release
' βRelease
' Update 20091231 1814 0byteファイルに因るエラーへ対策。
' Update 20091231 0425 処理集約の誤りを修正。
' Update 20091230 0315 複数ファイル指定に暫定対応。
' αRelease 20091230 0300
' DevStart 20091230 0200 X3FSIsを汎用用途向けに修正。

' BPS (
' arFileNames - 対象ファイル群配列。
' ,arSet - 動作パラメータを、下記スキーマ準拠の配列で指定。
' )


' ▼▼ arSet Schema ▼▼▼▼▼

' = Array(strEx, SaveFileName, StartBit, ReadByte, Firstkey, Lastkey, strTimeKey, BaseDate)

' arSet
' (0) {strEx} 対象拡張子 (String)
' (1) {SaveFileName} 保存ファイル名 (String)
' (2) StartBit 読み取り先頭位置(Bit) (Number)
' (3) ReadByte 読み込み範囲(byte) (Number)
' (4) Firstkey 先頭キー名 (String)
' (5) Lastkey 最終キー名 (String)
' (6) {strTimeKey} 時間キー名 (String)
' (7) {BaseDate} 時間変換基日付文字列("y/m/d") (String)


Function BPS(arFileNames, arSet)
Dim kNothing, iADO, strTarget, Pc, fKey, rSource, rHeader, lHeader
Dim pResult, arResult, rUnits, sResult
kNothing = String(5, vbNullB) ' キーも値も存在しない範囲の、データ排除向け
Set iADO = objADO
For Each strTarget In arFileNames
If Fs.GetExtensionName(strTarget) = arSet(0) Then
arSet(1) = Replace(strTarget,"." & arSet(0),".txt") ' < 暫定
Set rSource = Fs.OpenTextFile(strTarget,1) ' 対象ファイルを読み取りモードで開く
With rSource
' ファイルから指定範囲をメモリへ取得
If arSet(2) > 0 Then
.Skip(arSet(2)) ' 先頭位置をセット
End If
rHeader = .Read(arSet(3)) ' 指定範囲を取得
End With
Set rSource = Nothing
With iADO
If LenB(rHeader) > 0 Then
' Convert to PlainText
rHeader = CStr(rHeader) ' 次処理に備え、文字列データ化
rHeader = Replace(rHeader, "SECc", "") ' 無効キー排除
rHeader = Replace(rHeader, kNothing, "") ' 無効範囲の消去
.Type = 2 ' AccessMode - Text
.Charset = "_autodetect" '"Shift_JIS" "Unicode" "utf-8"
.Open
.Position = 0
.WriteText = rHeader
lHeader = .Position ' 取得データ長
rHeader = ""
For Pc = 1 To lHeader Step 2
.Position = Pc
pResult = pResult & .ReadText(1)
Next
.Close
arResult = Split(pResult, vbNullB) ' 配列化。
pResult = ""
For Each sResult In arResult
If sResult = arSet(4) Or fKey > 0 Then ' スタートキー
If fKey = 4 Then ' 日付データ変換
sResult = cnvDateTime(arSet(7), sResult)
End If
rUnits = rUnits & sResult ' 値書き込み
' ▼ 末尾符号/キー検出処理 ▼▼▼▼▼
If fKey < 2 Then
If sResult = arSet(5) Then ' 終了キー
fKey = 5
ElseIf sResult = arSet(6) Then ' 時刻値変換対象
fKey = 4
Else
fKey = 3
End If
rUnits = rUnits & "," ' キー末尾処理
Else
rUnits = rUnits & vbCrLf ' データ末尾処理
If fKey = 5 Then ' 処理終了
Exit For
End If
fKey = 1
End If
' ▲ 末尾符号/キー検出処理 ▲▲▲▲▲
End If
sResult = ""
Next
arResult = ""
fKey = 0
' 指定ファイルへ書き込み
.Type = 2 ' AccessMode - Text
.Charset = "_autodetect"
.Open
.Position = 0
.WriteText rUnits
.SaveToFile arSet(1), 2
End If
.Close
End With
rUnits = "" ' < 暫定
End If
Next
Set iADO = Nothing
End Function

'------------------------------------
' cnvDateTime
' 秒整数で構成された日時データを、Windowsシリアル値に変換。
' 基準日の異なる値の変換にも対応。

' - Created by LazwardFox -

'

' Update
' Release
' βRelease 20091230 0300
' αRelease 20091229 1635
' DevStart 20091229 1500

' cnvDateTime (
' strBaseDate - "y/m/d"形式の日付文字列、基準日を指定。
' ,SourceDateTime - Secベースの経過時間を表す整数
' )

Function cnvDateTime(strBaseDate, SourceDateTime)
Dim sDate
sDate = DateValue(strBaseDate)
cnvDateTime = (((SourceDateTime / 60) / 60) / 24) + sDate
End Function




< ファイルの一部へのみアクセスするなら、FileSystemObject(FSO) >

2009/12/31

ダメだな・・・


ADODBStream使っても、LAN経由(ネットワークドライブ)のファイルへ読み込み掛けると、
その対象ファイル全容量を、一旦ローカルにキャッシュしてるワ。

ファイルが小さいとか、GigabitEtherとか使ってる分には無問題なんだろうケドねぇ・・・(´ヘ`;)

色々試したが、やっぱり この方法では、部分的に読み込むのはムリな模様(-_-;)
もしかしてADODBStreamよりも、FileSystemObjectの類似処理のほうが向いているのか?

2009/12/30

またかいっ・・・


先の おでかけ撮影のトキにもヤられた、SD14の撮影データ破損。
今朝の就寝前定点撮影データも完全ロスト・・・ もう勘弁して(-_-;)

CFメーカー/商品問わず こんな症状出るようなら、新たにCFを買い足すとしても躊躇する罠・・・(´ヘ`;)

取り敢えずChkDskで回復させたが、確保できた.chkファイルの拡張子をX3F変え、
そのままSIGMA PhotoProで現像を試みたトコロで、余程 運が良くない限り、現像は出来ない。
しかし、面白いコトがついさっき判った。
前ログ公開のスクリプトで、正常なファイルと同様に撮影情報が取得できたのだワw

確かに、元々から、完全に全ての情報を取得できないスクリプトだったワケだが、
Header破損しているファイルからも、正常なファイルからのモノと変わらないデータを抜き出せたコトに驚いている。

・・・でも、現像は出来ないんだよなぁ(;_;)
RAW内のメインデータの範囲を取得する手段があれば復元できそうだが、
その情報を格納しているハズのFooterも死んでるコトが多いし、
当然ファイル内で一番規模の大きいメインデータの破損も考えられるワケだから、
結局安直には解決できん・・・(´ヘ`;)


ま、撮影のログだけでも簡単に確保できたので、ヨシとするしかナイ罠・・・

なんだか・・・


・・・またまた遅延。 真に おきつねさまくおりてぃww


って アレ、まだ完成はしていない。


・・・先のを うpしたアトに気付いたコトなのだが、今回、スクリプトの対象としているトコロのX3Fファイルってのは、
どうやらカメラ側の設定次第で、付随するデータの開始位置も変ってしまうようで、
文字列として抽出する範囲固定で処理しているようなブツでは、うまく対応できないと云う罠(-_-;)

また、撮影日時の値も、秒で構成された小数点以下の値を使わない整数で表されている上、
基準日時が通常端末とは異なる1970/01/01と云う仕様。
・・・Longで表されるシリアル値で、且つ 1900/01/01を基準として動作するVBScriptの日付関数では、
単純に そのまま代入して使うと云うワケには逝かなかった。

今回は、それらの点への対応と、オブジェクトの再利用など、処理の流れを大幅に見直し効率化を図り、且つ
暫定ではあるが、複数ファイルドロップも可能にした。


・・・ただ、カメラの設定項目で、SIGMA PhotoProでも抽出でき、撮影データと深く関わりのある、
露出補正/コントラスト/彩度/シャープネス は、あれらテキストとは、独立したBitで記録されているらしく、
今回の版でも取り出せてない。

そのヘン、X3Fファイルのデータ形式について物色したら、意外に単純でない項目があって、
仕様の通りの処理していては、ファイルの全領域を読み込む必要性に迫られてしまう・・・
コレは、ネットワークドライブを多用している おきつねさま的には、非常~にヨロしくない(´ヘ`;)
なので、実機サンプル撮影後のデータを比較解析し、詳細が判明し次第、スクリプトに反映させるコトとした。


ま、今回のでも、前の版よりは、全然マシではあるモノの、以下は やっぱり、
まだまだ アクマでサンプルですから・・・m(_ _)mスクリプトは、散々コソコソ差し替えつつも、何気にメドイさんだったんで
アーカイブせずに放置していたのだが、取り敢えず、うpしますたm(_ _)m


X3FSIR_a.zip αReleaseArchive - 20100103 0723 Update -
▲ を、右クリックしてファイルとして保存してください。晒し者w

'***** ↓↓↓ScriptTitle↓↓↓ *********************************************************
' X3FSIR_a.vbs - X3F ShootingInformationsReader
' FoveonX3 RAWファイルから、撮影情報を文字列として取得する。

' - Created by LazwardFox -

'

' Update -------- ----
' Release
' Update
' βRelease
' Update 20100103 0603 変数整理。
' Update 20091231 1814 0byteファイルに因るエラーへ対策。
' Update 20091231 0425 処理集約の誤りを修正。
' Update 20091230 0315 複数ファイル指定に暫定対応。
' Update 20091230 0130 撮影日時文字列化処理追加/テキストデータの範囲可変に対応。
' αRelease 20091226 2150 単一ファイル取得版、データも内容のまま列挙。
' 日本語/最適化準備中。
' DevStart 20091226 2040

'***** ↓↓↓ ObjectDecralations ↓↓↓ *************************************************
Option Explicit
Public My, Parameters, Fs, objADO ', MySh, objSMTP, objMx
Set My = WScript
With My
Set Parameters = .Arguments ' パラメーター取得
If Parameters.Count <= 0 Then ' パラメータなし起動の無効化
.Quit
End If

Set Fs = .CreateObject("Scripting.FileSystemObject")
Set objADO = .CreateObject("ADODB.Stream")
'Set MySh = .CreateObject("WScript.Shell")
'Set objSMTP = .CreateObject("CDO.Message") ' SMTP Object
'Set objMx = .CreateObject("MSXML2.XMLHTTP") ' URL Check
End With

'***** ↓↓↓ Decralations ↓↓↓ *************************************************
'Public ThisScriptFull, ThisScript, Start
Const vbWq = """"

' Const - Letters
Dim vbWCrLf, vbTc, vbNullB
vbWCrLf = vbCrLf & vbCrLf
vbTc = vbTab & vbCrLf
vbNullB = chr(&h00)

' Const - Date/Times


'***** ↓↓↓ LocalDecralations ↓↓↓ *************************************************
Dim X3FSet

'***** ↓↓↓MainRoutine↓↓↓ *********************************************************
'On Error Resume Next

'X3FSet = Array("X3F",, 264, 1500, "VERSION_BF", "BURST", "TIME", "1970/1/1")
X3FSet = Array("X3F",, 0, 1764, "VERSION_BF", "BURST", "TIME", "1970/1/1")
BPS Parameters, X3FSet


' ----- ExitProcess
Set Fs = Nothing
Set objADO = Nothing
My.Quit

'***** ↓↓↓Functions↓↓↓ *********************************************************
' X3FSIs
'------------------------------------
' Binary Pickup to Strings
' バイナリファイル中 範囲を指定し、任意の文字列群を抽出する。

' - Created by LazwardFox -

' Fs、objADO、cnvDateTime

' Update
' Release
' βRelease
' Update 20091231 1814 0byteファイルに因るエラーへ対策。
' Update 20091231 0425 処理集約の誤りを修正。
' Update 20091230 0315 複数ファイル指定に暫定対応。
' αRelease 20091230 0300
' DevStart 20091230 0200 X3FSIsを汎用用途向けに修正。

' BPS (
' arFileNames - 対象ファイル群配列。
' ,arSet - 動作パラメータを、下記スキーマ準拠の配列で指定。
' )


' ▼▼ arSet Schema ▼▼▼▼▼

' = Array(strEx, SaveFileName, StartBit, ReadByte, Firstkey, Lastkey, strTimeKey, BaseDate)

' arSet
' (0) {strEx} 対象拡張子 (String)
' (1) {SaveFileName} 保存ファイル名 (String)
' (2) StartBit 読み取り先頭位置(Bit) (Number)
' (3) ReadByte 読み込み範囲(byte) (Number)
' (4) Firstkey 先頭キー名 (String)
' (5) Lastkey 最終キー名 (String)
' (6) {strTimeKey} 時間キー名 (String)
' (7) {BaseDate} 時間変換基日付文字列("y/m/d") (String)


Function BPS(arFileNames, arSet)
Dim kNothing, iADO, strTarget, Pc, fKey, rSource
Dim lHeader, pResult, arResult, rUnits, sResult
kNothing = String(5, vbNullB) ' キーも値も存在しない範囲の、データ排除向け
Set iADO = objADO
For Each strTarget In arFileNames
If Fs.GetExtensionName(strtarget) = arSet(0) Then
arSet(1) = Replace(strtarget,"." & arSet(0),".txt") ' < 暫定
With iADO
' ファイルから指定範囲をメモリへ取得
.Type = 1 ' AccessMode - Binary
.Open
.LoadFromFile strTarget ' 対象ファイル
.Position = arSet(2) ' 先頭位置をセット
rSource = .Read(arSet(3)) ' 指定範囲を取得
If .Position > 0 Then ' 20091231 1814
.Close
' Convert to PlainText
rSource = CStr(rSource) ' 次処理に備え、文字列データ化
rSource = Replace(rSource, kNothing, "") ' 無効範囲の消去
.Type = 2 ' AccessMode - Text
.Charset = "_autodetect" ' "Shift_JIS" "utf-8" "Unicode"
.Open
.Position = 0
.WriteText = rSource
lHeader = .Position ' 取得データ長
rSource = ""
For Pc = 0 To lHeader
.Position = Pc
pResult = pResult & .ReadText(1)
Next
.Close
arResult = Split(pResult, vbNullB) ' 配列化。
pResult = ""
For Each sResult In arResult
If sResult = arSet(4) Or fKey > 0 Then ' スタートキー
If fKey = 4 Then ' 日付データ変換
sResult = cnvDateTime(arSet(7), sResult)
End If
rUnits = rUnits & sResult ' 値書き込み
If fKey < 2 Then ' ▼ 末尾符号/キー検出処理 ▼▼▼▼▼
If sResult = arSet(5) Then ' 終了キー
fKey = 5
ElseIf sResult = arSet(6) Then ' 時刻値変換対象
fKey = 4
Else
fKey = 3
End If
rUnits = rUnits & "," ' キー末尾処理
Else
rUnits = rUnits & vbCrLf ' データ末尾処理
If fKey = 5 Then ' 処理終了
Exit For
End If
fKey = 1
End If ' ▲ 末尾符号/キー検出処理 ▲▲▲▲▲
End If
sResult = ""
Next
arResult = ""
fKey = 0
' 指定ファイルへ書き込み
.Type = 2 ' AccessMode - Text
.Charset = "_autodetect"
.Open
.Position = 0
.WriteText rUnits
.SaveToFile arSet(1), 2
End If
.Close
End With
rUnits = "" ' < 暫定
End If
Next
Set iADO = Nothing
End Function

'------------------------------------
' cnvDateTime
' 秒整数で構成された日時データを、Windowsシリアル値に変換。
' 基準日の異なる値の変換にも対応。

' - Created by LazwardFox -

'

' Update
' Release
' βRelease 20091230 0300
' αRelease 20091229 1635
' DevStart 20091229 1500

' cnvDateTime (
' strBaseDate - "y/m/d"形式の日付文字列、基準日を指定。
' ,SourceDateTime - Secベースの経過時間を表す整数
' )

Function cnvDateTime(strBaseDate, SourceDateTime)
Dim sDate
sDate = DateValue(strBaseDate)
cnvDateTime = (((SourceDateTime / 60) / 60) / 24) + sDate
End Function

2009/12/26

いい加減シビレを切らせて・・・


・・・構築中なのデス! SIGMA RAW(FoveonX3Fファイル)の撮影情報連続取得スクリプト。
最新版は次のログで公開/更新中・・・ コチラのログは、スクリプト比較向けに放置w

因みに あの、X3Fって拡張子のファイル、厳密に云うと、JPEGで云うトコロのEXIFってのには準拠出来ていない。
なので、Windowsのエクスプローラで使うには結構不便を強いられる。

しかも、本家提供の現像アプリSIGMA PhotoPro3.xですら、
ファームウェア更新などで拡張されたプロパティ等を、完全に読み出せないと云う罠・・・
撮影したら即、必要な情報メモっておくか、カメラ(CF)にデータがあるウチ(端末へ転送してしまう前)に、
情報控えておかないと、管理できない・・・

そんなデジタルデータなんて、使い悪くて仕方ないんだが・・・(-_-;)


で、バイナリエディタでX3Fファイル覗いたら、なんか知らん、ファイルの先頭に全てあるではナイでsky♪
だったら、文字列解析で利用した、ADODBStreamで特定範囲を読み出すだけのほうが、
SPP使うよりアクセス時間短縮できる・・・  ってのは、随分前から考えていたのだが、
ソコはソレおきつねさまくおりてぃ、ダレかが作るだろうと永らく放置していたのだ!

・・・って、チョイと文字列の扱いが面倒だったので手を付けなかっただけなのだが、
此度は諦め、1日使って最適な呼び出し方など模索し、解決に至った。

以下スクリプトで単体動作可能だが、1ファイルずつドロップする体なので、使い勝手は良くない。
このレベルだと、SPPでやってるよりは マシンに負荷が掛からないってぇトコだけが利点な程度。
おきつねさますくりぷととしては、とてもクオリティを満たしているとは云い難い。
ツマり・・・


     アクマでテストな版デスから。


ってコトでw


明日 このコアに、連続ファイル/フォルダ投入/日時文字列化/iniローダ/日付バックアップ/html吐き出しなど、
今までのライブラリを そのまま適用したり、下記に内包させて最適化を図るなどして、
SPPと等価の文字列を連続したHTMLとして取得可能なスクリプトに仕上げる。
(ココに晒す写真や そのデータを手作業で並べるのが面倒になっただけw)


取り敢えずコアなどww

'***** ↓↓↓ScriptTitle↓↓↓ *********************************************************
' X3F ShootingInformationsReader
' - Created by LazwardFox -

'

' Update -------- ----
' Release
' Update
' βRelease
' αRelease 20091226 2150 単一ファイル取得版、データも内容のまま列挙。
' 日本語/最適化準備中。
' DevStart 20091226 1241

'***** ↓↓↓ ObjectDecralations ↓↓↓ *************************************************
Public My, Parameters, Fs, objADO ', MySh, objSMTP, objMx
Set My = WScript
With My
Set Parameters = .Arguments ' パラメーター取得
If Parameters.Count <= 0 Then ' パラメータなし起動の無効化
.Quit
End If

Set Fs = .CreateObject("Scripting.FileSystemObject")
Set objADO = CreateObject("ADODB.Stream")
'Set MySh = .CreateObject("WScript.Shell")
'Set objSMTP = .CreateObject("CDO.Message") ' SMTP Object
'Set objMx = .CreateObject("MSXML2.XMLHTTP") ' URL Check
End With

'***** ↓↓↓ Decralations ↓↓↓ *************************************************
'Public ThisScriptFull, ThisScript, Start
Const vbWq = """"

' Const - Letters
Dim vbWCrLf, vbTc, vbNullB
vbWCrLf = vbCrLf & vbCrLf
vbTc = vbTab & vbCrLf
vbNullB = chr(&h00)

' Const - Date/Times


'***** ↓↓↓ LocalDecralations ↓↓↓ *************************************************
'Dim rdSource, svRoot, edMove, eSource
'Dim arLog, arResult, strReport

'***** ↓↓↓MainRoutine↓↓↓ *********************************************************
'On Error Resume Next

X3FSIR Parameters(0),34

' Msgbox strResult,,"CreateTesters"

' ----- ExitProcess
Set Fs = Nothing
Set objADO = Nothing
My.Quit

'***** ↓↓↓Functions↓↓↓ *********************************************************
'------------------------------------
' X3F ShootingInformationsReader
' FoveonX3 RAWファイルから、撮影情報を文字列として取得する。

' - Created by LazwardFox -

' Fs、objADO

' Update
' Release
' βRelease
' αRelease 20091226 2150 単一ファイル取得版、データも内容のまま列挙。
' 日本語/最適化準備中。
' DevStart 20091226 1241

' X3FSIs (
' strTarget - X3Fファイル名を指定する。他の種類は無効。
' ,KeyCount - キー数を指定。
' )

Function X3FSIR(strTarget, KeyCount)
Dim Lc, sName, iADO, sADO, Pc, kPc, rByte, cResult, arResult, rUnits
Const strEx = "X3F"
Lc = (KeyCount * 2) - 1
If Fs.GetExtensionName(strtarget) = strEx Then
sName = Replace(strtarget,"." & strEx,".txt") ' < 暫定
Set iADO = objADO
With iADO
.Type = 1 ' - Binary
.Open
.LoadFromFile strTarget ' 対象ファイル
For Pc = 1 To 1100 Step 1
.Position = 527 + Pc
rByte = rByte & CStr(.Read(1))
Next
.Close
cResult = Replace(rByte,vbNullB & vbNullB & vbNullB & vbNullB & vbNullB, "")
cResult = Replace(cResult," ", "")
arResult = Split(cResult,vbNullB)
For Pc = 0 To Lc
rUnits = rUnits & arResult(Pc)
If kPc = 0 Then
rUnits = rUnits & ","
kPc = 1
Else
rUnits = rUnits & vbCrLf
kPc = 0
End If
Next
.Type = 2 ' - Text
.Charset = "_autodetect" ' "Shift_JIS" '"utf-8" '"utf-8" ' "Unicode"
.Open
.WriteText rUnits
.Position = 0
.SaveToFile sName, 2 ' < 暫定
.Close
End With
Set iADO = Nothing
End If
End Function



・・・SD14のX3Fファイルでしかテスト出来ないので、このままで同社他機種に対応できるかは不明。
ただ、メチャクチャ単純な処理しか使っていないので、各位で好き勝手改変して使ってもらうのもアリだろう。
メドイけど(^_^;)

2009/12/08

あいたたた・・・


ウチ鯖の専用HPを、ケータイのブラウザで読み、ソコからPOSTさせて得た基地局座標を、
ググるさんAPIで準広域地図画像に変換し、鯖の指定フォルダに固有名称で確保するコトで、
詳細座標を漏洩するコト無く、おきつねさま位置をWeb公開・・・ ってのを試みたのだが、なんと!
禿bank の SAMSUNG 709SC は、簡易位置情報取得機能を持ってなかったと云うオチがw (^_^;)

テスト環境すらナイってコトなので、このガジェットの開発は断念の方向・・・


しかし、端末へのメールの移行や、MAPIクライアントやPIMとの内容同期もサポしてない・・・
流石にコレは "予想GUY" だったワww
<SoftBank SAMSUNG 709SC>

2009/12/06

VB弾投下っ!・・・


VBScript等で、時刻文字列とか、2つの日時から その差異や平均を取得となると、
簡単なようで、厳密にやろうとすると結構面倒な上、難しいと云うのは、
そのヘン触ったコトのある身なら、ダレでも既知のコトと思う。

で、以前公開した、日付文字列取得関数を簡単に改良した版と、日時の差異を色々な形式で取得できる関数、
変数内データ確認関数、簡単な桁揃え関数などを一纏めにし、且つ、ソレらが連携するよう組んだサンプルを、
以下にうpしてみた。

アーカイブはコチラ ・・・今回は サンプルなので、エンコード版は非同梱。


おやくそくの ひけらかしw

'***** ↓↓↓ScriptTitle↓↓↓ ****************************************************
' dtDiffs (X3FManeger)
' - Created by LazwardFox -

' 時間文字列取得関数と、時間差取得関数のテストパッケージ。
' mSecレベルを未処理な為、平均時間取得で、秒の精度が低い。

' 特徴)
' 時間差異取得関数 dtDiff で 得られる差異は最大、9999/12/31 23:59:59
' また、比較時刻に差異が無かった場合には、既存日付関数では取得不可能な、
' 0年0ヶ月0日 0時間0分0秒を、様々な形式の値として取得可能。

' 注)
' 上記特徴に起因し、時間差異取得関数 dtDiff で 得た値は、
' 概ね、そのまま日付処理関数に代入できない。

' Tips 01)
' VBScriptの時刻取得関数で得られた値には、ミリ秒が含まれる。
' が、このスクリプトに含まれる処理だけでは、
' ソレを表示結果に反映させるコトは出来ない。
' (JavaScriptにある、MilliSeconds に、該当する関数はナイ)

' Tips 02)
' テストで用いている Sleep関数は、1/1000秒レベルの精度を持たない。
' 故に、テストでのミリ秒の値は安定しない。
' つまり、.Sleep 3000 としても、ジャスト3000mSecでは動作していない。
' (JavaScriptで類似処理を用いても、ほぼ同様)

' 単純数値化
' yyyymmddhhnnss と結果を並べて、(倍精度)整数に変換したモノ。
' もし仮に、結果の差異が 11年 6ヶ月 2日 16時間 22分 4秒 であった場合、
' 110602162204 が(文字列ではなく)整数で返される。


' それら特徴や問題に起因し、平均値を得るに、
' 丁度割り切れる秒数でナイ場合の精度は期待できない。


' Update -------- ----
' Release -------- ----
' Update 20091206 0307 平均値出力暫定追加(ミリSecレベル未対応版)
' Update 20091206 0247 公開用にX3FManegerから分離し、テストスクリプト化。
' βRelease 20091011 0625
' DevStart 20091010 1549

'***** ↓↓↓ ObjectDecralations ↓↓↓ *******************************************
Public My, Fs ', Parameters, MySh,
Set My = WScript
With My
'Set Parameters = .Arguments ' パラメーター取得
'If Parameters.Count <= 0 Then ' パラメータなし起動の無効化
' .Quit
'End If

'Set MySh = .CreateObject("WScript.Shell")
Set Fs = .CreateObject("Scripting.FileSystemObject")
'Set objSMTP = .CreateObject("CDO.Message") ' SMTP Object
'Set objMx = .CreateObject("MSXML2.XMLHTTP") ' URL Check
End With

'***** ↓↓↓ Decralations ↓↓↓ *************************************************

' Const - Letters
Dim vbWCrLf, vbTc
Const vbWq = """"
vbWCrLf = vbCrLf & vbCrLf
vbTc = vbTab & vbCrLf

' Const - Date/Times


'***** ↓↓↓ LocalDecralations ↓↓↓ ********************************************
Dim sStartTime, sEndTime, ElapsedTime
Dim StartTime, EndTime
Dim strReport
strReport = "時間差異と平均時間取得テスト" & " " & vbWCrLf

'***** ↓↓↓ TestParameter Decralations ↓↓↓ ***********************************
Const sPar = 3 ' テスト用平均値取得パラメータ

'***** ↓↓↓MainRoutine↓↓↓ ****************************************************
'On Error Resume Next
sStartTime = Now() ' 開始時刻シリアル値取得
My.Sleep 6000 ' テスト間隔
sEndTime = Now() ' 終了時刻シリアル値取得
dtDiff sStartTime, sEndTime, sPar, ElapsedTime ' 経過時間
iDT sStartTime,,,, 0, StartTime ' 開始時刻文字列取得
iDT sEndTime,,,, 0, EndTime ' 終了時刻文字列取得

strReport = strReport & "みなし処理回数 - " & sPar & " " & vbWCrLf

strReport = strReport & "開始-" & StartTime & " " & vbCrLf
strReport = strReport & "終了-" & EndTime & " " & vbCrLf
strReport = strReport & "経過-" & Join(ElapsedTime(0)," ") & " " & vbCrLf
strReport = strReport & "経過時間単純数値化-" & ElapsedTime(1) & " " & vbCrLf
strReport = strReport & "平均-" & Join(ElapsedTime(2)," ") & " " & vbCrLf
strReport = strReport & "平均時間単純数値化-" & ElapsedTime(3) & " "
Msgbox strReport & " ",,Fs.GetBaseName(My.ScriptName)
Set Fs = Nothing
'Set MySh = Nothing
My.Quit

'***** ↓↓↓Functions↓↓↓ ******************************************************

' X3FManeger (fCopy)
'------------------------------------
' iDT - 日時文字列 ないし 日/時配列取得 for VBScript
' - Created by LazwardFox -

' VarChk

' Update 20091103 1149 パラメータチェックを完全外部化。
' Update 20091010 1736 文字列/シリアル値による日時指定、
' 及び パラメータ省略に対応。
' Update 20090228 0458 変数宣言変更
' Update 20090223 0959 時刻桁処理変更
' Update 20090223 0253 Len記述忘れ修正
' Update 20090223 0135 変数宣言忘れ修正
' Update 20090210 0218
' Update 20090210 0115
' Release 20090209 2035

' iDT (
' {tDateTime} - Serial / DateTimeStrings (省略可、既定値 - Now)
' ,{dSplitter} - DateSplitString (省略可、既定値 - "/")
' ,{dtSeparater} - Date/Time SepaleteString (省略可、既定値 - " ")
' ,{tSplitter} - TimeSplitString (省略可、既定値 - ":")
' ,{Control} - 戻り値 文字列/配列指定 0 or 1 (省略可、既定値 - 1)
' ,Result - 結果日時文字列 (省略不可)
' )

' Memo - いずれかのSplitterに ~|" を設定すると、全ての要素が、配列として返されます。
' iDT ,"|",,,,arDT ' - (0) YYYY / (1) MM / (2) DD / (3) HH / (4) NN / (5) SS

Public Function iDT(tDateTime, dSplitter, dtSeparater, tSplitter, Control, Result)
Dim vDateTime, cDateTime, nD, nS, strYMD, strHNS
Dim dVal, cVar, arVar
dVal = Array(Now(),"/"," ",":",1) ' 既定値配列
cVar = Array(Array(tDateTime,7,False,dVal(0)),Array(dSplitter,10,True,dVal(1)), _
Array(dtSeparater,10,True,dVal(2)),Array(tSplitter,10,True,dVal(3)), _
Array(Control,2,False,dVal(4)))
arVar = VarChk(cVar)
tDateTime = arVar(0)
strYMD = FormatDateTime(DateValue(tDateTime),0) 'Update 20091010 1736
nS = ":" & Split(CStr(FormatDateTime(tDateTime,3)),":")(2) 'Update 20090223 0951
strHNS = FormatDateTime(tDateTime,4) & nS 'Update 20090223 0951
If arVar(3) = dVal(3) Then
Else
strHNS = Replace(strHNS,dVal(3),arVar(3))
End If
If arVar(1) = dVal(1) Then
Else
strYMD = Cstr(Replace(strYMD,dVal(1),arVar(1)))
End If
If arVar(4) = dVal(4) Then
Result = Split(strYMD & "|" & strHNS,"|")
Else
Result = strYMD & arVar(2) & strHNS
End If
End Function

' X3FManeger (fCopy)
'------------------------------------
' VarChk
' 変数内データの確認と、既定値への置換をサポート。
' 関数への代入パラメータ確認向け
' - Created by LazwardFox -

' Update
' Release
' βRelease 20091103 1152
' DevStart 20091103 1014

' VarChk - 結果を配列で返す。
' (
' arVar - 調査対象と条件を配列で代入する。 (省略不可)
' )

' arVar = Array(Array(Value,VarTypes,Boolean,DefaultData),Array(Value,VarTypes,Boolean,DefaultData),・・・)

' Value - 確認対象となる値、ないし変数
' VarTypes - VarType定数 (日時値を得る場合は、基が文字列代入であっても 8 を指定)
' Boolean - 条件の可否
' DefaultData - 代替規定値 (データ型自由)

Function VarChk(arVar)
If VarType(arVar) >= 8192 Then
ReDim iResult(UBound(arVar))
Dim Pc, iVar, cVar ,vVar, vDT, cDT
Pc = 0
For Each iVar In arVar
cVar = VarType(iVar) >= 8192 And Ubound(iVar) = 3
If cVar Then
cVar = VarType(iVar(1)) = 2 And VarType(iVar(2)) = 11
If cVar Then
If iVar(1) = 8 Then
vDT = VarType(iVar(0))
cDT = vDT <> 10 And (vDT = 7 Or (vDT = 8 And IsDate(iVar(0))))
If cDT Then ' シリアル値/日時文字列 識別
iResult(Pc) = DateValue(iVar(0)) + TimeValue(iVar(0))
Else
iResult(Pc) = iVar(3) ' Now()
End If
Else
vVar = VarType(iVar(0))
If iVar(2) = (vVar = iVar(1)) Then
iResult(Pc) = iVar(3)
Else
iResult(Pc) = iVar(0)
End If
End If
End If
End If
Pc = Pc + 1
Next
End If
VarChk = iResult
End Function

' X3FManeger
'------------------------------------
' dtDiff
' 日時値の差異を取得。
' "各単位の差異のみを単純に取得"するDateDiffとは異なる。
' ※ iDTの仕様起因し、利用する場合、コチラを先に実行する必要がある。
' - Created by LazwardFox -

' Digit, VarChk

' Update 20091208 0119 平均値取得時のゼロ除算回避を追記。
' Update 20091206 0626 VarChk使用で、Par 省略に対応。
' Update 20091206 0356 暫定版平均値取得機能追加。
' Update 20091206 0217 差異演算基底日付値に伴う修正。
' Update 20091105 0329 単純化した時間差数値を出力可能に
' Update 20091105 0315 文字列桁揃えをサポート
' Release 20091103 1655
' βRelease 20091103 1626
' DevStart 20091103 1606

' dtDiff - 各単位別の結果を配列で返す。
' Var(0) 日付 - (0) Y / (1) M / (2) D
' Var(1) 時間 - (0) H : (1) N : (2) S
' (
' Before - Serial / DateTimeStrings (省略不可)
' ,{After} - DateSplitString (省略可、既定値 - Now())
' ,{Par} - AverageParameter (省略可、既定値 - 1)
' ,Result - 結果を日/時別の文字列を配列として返す。 (省略不可)
' Result(0)(0) - "Y/M/D" / (1) - "H:N:S"
' Result(1) - YYYYMMDDHHNNSS を並べ、単純数値化した結果が返る。
' Result(2)(0) - "Y/M/D" / (1) - "H:N:S"
' Result(3) - YYYYMMDDHHNNSS を並べ、単純数値化した結果が返る。
' 例) 時間差が 4日と2時間15分5秒 なら 4021505
' )

' Result と Join(Var(0),"/") & " " & Join(Var(1),":") は、等価。
' 数値で、単位別の値の取得が不要であれば、以下書式だけで利用可能。

' dtDiff Before, After, Result

Function dtDiff(Before, After, Par, Result)
If VarType(Before) = 7 Then
Dim cVar, arVar, lDate, Diffs, avDiffs, iResult
cVar = Array(Array(After,7,False,Now()), Array(Par,2,False,1))
arVar = VarChk(cVar)
lDate = DateSerial(0,1,1) ' 差異演算基底日付値 (0,1,1) = 2000/01/01
Diffs = arVar(0) - Before 'After - Before
If arVar(1) > 0 Then
avDiffs = Diffs / arVar(1)
End If
Diffs = lDate + Diffs
avDiffs = lDate + avDiffs
iResult = Array( _
Array(Digit(Year(Diffs) - 2000, "0000"),Digit(Month(Diffs) - 1, "00"),Digit(Day(Diffs) - 1, "00")), _
Array(Digit(Hour(Diffs), "00"), Digit(Minute(Diffs),"00"), Digit(Second(Diffs),"00")), _
Array(Digit(Year(avDiffs) - 2000, "0000"),Digit(Month(avDiffs) - 1, "00"),Digit(Day(avDiffs) - 1, "00")), _
Array(Digit(Hour(avDiffs), "00"), Digit(Minute(avDiffs),"00"), Digit(Second(avDiffs),"00")))
Result = Array(Array(Join(iResult(0),"/"),Join(iResult(1),":")),Cdbl(Join(iResult(0),"") & Join(iResult(1),"")), _
Array(Join(iResult(2),"/"),Join(iResult(3),":")),Cdbl(Join(iResult(2),"") & Join(iResult(3),"")))
dtDiff = iResult
Else
dtDiff = False
End If
End Function

' X3FManeger
'------------------------------------
' Digit
' 文字列表記の数値の桁揃えを行う。
' - Created by LazwardFox -

' Update
' Release
' βRelease 20091105 0303 チョー暫定発行 そにょ2
' DevStart 20091105 ----

Function Digit(Num, dig)
Digit = Right(Clng("1" & dig) + Num, Len(Dig))
End Function



ココまでヤる意味があるかは、利用側の用途次第かw

mSec対応版も組んでたんだけど、時間無くなったので途中のまま・・・(-_-;)
<そのまま使えるVBscript 日時文字列 時刻差異取得>