カテゴリー
プログラム ゆっくりMovieMaker

YMM4セリフ入力マクロが落ちるの対処

「YMM4セリフ入力マクロが落ちる」でステップインで実行するていうことに回避したけど、
msgboxを一度起動させれば落ちないことがわかった。
ということで瞬時に閉じるmsgboxを走らせて回避することに成功した

カテゴリー
プログラム

[WSH・Python]全銀フォーマットの入出金取引明細レコード・フォーマットをcsvに変換してみた

全銀フォーマットの入出金取引明細レコード・フォーマットをcsvに変換してみた。
和暦は2018を足して西暦にしてます。
言語はJscriptです。Windowsマシンなら動くでしょう。

cscript zengin2csv.js "全銀データのファイル"

zengin2csv.js


//入出金取引明細レコード・フォーマット
//① ヘッダー・レコード
type1=[['データ区分','N',1],
['種別コード','N',2],
['コード区分','N',1],
['作成日','N',6],
['勘定日(自)','N',6],
['勘定日(至)','N',6],
['銀行コード','N',4],
['銀行名','C',15],
['支店コード','N',3],
['支店名','C',15],
['ダミー','N',3],
['預金種目','N',1],
['口座番号(注)','N',10],
['口座名','C',40],
['※貸越区分','N',1],
['※通帳・証書区分','N',1],
['※取引前残高','N',14],
['ダミー','C',71]
]

//②-1 データ・レコード(普通預金・当座預金・貯蓄預金の場合)
type21=[['データ区分','N',1],
['※照会番号','N',8],
['勘定日','N',6],
['預入・払出日','N',6],
['入払区分(注)','N',1],
['※取引区分','N',2],
['取引金額','N',12],
['うち他店券金額','N',12],
['※交換呈示日','N',6],
['※不渡返還日','N',6],
['※手形・小切手区分','N',1],
['※手形・小切手番号','N',7],
['※僚店番号','N',3],
['※振込依頼人コード','N',10],
['※振込依頼人名または契約者番号','C',48],
['※仕向銀行名','C',15],
['※仕向店名','C',15],
['※摘要内容','C',20],
['※EDI 情報','C',20],
['ダミー','C',1]
]

//②-2 データ・レコード(通知預金・定期預金・積立定期預金の場合)
type22=[['データ区分','N',1],
['※識別番号','N',8],
['勘定日','N',6],
['預入・払出日','N',6],
['入払区分(注 1)','N',1],
['※取引区分','N',2],
['取引金額','N',12],
['うち他店券金額','N',12],
['※交換呈示日','N',6],
['※不渡返還日','N',6],
['※手形・小切手区分','N',1],
['※手形・小切手番号','N',7],
['※僚店番号','N',3],
['※当初預入日','N',6],
['利率(注 2)','N',6],
['※満期日','N',6],
['※期間(1)','N',7],
['※期間利息','N',11],
['※中間払利率','N',6],
['※中間払区分','N',1],
['※期後期間','N',4],
['※期後利率','N',6],
['※期後利息','N',9],
['※合計利息','N',11],
['※税区分','N',1],
['※税率','N',4],
['※税額','N',10],
['※税引後利息','N',11],
['※摘要内容','C',20],
['※期間(2)','N',5],
['※期間利息正負表示','N',1],
['ダミー','C',4]
]

//③ トレーラ・レコード
type8=[['項目名','桁',],
['データ区分','N',1],
['入金件数','N',6],
['入金額合計','N',13],
['出金件数','N',6],
['出金額合計','N',13],
['※貸越区分','N',1],
['※取引後残高','N',14],
['データ・レコード件数','N',7],
['ダミー','C',139]
]

//④ エンド・レコード
type9=[['項目名','桁',],
['データ区分','N',1],
['レコード総件数','N',10],
['口座数','N',5],
['ダミー','C',184]
]

data_len=200
f_debug = true


//ファイル名は引数で渡される
var args = WScript.Arguments

var outputfilename = args(0)+ ".csv"
var fs = new ActiveXObject( "Scripting.FileSystemObject" );
var ifile = fs.OpenTextFile(args(0), 1, true);
var ofile = fs.OpenTextFile(outputfilename, 2, true);

var str =ifile.ReadAll();

data_num = str.length / data_len

for (var j = 0; j < data_num; j++) {
	//レコードの切り出し
	data_rec=str.substr( 200*j, data_len );
	//WScript.Echo( data_rec);
	
	//1文字目でデータ種別を判断
	column_data=""
	switch (data_rec.substr(0,1)) {
		case "1":
			//実行する処理; //式が値1に当てはまる場合に実行される

			
			//カラム行出力
			for (var i = 0; i < type1.length; i++) {
				column_data += type1[i][0]+","
			}
			if (f_debug) WScript.Echo(column_data)
			ofile.WriteLine(column_data)
			
			if (f_debug) WScript.Echo(text2csv(data_rec,type1))
			ofile.WriteLine(text2csv(data_rec,type1))

			column_data=""
			
			
			//62文字(0始まり)で預金種目を区別
			if (data_rec.substr(62,1) == "1") {
				type2=type21
			} else {
				type2=type22
			}
			//上の場合分けは不要みたい
             type2=type21


			
			//カラム行出力
			for (var i = 0; i < type2.length; i++) {
				column_data += type2[i][0]+","
			}
			if (f_debug) WScript.Echo(column_data)
			ofile.WriteLine(column_data)
			
			
			break;
		case "2":
		
			if (f_debug) WScript.Echo(text2csv(data_rec,type2))
			ofile.WriteLine(text2csv(data_rec,type2))
			//WScript.quit(0);
			break;
		case "8":
			//実行する処理;
			break;
		case "9":
			//実行する処理;
			break;
		default:
			//実行する処理;
	} 
	
	
}


ifile.Close();
ofile.Close();


//  オブジェクトを解放
fs = null;

function text2csv(data_rec,type) {
	data_pos=0
	column_data=""
	for (var i = 0; i < type.length; i++) {
	
		if (type[i][1]=="N") {
			//末尾が日で終わる項目
			if (data_pos,type[i][0].match(/日$/) && (data_rec.substr(data_pos,type[i][2]) != '000000')) {
				//日付形式に直す.
				date_data1 = data_rec.substr(data_pos,type[i][2])
				//和暦を西暦に
				date_data2 =  Number(date_data1.substr(0,2))+2018 + '/' + date_data1.substr(2,2) + '/' + date_data1.substr(4,2) 
			
				column_data += '"' + date_data2 + '",'
				
			} else {
		
				column_data += data_rec.substr(data_pos,type[i][2])+','
			}
		} else {
			//末尾の空白を削除して"で囲む
			column_data += '"'+data_rec.substr(data_pos,type[i][2]).replace(/\s+$/g, '')+'",'
		}

	
		//column_data += data_rec.substr(data_pos,type[i][2])+","
		data_pos=data_pos+type[i][2]
	}
	return column_data
}

Pythonでも同じようなものを作ってみた。

import sys
import os
import re
import csv
import shutil
import glob
from datetime import datetime
#from dateutil.parser import parse
import time


#入出金取引明細レコード・フォーマット
#① ヘッダー・レコード
type1=[['データ区分','N',1],
['種別コード','N',2],
['コード区分','N',1],
['作成日','N',6],
['勘定日(自)','N',6],
['勘定日(至)','N',6],
['銀行コード','N',4],
['銀行名','C',15],
['支店コード','N',3],
['支店名','C',15],
['ダミー','N',3],
['預金種目','N',1],
['口座番号(注)','N',10],
['口座名','C',40],
['※貸越区分','N',1],
['※通帳・証書区分','N',1],
['※取引前残高','N',14],
['ダミー','C',71]
]

#②-1 データ・レコード(普通預金・当座預金・貯蓄預金の場合)
type21=[['データ区分','N',1],
['※照会番号','N',8],
['勘定日','N',6],
['預入・払出日','N',6],
['入払区分(注)','N',1],
['※取引区分','N',2],
['取引金額','N',12],
['うち他店券金額','N',12],
['※交換呈示日','N',6],
['※不渡返還日','N',6],
['※手形・小切手区分','N',1],
['※手形・小切手番号','N',7],
['※僚店番号','N',3],
['※振込依頼人コード','N',10],
['※振込依頼人名または契約者番号','C',48],
['※仕向銀行名','C',15],
['※仕向店名','C',15],
['※摘要内容','C',20],
['※EDI 情報','C',20],
['ダミー','C',1]
]

#②-2 データ・レコード(通知預金・定期預金・積立定期預金の場合)
type22=[['データ区分','N',1],
['※識別番号','N',8],
['勘定日','N',6],
['預入・払出日','N',6],
['入払区分(注 1)','N',1],
['※取引区分','N',2],
['取引金額','N',12],
['うち他店券金額','N',12],
['※交換呈示日','N',6],
['※不渡返還日','N',6],
['※手形・小切手区分','N',1],
['※手形・小切手番号','N',7],
['※僚店番号','N',3],
['※当初預入日','N',6],
['利率(注 2)','N',6],
['※満期日','N',6],
['※期間(1)','N',7],
['※期間利息','N',11],
['※中間払利率','N',6],
['※中間払区分','N',1],
['※期後期間','N',4],
['※期後利率','N',6],
['※期後利息','N',9],
['※合計利息','N',11],
['※税区分','N',1],
['※税率','N',4],
['※税額','N',10],
['※税引後利息','N',11],
['※摘要内容','C',20],
['※期間(2)','N',5],
['※期間利息正負表示','N',1],
['ダミー','C',4]
]

#③ トレーラ・レコード
type8=[['項目名','桁',],
['データ区分','N',1],
['入金件数','N',6],
['入金額合計','N',13],
['出金件数','N',6],
['出金額合計','N',13],
['※貸越区分','N',1],
['※取引後残高','N',14],
['データ・レコード件数','N',7],
['ダミー','C',139]
]

#④ エンド・レコード
type9=[['項目名','桁',],
['データ区分','N',1],
['レコード総件数','N',10],
['口座数','N',5],
['ダミー','C',184]
]

data_len=200
f_debug = 1

def text2csv(data_rec,type):
    data_pos = 0
    column_data = ""
    for i in range(len(type)):
        if type[i][1]=="N":
            #//末尾が日で終わる項目
            if re.search('日', type[i][0]) and data_rec[data_pos:data_pos+type[i][2]] != '000000':
                #print("hit",type[i][0])
                date_data1 = data_rec[data_pos: data_pos+type[i][2]]

                date_dat0 = date_data1[0:2]
                date_dat1 = date_data1[2:4]
                date_dat2 = date_data1[4:6]
                date_dat4 = str(int(date_data1[0:2])+2018)
                date_data2 = str(int(date_data1[0:2])+2018) + '/' + date_data1[2:4] + '/' + date_data1[4:6]
                column_data += '"' + date_data2 + '",'
            else:
                column_data += data_rec[data_pos:data_pos+type[i][2]]+','
        else:
            column_data += '"' + re.sub('\s+$', '', data_rec[data_pos:data_pos + type[i][2]]) + '",'

        data_pos += type[i][2]
    return column_data





def transZengin(inputfilename):
    x_cnt=0
    outputfilename = inputfilename+ ".csv"
    ifile = open(inputfilename, 'r')
    ofile = open(outputfilename, 'w')

    text = ifile.read()
    data_num = int(len(text) / data_len)

    for j in range(data_num):
        #レコードの切り出し
        data_rec = text[data_len * j:data_len * j+data_len]
        column_data=""
        if data_rec[0:1]=="1":
            #//見出し出力
            for i in range(len(type1)):
                column_data += type1[i][0] + ","
            if f_debug==1:
                print(column_data)
            ofile.write(column_data+'\n')

            column_data=text2csv(data_rec,type1)
            if f_debug==1:
                print(column_data)
            ofile.write(column_data+'\n')

            #データレコードの見出し行出力
            column_data = ""
            if data_rec[62:63]=="1":
                type2 = type21
            else:
                type2 = type22
            #//上の場合分けは不要みたい
            type2 = type21
            #//見出し出力
            for i in range(len(type2)):
                column_data += type2[i][0] + ","
            if f_debug==1:
                print(column_data)
            ofile.write(column_data+'\n')

        elif data_rec[0:1]=="2":
            column_data=text2csv(data_rec,type2)
            if f_debug==1:
                print(column_data)
            ofile.write(column_data+'\n')
            x_cnt = +1

    ifile.close()
    ofile.close()
    if x_cnt>0:
        return outputfilename
    else:
        return ''

inputfilename = 'Zengin0000554'
transZengin(inputfilename)

カテゴリー
プログラム

pythonでZV-E10の録画ボタンを押す

pythonでZV-E10の録画ボタンを押してみました。

from pywinauto import Application
import os
import subprocess
import time
app = Application().connect(path=r"C:\Program Files\Sony\Imaging Edge\Remote.exe")
hwin = app.top_window()
stb_btn=''
rec_btn=''

# ZV-E10用
stb_btn='Button18'
rec_btn='Button19'

# RX100M5A用
#stb_btn='Button11'
#rec_btn='Button12'

if stb_btn=='':

    for num in range(50):
        #print(app['Remote']['Button'+str(num)].get_properties()['control_id'])
        if app['Remote']['Button'+str(num)].get_properties()['control_id']==1001:

            stb_btn = 'Button' + str(num)
            rec_btn = 'Button' + str(num+1)
            print(stb_btn,rec_btn)
            break

#静止画撮影ボタン(Button11)の状態で録画中かどうかを判定する
if app['Remote'][stb_btn].get_properties()['is_enabled']:
    #静止画撮影ボタンがenable → 録画中でない
    print('録画ボタンを押す')
    # 録画ボタンを押す
    app['Remote'][rec_btn].click()
else:
    print('すでに録画中')
print('録画中')
time.sleep(180)

print('録画終了')
# 録画ボタンを押す
if not app['Remote'][stb_btn].get_properties()['is_enabled']:
    #静止画撮影ボタンがenable → 録画中でない
    print('録画ボタンを押す')
    # 録画ボタンを押す
    app['Remote'][rec_btn].click()
else:
    print('すでに終了済み')

カテゴリー
プログラム ゆっくりMovieMaker

YMM4セリフ入力マクロが落ちる

このところYMM4セリフ入力マクロが実行とともにExcelごと落ちてしまうという現象が多発している。
マクロの中でキャラ変更のコンボボックスを叩くということをやってるんだが、
そこで落ちてしまう。
もちろん落ちないときもあって、なんかコード上の問題ではないような気がする。
落ちるときと落ちないときの差がわからない。

ただし、回避方法というのも見つかって、VBAマクロをステップ実行させると落ちない。
落ちないというか今の所落ちたことがない。

ここで実行を押さずに、ステップインを押す。
ステップインを押すとVBAのエディタが開かれるので、F5キーで続きを再開させると、
今の所落ちずに処理が流れる。

回避策を施しました。

カテゴリー
プログラム ゆっくりMovieMaker

ゆっくりムービーメーカー4の定義ファイルからセリフを抜き出すバッチ

ゆっくりムービーメーカー4の定義ファイルからセリフを抜き出すバッチです。

@if(0)==(0) ECHO OFF
:カレントDIRをこのバッチが置かれたDIRに変更
cd /d %~dp0
%SystemRoot%\SysWOW64\cscript.exe //nologo //E:JScript "%~f0" %* | sort > serifu.csv
GOTO :EOF
@end

// 読み込み
var sr = new ActiveXObject("ADODB.Stream");
sr.Type = 2;
sr.charset = "utf-8";
sr.Open();
sr.LoadFromFile( "init1.ymmp" );   //ymm4のymmpファイル名
var temp = sr.ReadText( -1 );
sr.Close();
//設定ファイルをオブジェクトとしてとりこみ
parsedjson = eval('('+temp+')');
//WScript.echo(parsedjson["Timeline"]["Items"][0]["CharacterName"])
for (var i = 0; i < parsedjson["Timeline"]["Items"].length; i++) {
	if (parsedjson["Timeline"]["Items"][i]["Serif"]) {
		WScript.echo(("          "+parsedjson["Timeline"]["Items"][i]["Frame"]).slice(-10)+","+parsedjson["Timeline"]["Items"][i]["CharacterName"]+',"'+parsedjson["Timeline"]["Items"][i]["Serif"].replace(/\r?\n/g ,"")+'"')
	}
}

カテゴリー
OpenWrt

OpenWrtでDDNS(ダイナミックDNS)の設定

OpenWrtで楽天ひかりに接続できるようになったのだが、自宅サーバーを建てていてDDNS(ダイナミックDNS)を使っているから、
OpenWrtでDDNSの情報更新をさせるようにしてみた。
DDNSパッケージのインストール
「システム」「ソフトウェア」で「luci-app-ddns」を検索しインストールする
DDNSとしてno-ip.comを利用してるから「ddns-scripts_no-ip_com」もインストールする。

インストール後は「サービス」「DDNS」というメニューが出てくる。

設定項目はいたって簡単。
no-ip.comを選択して、ユーザー名、パスワード名、ホスト名を入れてくだけ。

カテゴリー
OpenWrt PC

仮想環境のOpenWRTでの楽天ひかりの上りPPPoEが遅い

仮想環境でルーターを構築して楽天ひかりに接続できたものの、
IPv4の上りがとんでもなく遅い。
128kbbsだから昔のISDNなみ。
まだまだIPv4サイトも多いので、そういうサイトで写真すらうpできない。

  ipv4 ipv6
下り 368.5Mbps(非常に速い) 413.13Mbps(非常に速い)
上り 0.11Mbps(非常に遅い) 63.8Mbps(速い)

wiresharkで見てみるとRetransmission,Out-Of-Orderがやたら出てたんで、
それ絡みで調べてたらTSO有効でvmwareを使ってるとネットが遅いていう情報が出てきた。
試しにNICの設定で大量送信オフロードてのをOFFにしたら、
上り128kbpsしか出てなかったのがいきなり、40Mbpsまで跳ね上がった。
TSOの設定てNICの設定とWindowsOSのレジストリにもあるので、両方ともOFFにしたら上の数値になったわ。

  ipv4 ipv6
下り 441.26Mbps(非常に速い) 328.18Mbps(非常に速い)
上り 96.89Mbps(かなり速い) 76.12Mbps(速い)
カテゴリー
OpenWrt PC

無料ルーターのOpenWrtで楽天ひかりIPv6接続

楽天モバイル加入者特典で楽天ひかりが1年間無料ていうのに釣られて、プロバイダーを楽天ひかりに変えてみた。
今のプロバイダーはIPv6接続が流行りということで、楽天ひかりもクロスパス接続でIPv6接続をするというサービスをやっている。
しかし、これにはルーターが対応してないと接続できず、家のルーターは対応してない機種だった。
ルーターを新たに買うというものためらわれたので、方策を探してみると、フリーのOpenWrtで対応できることが分かった。
ということで、新たにルーターを買わず、しかも仮想環境でルーターを動かすことにしてみた。

従来の環境

ルータを仮想化してみた環境

作成手順

openwrtのダウンロードとvmware形式の変換

wget https://downloads.openwrt.org/releases/19.07.7/targets/x86/64/openwrt-19.07.7-x86-64-combined-ext4.img.gz
gunzip openwrt-19.07.7-x86-64-combined-ext4.img.gz
qemu-img convert -f raw -O vmdk openwrt-19.07.7-x86-64-combined-ext4.img openwrt-19.07.7-x86-64-combined-ext4.vmdk

openwrt.vmxに追加する2行

ethernet0.virtualDev = "e1000"
ethernet1.virtualDev = "e1000"

AFTRアドレス

dgw.xpass.jp

動画にはないですが、さらにopenwrt で下記の設定をしました。
・ネットワーク→インターフェース→LAN→編集
DHCPサーバー→IPv6設定
ルーターアドバタイズメント-サービス:リレーモード
DHCPv6-サービス:リレーモード
NDP-プロキシ:リレーモード
保存

・WAN6インターフェースの設定追加
viとかで/etc/config/dhcpを編集、以下を追加

config dhcp 'wan6'
option interface 'wan6'
option dhcpv6 'relay'
option ra 'relay'
option ndp 'relay'
option master '1'

5chの接続先

104.18.231.0
104.18.232.0
104.18.233.0
104.18.234.0
104.18.235.0
カテゴリー
プログラム ゆっくりMovieMaker

ゆっくりムービーメーカー3の設定をスクリプトで変更

ymm3edit.wsf

カテゴリー
PC

ExcelとAviUtlでお手軽に横スクロール比較動画を作成する

動画内で使ったエクセルマクロ
Yokosukuimage