Translate

2026年8月13日木曜日

Hello, World

windowsで実行


main = putStrLn "Hello, World!"

runghc ./ファイル名.hs
→コンパイルして実行(実行ファイルは生成しない)

ghc ./ファイル名.hs
→ファイル名.hi, ファイル名.o, ファイル名.exe を作成
./ファイル.exe

2024年2月10日土曜日

PowerShellメモ

■PowerShell ISE
PowerShellスクリプト開発環境のことデバッグ機能、入力支援機能あり

■変数作成
宣言はなし。値代入により変数が作成される。

$ + 変数名 で作成できる。

$str = "あいうえお" 
$int = 10 
 ※大文字小文字は識別されない 

■標準出力
Write-Host 変数名 で出力 

■strictモード
以下のようにタイプミスしても何も表示されない
$string = "Hello World!"
Write-Host $sting

そのため set-psdebug -Strict を記載すると
それ以降で、変数が作成されていないのに利用しているとエラーとなる

set-psdebug -Strict $string = "Hello World!"
Write-Host $sting

>変数 '$sting' は、設定されていないために取得できません。

■変数の型
// 整数
Byte (8bit 符号なし) 
Char (16bit 符号なし) 
UInt16(16bit 符号なし) 
UInt32(32bit 符号なし) 
UInt64(64bit 符号なし) 
 SByte (8bit 符号あり) 
Int16 (16bit 符号あり) 
Int32 (32bit 符号あり) 
Int64 (64bit 符号あり) 

 // 他
Decimal 
Double 
Boolean 
DateTime 
String 
Object 

代入した際に型が自動的に決まってしまうので、数値については 
下記のように型を記載することで指定できる

[Byte]$num = 255
参考:
以下によって変数の型が取得できる
set-psdebug -Strict
$str = "文字列"
Write-Host $str.GetType()

■型変換
変数 -as データ型 で変換できる

$numstr = "123"
$num = $numstr -as [Int16]


■文字列中の変数展開
set-psdebug -Strict
$num = 123

Write-Host "`$numの値は、 $num です"
Write-Host "`$numの値は、${num}です"

半角スペースで区切れている場合は、よいが区切れていないと変数名の切れ目が意図したところにならないので{}で囲む
また、$自体をエスケープするには `(バックくぉーと)を使う
カレントフォルダで Name列が sで始まるデータに絞り込み全列表示


■定数
Set-Variable -name keisu -value 0.5 -option constant
$keisu = 0.6

>変数 keisu は読み取り専用または定数であるため、上書きできません。


■特別な変数
$Args…引数が格納されている

$True…True
$False…False
$NULL…Null

$This…オブジェクト自身

$Error…エラー


■配列の初期値
①コンマ区切りで指定する
$dataList = "aaa", "bbb", "ccc"
Write-Host $dataList #aaa bbb ccc

$dataList = 100, 200, 300
Write-Host $dataList

$dataList = 3..5 #連続する数値を配列に指定
Write-Host $dataList.Count #3

②@()を使う
$dataList = (100, 200, 300)
Write-Host $dataList #100 200 300


■配列の初期値(1要素の配列)
①@()を使う
$dataList = @(100)
Write-Host $dataList[0]

②,とデータを指定する
$dataList = ,100
Write-Host $dataList[0] #100

■要素を追加
$dataList = @("aaa", "bbb", "ccc")
$dataList += ("ddd")
Write-Host $dataList #aaa bbb ccc ddd
※System.String[]では、Addではなく += で追加


■要素を削除
削除したい要素以外のデータで配列を作り直す
$dataList = @("aaa", "bbb", "ccc", "ddd", "eee")
$dataList = $dataList[0..2] + $dataList[4]
Write-Host $dataList #aaa bbb ccc eee

■配列の個数
$変数名.length … 個数 #Countを同じ

■多次元配列
$data = New-Object 'string[,]' 2,3
$data[0,0] = "0,0"
$data[0,1] = "0,1"
$data[0,2] = "0,2"

$data[1,0] = "1,0"
$data[1,1] = "1,1"
$data[1,2] = "1,2"

Write-Host $data #0,0 0,1 0,2 1,0 1,1 1,2


■ジャグ配列
$data = @(@(11, 12), @(21, 22, 23))
Write-Host $data #11 12 21 22 23



■算術演算子
+-*/%

■比較演算子
-eq …等しい
-ne …等しくない

-gt …より大きい
-ge …以上
-lt …より小さい
-le …以下

-like …ワイルドカードに一致
-notlike …ワイルドカードに不一致
※ *…以上にマッチ ?…1文字にマッチ

-match …正規表現に一致
-notmatch …正規表現に不一致

・文字、小文字の比較
Write-Host ("abc" -ceq "ABC") #大文字小文字区別
Write-Host ("abc" -ieq "ABC") #大文字小文字区別しない
Write-Host ("abc" -eq "ABC")  #デフォルトは大文字小文字区別しない

■論理演算子
-and
-or
-not
-!

■if文
if(条件){
}elseif(条件){
}else{
}

■switch
switch 条件
{
  値1{}
  値2{}
  …
  default{}
}
※途中で抜けたいときは、break

■for文
for($i = 0; $i -lt 10; $i++)
{
    if($i % 2 -eq 0) { continue }
    if($i -eq 9) { break }
    Write-Host $i  #1 3 5 7  
}

■foreach
foreach($num in $numList){
    write-host $num
}


■while
while(条件){}

■コメント
# 1行コメント

<#
複数行
コメント
#>

■改行、タブ
バッククォートをつける
`n
`t

■関数
--------------------------------------------
Echo("test")

function Echo($message){
    Write-Host $message
}
--------------------------------------------
#引数の型を定義することも可
function Echo([string]$message){
    Write-Host $message
}
--------------------------------------------
2つの値を足して、結果を返す場合
function Plus([int]$num1, [int]$num2){ 
    return $num1 + $num2
}

$ans = Plus 10 20
Write-Host $ans

※関数に渡した際の型がよくわからない・・・
後で調べる
※参照渡しの場合は、呼び出す側、仮引数ともに[ref]をつける

■例外
try{
    throw "エラーのテスト"
}
catch
{
    Write-Host "catch $_"
}
finally
{
    Write-Host "finally"
}


■他後でまとめる
Get-ChildItem | Where-Object { $_.Name -Match "^s"}


カレントフォルダで Size列
Get-ChildItem | Where-Object { $_.Name -Match "^s"} | Select-Object Name

カレントフォルダ配下すべてに対し、 *.xml に絞り、更新日時でソートし、ファイル名の古パスを1件表示
Get-ChildItem -Filter *.xml -Recurse  | Sort-Object LastWriteTime -Descending |  Select-Object {$_.FullName} -first 1</div>

2023年9月29日金曜日

デバッグログ

Debug.unityLogger.logEnabled = false;//ログを出力しない Debug.unityLogger.logEnabled = true; //ログを出力する

2021年6月26日土曜日

SQLite

■テーブルがなければ作る CREATE TABLE IF NOT EXISTS [テーブル名]~ ■AUTO INCREMENT SQLiteとしては、おすすめしていないため、使わないとすると CREATEテーブルで INTEGER と PRIMARY KEY を設定することで INSERT時、何もあたいを指定しないとROWIDが設定されるとのこと 例 CREATE TABLE [Employee] ( [id] INTEGER PRIMARY KEY, [name] TEXT NOT NULL) INSERT INTO ([name]) VALUES('NAME1') この場合自動的に、ROWIDのあたいを使う。 AUTO INCREMENTは、行をDELETEしてもIDを再利用しないため増える一方であるが AUTO INCREMENTを指定しない場合、基本的には増える一方であるが、DELETEした場合は再利用を行う点が違う。 そのため、外部キー等でいくつのIDが設定されているか知りたい時は、 SELECT last_insert_rowid() といった感じで最後にしようしたあたいが取得できる

2020年3月20日金曜日

TypeScriptメモ

■クラス
・クラス
class クラス名 {}

・コンストラクタ
class クラス名{
    constructor(){
    }
}

・インスタンス変数
class クラス名{
    public 変数名: 型;
    private 変数名: 型;

    // getter
    public get 名前() {
        return this.変数名;
    }

    // setter
    public set 名前(変数名){
        this.変数名 = 変数名
    }
}

public 変数名は、constructorでも設定可能
class クラス名{
    constructor(public 変数名: 型){} // publicをつけると public 変数名を書いたのと同じになる
}

・インスタンスメソッド
class クラス名{
    public メソッド名(){}

    private メソッド名(){}
}


2020年3月8日日曜日

vscodeメモ

定義に移動
win
ctr + マウスオーバー でクリック

mac
Option + マウスオーバーでクリック

2020年3月2日月曜日

トグルスイッチ

あとで眺める
https://www.designlabthemes.com/css-toggle-switch/

VSCodeでTypeScriptを軽く触る時の最低限のメモ

◆達成したいこと。

ちょっとTypeScriptを使ってコードを書いて見たい場合に、
html/js/TypeScriptのいずれも保存時自動で更新するようにしたい

◆やったこと
html/jsの保存時、自動更新は拡張機能のLive Serverを使用
TypeScriptについては以下のようにした

VSCodeでプロジェクトのルートフォルダを開くためcodeコマンドを実行
$ code フォルダパス

TypeScriptとをインストール
$ npm i typescript


package.jsonを作成
$ npm init -y

package.jsonにtscコマンドを指定
  "scripts": {
    "watch": "tsc -w"
  },

フォルダ構成
下記のようにしたいので
├── node_modules
├── src
│ ├─js
│ ├─ts
│ └─index.html
├── package-lock.json
├── package.json
└── tsconfig.json

tsconfig.jsonを作って場所を設定する
$ tsc --init
"outDir": "./src/js",


後は、Live Serverを起動した状態で、
$ npm run watch でtsの保存を監視してコンパイルさせるようにする

2020年2月9日日曜日

VSCode複数起動

見比べたくて複数起動したかったのでメモ

mac: shift + command + n
win: shift + control + n

VSCodeでHTML書く時用のメモ

Emmet+VSCodeのショートカットのメモ

◾️HTML5の雛形
! + [Tab]

◾️次の行へ移動し空行追加
[Ctrl] + Enter

◾️タグ
基本的にはタグ名 + Enter

id属性は
タグ#id + Enter

class属性は
タグ.Class + Enter

それ以外は
タグ:属性 + Enter

2019年3月18日月曜日

memo

@echo off

cd /d %~dp0

set LockFile=nolock

:Loop
if exist %LockFile% (
if exist %LockFile%/ (
timeout /t 3 > nul
goto Loop
)

rem 存在する場合そのまま

) else (
echo 存在しない
type nul > %LockFile%
timeout /t 3 > nul
goto Loop

)

rem ------------------


pause

2018年8月12日日曜日

test

test

2018年7月7日土曜日

SQLiteのNuget

.net framework
System.Data.SQLite

.net core
Microsoft.Data.Sqlite

.net core でSQLite EF
Microsoft.EntityFrameworkCore.sqlite
Microsoft.EntityFrameworkCore.tools

2018年6月10日日曜日

AOLのjoinエラー

error CS1502: The best overloaded method match for `string.Join(string, string[])' has some invalid arguments /usr/lib/mono/2.0/mscorlib.dll
(Location of the symbol related to previous error)

文字列でない配列をジョインするときにエラーになるので型変換が必要
string.Join(" ", (string[])data.ToArray())

2018年6月2日土曜日

onLoad と DOMContentLoadedの違いメモ

window.addEventListener("load", function(e) {
alert("load");
});

document.addEventListener('DOMContentLoaded', function (e) {
alert("DOMContentLoaded");
});


loadイベントは、リソースおよびその依存リソースの読み込みが終わると発生します。。
load


HTMLのDOMツリーを解析完了した時点で発生する
DOMContentLoaded

2018年3月25日日曜日

App Serviceにフォルダ追加

App ServiceでImageディレクトリ配下に作ったディレクトリがデプロイで作られないようなので…
直接作成

azureにログイン
該当のApp Serviceを選択
App Service Editorを選択
(右画面に 移動→ が出るので選択)


下記画面が開くので該当ディレクトリを選択して右クリックで追加できます

2018年3月23日金曜日

スクリプトを用いたデータの出力

Microsoft SQL Server Management Studioで該当データベースを選択して右クリック

スクリプトの生成 を選択

□説明画面
次へ

□オブジェクトの選択
特定のデータベースオブジェクトを選択
出力対象のテーブルを選択
次へ

□スクリプト作成オプションの設定
詳細設定->スクリプトを作成するデータの種類:データのみ->OK
次へ

□概要
次へ

出力される

2018年2月25日日曜日

Visual Studio ブラウザの追加

ASP.NET開発時に開くブラウザの追加。
Google Chromeのシークレットを追加する。

ブラウザの一覧から、ブラウザーの選択を開く
追加から

プログラム:
C:\Users\[User名]\AppData\Local\Google\Chrome\Application\chrome.exe

引数:
--incognito

名前:
適当につける




以上

2017年12月19日火曜日

DebugModule.bas

Option Explicit
Private Indent          As Integer
Private Prefix          As String
Private FH              As Object
Private FlagNotime          As Boolean
Private FlagDebugPrint  As Boolean

Private Declare Sub Sleep Lib "Kernel32" (ByVal dwMilliseconds As Long)
Sub DebugPrint(ByVal VarName As Variant, Optional ByVal Filename As String = "Debug.txt", _
               Optional ByVal TypeNameFlag As Boolean = False, Optional ByVal IndentCount As Integer = 4, _
               Optional NotimeFlag As Boolean = False, Optional DebugPrintFlag As Boolean = False)
    '必須:
    'VarName: データ構造を知りたい変数名を指定
    
    'オプション:
    'Indentcount: 配列、コレクション、Dictionaryなどネストして表示されるデータの全角スペースの数
    'TypeNameFlag:全ての型を表示したい時にTrue
    '----------------------------------------------------------------------------------------------
    
    '再帰呼出で、トップの時⇒追記状態でファイルオープンしておく
    If Indent = 0 Then
        FlagNotime = NotimeFlag
        FlagDebugPrint = DebugPrintFlag
        If Not FlagDebugPrint Then Call FileOpen(Filename)
    End If
    
    
    Dim i As Long
    Dim key As Variant
    If TypeName(VarName) = "Byte" Or TypeName(VarName) = "Integer" Or _
       TypeName(VarName) = "Long" Or TypeName(VarName) = "String" Or _
       TypeName(VarName) = "Single" Or TypeName(VarName) = "Double" Or _
       TypeName(VarName) = "Currency" Or TypeName(VarName) = "Date" Or _
       TypeName(VarName) = "Boolean" Or TypeName(VarName) = "Boolean" Then
        
        Call Output(TypeName(VarName), IndentCount, TypeNameFlag, VarName)

    ElseIf TypeName(VarName) = "Empty" Or TypeName(VarName) = "Null" Or _
           TypeName(VarName) = "Nothing" Or TypeName(VarName) = "Unknown" Then
        
        Call Output(TypeName(VarName), IndentCount, TypeNameFlag)
        
    ElseIf 0 < InStr(TypeName(VarName), "()") Then
        '2次元配列まで対応!3次元以上はNG!
        Dim temp As Integer, Dimension As Integer
        On Error Resume Next
        temp = UBound(VarName, 3)
        If Err.Number = 0 Then
            MsgBox "配列は3次元配列以上は未対応です"
            End
        End If
        
        Err.Clear
        temp = UBound(VarName, 2)
        Dimension = IIf(Err.Number = 0, 2, 1)
        On Error GoTo 0
        
        
        Call Output(TypeName(VarName), IndentCount, TypeNameFlag)
        
        '1次元配列か2次元配列かで処理を分岐
        Indent = Indent + 1
        If Dimension = 1 Then
        '1次元配列の処理
            For i = 0 To UBound(VarName)
                Prefix = "(" & i & "): "
                Call DebugPrint(VarName(i), IndentCount, TypeNameFlag)
            Next
            
        ElseIf Dimension = 2 Then
        '2次元配列の処理
            Dim ii As Long
            For i = 0 To UBound(VarName, 1)
                For ii = 0 To UBound(VarName, 2)
                    Prefix = "(" & i & "," & ii & "): "
                    Call DebugPrint(VarName(i, ii), IndentCount, TypeNameFlag)
                Next
            Next
        End If
        Indent = Indent - 1
    ElseIf TypeName(VarName) = "Collection" Then

        Call Output(TypeName(VarName), IndentCount, TypeNameFlag)
        
        Indent = Indent + 1
        For i = 1 To VarName.Count
            Prefix = i & ":"
            Call DebugPrint(VarName.Item(i), IndentCount, TypeNameFlag)
        Next
        Indent = Indent - 1
    
    ElseIf TypeName(VarName) = "Dictionary" Then

        Call Output(TypeName(VarName), IndentCount, TypeNameFlag)
        
        Indent = Indent + 1
        For Each key In VarName
            Prefix = "[" & TypeName(key) & "]" & key & " => "
            Call DebugPrint(VarName.Item(key), IndentCount, TypeNameFlag)
        Next
        Indent = Indent - 1
        
    End If
     
    '再帰呼出で、トップの時⇒追記状態でファイルオープンしておく
    If Indent = 0 And Not FlagDebugPrint Then Call FileClose
End Sub

Sub Output(ByVal TypeVarName As String, ByVal IndentCount As Integer, ByVal TypeNameFlag As Boolean, Optional ByVal VarName As Variant = "")
    If IndentCount < 0 Then IndentCount = 0
    
    Dim OutPutData As String
    If TypeNameFlag Then
        OutPutData = String(Indent * IndentCount, " ") & Prefix & "[" & TypeVarName & "]" & VarName & vbCrLf
            
        If FlagDebugPrint Then
            Debug.Print Replace(OutPutData, vbCrLf, "") '改行ははずす
        Else
            FH.Write OutPutData
        End If
    Else
        If 0 < InStrRev(Prefix, "]") Then
            Prefix = Right(Prefix, Len(Prefix) - InStrRev(Prefix, "]"))
        End If
        
        If 0 < InStr(TypeVarName, "()") Or TypeVarName = "Collection" Or TypeVarName = "Dictionary" Then
            OutPutData = String(Indent * IndentCount, " ") & Prefix & "[" & TypeVarName & "]" & VarName & vbCrLf
            
            If FlagDebugPrint Then
                Debug.Print Replace(OutPutData, vbCrLf, "") '改行ははずす
            Else
                FH.Write OutPutData
            End If
        Else
            OutPutData = String(Indent * IndentCount, " ") & Prefix & VarName & vbCrLf
            
            If FlagDebugPrint Then
                Debug.Print Replace(OutPutData, vbCrLf, "") '改行ははずす
            Else
                FH.Write OutPutData
            End If
        End If
    End If
    
    Prefix = ""
End Sub


Private Sub FileOpen(ByVal Filename As String)
    '.txtが省略されていたら追加する
    If 0 = InStr(Filename, ".txt") Then Filename = Filename & ".txt"
    
    Dim FSO As Object, FilePath As String
    Set FSO = CreateObject("Scripting.FileSystemObject")
    

    If FlagNotime Then
        FilePath = ThisWorkbook.Path & "\" & Filename
        Set FH = FSO.OPenTextFile(FilePath, 2, True)
    Else
        FilePath = ThisWorkbook.Path & "\(" & Replace(Time, ":", "") & ")" & Filename
        Set FH = FSO.OPenTextFile(FilePath, 8, True)
    End If
    
    Set FSO = Nothing
End Sub

Private Sub FileClose()
    FH.Close
    Set FH = Nothing
    
    Sleep (1000) '同名ファイルに出力されるのを避けるため、1秒時間をおいている
End Sub


'■SampleCode
Private Sub SampleCode1()
    'Dummyデータ
    Dim varString   As String:   varString = "文字列"
    Dim varInteger  As Integer:  varInteger = 3
    Dim varLong     As Long:     varLong = 3
    Dim varDouble   As Double:   varDouble = 3.5
    Dim varBoolean  As Boolean:  varBoolean = True

    '■配列データの出力を行います
    Dim varArray(2) As Variant
        varArray(0) = varString
        varArray(1) = varInteger
        varArray(2) = varBoolean
    
    '※引数にデータ構造を見たい変数名を指定します
    '実行Excelファイルと同階層に (時間)Debug.txt として出力されます
    Call DebugPrint(varArray)
    '-----------------------------
    '[Variant()]
    '  (0): 文字列
    '  (1): 3
    '  (2): True
    '-----------------------------
End Sub

Private Sub SampleCode2()
    'Dummyデータ
    Dim varString   As String:   varString = "文字列"
    Dim varInteger  As Integer:  varInteger = 3
    Dim varLong     As Long:     varLong = 3
    Dim varDouble   As Double:   varDouble = 3.5
    Dim varBoolean  As Boolean:  varBoolean = True

    Dim varArray(2) As Variant
        varArray(0) = varString
        varArray(1) = varInteger
        varArray(2) = varBoolean
    
    '■Dictionaryの出力を行います
    Dim varDic As Object
    Set varDic = CreateObject("Scripting.Dictionary")
    varDic.Add "配列1", varArray
    varDic.Add "配列2", Array("a", "b", "c")
    
    '※引数にデータ構造を見たい変数名を指定します
    '実行Excelファイルと同階層に (時間)Debug.txt として出力されます
    Call DebugPrint(varDic)
    '-----------------------------
    '※ファイルの出力結果
    '[Dictionary]
    '配列1 => [Variant()]
    '  (0): 文字列
    '  (1): 3
    '  (2): True
    '配列2 => [Variant()]
    '  (0): a
    '  (1): b
    '  (2): c
    '-----------------------------
    
    '対応している変数形式は
    'String/Integer/Long/Single/Double/Currency/Date/Boolean/Byte/Variant
    '上記を用いた、Collection/Dictionary/配列(2次元配列まで)
End Sub

Private Sub SampleCode3()
    'Dummyデータ
    Dim varString   As String:   varString = "文字列"
    Dim varInteger  As Integer:  varInteger = 3
    Dim varLong     As Long:     varLong = 3
    Dim varDouble   As Double:   varDouble = 3.5
    Dim varBoolean  As Boolean:  varBoolean = True

    Dim varArray(2) As Variant
        varArray(0) = varString
        varArray(1) = varInteger
        varArray(2) = varBoolean
    
    Dim varDic As Object
    Set varDic = CreateObject("Scripting.Dictionary")
    varDic.Add "配列1", varArray
    varDic.Add "配列2", Array("a", "b", "c")
    
    
    'Q And A
    '■複数出力したとき、何の変数を出力したものか判断がつきにくい!
    ' なんとかしてほしい
    ' ⇒Filenameオプションにファイル名を指定してください
    Call DebugPrint(varArray, Filename:="Array.txt")
    Call DebugPrint(varDic, Filename:="Dictionary") '拡張子は書かなくても自動的.txtになります
End Sub


Private Sub SampleCode4()
    'Dummyデータ
    Dim varString   As String:   varString = "文字列"
    Dim varInteger  As Integer:  varInteger = 3
    Dim varLong     As Long:     varLong = 3
    Dim varDouble   As Double:   varDouble = 3.5
    Dim varBoolean  As Boolean:  varBoolean = True

    Dim varArray(2) As Variant
        varArray(0) = varString
        varArray(1) = varInteger
        varArray(2) = varBoolean
    
    Dim varDic As Object
    Set varDic = CreateObject("Scripting.Dictionary")
    varDic.Add "配列1", varArray
    varDic.Add "配列2", Array("a", "b", "c")
    
    
    'Q And A
    '■複数出力なんてしません!なのでファイル名に時間をつけて複数出力するのはやめてくれますか?
    ' 何度も何度も消すのがめんどくさい。ゴミ箱がひどいことになる・・・
    ' ⇒NotimeFlagオプションをTrueにしてください
    Call DebugPrint(varDic, Filename:="上書きテスト")
    Call DebugPrint(varDic, Filename:="上書きテスト") '通常だと(時間)上書きテスト.txt が時間ごとに作られる
    Call DebugPrint(varDic, Filename:="上書きテスト", NotimeFlag:=True)
    Call DebugPrint(varDic, Filename:="上書きテスト", NotimeFlag:=True)
    Call DebugPrint(varDic, Filename:="上書きテスト", NotimeFlag:=True) '上書きテスト.txt が一つだけ作られる(一番最後に実行したものだけが残る)
End Sub

Private Sub SampleCode5()
    'Dummyデータ
    Dim varString   As String:   varString = "文字列"
    Dim varInteger  As Integer:  varInteger = 3
    Dim varLong     As Long:     varLong = 3
    Dim varDouble   As Double:   varDouble = 3.5
    Dim varBoolean  As Boolean:  varBoolean = True

    Dim varArray(2) As Variant
        varArray(0) = varString
        varArray(1) = varInteger
        varArray(2) = varBoolean
    
    Dim varDic As Object
    Set varDic = CreateObject("Scripting.Dictionary")
    varDic.Add "配列1", varArray
    varDic.Add "配列2", Array("a", "b", "c")
    
    'Q And A
    '■配列/Collection/Dictionaryでインデントされて出力
    ' されますが、あの幅が好みじゃない・・・。
    ' ⇒IndentCountオプションを指定してください
    Call DebugPrint(varDic, IndentCount:=5)
    
    '-----------------------------
    '※ファイルの出力結果
    '[Dictionary]
    '     配列1 => [Variant()]
    '          (0): 文字列
    '          (1): 3
    '          (2): True
    '     配列2 => [Variant()]
    '          (0): a
    '          (1): b
    '          (2): c
    '-----------------------------
End Sub

Private Sub SampleCode6()
    'Dummyデータ
    Dim varString   As String:   varString = "文字列"
    Dim varInteger  As Integer:  varInteger = 3
    Dim varLong     As Long:     varLong = 3
    Dim varDouble   As Double:   varDouble = 3.5
    Dim varBoolean  As Boolean:  varBoolean = True

    Dim varArray(2) As Variant
        varArray(0) = varString
        varArray(1) = varInteger
        varArray(2) = varBoolean
    
    Dim varDic As Object
    Set varDic = CreateObject("Scripting.Dictionary")
    varDic.Add "配列1", varArray
    varDic.Add "配列2", Array("a", "b", "c")
    
    
    'Q And A
    '■データの型式を全てみたいです
    ' ⇒TypeNameFlagオプションをTrueにしてください
    Call DebugPrint(varDic, TypeNameFlag:=True)
    
    '-----------------------------
    '※ファイルの出力結果
    '[Dictionary]
    '[String] 配列1 >= [Variant()]
    '  (0): [String]文字列
    '  (1): [Integer]3
    '  (2): [Boolean]True
    '[String] 配列2 >= [Variant()]
    '  (0): [String]a
    '  (1): [String]b
    '  (2): [String]c
    '-----------------------------
End Sub

Private Sub SampleCode7()
    'Dummyデータ
    Dim varString   As String:   varString = "文字列"
    Dim varInteger  As Integer:  varInteger = 3
    Dim varLong     As Long:     varLong = 3
    Dim varDouble   As Double:   varDouble = 3.5
    Dim varBoolean  As Boolean:  varBoolean = True

    Dim varArray(2) As Variant
        varArray(0) = varString
        varArray(1) = varInteger
        varArray(2) = varBoolean
    
    Dim varDic As Object
    Set varDic = CreateObject("Scripting.Dictionary")
    varDic.Add "配列1", varArray
    varDic.Add "配列2", Array("a", "b", "c")
    
    
    'Q And A
    '■ファイルじゃなくイミディエイトウィンドウにだしてよ
    ' ⇒DebugPrintFlagをTrueにしてください
    Call DebugPrint(varDic, DebugPrintFlag:=True)
    
End Sub

xmlObj.cls

Option Explicit

Dim xmlObj      As Object
Dim xmlAttr     As Object
Dim xmlNode     As Object
Dim xmlString   As String

Private Sub Class_Initialize()

    Set xmlObj = CreateObject("MSXML2.DOMDocument")
    xmlObj.async = False
    xmlObj.setProperty "SelectionLanguage", "XPath"
    
    xmlObj.appendChild xmlObj.createProcessingInstruction("xml", "version='1.0' encoding='UTF-8'")
End Sub

Private Sub Class_Terminate()
    Set xmlObj = Nothing
End Sub

Public Sub XMLin(ByVal data As Variant)
    
    If TypeName(data) = "String" Then
        Call FileLoad(data)
        
    ElseIf TypeName(data) = "Dictionary" Then
        Call judgeTypeName(data)
        
    Else
        Call Die("XMLinメソッドは、String型またはDictionary型のみを取ることができます" & vbCrLf & _
                 "引数の型:" & TypeName(data))
    End If
    
End Sub

Public Sub XMLout(ByVal FilePath As String)
    xmlObj.Save FilePath
End Sub

Public Function XPath(ByVal strXPath As String)
    
    'xmlの文字列をロードする
    xmlObj.loadXML xmlString
    
    Set XPath = xmlObj.documentElement.selectNodes(strXPath)
    
End Function


Private Sub FileLoad(ByVal FilePath As Variant)
    
    Dim FH  As Object
    Dim FSO As Object
    
    Set FSO = CreateObject("Scripting.FileSystemObject")
    
    xmlString = ""
    
    If Not FSO.FileExists(FilePath) Then Call Die("FileLoadメソッド:ファイルは存在しません" & vbCrLf & "FilePath:" & FilePath)
    
    Set FH = FSO.OPenTextFile(FilePath, 1)
    
    Do While Not FH.AtEndOfStream
        xmlString = xmlString & FH.ReadLine
    
    Loop
    
    FH.Close
    
    Set FH = Nothing
    Set FSO = Nothing
    
End Sub

Private Sub judgeTypeName(ByRef data As Variant)
    
    Dim counter As Long
    Dim key     As Variant
    
    'キーに属性を含んでいる場合を高所して先に属性の登録を行う
    Call AddAttributeNode(data)
    
    
    For Each key In data
        counter = counter + 1
        
        If AddXmlNode(key) Then GoTo NextForLoop

        
        If TypeName(key) = "Dictionary" Then
            Call judgeTypeName(key)
            If counter = data.Count Then _
                Set xmlNode = xmlNode.parentNode
            
        ElseIf TypeName(data(key)) = "Collection" Then
            Call judgeTypeName(data(key))
                
        ElseIf TypeName(data(key)) = "Dictionary" Then
            Call judgeTypeName(data(key))
            
            If counter = data.Count Then _
                Set xmlNode = xmlNode.parentNode
            
        ElseIf TypeName(data(key)) = "String" Then
            Call AddChildText(data(key))
        
        Else
            Call Die("judgeTypeNameメソッドエラー:")
            Debug.Print ""
        
        End If
        
NextForLoop:
    Next
    
End Sub

Private Sub AddChildText(ByVal ChildText As String)
    '子要素にテキストを追加
    Set xmlNode = xmlNode.appendChild(xmlObj.createTextNode(ChildText))
    Set xmlNode = xmlNode.parentNode
    Set xmlNode = xmlNode.parentNode
    
End Sub


Private Sub AddAttributeNode(ByRef data As Variant)
    
    Dim key As Variant
    
    '子要素をぶら下げた後に属性処理をすると意図したところと違うところに属性がつくので
    '最初にキーを走査して属性を探しあれば親要素に属性を追加する
    For Each key In data
    
        If TypeName(key) <> "String" Then GoTo NextForEach
        If key = "@" Then
            Call Die("AddAttributeNodeメソッドエラー:属性名がありません")
            
        ElseIf Left(key, 1) = "@" Then
            Set xmlAttr = xmlNode.Attributes.setNamedItem(xmlObj.createAttribute(Mid(key, 2, Len(key))))
            xmlAttr.nodeValue = data(key)
        End If

NextForEach:
    Next
    
End Sub

Private Function AddXmlNode(ByRef key As Variant)
    
    If TypeName(key) <> "String" Then
        Exit Function
    
    ElseIf key = "" Then
        Exit Function
    
    End If
    
    
    'キーを処理する
    If xmlNode Is Nothing Then
    'Nothingの時は初なのでルートとして指定
        Set xmlNode = xmlObj.appendChild(xmlObj.CreateElement(key))
    
    Else
    '親要素以外の処理
        If Left(key, 1) <> "@" Then
        '@で始まらない時は、子要素として登録。 False(0)を返す
            Set xmlNode = xmlNode.appendChild(xmlObj.CreateElement(key))
            AddXmlNode = 0
            
       Else
       '@で始まる時は、True(1)を返す
            AddXmlNode = 1
       
       End If
       
    End If
    
End Function

Private Sub Die(ByVal msg As String)
    MsgBox "下記理由により終了します" & vbCrLf & _
           msg
    End
End Sub