SQLの窓 イラストAC フリー素材

2019年06月28日

復活してました => ゾウフォントの配布元のサイトが閉鎖されたようです

2019/03/25 に ver2 で復活していました。

いろいろ事情があったようですが、良かったですね





アクセスすると、ロリポップのレンタルサーバの 404 エラーが表示されます。検索しても、他のサイトがみつかりませんし、インターネットアーカイブにもありませんでした。

元々、アーカイブには『002zou-Regular.otf』が入っていただけで、ライセンス等はサイトに記述されていたと記憶しています。
配布している素材やフォントは商用OK・著作者表記不要・無料でご利用いただけますが、著作権は放棄しておりません。再配布、素材の販売、画像の直リンク・公序良俗に反する利用はおやめください。本サイトの素材やフォントをDL・使用した場合に発生した事故や障害等は、一切責任を負いません。

利用報告やクレジット表記・リンク等は不要ではありますが、していただけるととてもうれしいです。
フォントファイルは所有していますが、再配布不可なのでどうにもなりませんね、残念です。
【フリーフォントで...の最新記事】
posted by at 2019-06-28 18:22 | フリーフォントで... | このブログの読者になる | 更新情報をチェックする

2019年06月27日

複数行のグループデータを1行にまとめるSQL

縦のデータを



case で行毎の表示列を作成する
select 
	コード

	,case 行 
		when 1 then 内容
		else null
	end as 内容1

	,case 行 
		when 2 then 内容
		else null
	end as 内容2

	,case 行 
		when 3 then 内容
		else null
	end as 内容3

 from data



後は、group と max で一つの行に
select 
	コード

	,max(case 行 
		when 1 then 内容
		else null
	end) as 内容1

	,max(case 行 
		when 2 then 内容
		else null
	end) as 内容2

	,max(case 行 
		when 3 then 内容
		else null
	end) as 内容3

 from data
 group by コード





CREATE TABLE `data` (
  `コード` int(11) NOT NULL DEFAULT '0',
  `行` int(11) NOT NULL DEFAULT '0',
  `内容` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`コード`,`行`)
)


MySQL でのサンプルですが、SQLServer、PostgreSQL、Oracle でも可能です。

各構文のサンプルはこちらから

※ 分解には、UNION を使います。



posted by at 2019-06-27 23:09 | DB関連 | このブログの読者になる | 更新情報をチェックする

C# の delegate : メソッドの引数にメソッドを渡して使用する方法と、JavaScript の function(){} と同じ使用方法( 匿名 )

要するに関数型の変数の宣言。

private delegate void func(string a);

で、func という型が定義されて、func a という変数 a は、『引数が string 型で、戻り値が無い』という定義がされているメソッドであればなんでも良いという事。

メソッドを代入された変数はそのメソッドの代用になり、そのままメソッドとして使用できるようになるが、変数なので、内容を変更もできるし(他のメソッドとして入れ替え可能)、引数にも使用できる。( もちろん最初のメソッド名も引数として渡せるが、変数では無いので中身を変更はできない )

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;

namespace WindowsFormsApplication1
{

    public partial class Form1 : Form
    {
        // ▼ 宣言
        private delegate void func(string a);

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {

            // ▼ 呼び出しタイプ1( 特定メソッド型変数にメソッド名を代入 )
            func _ptr = debug_string;
            button_action(_ptr);

            // ▼ 呼び出しタイプ2( 古い方法 )
            button_action(new func(debug_string));

            // ▼ 匿名処理1( ラムダ式 ) : button_action 内より呼び出される
            button_action((string a) => { Debug.WriteLine(a); });

            // ▼ 匿名処理2: button_action 内より呼び出される
            button_action(delegate(string a) { Debug.WriteLine(a); });
           
        }

        private void button_action(func ptr)
        {
            // 変数を使ってメソッドを呼び出す
            // ( 呼び出しタイプ1と2では debug_string が呼び出される )
            // ( 匿名処理1と2では そこに書いた別々のコードが呼び出される )
            ptr("デバッグを呼び出す");
        }

        private void debug_string(string a)
        {
            Debug.WriteLine(a);
        }
    }
}

※ 呼び出しタイプ2/匿名処理1/匿名処理2
方法 : デリゲートを宣言し、インスタンス化して使用する

リンク先によると、『new func(debug_string)』は一番古い書き方で、その次に『debug_string』というメソッド名を直接セットするようになっていますが、さらに『delegate』を使って匿名の処理をその場で書く事ができるようになっています。

そしてさらに最新の書き方が『ラムダ式』で、 (引数) => {処理;処理;} というような書き方が可能になっています。

ラムダ式 (C# プログラミング ガイド)


posted by at 2019-06-27 19:32 | C# | このブログの読者になる | 更新情報をチェックする

2019年04月05日

DF.exe ( テキストファイル差分表示 ) の設定

1) Terapad を外部エディタとして使用する
"インストールパス\TeraPad.exe" /j=%L "%P"



2) キャラクタセットの設定

Auto でうまくいかない時は固定で正しいキャラクタセットに変更します



ダウンロード( Vector )
Terapad ダウンロード( Vector )



中のウインドウ表示を空にして、比較したいファイルを順にウインドウへドラッグ&ドロップします(フォルダごと比較も可)





posted by at 2019-04-05 22:21 | フリーソフト | このブログの読者になる | 更新情報をチェックする

2019年02月11日

【VBS + Excel】シンプルな詳細設計書のフォーマット。1) Excel のダウンロード、2) VBScript で作成するサンプル

▼ B4 基本設計書セット


これは、Excle(2010) ブックをダウンロードします。
( ※ プログラム一覧、概要書、テーブル一覧、テーブル設計、画面設計、入力設計、出力設計 )

PDF サンプル 


▼ スクリプトによる詳細設計書作成

Microsoft Excel がインストールされている必要があります

Excel 2007 以降の場合、.xls で保存する形式として 97-2003 として保存するようにしています。VBScript のライブラリはWEB上にあり、それらを参照して実行しています

実行すると、ドキュメントフォルダに作成されます
作成されるのは、非常にシンプルな4種類の設計書フォーマットです。
1) 概要書
 処理を中心とした入出力をオートシェイプの
 フローチャートで示し、概要を記述して正確
 な入出力エントリ列挙します
2) 画面設計書
 最近では画面の画像をはりつける事がほとん
 どです
3) 入力設計書
 入力チェックを中心とした GUI の操作手順を
 ベースとしてアプリケーションの定義をして
 いきます。入力フィールドの属性も通常示さ
 れます
4) 出力設計書
 更新処理はここで記述されます。最近では、
 DBテーブルの更新仕様と考えて良いでしょう。
 但し例外として、印刷処理のフォーマット指示
 である事もあります
作成するのは、詳細設計書書式なのですが、もし、VBScript を書く事ができるのであれば、Excel にアクセスしている部分は WEB 上のライブラリですが、常に Hosting しているので利用していただいて結構です。

ライブラリそのものは、テキストとして Hosting しているので、都合上 UTF-8 で書かれています。以下からダウンロード可能です。

baseFunction.vbs
excelFunction.vbs

※ 以下は仕様を書き込んだ作成イメージです

<JOB>
<COMMENT>
************************************************************
 WSH 実行スケルトン
************************************************************
</COMMENT>

<COMMENT>
************************************************************
 外部スクリプト定義
************************************************************
</COMMENT>
<SCRIPT
	language="VBScript"
	src="http://lightbox.in.coocan.jp/laylaClass.vbs">
</SCRIPT>

<SCRIPT language=VBScript>
' ***********************************************************
' 処理開始
' ***********************************************************
Call laylaFunctionTarget( "http://lightbox.in.coocan.jp/" )
Call laylaLoadFunction( "baseFunction.vbs" )
Call laylaLoadFunction( "excelFunction.vbs" )

Crun

str = InputBox( MyDocDir & " に作成されるExcelブック名を指定します",, _
	"簡易詳細設計書フォーマット" )
if str = "" then
	Wscript.Quit
end if

strTarget = MyDocDir & "\" & str & ".xls"

Set MyBook = CreateBook( strTarget )
' Call ExcelVisible( True )

' ******************************************************
' 画面設計書フォーマット作成
' ******************************************************
strSheetName = "画面設計書"
Wscript.Echo strSheetName & " を作成しています"

Call AddSheetTop(MyBook, strSheetName)
Call ExcelSelectSheet(MyBook, strSheetName)
on error resume next
Call DeleteSheet( MyBook, "Sheet1" )
Call DeleteSheet( MyBook, "Sheet2" )
Call DeleteSheet( MyBook, "Sheet3" )
on error goto 0

Call Format_Page(MyBook)

Call ExcelSize_Disp(MyBook, strSheetName)
Call ExcelLine_Disp(MyBook, strSheetName)
Call ExcelSetText_Disp(MyBook, strSheetName)

' ******************************************************
' 概要書
' ******************************************************
strSheetName = "概要書"
Wscript.Echo strSheetName & " を作成しています"

Call AddSheetTop(MyBook, strSheetName)
Call ExcelSelectSheet(MyBook, strSheetName)
Call Format_Page(MyBook)
Call ExcelSize_Plan(MyBook, strSheetName)
Call ExcelLine_Plan(MyBook, strSheetName)
Call ExcelSetText_Plan(MyBook, strSheetName)

' ******************************************************
' 入力設計書
' ******************************************************
strSheetName = "入力設計書"
Wscript.Echo strSheetName & " を作成しています"

Call AddSheetLast(MyBook, strSheetName)
Call ExcelSelectSheet(MyBook, strSheetName)
Call Format_Page(MyBook)
Call ExcelSize_Plan(MyBook, strSheetName)
Call ExcelLine_Plan(MyBook, strSheetName)
Call ExcelSetText_Plan(MyBook, strSheetName)

' ******************************************************
' 出力設計書
' ******************************************************
strSheetName = "出力設計書"
Wscript.Echo strSheetName & " を作成しています"

Call AddSheetLast(MyBook, strSheetName)
Call ExcelSelectSheet(MyBook, strSheetName)
Call Format_Page(MyBook)
Call ExcelSize_Plan(MyBook, strSheetName)
Call ExcelLine_Plan(MyBook, strSheetName)
Call ExcelSetText_Plan(MyBook, strSheetName)


' ******************************************************
' 終了処理
' ******************************************************
Call ExcelSave( MyBook )
Call ExcelQuit( MyBook )
Call ExcelLoad( Dd(strTarget) )

' ******************************************************
' セルサイズの設定
' ******************************************************
Function ExcelSize_Disp(MyBook, Target)

	'セルの高さ合わせ
	Call ExcelSetRowHeight(MyBook, Target, 1, 13.50)
	Call ExcelSetRowHeight(MyBook, Target, 2, 24.50)
	Call ExcelSetRowHeight(MyBook, Target, 3, 13.50)
	Call ExcelSetRowHeight(MyBook, Target, 4, 24.50)

	For i = 5 To 25
		Call ExcelSetRowHeight(MyBook, Target, i, 24.75)
	Next

	For i = 26 To 38
		Call ExcelSetRowHeight(MyBook, Target, i, 19.00)
	Next

	'セルの幅合わせ
	Call ExcelSetColumnWidth(MyBook, Target, 1, 3.50)
	Call ExcelSetColumnWidth(MyBook, Target, 2, 22.38)
	Call ExcelSetColumnWidth(MyBook, Target, 3, 7.50)
	Call ExcelSetColumnWidth(MyBook, Target, 4, 6.00)
	Call ExcelSetColumnWidth(MyBook, Target, 5, 6.00)
	Call ExcelSetColumnWidth(MyBook, Target, 6, 11.50)
	Call ExcelSetColumnWidth(MyBook, Target, 7, 25.00)
	Call ExcelSetColumnWidth(MyBook, Target, 8, 12.00)

End Function

' ******************************************************
' 罫線の設定
' ******************************************************
Function ExcelLine_Disp(MyBook, Target)

	' BOX罫線
	Call ExcelRange(MyBook, Target, 1, 1, 8, 38 )
	Call ExcelBox(xlContinuous, xlMedium)

	' 上罫線
	Call ExcelRange(MyBook, Target, 1, 2, 8, 2 )
	Call ExcelLine(xlDot, xlThin)

	Call ExcelRange(MyBook, Target, 1, 3, 8, 3 )
	Call ExcelLine(xlContinuous, xlThin)

	Call ExcelRange(MyBook, Target, 1, 4, 8, 4 )
	Call ExcelLine(xlDot, xlThin)

	Call ExcelRange(MyBook, Target, 1, 5, 8, 5 )
	Call ExcelLine(xlContinuous, xlMedium)

	Call ExcelRange(MyBook, Target, 1, 26, 8, 26 )
	Call ExcelLine(xlContinuous, xlMedium)

	for i = 27 to 38
		Call ExcelRange(MyBook, Target, 1, i, 8, i )
		Call ExcelLine(xlDot, xlThin)
	Next

	' 右罫線
	Call ExcelRange(MyBook, Target, 2, 1, 2, 4 )
	Call ExcelLineRight(xlContinuous, xlThin)

	Call ExcelRange(MyBook, Target, 6, 1, 6, 4 )
	Call ExcelLineRight(xlContinuous, xlThin)

	Call ExcelRange(MyBook, Target, 7, 1, 7, 4 )
	Call ExcelLineRight(xlContinuous, xlThin)

End Function

' ******************************************************
' セルのテキストの設定
' ******************************************************
Function ExcelSetText_Disp(MyBook, Target)

	Call ExcelRange(MyBook, Target, 1, 1, 7, 49 )
	Call ExcelVAlign()

	' 1行目
	Call ExcelSetCell(MyBook, Target, 1, 1, " システム名")
	Call ExcelSetCell(MyBook, Target, 3, 1, " サブシステム名")
	Call ExcelSetCell(MyBook, Target, 7, 1, " プログラムID")
	Call ExcelSetCell(MyBook, Target, 8, 1, "ページ")
	Call ExcelRange(MyBook, Target, 8, 1, 8, 1 )
	Call ExcelHAlign()

	' 2行目
	Call ExcelSetCell(MyBook, Target, 8, 2, "/")
	Call ExcelRange(MyBook, Target, 8, 2, 8, 2 )
	Call ExcelHAlign()

	' 3行目
	Call ExcelSetCell(MyBook, Target, 1, 3, " 画面ID")
	Call ExcelSetCell(MyBook, Target, 3, 3, " 画面名")

	Call ExcelSetCell(MyBook, Target, 7, 3, "作成日")
	Call ExcelRange(MyBook, Target, 7, 3, 7, 3 )
	Call ExcelHAlign()

	Call ExcelSetCell(MyBook, Target, 8, 3, "作成者")
	Call ExcelRange(MyBook, Target, 8, 3, 8, 3 )
	Call ExcelHAlign()

	' 4行目
	Call ExcelRange(MyBook, Target, 7, 4, 7, 4 )
	Call ExcelHAlign()

	Call ExcelRange(MyBook, Target, 8, 4, 8, 4 )
	Call ExcelHAlign()

End Function

' ******************************************************
' セルサイズの設定
' ******************************************************
Function ExcelSize_Plan(MyBook, Target)

	if Target = "概要書" then

		'セルの高さ合わせ
		Call ExcelSetRowHeight(MyBook, Target, 1, 13.50)
		Call ExcelSetRowHeight(MyBook, Target, 2, 24.50)
		Call ExcelSetRowHeight(MyBook, Target, 3, 13.50)
		Call ExcelSetRowHeight(MyBook, Target, 4, 24.50)
		Call ExcelSetRowHeight(MyBook, Target, 5, 24.50)
		Call ExcelSetRowHeight(MyBook, Target, 34, 20.25)

		For i = 6 To 49
			if 6 <= i AND i <= 33then
				Call ExcelSetRowHeight(MyBook, Target, i, 13.50)
			elseif 35 <=  i AND i  <= 44 then
				Call ExcelSetRowHeight(MyBook, Target, i, 24.50)
			elseif 45 <=  i AND i  <= 49 then
				Call ExcelSetRowHeight(MyBook, Target, i, 18.50)
			end if
		Next

		'セルの幅合わせ
		Call ExcelSetColumnWidth(MyBook, Target, 1, 3.50)
		Call ExcelSetColumnWidth(MyBook, Target, 2, 22.38)
		Call ExcelSetColumnWidth(MyBook, Target, 3, 12.38)
		Call ExcelSetColumnWidth(MyBook, Target, 4, 8.25)
		Call ExcelSetColumnWidth(MyBook, Target, 5, 11.50)
		Call ExcelSetColumnWidth(MyBook, Target, 6, 25.00)
		Call ExcelSetColumnWidth(MyBook, Target, 7, 12.00)

	elseif Target = "入力設計書" then

		'セルの高さ合わせ
		Call ExcelSetRowHeight(MyBook, Target, 1, 13.50)
		Call ExcelSetRowHeight(MyBook, Target, 2, 24.50)
		Call ExcelSetRowHeight(MyBook, Target, 3, 13.50)
		Call ExcelSetRowHeight(MyBook, Target, 4, 24.50)
		Call ExcelSetRowHeight(MyBook, Target, 5, 20.25)

		For i = 6 To 38
			if 6 <= i AND i <= 25then
				Call ExcelSetRowHeight(MyBook, Target, i, 24.75)
			elseif 26 <=  i AND i  <= 38 then
				Call ExcelSetRowHeight(MyBook, Target, i, 19.00)
			end if
		Next

		'セルの幅合わせ
		Call ExcelSetColumnWidth(MyBook, Target, 1, 3.50)
		Call ExcelSetColumnWidth(MyBook, Target, 2, 22.38)
		Call ExcelSetColumnWidth(MyBook, Target, 3, 7.50)
		Call ExcelSetColumnWidth(MyBook, Target, 4, 6.00)
		Call ExcelSetColumnWidth(MyBook, Target, 5, 6.00)
		Call ExcelSetColumnWidth(MyBook, Target, 6, 11.50)
		Call ExcelSetColumnWidth(MyBook, Target, 7, 25.00)
		Call ExcelSetColumnWidth(MyBook, Target, 8, 12.00)

	elseif Target = "出力設計書" then

		'セルの高さ合わせ
		Call ExcelSetRowHeight(MyBook, Target, 1, 13.50)
		Call ExcelSetRowHeight(MyBook, Target, 2, 24.50)
		Call ExcelSetRowHeight(MyBook, Target, 3, 13.50)
		Call ExcelSetRowHeight(MyBook, Target, 4, 24.50)
		Call ExcelSetRowHeight(MyBook, Target, 5, 20.25)

		For i = 6 To 38
			if 6 <= i AND i <= 25then
				Call ExcelSetRowHeight(MyBook, Target, i, 24.75)
			elseif 26 <=  i AND i  <= 38 then
				Call ExcelSetRowHeight(MyBook, Target, i, 19.00)
			end if
		Next

		'セルの幅合わせ
		Call ExcelSetColumnWidth(MyBook, Target, 1, 3.50)
		Call ExcelSetColumnWidth(MyBook, Target, 2, 22.38)
		Call ExcelSetColumnWidth(MyBook, Target, 3, 7.50)
		Call ExcelSetColumnWidth(MyBook, Target, 4, 6.00)
		Call ExcelSetColumnWidth(MyBook, Target, 5, 6.00)
		Call ExcelSetColumnWidth(MyBook, Target, 6, 11.50)
		Call ExcelSetColumnWidth(MyBook, Target, 7, 25.00)
		Call ExcelSetColumnWidth(MyBook, Target, 8, 12.00)

	end if

End Function

' ******************************************************
' 罫線の設定
' ******************************************************
Function ExcelLine_Plan(MyBook, Target)

	if Target = "概要書" then
		' BOX罫線
		Call ExcelRange(MyBook, Target, 1, 1, 7, 49 )
		Call ExcelBox(xlContinuous, xlMedium)

		' 上罫線
		Call ExcelRange(MyBook, Target, 1, 2, 7, 2 )
		Call ExcelLine(xlDot, xlThin)

		Call ExcelRange(MyBook, Target, 1, 3, 7, 3 )
		Call ExcelLine(xlContinuous, xlThin)

		Call ExcelRange(MyBook, Target, 1, 4, 7, 4 )
		Call ExcelLine(xlDot, xlThin)

		Call ExcelRange(MyBook, Target, 1, 5, 7, 5 )
		Call ExcelLine(xlContinuous, xlThin)

		Call ExcelRange(MyBook, Target, 5, 6, 7, 6 )
		Call ExcelLine(xlContinuous, xlThin)

		Call ExcelRange(MyBook, Target, 1, 34, 7, 34 )
		Call ExcelLine(xlContinuous, xlMedium)

		Call ExcelRange(MyBook, Target, 1, 35, 7, 35 )
		Call ExcelLine(xlContinuous, xlMedium)

		for i = 36 to 44
			' 線種→点線, 太さ→標準
			Call ExcelRange(MyBook, Target, 1, i, 7, i )
			Call ExcelLine(xlDot, xlThin)
		Next

		Call ExcelRange(MyBook, Target, 1, 45, 7, 45 )
		Call ExcelLine(xlContinuous, xlMedium)

		for i = 46 to 49
			' 線種→点線, 太さ→標準
			Call ExcelRange(MyBook, Target, 1, i, 7, i )
			Call ExcelLine(xlDot, xlThin)
		Next

		' 右罫線
		Call ExcelRange(MyBook, Target, 1, 35, 1, 44 )
		Call ExcelLineRight(xlDot, xlThin)

		Call ExcelRange(MyBook, Target, 4, 3, 4, 33 )
		Call ExcelLineRight(xlContinuous, xlThin)

		Call ExcelRange(MyBook, Target, 5, 1, 5, 4 )
		Call ExcelLineRight(xlContinuous, xlThin)

		Call ExcelRange(MyBook, Target, 6, 1, 6, 4 )
		Call ExcelLineRight(xlContinuous, xlThin)

		Call ExcelRange(MyBook, Target, 2, 34, 2, 44 )
		Call ExcelLineRight(xlContinuous, xlThin)

		Call ExcelRange(MyBook, Target, 3, 34, 3, 44 )
		Call ExcelLineRight(xlContinuous, xlThin)

	elseif Target = "入力設計書" then

		' BOX罫線
		Call ExcelRange(MyBook, Target, 1, 1, 8, 38 )
		Call ExcelBox(xlContinuous, xlMedium)

		' 上罫線
		Call ExcelRange(MyBook, Target, 1, 2, 8, 2 )
		Call ExcelLine(xlDot, xlThin)

		Call ExcelRange(MyBook, Target, 1, 3, 8, 3 )
		Call ExcelLine(xlContinuous, xlThin)

		Call ExcelRange(MyBook, Target, 1, 4, 8, 4 )
		Call ExcelLine(xlDot, xlThin)

		Call ExcelRange(MyBook, Target, 1, 5, 8, 5 )
		Call ExcelLine(xlContinuous, xlMedium)

		Call ExcelRange(MyBook, Target, 1, 6, 8, 6 )
		Call ExcelLine(xlContinuous, xlMedium)

		for i = 7 to 25
			Call ExcelRange(MyBook, Target, 1, i, 8, i )
			Call ExcelLine(xlDot, xlThin)
		Next

		Call ExcelRange(MyBook, Target, 1, 26, 8, 26 )
		Call ExcelLine(xlContinuous, xlMedium)

		for i = 27 to 38
			Call ExcelRange(MyBook, Target, 1, i, 8, i )
			Call ExcelLine(xlDot, xlThin)
		Next

		' 右罫線
		Call ExcelRange(MyBook, Target, 1, 6, 1, 25 )
		Call ExcelLineRight(xlDot, xlThin)

		Call ExcelRange(MyBook, Target, 2, 1, 2, 2 )
		Call ExcelLineRight(1, 2)

		Call ExcelRange(MyBook, Target, 2, 5, 2, 25 )
		Call ExcelLineRight(1, 2)

		Call ExcelRange(MyBook, Target, 3, 5, 3, 25 )
		Call ExcelLineRight(1, 2)

		Call ExcelRange(MyBook, Target, 4, 5, 4, 25 )
		Call ExcelLineRight(1, 2)

		Call ExcelRange(MyBook, Target, 5, 3, 5, 25 )
		Call ExcelLineRight(1, 2)

		Call ExcelRange(MyBook, Target, 6, 1, 6, 25 )
		Call ExcelLineRight(1, 2)

		Call ExcelRange(MyBook, Target, 7, 1, 7, 4 )
		Call ExcelLineRight(1, 2)

	elseif Target = "出力設計書" then

		' BOX罫線
		Call ExcelRange(MyBook, Target, 1, 1, 8, 38 )
		Call ExcelBox(xlContinuous, xlMedium)

		' 上罫線
		Call ExcelRange(MyBook, Target, 1, 2, 8, 2 )
		Call ExcelLine(xlDot, xlThin)

		Call ExcelRange(MyBook, Target, 1, 3, 8, 3 )
		Call ExcelLine(xlContinuous, xlThin)

		Call ExcelRange(MyBook, Target, 1, 4, 8, 4 )
		Call ExcelLine(xlDot, xlThin)

		Call ExcelRange(MyBook, Target, 1, 5, 8, 5 )
		Call ExcelLine(xlContinuous, xlMedium)

		Call ExcelRange(MyBook, Target, 1, 6, 8, 6 )
		Call ExcelLine(xlContinuous, xlMedium)

		for i = 7 to 25
			Call ExcelRange(MyBook, Target, 1, i, 8, i )
			Call ExcelLine(xlDot, xlThin)
		Next

		Call ExcelRange(MyBook, Target, 1, 26, 8, 26 )
		Call ExcelLine(xlContinuous, xlMedium)

		for i = 27 to 38
			Call ExcelRange(MyBook, Target, 1, i, 8, i )
			Call ExcelLine(xlDot, xlThin)
		Next

		' 右罫線
		Call ExcelRange(MyBook, Target, 1, 6, 1, 25 )
		Call ExcelLineRight(xlDot, xlThin)

		Call ExcelRange(MyBook, Target, 2, 1, 2, 2 )
		Call ExcelLineRight(xlContinuous, xlThin)

		Call ExcelRange(MyBook, Target, 2, 5, 2, 25 )
		Call ExcelLineRight(xlContinuous, xlThin)

		Call ExcelRange(MyBook, Target, 5, 3, 5, 4 )
		Call ExcelLineRight(xlContinuous, xlThin)

		Call ExcelRange(MyBook, Target, 6, 1, 6, 4 )
		Call ExcelLineRight(xlContinuous, xlThin)

		Call ExcelRange(MyBook, Target, 7, 1, 7, 25 )
		Call ExcelLineRight(xlContinuous, xlThin)
	end if

End Function

' ******************************************************
' セルのテキストの設定
' ******************************************************
Function ExcelSetText_Plan(MyBook, Target)

	if Target = "概要書" then

		Call ExcelRange(MyBook, Target, 1, 1, 7, 49 )
		Call ExcelVAlign()

		Call ExcelSetCell(MyBook, Target, 1, 1, " システム名")
		Call ExcelSetCell(MyBook, Target, 3, 1, " サブシステム名")
		Call ExcelSetCell(MyBook, Target, 6, 1, " プログラムID")
		Call ExcelSetCell(MyBook, Target, 1, 3, " プログラム名")
		Call ExcelSetCell(MyBook, Target, 1, 34, " テーブル名")

		Call ExcelSetCell(MyBook, Target, 7, 1, "ページ")
		Call ExcelRange(MyBook, Target, 7, 1, 7, 1 )
		Call ExcelHAlign()

		Call ExcelSetCell(MyBook, Target, 7, 2, "/")
		Call ExcelRange(MyBook, Target, 7, 2, 7, 2 )
		Call ExcelHAlign()

		Call ExcelSetCell(MyBook, Target, 5, 3, "種別")
		Call ExcelRange(MyBook, Target, 5, 3, 5, 3 )
		Call ExcelHAlign()

		Call ExcelSetCell(MyBook, Target, 6, 3, "作成日")
		Call ExcelRange(MyBook, Target, 6, 3, 6, 3 )
		Call ExcelHAlign()

		Call ExcelSetCell(MyBook, Target, 7, 3, "作成者")
		Call ExcelRange(MyBook, Target, 7, 3, 7, 3 )
		Call ExcelHAlign()

		Call ExcelSetCell(MyBook, Target, 5, 5, "処理概要")
		Call ExcelRange(MyBook, Target, 5, 5, 7, 5 )
		Call ExcelHAlign()

		Call ExcelSetCell(MyBook, Target, 3, 34, "入出力")
		Call ExcelRange(MyBook, Target, 3, 34, 3, 34 )
		Call ExcelHAlign()

		Call ExcelSetCell(MyBook, Target, 4, 34, "備考")
		Call ExcelRange(MyBook, Target, 4, 34, 7, 34 )
		Call ExcelHAlign()

		for i = 35 to 44
			Call ExcelSetCell(MyBook, Target, 1, i, i - 34)
			Call ExcelRange(MyBook, Target, 1, i, 1, i )

			' 配置
			Call ExcelHAlign()
			' 書式設定
			Call ExcelSetFont("太字", 12)
		next

	elseif Target = "入力設計書" then

		Call ExcelRange(MyBook, Target, 1, 1, 8, 38 )
		Call ExcelVAlign()

		Call ExcelSetCell(MyBook, Target, 1, 1, " システム名")

		Call ExcelSetCell(MyBook, Target, 3, 1, " サブシステム名")

		Call ExcelSetCell(MyBook, Target, 7, 1, " プログラムID")

		Call ExcelSetCell(MyBook, Target, 8, 1, "ページ")
		Call ExcelRange(MyBook, Target, 8, 1, 8, 1 )
		Call ExcelHAlign()

		Call ExcelSetCell(MyBook, Target, 8, 2, "/")
		Call ExcelRange(MyBook, Target, 8, 2, 8, 2 )
		Call ExcelHAlign()

		Call ExcelSetCell(MyBook, Target, 1, 3, " プログラム名")

		Call ExcelSetCell(MyBook, Target, 6, 3, "種別")
		Call ExcelRange(MyBook, Target, 6, 3, 6, 4 )
		Call ExcelHAlign()

		Call ExcelSetCell(MyBook, Target, 7, 3, "作成日")
		Call ExcelRange(MyBook, Target, 7, 3, 7, 4 )
		Call ExcelHAlign()

		Call ExcelSetCell(MyBook, Target, 8, 3, "作成者")
		Call ExcelRange(MyBook, Target, 8, 3, 8, 4 )
		Call ExcelHAlign()

		Call ExcelSetCell(MyBook, Target, 1, 5, " 項目名")

		Call ExcelSetCell(MyBook, Target, 3, 5, "型式")
		Call ExcelRange(MyBook, Target, 3, 5, 3, 5 )
		Call ExcelHAlign()

		Call ExcelSetCell(MyBook, Target, 4, 5, "桁数")
		Call ExcelRange(MyBook, Target, 4, 5, 4, 5 )
		Call ExcelHAlign()

		Call ExcelSetCell(MyBook, Target, 5, 5, "I/O")
		Call ExcelRange(MyBook, Target, 5, 5, 5, 5 )
		Call ExcelHAlign()

		Call ExcelSetCell(MyBook, Target, 6, 5, "種別")
		Call ExcelRange(MyBook, Target, 6, 5, 6, 5 )
		Call ExcelHAlign()

		For i = 6 to 25
			Call ExcelSetCell(MyBook, Target, 1, i, i - 5 )
			Call ExcelRange(MyBook, Target, 1, i, 1, i )
			Call ExcelHAlign()
		Next

	elseif Target = "出力設計書" then

		Call ExcelRange(MyBook, Target, 1, 1, 8, 38 )
		Call ExcelVAlign()

		Call ExcelSetCell(MyBook, Target, 1, 1, " システム名")

		Call ExcelSetCell(MyBook, Target, 3, 1, " サブシステム名")

		Call ExcelSetCell(MyBook, Target, 7, 1, " プログラムID")

		Call ExcelSetCell(MyBook, Target, 8, 1, "ページ")
		Call ExcelRange(MyBook, Target, 8, 1, 8, 1 )
		Call ExcelHAlign()

		Call ExcelSetCell(MyBook, Target, 8, 2, "/")
		Call ExcelRange(MyBook, Target, 8, 2, 8, 2 )
		Call ExcelHAlign()

		Call ExcelSetCell(MyBook, Target, 1, 3, " プログラム名")

		Call ExcelSetCell(MyBook, Target, 6, 3, "種別")
		Call ExcelRange(MyBook, Target, 6, 3, 6, 4 )
		Call ExcelHAlign()

		Call ExcelSetCell(MyBook, Target, 7, 3, "作成日")
		Call ExcelRange(MyBook, Target, 7, 3, 7, 4 )
		Call ExcelHAlign()

		Call ExcelSetCell(MyBook, Target, 8, 3, "作成者")
		Call ExcelRange(MyBook, Target, 8, 3, 8, 4 )
		Call ExcelHAlign()

		Call ExcelSetCell(MyBook, Target, 1, 5, " 列名")

		Call ExcelSetCell(MyBook, Target, 3, 5, " 更新説明")

		Call ExcelSetCell(MyBook, Target, 8, 5, "対象")
		Call ExcelRange(MyBook, Target, 8, 5, 8, 5 )
		Call ExcelHAlign()

		For i = 6 to 25
			Call ExcelSetCell(MyBook, Target, 1, i, i - 5 )
			Call ExcelRange(MyBook, Target, 1, i, 1, i )
			Call ExcelHAlign()
		Next

	end if

End Function

' ******************************************************
' ヘッダー,余白の指定
' ******************************************************
Function Format_Page(MyBook)

	on error resume next
	With MyBook.ActiveSheet.PageSetup
		.CenterHeader = "&18&A"
		.LeftMargin = ExcelApp.InchesToPoints(0.393700787401575)
		.RightMargin = ExcelApp.InchesToPoints(0.196850393700787)
		.TopMargin = ExcelApp.InchesToPoints(0.551181102362205)
		.BottomMargin = ExcelApp.InchesToPoints(0.393700787401575)
		.HeaderMargin = ExcelApp.InchesToPoints(0.196850393700787)
		.FooterMargin = ExcelApp.InchesToPoints(0.196850393700787)
	End With
	on error goto 0

End Function
</SCRIPT>
</JOB>




posted by at 2019-02-11 10:45 | VBScript | このブログの読者になる | 更新情報をチェックする

テーブル設計書作成 : VBScript + Excel.Application + SQLServer

『作成される Excel ブック』のコメントの下で、table_spec_ss.xlsx となっていますが、拡張子を .xls で作成するには Call CreateBook.SaveAs( BookPath ) を Call CreateBook.SaveAs( BookPath, 56 ) に変更する必要があります

※ 実行はコマンドプロンプトから、cscript table-spec.wsf として下さい。
※ Excel でテーブル設計書を作成する部分は他のデータベースでも可能ですが、それ用の SQL を考える必要があります。

関連する記事

VBScript : Excel の新しいBookを作成する
SQLExpress 2005( および 2008 ) の接続設定

1) 対象テーブルリストにテーブル名を列挙する
<RESOURCE id="TableList">
 
社員マスタ
商品マスタ
 
</RESOURCE>

2) table_spec_ss.xls が作成される Excel ブックです
   実行毎に上書きされるので注意して下さい

3) 作成される場所は、このスクリプトが置かれているディレクトリです

4) データベース接続情報には、自分の環境を記述してください
' **********************************************************
' データベース接続情報
' **********************************************************
strSERVER = ".\sqlexpress"
strDATABASE = "lightbox"
strUSER = "sa"
strPASS = "password"

5) Excel に対する処理経過を見たい場合は
   ExcelApp.Visible = True にして下さい

6) strSystemName を変更してタイトルの「システム名」を変更

7) strSubName を変更してタイトルの「サブシステム名」を変更

8) xlPaperB4 は B4 フォーマットです
table-spec.wsf
<JOB>
<RUNTIME>
<DESCRIPTION>
*******************************************************************
 プログラム名 : SQLServer 用表情報のレポート (複数実行)
*******************************************************************
</DESCRIPTION>
<EXAMPLE>

引数無し
</EXAMPLE>
</RUNTIME>

<COMMENT>
************************************************************
 対象テーブルリスト
************************************************************
</COMMENT>
<RESOURCE id="TableList">

社員マスタ
商品マスタ

</RESOURCE>

<COMMENT>
************************************************************
 オブジェクト定義
************************************************************
</COMMENT>
<REFERENCE object="ADODB.Connection" />
<OBJECT id="Cn" progid="ADODB.Connection" />
<OBJECT id="Rs" progid="ADODB.Recordset" />
<OBJECT id="ExcelApp" progid="Excel.Application" />
<OBJECT id="WshShell" progid="WScript.Shell" />
<OBJECT id="Fso" progid="Scripting.FileSystemObject" />

<COMMENT>
************************************************************
 外部スクリプト定義
************************************************************
</COMMENT>

<COMMENT>
************************************************************
 カレントスクリプト
************************************************************
</COMMENT>

<SCRIPT language=VBScript>

Dim str,strMessage,Target,strCurDir

' **********************************************************
' 作成される Excel ブック
' **********************************************************
Target = "table_spec_ss.xlsx"
strCurDir = WScript.ScriptFullName
strCurDir = Replace( strCurDir, WScript.ScriptName, "" )
Target = strCurDir & Target

Dim strSERVER,strDATABASE,strUSER,strPASS

' **********************************************************
' データベース接続情報
' **********************************************************
strSERVER = ".\sqlexpress"
strDATABASE = "lightbox"
strUSER = "sa"
strPASS = "password"

' **********************************************************
' コマンドプロンプトより起動される為の処理
' **********************************************************
str = WScript.FullName
str = Right( str, 11 )
str = Ucase( str )
if str <> "CSCRIPT.EXE" then
	strMessage = "コマンドプロンプトより cscript " & WScript.ScriptFullName
	strMessage = strMessage & " と指定して実行して下さい   " & vbCrLf & vbCrLf
	strMessage = strMessage & "( この文字列をクリップボードにコピーしたい場合は"
	strMessage = strMessage & " ctrl+c です )"
	WScript.Echo strMessage
	WScript.Quit
end if

' **********************************************************
' Excel 用定数
' **********************************************************
' https://docs.microsoft.com/ja-jp/dotnet/api/microsoft.office.interop.excel.xlpapersize?view=excel-pia
Const xlPaperB4 = 12

Const xlContinuous = 1
Const xlDash = -4115
Const xlDashDot = 4
Const xlDashDotDot = 5
Const xlDot = -4118
Const xlDouble = -4119
Const xlSlantDashDot = 13
Const xlLineStyleNone = -4142

Const xlHairline = 1
Const xlMedium = -4138
Const xlThick = 4
Const xlThin = 2

Const xlInsideHorizontal = 12
Const xlInsideVertical = 11
Const xlDiagonalDown = 5
Const xlDiagonalUp = 6
Const xlEdgeBottom = 9
Const xlEdgeLeft = 7
Const xlEdgeRight = 10
Const xlEdgeTop = 8

Const xlAutomatic = -4105

Const xlMaximized = -4137
Const xlMinimized = -4140
Const xlNormal = -4143

Const xlGeneral = 1
Const xlLeft = -4131
Const xlCenter = -4108
Const xlRight = -4152
Const xlFill = 5
Const xlJustify = -4130
Const xlCenterAcrossSelection = 7
Const xlDistributed = -4117
Const xlTop = -4160
Const xlBottom = -4107

Dim aTable,Result,Query,Query2,nCnt,strCol,aCol,nRows,nRowHeight
Dim MyBook,bAction,strSystemName,strSubName
Dim nColX,nColY,strSheetName,strBaseSheet
Dim aData

ExcelApp.Visible = False
strBaseSheet = "テーブル設計雛形"
strSystemName = "販売管理システム"
strSubName = "売上管理"
Query = "sp_columns "

' **********************************************************
' Excel 初期処理
' **********************************************************
aTable = Split( getResource("TableList"), vbCrLf )

' **********************************************************
' ブック作成
' **********************************************************
Set MyBook = CreateBook(Target)
if not IsObject( MyBook ) then
	' 初期処理エラーの為、直接終了
	ExcelApp.Quit
	' エラーメッセージの表示
	Wscript.Echo MyBook
	Wscript.Quit
end if

' **********************************************************
' DB 接続
' **********************************************************
Result = SQS_DBConnect( Cn, strSERVER, strDATABASE, strUSER, strPASS )
if Result <> "" then
	Wscript.Echo Result
	Wscript.Quit
end if

' **********************************************************
' 読み出し
' **********************************************************
Wscript.Echo "処理を開始しました。しばらくお待ち下さい"
bAction = False
For i = 0 to Ubound( aTable )
	if Trim( aTable(i) ) <> "" then
		if DBGet( Cn, Rs, Query & Ss( aTable(i) ), False ) then
			' ************************************************
			' Excel 処理
			' ************************************************
			nColX = 2
			nColY = 6
			if not bAction then
				bAction = True
				Call AddSheetLast( MyBook, strBaseSheet )
				Call DeleteSheet(MyBook,"Sheet1" )
				Call ColumnInit(MyBook,strBaseSheet)
				Wscript.Echo strBaseSheet & " を追加しました"
			end if
			strSheetName = ExcelCopySheet( MyBook, strBaseSheet, aTable(i) )
			strSaveSheetName = strSheetName
			Call ExcelSetCell(MyBook, strSheetName, 2, 2, strSystemName )
			Call ExcelSetCell(MyBook, strSheetName, 4, 2, strSubName )
			Call ExcelSetCell(MyBook, strSheetName, 10, 2, aTable(i) )
			Call ExcelSetCell(MyBook, strSheetName, 2, 4, aTable(i) )

			nCnt = 1
			nRowCnt = 1
			nSheetCount = 1
			Redim aData(0)
			Do While not Rs.EOF
				Redim Preserve aData(nCnt)
				aData(nCnt) = Rs.Fields("COLUMN_NAME").value & ""
				' ************************************************
				' Excel 処理
				' ************************************************
				Call ExcelSetCell(MyBook, strSheetName, nColX, nColY, Rs.Fields("COLUMN_NAME").value & "")
				Call ExcelSetCell(MyBook, strSheetName, nColX+2, nColY, Ucase(Rs.Fields("TYPE_NAME").value & "") )
				if Ucase( Rs.Fields("TYPE_NAME").value & "" ) = "VARCHAR" or _
					Ucase( Rs.Fields("TYPE_NAME").value & "" ) = "CHAR" or _
					Ucase( Rs.Fields("TYPE_NAME").value & "" ) = "NVARCHAR"or _ 
					Ucase( Rs.Fields("TYPE_NAME").value & "" ) = "NCHAR" then
					Call ExcelSetCell(MyBook, strSheetName, nColX+3, nColY, Rs.Fields("PRECISION").value & "")
				end if
				if Ucase( Rs.Fields("TYPE_NAME").value & "" ) = "DECIMAL" then
					Call ExcelSetCell(MyBook, strSheetName, nColX+3, nColY, Rs.Fields("PRECISION") & "")
					Call ExcelSetCell(MyBook, strSheetName, nColX+4, nColY, Rs.Fields("SCALE").value & "")
				end if
				nColY = nColY + 1

				Rs.MoveNext
				nCnt = nCnt + 1
				nRowCnt = nRowCnt + 1
				if nRowCnt > 65 then
					nRowCnt = 1
					nColX = 2
					nColY = 6
					nSheetCount = nSheetCount + 1
					strSheetName = ExcelCopySheet( MyBook, strBaseSheet, aTable(i) & "(" & nSheetCount & ")" )
					Call ExcelSetCell(MyBook, strSheetName, 2, 4, aTable(i) )
				end if
			Loop
			strSheetName = strSaveSheetName

			Result = ""
			Query2 = "sp_helpindex "
			if DBGet( Cn, Rs, Query2 & Ss( aTable(i) ), False ) then
				Do While not Rs.EOF
					if Left( Rs.Fields("index_name").value & "", 1 ) <> "_" then
						if InStr( Rs.Fields("index_description").value & "" , "primary key" ) > 0 then

							nCnt = 1
							strCol = Rs.Fields("index_keys").value & ""
							aCol = Split( strCol, ", " )

							For j = 0 to Ubound( aCol )
								For k = 1 to Ubound( aData )
									if aCol( j ) = aData( k ) then
										Call ExcelSetCell(MyBook, strSheetName, 11, 5 + k, j + 1 )
									end if
								Next
							Next

							Exit Do

						end if

					end if
					Rs.MoveNext
				Loop
			end if

			Wscript.Echo strSheetName & " を追加しました"
		end if
	end if

Next


' **********************************************************
' 接続解除
' **********************************************************
Call DBClose( Rs )
Call DBClose( Cn )

' **********************************************************
' 処理終了
' **********************************************************
Call ExcelSave(MyBook)
Call ExcelQuit(MyBook)

Wscript.Echo "処理が完了しました"

Call ExcelLoad(Target)


' **********************************************************
' Excel 出力用 初期処理
' **********************************************************
Function ColumnInit(MyBook,SheetName)

	' 行数
	nRows = 65
	nRowHeight = 13.5

	Call Format_Table(MyBook,SheetName)
	Call Format_Page(MyBook)

End Function

' **********************************************************
' Excel 処理関数
' **********************************************************
' ******************************************************
' シート名によるシート複写
' ******************************************************
Function ExcelCopySheet(MyBook, strSheetName, strNewSheetName)

	MyBook.Sheets(strSheetName).Copy (MyBook.Sheets(strSheetName))

	on error resume next
	MyBook.ActiveSheet.Name = strNewSheetName
	on error goto 0

	ExcelCopySheet = MyBook.ActiveSheet.Name

End Function

' ************************************************
' Excel ブック作成
' ************************************************
function CreateBook(BookPath)

	ExcelApp.DisplayAlerts = False

	ExcelApp.Workbooks.Add
	nBooks = ExcelApp.Workbooks.Count
	Set CreateBook = ExcelApp.Workbooks( nBooks )
	CreateBook.Activate

	on error resume next
	Call CreateBook.SaveAs( BookPath )
	if Err.Number <> 0 then
		CreateBook = "ERROR:" & Err.Description
	end if
	on error goto 0

End Function

' ******************************************************
' 終了
' ******************************************************
Function ExcelQuit(WorkBook)

	If TypeName(WorkBook) = "Workbook" Then
		' 保存した事にする
		WorkBook.Saved = True
	End If
	If IsObject(ExcelApp) Then
		ExcelApp.Quit
	End If

End Function

' ******************************************************
' セルへのデータセット
' ******************************************************
Function ExcelSetCell(MyBook, strSheetName, x, y, Data)

	MyBook.Sheets(strSheetName).Cells(y, x) = Data

End Function

' ******************************************************
' 先頭にシートを追加
' ******************************************************
function AddSheetTop( MyBook, SheetName )

	Dim Worksheet
	Dim Worksheet2

	Set Worksheet = MyBook.Worksheets( 1 )
	Worksheet.Activate
	Workbook.Worksheets.Add
	Set Worksheet2 = Workbook.ActiveSheet
	on error resume next
	Worksheet2.Name = SheetName
	on error goto 0

	AddSheetTop = Worksheet2.Name

end function

' ******************************************************
' 最後にシートを追加
' ******************************************************
function AddSheetLast( MyBook, SheetName )

	Dim Worksheet
	Dim Worksheet2
	Dim nSheets

	nSheets = MyBook.Worksheets.Count
	Set Worksheet = MyBook.Worksheets( nSheets )
	Worksheet.Activate
	Call MyBook.Worksheets.Add(,Worksheet)
	Set Worksheet2 = MyBook.ActiveSheet
	on error resume next
	Worksheet2.Name = SheetName
	on error goto 0

	AddSheetLast = Worksheet2.Name

end function

' ******************************************************
' Excel 実行 ( NT5.0 以上 )
' ******************************************************
Function ExcelLoad(strPath)

	Call WshShell.Run( "RunDLL32.EXE shell32.dll,ShellExec_RunDLL " & _
		strPath )

End Function

' ******************************************************
' 上書き保存
' ******************************************************
Function ExcelSave(MyBook)

	MyBook.Save

End Function

' ******************************************************
' シートを削除
' ******************************************************
function DeleteSheet( MyBook, SheetName )

	Dim Worksheet

	Set Worksheet = MyBook.Worksheets( SheetName )

	on error resume next
	Worksheet.Delete
	on error goto 0

end function

' ******************************************************
' 指定行の高さを設定
' ******************************************************
Function ExcelSetRowHeight(MyBook, strSheetName, row, Height)

	MyBook.Sheets(strSheetName).Rows(row).RowHeight = _
	Height

End Function

' ******************************************************
' 指定列の幅を設定
' ******************************************************
Function ExcelSetColumnWidth(MyBook, strSheetName, column, Width)

	Dim strColumn

	strColumn = Chr(Asc("A") + column - 1)

	MyBook.Sheets(strSheetName).Columns(strColumn).ColumnWidth = _
	Width

End Function

' ******************************************************
' 範囲選択
' ******************************************************
Function ExcelRange(MyBook, strSheetName, nX1, nY1, nX2, nY2 )

	Dim Sheet,strRange

	Set Sheet = MyBook.Sheets(strSheetName)
	Sheet.Select
	strRange = Chr(Asc("A") + nX1 - 1) & nY1 & ":"
	strRange = strRange & Chr(Asc("A") + nX2 - 1) & nY2
	Sheet.Range(strRange).Select

End Function

' ******************************************************
' 範囲の上に罫線
' ******************************************************
Function ExcelLine( nLineType, nWeight )

	With ExcelApp.Selection.Borders(xlEdgeTop)
		.LineStyle = nLineType
		.ColorIndex = xlAutomatic
		.Weight = nWeight
	End With

End Function

' ******************************************************
' 範囲の右に罫線(*追加*)
' ******************************************************
Function ExcelLineRight( nLineType, nWeight )

	With ExcelApp.Selection.Borders(xlEdgeRight)
		.LineStyle = nLineType
		.ColorIndex = xlAutomatic
		.Weight = nWeight
	End With

End Function

' ******************************************************
' 範囲に罫線
' ******************************************************
Function ExcelBox( nLineType, nWeight )

	With ExcelApp.Selection.Borders(xlEdgeTop)
		.LineStyle = nLineType
		.ColorIndex = xlAutomatic
		.Weight = nWeight
	End With
	With ExcelApp.Selection.Borders(xlEdgeLeft)
		.LineStyle = nLineType
		.ColorIndex = xlAutomatic
		.Weight = nWeight
	End With
	With ExcelApp.Selection.Borders(xlEdgeRight)
		.LineStyle = nLineType
		.ColorIndex = xlAutomatic
		.Weight = nWeight
	End With
	With ExcelApp.Selection.Borders(xlEdgeBottom)
		.LineStyle = nLineType
		.ColorIndex = xlAutomatic
		.Weight = nWeight
	End With

End Function

' ******************************************************
' 文字列の横位置を指定(*追加*)
' ******************************************************
Function ExcelHAlign()

	ExcelApp.Selection.HorizontalAlignment = xlCenterAcrossSelection

End Function
Function ExcelHAlign2()

	ExcelApp.Selection.HorizontalAlignment = xlCenter

End Function

' ******************************************************
' 文字列の縦位置を指定(*追加*)
' ******************************************************
Function ExcelVAlign()

	ExcelApp.Selection.VerticalAlignment = xlCenter

End Function

' ******************************************************
' シート名によるシート選択
' ******************************************************
Function ExcelSelectSheet(MyBook, strSheetName)

	MyBook.Sheets(strSheetName).Select

End Function

' ******************************************************
' テーブル設計書用フォーマット
' ******************************************************
Function Format_Table(MyBook,SheetName)

	'テーブル設計書フォーマット作成
	Call ExcelSelectSheet(MyBook, SheetName)
'	Call Format_Page(MyBook)

	Call ExcelSize_Table(MyBook, SheetName)
	Call ExcelLine_Table(MyBook, SheetName)
	Call ExcelSetText_Table(MyBook, SheetName)

End Function

' ******************************************************
' セルサイズの設定
' ******************************************************
Function ExcelSize_Table(MyBook, Target)

	Dim i

	'セルの高さ合わせ
	Call ExcelSetRowHeight(MyBook, Target, 1, 13.50)
	Call ExcelSetRowHeight(MyBook, Target, 2, 24.50)
	Call ExcelSetRowHeight(MyBook, Target, 3, 13.50)
	Call ExcelSetRowHeight(MyBook, Target, 4, 24.50)
	Call ExcelSetRowHeight(MyBook, Target, 5, 20.25)

	For i = 6 To nRows + 5
		Call ExcelSetRowHeight(MyBook, Target, i, nRowHeight)
	Next

	'セルの幅合わせ
	Call ExcelSetColumnWidth(MyBook, Target, 1, 3.50)
	Call ExcelSetColumnWidth(MyBook, Target, 2, 27.00)
	Call ExcelSetColumnWidth(MyBook, Target, 3, 0.75)
	Call ExcelSetColumnWidth(MyBook, Target, 4, 15.00)
	Call ExcelSetColumnWidth(MyBook, Target, 5, 4.50)
	Call ExcelSetColumnWidth(MyBook, Target, 6, 3.00)
	Call ExcelSetColumnWidth(MyBook, Target, 7, 0.75)
	Call ExcelSetColumnWidth(MyBook, Target, 8, 13.50)
	Call ExcelSetColumnWidth(MyBook, Target, 9, 0.75)
	Call ExcelSetColumnWidth(MyBook, Target, 10, 24.00)
	Call ExcelSetColumnWidth(MyBook, Target, 11, 12.00)

End Function

' ******************************************************
' 罫線の設定
' ******************************************************
Function ExcelLine_Table(MyBook, Target)

	Dim i

	' BOX罫線
	Call ExcelRange(MyBook, Target, 1, 1, 11, nRows + 5 )
	Call ExcelBox(xlContinuous, xlMedium)

	' 上罫線
	Call ExcelRange(MyBook, Target, 1, 2, 11, 2 )
	Call ExcelLine(xlDot, xlThin)

	Call ExcelRange(MyBook, Target, 1, 3, 11, 3 )
	Call ExcelLine(xlContinuous, xlThin)

	Call ExcelRange(MyBook, Target, 1, 4, 11, 4 )
	Call ExcelLine(xlDot, xlThin)

	Call ExcelRange(MyBook, Target, 1, 5, 11, 5 )
	Call ExcelLine(xlContinuous, xlMedium)

	Call ExcelRange(MyBook, Target, 1, 6, 11, 6 )
	Call ExcelLine(xlContinuous, xlMedium)

	for i = 7 to nRows + 5
		Call ExcelRange(MyBook, Target, 1, i, 11, i )
		Call ExcelLine(xlDot, xlThin)
	Next

	' 右罫線
	Call ExcelRange(MyBook, Target, 1, 6, 1, nRows + 5 )
	Call ExcelLineRight(xlDot, xlThin)

	Call ExcelRange(MyBook, Target, 2, 1, 2, 2 )
	Call ExcelLineRight(xlContinuous, xlThin)

	Call ExcelRange(MyBook, Target, 2, 5, 2, nRows + 5 )
	Call ExcelLineRight(xlContinuous, xlThin)

	Call ExcelRange(MyBook, Target, 4, 5, 4, nRows + 5 )
	Call ExcelLineRight(xlContinuous, xlThin)

	Call ExcelRange(MyBook, Target, 5, 6, 5, nRows + 5 )
	Call ExcelLineRight(xlDot, xlThin)

	Call ExcelRange(MyBook, Target, 6, 3, 6, nRows + 5 )
	Call ExcelLineRight(xlContinuous, xlThin)

	Call ExcelRange(MyBook, Target, 8, 1, 8, 4 )
	Call ExcelLineRight(xlContinuous, xlThin)

	Call ExcelRange(MyBook, Target, 10, 1, 10, nRows + 5 )
	Call ExcelLineRight(xlContinuous, xlThin)

End Function

' ******************************************************
' セルのテキストの設定
' ******************************************************
Function ExcelSetText_Table(MyBook, Target)

	Dim i

	Call ExcelRange(MyBook, Target, 1, 1, 7, 49 )
	Call ExcelVAlign()

	' 1行目
	Call ExcelSetCell(MyBook, Target, 1, 1, " システム名")

	Call ExcelSetCell(MyBook, Target, 3, 1, " サブシステム名")

	Call ExcelSetCell(MyBook, Target, 9, 1, " テーブルID")
	Call ExcelRange(MyBook, Target, 9, 1, 10, 1 )
	Call ExcelHAlign()
	Call ExcelRange(MyBook, Target, 9, 2, 10, 1 )
	Call ExcelVAlign()

	Call ExcelSetCell(MyBook, Target, 11, 1, "ページ")
	Call ExcelRange(MyBook, Target, 11, 1, 11, 1 )
	Call ExcelHAlign()
	Call ExcelRange(MyBook, Target, 11, 2, 11, 2 )
	Call ExcelHAlign()
	Call ExcelRange(MyBook, Target, 11, 2, 11, 2 )
	Call ExcelVAlign()

	' 2行目
	Call ExcelSetCell(MyBook, Target, 11, 2, "/")
	Call ExcelRange(MyBook, Target, 11, 2, 11, 2 )

	' 3行目
	Call ExcelSetCell(MyBook, Target, 1, 3, " テーブル名")

	Call ExcelSetCell(MyBook, Target, 7, 3, "種別")
	Call ExcelRange(MyBook, Target, 7, 3, 8, 3 )
	Call ExcelHAlign()

	Call ExcelSetCell(MyBook, Target, 9, 3, "作成日")
	Call ExcelRange(MyBook, Target, 9, 3, 10, 3 )
	Call ExcelHAlign()

	Call ExcelSetCell(MyBook, Target, 11, 3, "作成者")
	Call ExcelRange(MyBook, Target, 11, 3, 11, 3 )
	Call ExcelHAlign()

	' 4行目
	Call ExcelRange(MyBook, Target, 8, 4, 8, 4 )
	Call ExcelHAlign2()
	Call ExcelVAlign()

	Call ExcelRange(MyBook, Target, 10, 4, 10, 4 )
	Call ExcelHAlign2()
	Call ExcelVAlign()

	Call ExcelRange(MyBook, Target, 11, 4, 11, 4 )
	Call ExcelHAlign2()
	Call ExcelVAlign()

	' 5行目
	Call ExcelSetCell(MyBook, Target, 1, 5, " 列名")

	Call ExcelSetCell(MyBook, Target, 3, 5, "データ型")
	Call ExcelRange(MyBook, Target, 3, 5, 4, 5 )
	Call ExcelHAlign()

	Call ExcelSetCell(MyBook, Target, 5, 5, "サイズ")
	Call ExcelRange(MyBook, Target, 5, 5, 6, 5 )
	Call ExcelHAlign()

	Call ExcelSetCell(MyBook, Target, 7, 5, " 説明")

	Call ExcelSetCell(MyBook, Target, 11, 5, "主キー")
	Call ExcelRange(MyBook, Target, 11, 5, 11, 5 )
	Call ExcelHAlign()
	Call ExcelVAlign()

	for i = 6 to nRows + 5
		Call ExcelSetCell(MyBook, Target, 1, i, i - 5)
		Call ExcelRange(MyBook, Target, 1, i, 1, i )
		Call ExcelHAlign()
		Call ExcelRange(MyBook, Target, 11, i, 11, i )
		Call ExcelHAlign()
	next

	Call ExcelRange(MyBook, Target, 1, 1, 1, 1 )

End Function

' ******************************************************
' ヘッダー,余白の指定
' ******************************************************
Function Format_Page(MyBook)

	on error resume next

	With MyBook.ActiveSheet.PageSetup
		.CenterHeader = "&18&A"
		.PaperSize = xlPaperB4
'		.LeftMargin = ExcelApp.InchesToPoints(0.393700787401575)
'		.RightMargin = ExcelApp.InchesToPoints(0.196850393700787)
'		.TopMargin = ExcelApp.InchesToPoints(0.551181102362205)
'		.BottomMargin = ExcelApp.InchesToPoints(0.393700787401575)
'		.HeaderMargin = ExcelApp.InchesToPoints(0.196850393700787)
'		.FooterMargin = ExcelApp.InchesToPoints(0.196850393700787)
	End With

	on error goto 0

End Function

' ******************************************************
' シングルクォートで囲む
' ******************************************************
Function Ss( strValue )

	Ss = "'" & strValue & "'"

End Function

' ******************************************************
' DB接続(SQLServer)
' ******************************************************
Function SQS_DBConnect( _
	Connection, _
	Server, _
	DB, _
	User, _
	Pass _
)

	Dim ConnectionString

	ConnectionString = _
		"Provider=SQLOLEDB;" & _
		"Data Source=" & Server & ";" & _
		"Initial Catalog=" & DB & ";" & _
		"User ID=" & User & ";" & _
		"Password=" & Pass & ";"
	
	if IsEmpty( Connection ) then
		Set Connection = CreateObject( "ADODB.Connection" )
	end if

	on error resume next
	Connection.Open ConnectionString
	if Err.Number <> 0 then
		SQS_DBConnect = "ERROR:" & Err.Description
	else
		SQS_DBConnect = ""
	end if
	on error goto 0

End Function

' ******************************************************
' DB終了処理(接続を閉じる)
' ******************************************************
Function DBClose( _
	CnRs _
)
	
	On Error Resume Next
	If CnRs.State >= 1 Then
		CnRs.Close
	End If
	On Error Goto 0

	DBClose = True

End Function

' ******************************************************
' DB読込み
' 【戻り値】: True(データ有り),False(データ無し)
' ******************************************************
Function DBGet( _
	Connection, _
	Record, _
	SqlQuery, _
	bUpadateFlg _
)
	if IsEmpty( Record ) then
		Set Record = CreateObject( "ADODB.Recordset" )
	end if

	Dim ConstCheck

	' 閉じていない時は閉じる
	If Record.State >= 1 Then
		Record.Close
	End If

	' 更新処理に使用する場合は、レコード単位の共有的ロック
	If bUpadateFlg Then
		ConstCheck = adLockOptimistic
		if IsEmpty( ConstCheck ) then
			Record.LockType = 3
		else
			Record.LockType = adLockOptimistic
		end if
	else
		ConstCheck = adLockOptimistic
		if IsEmpty( ConstCheck ) then
			Record.LockType = 1
		else 
			Record.LockType = adLockReadOnly
		end if
	End If
	
	' レコードセット作成
	Record.Open SqlQuery, Connection
	If Record.State >= 1 Then
		If Record.EOF Then
			DBGet = False
		Else
			DBGet = True
		End If
	else
		DBGet = False
	end if

End Function

</SCRIPT>
</JOB>





posted by at 2019-02-11 10:11 | DB関連 | このブログの読者になる | 更新情報をチェックする

2019年01月11日

VBScript : CAPICOM を使った通常文字列の Base64エンコードと SHA1 と MD5 と SHA256/384/512

Windows10 でCAPICOM.Utilities を使用するには、こちらからダウンロードしてインストールが必要です。

但し 32 ビットでインストールされるので、VBScript で実行する際に、『C:\Windows\SysWOW64\cscript.exe』で実行する必要があります。
( または C:\Windows\SysWOW64\wscript.exe )

ドキュメント

以下の方法と同様で、バイナリファイルの変換に使う事が可能です。(PHPの文字列はバイナリ扱いです)

結果は PHP の関数で同じになる事を確かめています。
( php -r "print hash('sha256','変換する文字列');" )

変換する種類は、こちらの定数を使用します(HashedData.Algorithm)( VBscript で最後に小文字に変換してますが、PHP の結果と合わす為です )

Base64 の変換では、本来良く使われて来た用途としてバイナリデータのテキスト表現で、メールの添付ファイルに使用する際に改行を含めて76文字になるようになっています。CAPIUtil.Base64Encode の仕様もそうなっているので、PHP と比較する為に、ここではわざわざ改行を取り除いています。

それと、CAPICOM.HashedData で作成したオブジェクトを使いまわすとエラーになる事があったので、毎回作成して処理しました。
Set CAPIUtil = Wscript.CreateObject( "CAPICOM.Utilities" )
Set Stream = Wscript.CreateObject("ADODB.Stream")
Set StreamBin = Wscript.CreateObject("ADODB.Stream")

'***********************************
' Base64
'***********************************
Stream.Open
Stream.Charset = "shift_jis"
' shift_jis で入力文字を書き込む
Stream.WriteText "日本語表示OK日本語表示OK日本語表示OK日本語表示OK日本語表示OK"
Stream.Position = 0

' バイナリで開く
StreamBin.Open
StreamBin.Type = 1

' テキストをバイナリに変換
Stream.CopyTo StreamBin
Stream.Close

' 読み込みの為にデータポインタを先頭にセット
StreamBin.Position = 0

str = CAPIUtil.ByteArrayToBinaryString( StreamBin.Read )
str2 = CAPIUtil.Base64Encode( str )
' ' 長い文字列は仕様として、(\r\n を含めて 76文字で) 改行されます
str2 = Replace(str2,vbCrLf,"")

Wscript.Echo str2

'***********************************
' SHA1,SHA256,SHA384,SHA512 と MD5
'***********************************
' SHA1
Set HashedData = Wscript.CreateObject( "CAPICOM.HashedData" )
HashedData.Algorithm = 0
HashedData.Hash(str)

Wscript.Echo LCase(HashedData.Value)

' SHA256
Set HashedData = Wscript.CreateObject( "CAPICOM.HashedData" )
HashedData.Algorithm = 4
HashedData.Hash(str)

Wscript.Echo LCase(HashedData.Value)

' SHA384
Set HashedData = Wscript.CreateObject( "CAPICOM.HashedData" )
HashedData.Algorithm = 5
HashedData.Hash(str)

Wscript.Echo LCase(HashedData.Value)

' SHA512
Set HashedData = Wscript.CreateObject( "CAPICOM.HashedData" )
HashedData.Algorithm = 6
HashedData.Hash(str)

Wscript.Echo LCase(HashedData.Value)

' MD5
Set HashedData = Wscript.CreateObject( "CAPICOM.HashedData" )
HashedData.Algorithm = 3
HashedData.Hash(str)

Wscript.Echo LCase(HashedData.Value)







posted by at 2019-01-11 16:41 | VBScript | このブログの読者になる | 更新情報をチェックする

2019年01月08日

BEASTARS 11 : 決着ついた




いろんな事に決着付いて『しまった』と言わざるを得ない展開で溜息が出た。

ここからどうなるのかは想像も付かないけれど、レゴシが主役でルイが戻って来た以上どこかへ向かって物語は狼煙を上げるんだろうなぁ...

世の中も、自分的にもこれから数年は大きな変化が起きる事が『決まっている』だけに、とても感慨深いお話でした。


凄い・すごい・スゴイ





posted by at 2019-01-08 22:20 | 漫画 | このブログの読者になる | 更新情報をチェックする

2019年01月05日

DAZ3D : このブログのタイトル画像の Iray 化 ( 元は 3Delight )

Iray 化したからといって、良くなるとは限らないですね。



もうちょっとライティングで明暗のメリハリが必要ですね。




仕方無いので、カメラ位置変えて髪を風で流れるようにしてごまかしました






posted by at 2019-01-05 01:07 | Iray DAZ3D DAZStudio イラスト | このブログの読者になる | 更新情報をチェックする

DAZ3D : ツリーハウスの夜

プロトタイプ

ツリーハウスのプロダクトですが、たしか無料で手にいれたものでおせじにも『良いもの』とは言えないのですが、Iray 使った夜の照明ならいろいろごまかせるだろうとやってみました。



これはこれでいいんですが、雰囲気の比較の為に GIMP でスクリーンで明るくしたのが以下の画像。



この時点では木のテクスチャがさすがにちょっとクオリティが悪いです。背景は森の hdri を暗〜〜くして他のプロダクトの街灯みたいなのをくっつけてエミッションでライティングしてます。全体の明るさ調整に球を頭上において Emission でライト化して照明として使用しています。

以下の画像だと、背景の HDRI の様子がより解ります。



イラストAC に投稿したもの



投稿にあたって、壁と扉のシェーダを変更して、基本的な明るさを少し上げています。それでも暗いのは暗いですが、壁紙として使うぶんにはこのくらいでもいいはずです。

猫のポーズテスト



猫のプロダクト(Millennium Cat)は古いものなので、猫単体ではなかなかしんどいので、風景の中に溶け込ませる事をテストしたシーンです。早くに購入していたのになかなか試す機会が無かった専用の拡張ポーズ(Purrfect Poses for the Millennium Cat)のお試しです。





posted by at 2019-01-05 00:41 | Iray DAZ3D DAZStudio イラスト | このブログの読者になる | 更新情報をチェックする

2019年01月04日

Seesaa(またはさくらのブログ) の記事の一括編集内で、各種の設定を一括変更する為のブックマークレット

※ さくらのブログに広告の表示はありません

一括編集状態で実行する必要があります




Sessaa 一括変更

一括編集タブで使用します。検索結果でもいいですし、単純に200件表示でもいいです。

カテゴリの一括変更では、記事一覧を検索で絞ってから一括変更するといいと思います。カテゴリ番号は、そのカテゴリを表示した時の URL の最後の文字列( 例 : 7154748-1.html )のハイフン以降を除いた数字です。
( カテゴリID を数字に変更してカテゴリ変更をクリックします )


javascript:var wnd=document.createElement('iframe');wnd.setAttribute('id','if');wnd.frameBorder=0;document.body.appendChild(wnd);wnd.contentWindow.document.write('<script src=\'https://winofsql.jp/s01.js\' charset=\'shift_jis\'></script>')

// plugin Bookmarklet
// by lightbox

parent.document.getElementById("if").style.position='absolute';
parent.document.getElementById("if").style.width='300px';
parent.document.getElementById("if").style.height='34px';
parent.document.getElementById("if").style.left='0px';
parent.document.getElementById("if").style.top='0px';
parent.document.getElementById("if").style.zIndex=100;
var sLocation = parent.location.host;
var sUrl = parent.location.href;
var doc = parent.document;
var tds = doc.getElementsByTagName("form");
var len = tds.length;
var cnt = 0;
var add = null;
for( i = 0; i < len; i++ ) {
	if ( tds[i].name == 'search_form' ) {
//		cnt++;
//		if ( cnt == 2 ) {
			add = tds[i];
//		}
	}
}
var place = doc.createElement('div');
add.appendChild(place);
str="";
str+="<select id=changetype style=margin-left:5px;> \n";
str+="<option value=\"0\" title=\"受付×/表示×\">×/×</option> \n";
str+="<option value=\"1\" title=\"受付○/表示○\">○/○</option> \n";
str+="<option value=\"2\" title=\"受付×/表示○\">×/○</option> \n";
str+="<option value=\"3\" title=\"受付○(承認制)\">承認制</option> \n";
str+="</select> ";

str+="<select id=changetype2> \n";
str+="<option value=\"0\" selected=\"selected\">無効 / 公開</option> \n";
str+="<option value=\"1\" >有効 / 非公開</option> \n";
str+="</select> ";

str+="<INPUT type=button value='コメント' onClick='wnd.contentWindow.changeTarget(0)'>";
str+="&nbsp;<INPUT type=button value='公開設定' onClick='wnd.contentWindow.changeTarget(1)'>";
str+="&nbsp;<INPUT type=button value='広告の表示' onClick='wnd.contentWindow.changeTarget2()'>";
str+="&nbsp;<INPUT id='target_cat' type=text value='カテゴリID' onclick='this.select();' style='width:80px;'>";
str+="&nbsp;<INPUT type=button value='カテゴリ変更' onClick='wnd.contentWindow.changeTarget3()'>";
place.innerHTML = str


str="";
str+="<head> \n";
str+="<META http-equiv=\"Content-Type\" content=\"text/html; charset=shift_jis\" /> \n";
str+="<style type=text/css> \n";
str+="body { margin:0;background-color:forestgreen;color:white; } \n";
str+="</style> \n";
str+="</head> \n";
str+="<body> \n";

str+=" plugin Bookmarklet by lightbox\n";

str+="</body> \n";

document.write( str );
document.close();

var userAgent = window.navigator.userAgent.toLowerCase();
var appVersion = window.navigator.appVersion.toLowerCase();

function changeTarget(type) {

	var sels = doc.getElementsByTagName("select");
	var len = sels.length;
	var name,namelen,target;
	var value = doc.getElementById("changetype").value;

	// コメント
	if( type == 0 ) {

		for( i = 0; i < len; i++ ) {
			name = sels[i].name;
			namelen = name.length;
			target = name.substr(namelen-7,7)
			if ( target == 'comment' ) {
				doc.getElementsByName(name)[0].value = value;
			}
		}

	}
	// 公開・非公開
	if( type == 1 ) {

		value = doc.getElementById("changetype2").value;
		if ( value == 0 ) {
			value = 1;
		}
		else {
			value = 0;
		}

		for( i = 0; i < len; i++ ) {
			name = sels[i].name;
			namelen = name.length;
			target = name.substr(namelen-4,4)
			if ( target == 'flag' ) {
				doc.getElementsByName(name)[0].value = value;
			}
		}

	}

}
function changeTarget2() {

	var sels = doc.getElementsByTagName("select");
	var len = sels.length;
	var name,namelen,target;
	var value = doc.getElementById("changetype2").value;

	for( i = 0; i < len; i++ ) {
		name = sels[i].name;
		namelen = name.length;
		target = name.substr(namelen-4,4)
		if ( target == 'link' ) {
			doc.getElementsByName(name)[0].value = value;
		}
	}
}


function changeTarget3() {

	var sels = doc.getElementsByTagName("select");
	var len = sels.length;
	var name,namelen,target;
	var value = doc.getElementById("target_cat").value;

	for( i = 0; i < len; i++ ) {
		name = sels[i].name;
		namelen = name.length;
		target = name.substr(namelen-12,4)
		if ( target == '_cat' ) {
			doc.getElementsByName(name)[0].value = value;
		}
	}
}



更新履歴
2012-02-29 : カテゴリID を追加してからの初回投稿
2013-08-23 : 最新の Seesaa と さくらのブログで動作チェック
2015-07-06 : Seesaa と さくらが同じになっていたので、さくら専用を削除
2019-01-04 : 最新の Seesaa と さくらのブログで動作チェック




posted by at 2019-01-04 10:38 | ブックマークレット | このブログの読者になる | 更新情報をチェックする

2019年01月03日

DAZ3D : Juliette Hair の調整

この髪( Juliette Hair )は、$19.95 を $5.39 で買っています。一度使いましたが良くなかったので放置してましたが、他の人が使ってるのを見て調整してみようと思いました。

 出来上がったのが以下の画像です



正直そのまま使うととても印象がイマイチなものが出来上がるのでモーフで調整を入れようとするといいのが無く、本来使わないキャラクタのアジャストがあるにはありますが、正攻法ではありません。

▼ ノーマルの状態


▼ 調整した状態との差



そこで、General なパラメータでサイズ調整をしようとすると、本体を選択しているとえらい事になります...

DAZ の製品ではタマにあるのですが、やりたいモーフがパーツに存在する事があります。そこで今回は head を選択して General のパラメータ調整を行いました。




その他の結果






補足

この衣装は、Doctor Coat Outfit for Genesis 3 Female(s) ですが、H&C Nurse Uniform for Genesis 3 Female(s) と同じくクオリティが低いです。

どちらも Fitting に問題があり、G3 用のプロダクトとは思えないぐらいの調整が必要となります。特に、ポースによって服のシワが破綻するのが腹立つのでほぼつかってません。

イラストAC 用として医療関係のイラストに使おうと思ったんですけど...


ちなみに、以下が Aiko7 でのプロトタイプです。ドクターコートの下のシャツが表に出てしまっています。これは Iray プレビューしないと解りません。単純に専用モーフに Ajust Fit があるのでそれで調整しました。これは、ドクターコートの Fit 先を シャツにする方法もありますが、部分的に破綻する可能性があります( 破綻がカメラの範囲になければ そのほうが確実ですけど )






posted by at 2019-01-03 22:27 | Iray DAZ3D DAZStudio イラスト | このブログの読者になる | 更新情報をチェックする

2019年01月02日

DAZ3D : とてもアニメっぽいデザインの 戦艦 Dominator は作ってて楽しい



以前から戦艦が欲しかったのですが、年末のディスカウントで $6.36 で手に入れたプロダクトです。

Dominator

回りの小型機は、一つ作ってノードインスタンスで量産して角度と位置を調整したものですが、なかなか楽しいレンダレング具合です。( 最後に GIMP で オーバレイ+スクリーン )



ついついこの手のシーンは暗くなりがちですが、イザとなればこのように GIMP でレタッチすればいいのです。

以下の画像は Haze で雰囲気出そうとしてみたものですが、戦艦メインならレンダリング時間を犠牲にしてまで使う効果ではなかったようです。



動力部分のエミッション効果がとてもいい感じです。









posted by at 2019-01-02 23:32 | Iray DAZ3D DAZStudio イラスト | このブログの読者になる | 更新情報をチェックする

DAZ3D : Urban Sprawl 3 / Block 3 : 最近レンダリング開始しておいて他の作業をやる

最近レンダリング開始しておいて他の作業をやる...という事が増えてると言うか、DAZStudio ばかり触ってます。

Urban Sprawl 3



本業のほうは、IT そのものの進歩というか広がりが多き過ぎてどこにポイントを絞ればいいのか悩みます。最近は歳をとったせいもあって、アナログな外堀から攻めるべきかなぁ...と思う今日この頃です。

なんというか、社会人としての基本スペックは最近技術力よりもっと大きいものだと思うのです。だいたい、専門学校から実社会に橋渡しをする中で、元々現場は技術力なんてのはアテにもしていないし、それでも例外な学生はタマには居るのですが。

でも、デキル子はやはり社会人としての基本スペックも自然と高いので、人間形成を手伝うほうが先だと思わざるを得ない場面に最近は遭遇する事が多いわけです。

ああ、独り言になってしまいました。



Urban Sprawl 3 は前から欲しかったんですが、イザ表現に使おうという状況になると、あまりにも現実に近いのでただの風景になりがちです。

それで思うのですが、最近漫画で『異世界』モノが多くあるのですが、どれを取っても風景や登場人物や世界観がファンタジーなので楽しいわけです。風景をレンダリングしていて感じるものとおんなじなんですよね。とりあえず現実より遠いものは切り取りやすいんです。

だから、正直 Urban Sprawl 3 はつまんないです...( どうしよう )






posted by at 2019-01-02 16:21 | Iray DAZ3D DAZStudio イラスト | このブログの読者になる | 更新情報をチェックする

2018年12月08日

【VBS汎用】SHIFT_JISデータを各種キャラクタセットのテキストファイルへ変換

Microsoft のデータはメモ帳でも解るように、SHIFT_JIS と Unicode と (UTF8) しか通常では対応していないので、このような処理が実は結構必要になります。

しかし、このような方法はたぶんあまり知られて無いので、他のアプリケーションを利用している場合が多いのでは無いでしょうか。(というか、そもそもファイルシステムオブジェクトで UTF8、UTF8N、EUC-JP を対応しろって思いますけど。)

変換は全てメモリ上で処理します。

外部ライブラリを WEB 上に置いて読み込んで処理しているので、その部分は『コマンド』だと思って下さい。
例) Crun は、コマンドプロンプトでの実行を強制します


VBScript の中に埋め込んだデータはファイルとしては Shift_JIS です。VBScript のインタープリタの内部的には Unicode ですが、何も考えなければ出力されたデータは Shift_JIS になってしまいます。

これを 5 種類のキャラクタセットとして意図的に出力します
1) SHIFT_JIS
2) UNICODE
3) EUC-JP
4) UTF8
5) UTF8N
※ UTF8 が少し特殊です(BOMを付加しています)
右端のアイコンよりダウンロードできます
<JOB>
<SCRIPT
	language="VBScript"
	src="http://lightbox.in.coocan.jp/laylaClass.vbs">
</SCRIPT>

<SCRIPT language=VBScript>
' ***********************************************************
' 処理開始
' ***********************************************************
Call laylaFunctionTarget( "http://lightbox.in.coocan.jp/" )
Call laylaLoadFunction( "baseFunction.vbs" )

' Csript.exe で実行を強制
Crun

' 元となる shift_jis の文字列
strShiftJis = GetInline("shift_jis")

' このディレクトリ
strDir = ScriptDir()

' ファイルシステムオブジェクト作成
GetFso

' 出力パス
strPath1 = strDir & "\sjis.txt"
strPath2 = strDir & "\unicode.txt"
strPath3 = strDir & "\ujis.txt"
strPath4 = strDir & "\utf8.txt"
strPath5 = strDir & "\utf8n.txt"

' ファイルシステムオブジェクトで、sjis と unicode
Call PutTextFile( strPath1, strShiftJis )
Call PutTextFileUnicode( strPath2, strShiftJis )

' キャラクタセット変換用の Stream オブジェクト
Set Stream = Wscript.CreateObject("ADODB.Stream")
Set Stream2 = Wscript.CreateObject("ADODB.Stream")

' 開く
Stream.Open
Stream2.Open
' 二つ目はバイナリ専用
Stream2.Type = 1

Stream.Charset = "euc-jp"
Stream.WriteText strShiftJis
Stream.SaveToFile strPath3, 2

' 先頭に移動
Stream.Position = 0
Stream.Charset = "utf-8"
Stream.WriteText strShiftJis
Stream.SaveToFile strPath4, 2

' バイナリにコピー
Stream.CopyTo Stream2

' 一つ目もバイナリにする為、いったん閉じる
Stream.Close
' 再度開いてバイナリにする
Stream.Open
Stream.Type = 1

' バイナリを読んでバイナリに書く
Stream2.Position = 0
Stream2.Read(3)
Do while not Stream2.EOS
	Stream.Write Stream2.Read(16)
Loop

' utn-8n
Stream.SaveToFile strPath5, 2


' 閉じる
Stream2.Close
Stream.Close


print "処理が終了しました"
print ""

Wscript.Quit

</SCRIPT>

<RESOURCE id="shift_jis">
<![CDATA[
ここは、VBScript なので shift_jis になります。
必要に応じてキャラクタセットを変更します
]]>
</RESOURCE>

</JOB>




posted by at 2018-12-08 14:20 | VBScript | このブログの読者になる | 更新情報をチェックする

VBScript : デスクトップの列挙

オンライン上にある、VBScript のライブラリを使用しています。
<JOB>
<COMMENT>
************************************************************
 WSH 実行スケルトン
************************************************************
</COMMENT>

<COMMENT>
************************************************************
 外部スクリプト定義
************************************************************
</COMMENT>
<SCRIPT
	language="VBScript"
	src="http://lightbox.in.coocan.jp/laylaClass.vbs">
</SCRIPT>

<SCRIPT language="VBScript">
' ***********************************************************
' 処理開始
' ***********************************************************
Call laylaFunctionTarget( "http://lightbox.in.coocan.jp/" )
Call laylaLoadFunction( "baseFunction.vbs" )

GetShell

Crun2 130

Wscript.Echo "【デスクトップ/一般】"
Wscript.Echo "----------------------------------------------------"
Set objFolder = Shell.NameSpace( 0 )

Set objFolderItems = objFolder.Items()
nCount = objFolderItems.Count

' 列挙1
strData = ""
For i = 0 to nCount - 1

	strData = strData & RpadB(objFolderItems.Item(i).Name," ",30 )
'	strData = strData & RpadB(objFolderItems.Item(i).ModifyDate," ",30 )
	strData = strData & RpadB(objFolderItems.Item(i).Path," ",89 )
'	strData = strData & RpadB(objFolderItems.Item(i).Size," ",20 )
'	strData = strData & RpadB(objFolderItems.Item(i).Type," ",20 )
	WScript.Echo strData
	strData = ""

Next


' 列挙2
Wscript.Echo
Wscript.Echo "【デスクトップ/詳細情報】"
Wscript.Echo "----------------------------------------------------"
strData = ""
For Each obj In objFolderItems

	strData = strData & RpadB(objFolder.GetDetailsOf(obj, 0)," ",20 )
	strData = strData & RpadB(objFolder.GetDetailsOf(obj, 1)," ",20 )
	strData = strData & RpadB(objFolder.GetDetailsOf(obj, 2)," ",20 )
	strData = strData & RpadB(objFolder.GetDetailsOf(obj, 3)," ",20 )
	strData = strData & RpadB(objFolder.GetDetailsOf(obj, 4)," ",20 )
	strData = strData & RpadB(objFolder.GetDetailsOf(obj, -1)," ",20 )
	WScript.Echo strData
	strData = ""

Next

Wscript.Echo

</SCRIPT>
</JOB>



▼ Windows10 での実行結果サンプル


結果をテキストファイルに残すには、以下のようにして表示をファイルにリダイレクトします
cscript ginpro_1517239356526.wsf > log.txt
一部特殊フォルダが表示されていますが、それらを使用してエクスプローラを起動する事ができます。Winows10 で、PC を選択してエクスプローラを開く記述は以下のようになります。
Explorer /e,/root,::{20D04FE0-3AEA-1069-A2D8-08002B30309D}



posted by at 2018-12-08 13:30 | VBScript | このブログの読者になる | 更新情報をチェックする

2018年12月01日

DAZ3D で Amazon Pay を使用してみました。



いままでずっとPayPal 使ってましたし別にそれでいいんですが、どうしても PayPal と比較したくなったので使ってみました。PayPal と同じくログイン画面が出ますので、日本の Amazon のユーザとパスワードで送信すると普通に支払いが完了しました。金額も同程度の以前の PayPal と比べて同じです。

ただ、しかし、記録が残ってません...



Amazon Payについて
Amazon.co.jpのアカウントをお持ちの場合、Amazon Payのアカウントは自動的に作成されています。Amazon Payに対応している他のサイトで初めてAmazon Payを使用したとき、アカウントが有効になります。Amazon Payのアカウントは、Amazon.co.jpのアカウントと連動しており、Amazon.co.jpに登録しているクレジットカードをすぐに利用することができます。
で、最後に 詳しくは、https://pay.amazon.com/jp をご覧ください。 と言われてログインしてみると『お支払はございません。』だそうです。 まぁ、いいけどね。PayPal でも Amazon でも、必要額しか入れてない VISA デビットだし。 メールは amazon.com から来るので、そこにあるリンク先からログインしようとしても当然できません( これは想定内 ) ▼ なぜかあまり解説が見つからない( Wikipedia にあったリンク ) アマゾンが語る「Amazonログイン&ペイメント」導入1000社突破の今 PayPal と同じくクレジットカードの番号等漏洩の心配を一応はしなくていいのがメリットですが、まだ PayPal に軍配上がりそうな気はしますね、これでは。 ちなみに、DAZ3D の フォーラムの Adminstrator が、Introducing Amazon Pay でこう言ってます。
当社のAmazon Payは現在、定期的な取引を処理することができません。 
▼ 一般詳細 Amazon Payとは?使い方とメリットデメリット・提携サイト・ギフト券との併用について徹底解説
posted by at 2018-12-01 19:57 | DAZ3D | このブログの読者になる | 更新情報をチェックする

DAZ3D : G8 に Genesis の衣装が着れるか改めて試してみた

RSSY Clothing Converter from Genesis to Genesis 8 Female という製品があったので内容を見てみると、バッチ処理でプロダクトそのものをコンバートしてセットを作成するものでした。よくよく読むと一部の製品では必ずしもうまく行くとは限らないとあったり、自分の持ってる Genesis の衣装の種類と実際 G8 に着せてみてからでも遅くないと思ってやってみたんですが...



普通に着れました。

プロダクトのサンプル画像と同じ衣装です。靴は G2 用のスニーカーですが、オリジナルのブーツでも着れてます。ひょっとして、Wear Them All - Autofitting Clones and Clothing Smoothers for Genesis 3 Female(s) が入ってるからかな..なんて思ったりもしますが、DAZStudio の裏事情なんてありそうだけど解るわけでも無いので着れてるからいい事にしよう。

環境設定

単純平面作って、Iray で光沢( シルク系 )
HDRI は完全な夜
エミッション球を少し紫で高さと大きさを調整してメインの照明
顔の近くに少しオレンジのポイントライト

衣装

Dark Moods for Genesis
Running Shoes for Genesis 2 Female(s) and Genesis



Marja Hair



posted by at 2018-12-01 17:58 | Iray DAZ3D DAZStudio イラスト | このブログの読者になる | 更新情報をチェックする

2018年10月28日

PowerShell 移行用 C# コンソールアプリのコードテスト( ZIP 圧縮 )

▼ とてもお世話になっています
ZipFile、ZipArchiveクラスを使用して、ZIP圧縮、展開(解凍)、リスト表示などを行う( dobon.net )

この方法ですと、画像関連で Thumbs.db が書庫に入ってしまいますが、仕方ないです。

public class MyClass のほうを、PowerShell に書いて [MyClass]::create_zip() で実行します。
using System;
using System.IO;
using System.IO.Compression;

namespace create_zip {
	class Program {

		static void Main(string[] args) {

			MyClass.create_zip(args[0], args[1]);

		}
	}

	public class MyClass {
		public static void create_zip(string dir, string zipPath) {

			Console.WriteLine(dir);

			if (File.Exists(zipPath)) {
				File.Delete(zipPath);
			}

			try {
				ZipFile.CreateFromDirectory(
							dir,
							zipPath
						);
			}
			catch (Exception ex) {

				Console.WriteLine(ex.Message);
			}

		}

	}
}


▼ 久しぶりに使うとタブの設定や中かっこの設定を忘れていた。
 

# バッチファイルからの引数
$dir = $Args[0]
$zipPath = $Args[1]

$code = @"
using System;
using System.IO;
using System.IO.Compression;

public class MyClass {
	public static void create_zip(string dir,string zipPath) {

		Console.WriteLine(dir);

		if (File.Exists(zipPath)) {
			File.Delete(zipPath);
		}

		try {
			ZipFile.CreateFromDirectory(
						dir,
						zipPath
					);
		}
		catch (Exception ex) {

			Console.WriteLine(ex.Message);
		}

	}

}
"@

Add-Type -Language CSharp -TypeDefinition $code -ReferencedAssemblies `
	( `
	"System.IO.Compression.FileSystem" `
	)

# 実行
[MyClass]::create_zip($dir,$zipPath)





posted by at 2018-10-28 19:08 | C# | このブログの読者になる | 更新情報をチェックする

2018年10月19日

PowerShell 内に C# を記述して、SQLServer( SQLExpress ) の SMO を使用してテーブルの CREATE TABLE 文 を取得する

ライブラリを取得する為に、nuget を使用します。

少し参照する dll が多いですが、VisualStudio で実行テストした後 PowerShell に移植しています
$code = @"
using System;
using System.Text;
using System.IO;
using System.Collections.Generic;
using System.Collections.Specialized;
using Microsoft.SqlServer.Management.Common;
using Microsoft.SqlServer.Management.Smo;
public class MyClass {

	public static void create_sql() {

		UTF8Encoding UTF8N_Enc = new UTF8Encoding();
		// false は上書き
		StreamWriter WriteFile = new StreamWriter("sqlexpress.sql", false, UTF8N_Enc);

		// サーバー
		Server srv;
		// インスタンス
		srv = new Server();

		// サーバーインスタンスの情報
		srv.ConnectionContext.AutoDisconnectMode = AutoDisconnectMode.NoAutoDisconnect;
		srv.ConnectionContext.LoginSecure = false;
		srv.ConnectionContext.Login = "sa";
		srv.ConnectionContext.Password = "";
		// 接続
		srv.ConnectionContext.Connect();

		// バージョンの表示
		Console.WriteLine(srv.Information.Version);

		// 参考
		Scripter scripter = new Scripter(srv);

		Database myDb = srv.Databases["lightbox"];
		foreach (Table myTable in myDb.Tables)
		{

			StringCollection tableScripts = myTable.Script();
			foreach (string script in tableScripts)
			{
			  WriteFile.WriteLine(script);
			}
		}

		WriteFile.Close();
		WriteFile.Dispose();

		srv.ConnectionContext.Disconnect();


	}
}
"@
Add-Type -Path ("C:\user\lightbox\nuget\Microsoft.SqlServer.SqlManagementObjects.140.17283.0\lib\net40\Microsoft.SqlServer.ConnectionInfo.dll","C:\user\lightbox\nuget\Microsoft.SqlServer.SqlManagementObjects.140.17283.0\lib\net40\Microsoft.SqlServer.Smo.dll","C:\user\lightbox\nuget\Microsoft.SqlServer.SqlManagementObjects.140.17283.0\lib\net40\Microsoft.SqlServer.Management.Sdk.Sfc.dll","C:\user\lightbox\nuget\Microsoft.SqlServer.SqlManagementObjects.140.17283.0\lib\net40\Microsoft.SqlServer.SmoExtended.dll","C:\user\lightbox\nuget\Microsoft.SqlServer.SqlManagementObjects.140.17283.0\lib\net40\Microsoft.SqlServer.SqlEnum.dll")
Add-Type -Language CSharp -TypeDefinition $code -ReferencedAssemblies ("C:\user\lightbox\nuget\Microsoft.SqlServer.SqlManagementObjects.140.17283.0\lib\net40\Microsoft.SqlServer.ConnectionInfo.dll","C:\user\lightbox\nuget\Microsoft.SqlServer.SqlManagementObjects.140.17283.0\lib\net40\Microsoft.SqlServer.Smo.dll","C:\user\lightbox\nuget\Microsoft.SqlServer.SqlManagementObjects.140.17283.0\lib\net40\Microsoft.SqlServer.Management.Sdk.Sfc.dll","C:\user\lightbox\nuget\Microsoft.SqlServer.SqlManagementObjects.140.17283.0\lib\net40\Microsoft.SqlServer.SmoExtended.dll","C:\user\lightbox\nuget\Microsoft.SqlServer.SqlManagementObjects.140.17283.0\lib\net40\Microsoft.SqlServer.SqlEnum.dll")

[MyClass]::create_sql()




posted by at 2018-10-19 15:54 | PowerShell | このブログの読者になる | 更新情報をチェックする

2018年10月16日

DAZ3D : 荒れた宇宙船内を見廻るトロール



いつだったか、100% オフだったトロールです。もともと、たいした造形では無いので、一番かっこよく見える角度で歩かせてみました。マテリアルも、当然 Iray では無いので自己チューニングでちょっと光沢気味で濃い茶色にして、ライトで明暗付けてそもそも暗い場所で撮影。

なんですが、よくよく見ると、あと一歩でたぶん穴に転げ落ちると思われます...



Troll : $24.95




posted by at 2018-10-16 22:02 | Iray DAZ3D DAZStudio イラスト | このブログの読者になる | 更新情報をチェックする

あの台風21号でぶっ倒れたTVのアンテナがやっと今日立ち直った


※ 台風というキーワードではこれが一番良かった。PNG の背景を灰色でかるくさっと色ぬって使用
※ ▼ Twitter の見栄えもとてもいい感じ


長かったです。

関西ではアンテナどころか、瓦が飛びまくったのでまだ修理できていない家ばかりですが、それでもアンテナがぶっ倒れると TV が映らないわけで、家族にはブースター付きの室内アンテナを購入しましたが、それが使える TV は居間の1台なのでいろいろ愚痴も言われたわけです。

なにせ、上新へのアプローチが一日遅れただけで、2週間も工事日が遅れました( 速攻で行った近所でも一週間後だった )。さらにその日が 9月の29日という最低な運命で、その日も台風24号の影響で工事が中止され、というかその日は尿管結石で入院したため自宅に居ないというのも相当不運です。

結局工事がさらに17日も伸びた今日になったわけですが、天気予報を見ながら不安でありましたが、今日は天気に恵まれて無事工事が終了したわけです。


※ アンテナの工事なのでこれがぴったり。一応本物は2段になるのですけれど
※ アンテナ施工法( DXアンテナ : PDF )


しかし、アンテナ設置に3時間もかかるとは思わなかったです。根本的にぶっ倒れてるので、屋根の四方から固定する作業もあったかもしれませんが、けっこうやきもきしました。家の中では TV のアンテナ強度サーチボタンをいつでも押せる状態でジリジリ待ってました。

で、びっくり。

もともと34年も使ってたアンテナなんで、ぶっ倒れる前の強度もしれてたんですが、今回新しいアンテナでは一番強度の高い部屋ではほぼ全て 99% でした。居間でも全て 90% 超えていたのでほっとしました。何せ、場合によってはブースター入れるとか言われてましたし( 1万6千円もするのですが、まあ必要ないとは思ってましたが... )、万が一ちゃんと映らなかったらまた愚痴いわれるし。


で、最初の見積もりよりも千円安かったし( それでも3万 )、サンTV もちゃっん映ってるのでめでたしです。



※ イラストAC よりフリーダウンロード


あ、そうそう。上新の業者さんですが、きっちりとした制服の感じのいいおじさんでした。職人風の人が来たらどうしようかと思いましたが、最後にアンケートを求めるあたり関西電力の駆けつけサービスと良く似た手法です( 関西電力は、電話かけて来て聞かれましたけどね )。




posted by at 2018-10-16 19:19 | 生活 : トラブル・知恵 | このブログの読者になる | 更新情報をチェックする

PowerShell 内に、C# を書いて、TKMP.DLL でメール受信

powershell -NoProfile -ExecutionPolicy Unrestricted .\mail_rec.ps1 > log.txt
.NET用メール送受信クラスライブラリ (TKMP.DLL) ▼ さくらインターネットのメールでテストしています mail_rec.ps1
$code = @"
using System;
using TKMP.Net;
using TKMP.Reader;
public class MyClass {
	public static void mail_rec() {

//public class MyClass
//{
//	public static void Main()
//	{
		ImapClient client = null;

		BasicImapLogon logon = new BasicImapLogon("ユーザ@さくらユーザ.sakura.ne.jp", "パスワード");
		client = new ImapClient(logon, "さくらユーザ.sakura.ne.jp", 993);
		client.AuthenticationProtocol = AuthenticationProtocols.SSL;

		try
		{
			if (!client.Connect())
			{
				Console.WriteLine("接続できませんでした");
				return;
			}
		}
		catch (Exception ex)
		{
			Console.WriteLine("接続エラーが発生しました" + ex.Message );
			return;
		}

		// メールデータ一覧を格納するオブジェクト
		IMailData[] mailData = client.GetMailList();

		// データがありません
		if (mailData == null)
		{
			Console.WriteLine("データがありません");
			return;
		}

		int maxCount = 100;
		int mailCounter = 0;

		// メールデータの数
		Console.WriteLine(mailData.Length);

		mailCounter = mailData.Length;
		if (mailCounter < maxCount)
		{
			maxCount = mailCounter;
		}

		// 読込み
		int idx = 0;

		// メールデータを表示するループ
		foreach (var data in mailData)
		{

			idx++;
			if (idx > maxCount)
			{

				break;
			}

			data.ReadBody();

			Console.WriteLine("■■■【" + idx +"開始】------------------------");

			// 本文無し( 本文が必要な場合は、false で、reader.MainText )
			MailReader reader = new MailReader(data.DataStream, false);

			if (reader.FileCount == 0)
			{
				Console.WriteLine("添付ファイルはありません");
			}

			//添付ファイルのコレクションを検査します
			foreach (TKMP.Reader.File file in reader.FileCollection)
			{
				// 保存場所は事前に作成する必要があります
				// (メールとの関連は、アプリケーション側で工夫する必要があります)
				file.FileSave(@"c:\temp\data\");
			}

			// UID ( ユニークなメールのID  )
			// ▼ tkmp リファレンス : http://uwa.potetihouse.com/library/tkmp/document/html/P_TKMP_Net_MailData_Imap_UID.htm
			// この値は各メールデータ毎にユニークであることをサーバーが保証しているので、既読メールの識別にはこの値を使用してください
			Console.WriteLine("UID : " + data.UID);

			// メールサイズ
			Console.WriteLine("サイズ : " + data.Length);

			// 本文( 本来はファイルかデータベースに書きだす )
			Console.WriteLine("▼【本文】------------------------");
			Console.WriteLine(reader.MainText);
			Console.WriteLine("▲【本文】------------------------");

			// ヘッダの一覧より、目的のヘッダを探す
			// http://uwa.potetihouse.com/library/tkmp/document/html/AllMembers_T_TKMP_Reader_Header_HeaderString.htm
			foreach (TKMP.Reader.Header.HeaderString headerdata in reader.HeaderCollection)
			{

				if ( headerdata.Name == "From" || headerdata.Name == "Subject" || headerdata.Name == "Date" ) {
					if (headerdata.Name == "From") {
						Console.WriteLine("【FROM】" + headerdata.Data);
					}
					if (headerdata.Name == "Subject") {
						Console.WriteLine("【件名】" + headerdata.Data);
					}
					if (headerdata.Name == "Date") {
						Console.WriteLine("【日付】" + headerdata.Data);
	
						string target = headerdata.Data;
						target = target.Replace(" (JST)", "");
						target = target.Replace(" (PDT)", "");
						try
						{
							DateTime dt = System.DateTime.ParseExact(target, "ddd, d MMM yyyy HH':'mm':'ss zzz", System.Globalization.DateTimeFormatInfo.InvariantInfo, System.Globalization.DateTimeStyles.None);
							Console.WriteLine("【編集日付】" + string.Format("{0}", dt));
						}
						catch (Exception ex)
						{
							Console.WriteLine("【変換エラー】" + headerdata.Data);
							Console.WriteLine(headerdata.Data + " はフォーマット変換できませんでした" + ex.Message);
						}
	
					}
				}
				else {
					Console.WriteLine("【" + headerdata.Name + "】=>" + headerdata.Data);
				}

			}

			Console.WriteLine("■■■【" + idx +"終了】------------------------");
			Console.WriteLine("");


		 }

		// 受信終了
		client.Close();


	}
}
"@

$path = "C:\user\dll"
Add-Type -Path ("${path}\TKMP.dll")
Add-Type -Language CSharp -TypeDefinition $code -ReferencedAssemblies ("${path}\TKMP.dll")

[MyClass]::mail_rec()


関連する記事

PowerShell2.0 : PowerShell 内で VBのコードを記述(TKMP.dllを使用)して、exe を作成した後実行してメールを送信する



posted by at 2018-10-16 11:51 | PowerShell | このブログの読者になる | 更新情報をチェックする

2018年10月13日

13日間の入院中(21万支払った)に時間がたっぷりあったので DAZ3D の過去作品をスレッドで投稿して、ハート3つ以上あったやつ

尿管結石で最初別の病院に救急車で運ばれて、そこで4万も支払ったのに痛みが引いた朝に妙な主治医が現れて、開口一番『ウチでは手術できないんで、居ててもムダだから退院しますか?』って言われた。

後から考えるといろいろふざけんなですが、その時も痛み引いてもう大丈夫と思い込んでたのでそのまま退院。しかし、尿管結石がそんなに簡単に終わるもので無い事をこの後思い知るわけです。

運の悪い事に、翌日の退院が土曜で次の週の月曜が祝日の為、火曜まで次の病院にも行くことができず最初の病院で退院時にもらった痛み止め座薬3つで耐えたわけです。

で、いまだに石はおなかの中にあるわ、腎臓から尿漏れしてたのでDJカテーテルが尿管に入ってるわ、次の石叩きの手術が8万もして25日に仕事休んで受けなければならないんだけど、それでも石が無くなる保証は全く無いので何も終わらないというやるせない生活が今現在進行形です。

入院中投稿した DAZ3D のイラスト(ハート3以上)





















posted by at 2018-10-13 20:52 | Iray DAZ3D DAZStudio イラスト | このブログの読者になる | 更新情報をチェックする

Windows 10 Update (1803/1809) + HP製のPCで HpqKbFiltr.sys が原因で WDF_VIOLATION が起こり、BSOD(ブルースクリーン)が発生する深刻な不具合の対処方法

コンピュータの専門学校です。10/11 の更新で入り込み、10/12 は起動して、その後再起動すると発生するというパターンでかなりの PC がアウトになりました。幸い、10/11 時点で被害にあった PC が留学生だったので、早々に英語圏の記事を見つけて対応に至りました。

HP PCs Getting WDF_VIOLATION BSOD After Installing Windows 10 Updates

ただ、目的の作業はとても簡単なのですが、コマンドプロンプトを開く必要があるので、Windows10 が『修復してみます』とか言って頑張るので時間がかかってしまいました。要するに画面から『詳細オプション』を選択できるようにならないといけません。

▼ こういうやつです


ここから、コマンドプロンプトを選択できるメニューに移動できればすぐ復旧できます。

コマンドプロントが表示されたら x ドライブの可能性があるので、c: と入力して c ドライブに移動して以下のコマンドを実行します
cd c:\windows\system32\drivers
ren HpqKbFiltr.sys HpqKbFiltr.sys.bak
これで、10/12 のトラブルは対処しました。 ただ、HP PCs Getting WDF_VIOLATION BSOD After Installing Windows 10 Updates での説明は既に別の方法に変更されており、この方法は正式な対応のようですが、ちょっと難解なので ren での対応が簡単であると現状では認識しています。 ▼ 昨日時点の記事内容
コマンドプロンプトが開きます。 このコマンドプロンプトでは、コンピュータのハードドライブに関連付けられているドライブを特定する必要があります。 次に、[drive_letter]:\ Windows \ system32 \ driversに移動し、HpqKbFiltr.sysファイルの名前をHpqKbFiltr.sys.bakに変更します。

ドライバフォルダ内で、ren HpqKbFiltr.sys HpqKbFiltr.sys.bakコマンドを使用してファイルの名前を変更できます。ファイルの名前を変更したら、exitと入力してコンピュータを再起動します。 Windows 10が正しく再起動するはずです。
posted by at 2018-10-13 14:34 | Windows | このブログの読者になる | 更新情報をチェックする

2018年09月01日

Google Chrome で今入力してるテキストフィールドの候補を選択して削除

下矢印で選択して 『SHIFT+DELETE』です。

※ Chrome のキーボード ショートカット で、『アドレスバーのショートカット』

※ Mac は shift+fn+delete






Chrome 上で Ctrl+Shift+Delete では、一括で削除する為のダイアログが表示されます( 候補選択中は候補の削除 )が、これは主にキャッシュの削除で使用します。( 期間を選択できるので適宜 / 普通は全期間でいいと思いますが )






posted by at 2018-09-01 13:04 | Google Chrome | このブログの読者になる | 更新情報をチェックする

2018年08月20日

DAZ3D : モーフを過去世代から移植して、スキンをかぶせると新しいキャラが出てきて楽しい

DAZ3D : G2 で過去作成したキャラを G8 に転送する( システムに保存せずにシーンとして保存する )

G8 フィギュアには、G3 の UV とほぼ一致するらしく、スキンが使える。しかし、手始めに G8 用オリジナルフィギュアに G8 用の別のフィギュアのスキンを使ってみたのですが...



▼ 彼女の本来の姿は下の画像です。



つまり、宇宙人なのでこの耳がデフォルトなので『耳のモーフ』が無いので髪の毛装着すると auto_follow で耳部分が突き出るけれどオフにするモーフが無いわけです。

なので、髪の毛を手作業で調整しながら FIT させて、HEAD を親にして固定するという方法を取り、耳部分を surface で透明にするという手法を取っています( 面倒くさい... )

そして、怒りの顔の上半分表情を適用

※ 表情は Grimaces - Expressions for G8F から顔の上下部分で分解したポーズを適用



スキンは、▼ 彼女を使用しています



肌の色が濃いので、ライトでメリハリと思ったのですが、Skin Doctor 使っ手っとりばやく。一応、Opacity でテカリを軽減させてますが、あまり変わらない。ライトは大きなのを遠めで使ってレンダリング。

時間かかりそうだったので、そのまま就寝。で、朝投稿( Twitter & Tumblr )




posted by at 2018-08-20 13:10 | DAZStudio | このブログの読者になる | 更新情報をチェックする

2018年08月17日

DAZ3D : 今日家に着いたらやる事 / 極端感情モーフの顔の上下分解

Grimaces - Morph Dial & One-Click Expressions for Genesis 3 Female

完全にはうまくいかないのは解ってるんですが、いろいろ試したところ感情モーフ + 他の顔ポーズで成り立ってるようなのです。それならば、Shape や Pose で保存する時のカスタマイズまたは、GenX のモーフ別の選択で G8 に転送できないかを試そうと思ってます。

 

上の画像は、モーフ以外に使用されている顔のパラメータをリセットして顔の下半分の表情を抑えたもので、個別にやるには時間かかりすぎるので、ファイルベースで保存・再現できたらいいなぁと。

しかし、時間さえあればプログラマなんだから、テキストベースのデータ、またはスクリプトでなんとかいろいろこねくり回したいんですが...
レンダリングした画像ですら、Twitter に投稿して力尽きる状態が続いてるので、困ったもんです。




posted by at 2018-08-17 13:35 | DAZStudio | このブログの読者になる | 更新情報をチェックする

2018年08月16日

DAZ3D : G8 に G3 のポーズを正しくさせる

G8 は G3 からのバージョンアップを想定して設計されたんだろうなぁ、と思いますが、昔の DAZ からはシステム的にもとても良くなったなと思います。DAZStudio 3 のころは『DAZクオリティ』と言って、とても一般人が使えたものではなかったですから。

という事で、G3 から G8 へのモーフの移植は以下の記事で一応の完結です。

1) G3 から G8 へモーフをマニュアルで転送する

2) G2 で過去作成したキャラを G8 に転送する( システムに保存せずにシーンとして保存する )
1) では最後の Save as>Support Asset>Morph Asset の処理で常にG8に表示されるモーフとなります

2) ではその作業を省いてシーンとして保存し、必要ならば『常にG8に表示されるモーフ』

また、2) では、1世代間のモーフの移植作業の基本作業まの説明でもあります。サンブルとして G2>G3 のモーフを作成してから、G3>G8 の作業に使用するという内容です。( G3 > G8 で G3 の転送するモーフをスライダーで設定する替りに Morph Loader Pro を使用して一時的にモーフ・スライダを実装して使うという内容になっています。 )

2段階になっているのは、G3 > G8 が他と少し違う手順なので、一旦 G3 のモーフを作成して使えば良いという結論てす。

V4 > G3 は GenX とG3 用のプラグインが必要ですが、そこから G8 へは転送しました。( G1(Hitomi) > G3 はテストしたんですが、何故か結果が不安定だったので別のキャラでのテストは保留中です )
モーフが OK なら次は Pose これは、G3 > G8 は一瞬で解決しました。探してすぐ見つかったのがレンダロの FreeStaff で、G3 のポーズを適用した後に生じるズレを補正するスクリプトです。 G3 G8 Pose Adjust Scripts しかも、スクリプトは 3つ あって、 Full / Legs / Arms と状況に応じて使い分ける事ができます。 これで、G3 > G8 のポーズは解決ですが、G3 と G8 の互換性設計のせいか、G3 の Skin(UVs) が G8 で使用できます( 完全では無いらしいですが、現在見た目で問題感じてません ) とすると、残ってる問題は G2 > G3 です。 これはさすがに、製品しか無いようです... 2・3時間一応探したんですが、ダメでした。1ポーズならば、モーフとして考えて転送する方法はあったのですが、ほぼ後から使い物になんないですし。 Genesis 2 to Genesis 3 Pose Converter $15.95 Legacy UVs for Genesis 8: Genesis 2 Female $21.95 まあ、このあたりでしょうか。自分は G2 が一番リソースが多いので、Genesis 2 to Genesis 3 Pose Converter は欲しいです。G2 のスキンはあまりいいものがなさそうなのでたぶん必要無いでしょう。
posted by at 2018-08-16 13:06 | DAZStudio | このブログの読者になる | 更新情報をチェックする

2018年08月15日

DAZ3D : G2 で過去作成したキャラを G8 に転送する( システムに保存せずにシーンとして保存する )

『DAZ3D : G3 から G8 へモーフをマニュアルで転送する』 での一連の処理の結果、システムにモーフが登録されて、以降 G8 フィギュアには常に『Morphs > Morph Loader』が存在します。



しかし、これらのモーフを常に運用するわけでも無いのでシーンファイルとして(キャラクタとして)保存してしまおうと思います。

システムのファイルは 『C:\Users\Public\Documents\My DAZ 3D Library\data\DAZ 3D\Genesis 8\Female\Morphs』の下にベンダー\Product( うちの環境では、ベンダーは sworc ) として Aiko7.dsf というような形で保存されています。これらのファイルは、単独で削除すればそのモーフはシステムより削除され、ベンダーフォルダごと削除すると全て削除されます。

バックアップすれば戻せるはずなので、まずはバックアップして全て削除しました。

『DAZ3D : G3 から G8 へモーフをマニュアルで転送する』で必要なファイルは、G8 用の obj ファイル か G3 用の obj ファイルになります。なので、どちらかというとそちらのほうが管理すべきファイルなので、作成したら世代別のフォルダに置いておくといいでしょう。

Genesis からも G8 へ転送できますが、Hitomi を Genesis > G3 の obj ファイルを作成したのですが、そのキャラを使っていると DAZStudio が落ちたりしたので G2 で行います。

G2 のキャラクターファイルを作成



パラメータタブの Zero メニューで Zero Figure Pose でポーズをリセットして Giselle6_character.duf として保存しました。これは他の目的でも使用できる普通のファイルです。

G3 を新しいシーンとしてロード



Subdivision Level を 0 に変更して、Hidden の中にあるクローンで Genesis2 Female を 100%にします。



その後 エクスポートで Giselle6_G3.obj として保存します。
※ その際、To で、DAZ Studio を選択して、Write Groups のチェックを外す(Write Groups のチェックを外す とカスタムになるけど気にしない)

G2 をロードしてキャラクタを適用

保存しておいた、Giselle6_character.duf を使用して G2 に適用します。
肌色がキャラクタが適用されたG2 で、このシーンに対して、Giselle6_G3.obj を インポートします。



そして Edit > Assets > Transfer Utility で G2 と Giselle6_G3 を一致させます





次にこれが重要ですが、Genesis2 を非表示にしてから、最後に、この結果を Giselle6_G3_Morph.obj として保存します



このファイルが、G3 に対して Morph Loader Pro で使うモーフファイルとなります。これを実行すると、G3 が G2 のモーフを使えるようになります。

G3 > G8 の手順を開始する

なので、『DAZ3D : G3 から G8 へモーフをマニュアルで転送する』 の 『シーンとして一旦保存』しておいたシーンの G3 に対して Morph Loader Pro でロードします。ロードしたら、Morphs > Morph Loader にモーフが登録されているので( これはこのシーンのみの登録 )、100% で適用します。

すると、ここではとてもおかしな状態になりますが、Edit > Rigging > Adjust rigging to shape で正常になります。
( このキャラクタは特別で、基本的には気づかないと思います )



Adjust rigging to shape の後は、Morphs > Morph Loader ツリーに作成したモーフがあるので、右クリックして Edit モードにして、そのモーフで右クリックして ERC Freeze を選択して Accept。

しかし、G8 に移す為にこの内容をさらに Giselle6_G8_Morph.obj としてエクスポートします。

G8 を新しいシーンとしてロードする

再び Morph Loader Pro で、Giselle6_G8_Morph.obj を読み込みます。

Edit > Rigging > Adjust rigging to shape と ERC Freeze を行って、シーン(G8_Giselle6)として保存します。

G8_Giselle6 では、もともとの筋肉美が失われているので、G8 のモーフで筋肉を再生して使用しています。

※ スキンは G3 のものが使用できます。



左 : G2, 中央 : 転送した G8, 右 : 筋肉モーフで調整

システムに登録したい場合は

G8_Giselle6 をロードして、Save as > Support Asset > Morph Asset で Genesis8 のツリーを開けて Morphs > Morph Loader 内の Giselle6_G8_Morph をチェックして Accept します。







posted by at 2018-08-15 13:07 | DAZStudio | このブログの読者になる | 更新情報をチェックする