無限不可能性ドライブ

『ニューラルネットワーク自作入門』に刺激されてExcelVBAでニューラルネットワークを作ってみたものの、やっぱり数学やらなきゃと思い少しずつやってきたのもあって、自分の知識の整理とかそういった感じです。

年賀クイズの答え

今回はそれほど面倒な計算もなかったので、地道に計算すればできたかな?と思います。
Excelとかを使う場合の計算式の例もあげておきますね。

というわけで、答えは「にしんほう」、二進法でした!

「ねぇ、そのうち二進法で話するのも面白いんじゃない?」

MOSAIC.WAVの「Mon-ju☆Brains」という人工知能を題材とした曲の一節で、
なんだかマシンのヒトに対する思いを感じられるような気がしてホロッとしちゃうんですよね。Spotifyとかでは聞くことができるので気になった方はぜひ。
open.spotify.com

MOSAIC.WAV には他にもいろいろなテクノロジーを題材とした曲(ボカロとかドローンとかVRとか量子コンピュータとかスーパーカミオカンデとかパソコンとかレコメンドシステムとか迷惑メールとかタッチパネルとかパンツとかめがねとか…)があるのでテクノロジー好きな方にはお勧めです!

というわけで、今年もよろしくお願いします。

2022年に書いた記事など…

2022年に書いた記事をまとめておこうと思いますー。

NeuralNetwork on Scratch

Scratch で作ったニューラルネットワークです。
ミニバッチにも対応しています。
手書きの文字や図形をちゃんと学習し、認識できるようになります。
Scratch のプロジェクトは公開しているので、興味のある方は試してみてくださいね。
zenn.dev

NeuralNetwork on Scratch(アヤメの分類)

定番のアヤメの分類のやり方を書いてみました。
中身は基本的なニューラルネットワークなので、手書き文字以外でも学習できます。
zenn.dev

NeuralNetwork on Scratch(隠れ層の増やし方)

隠れ層を増やせるような実装にしてあります。
ちょっと面倒ですが…
zenn.dev

NeuralNetwork on Scratch(基本部分)

NeuralNetwork on Scratch の基本的な部分のみを取り出したものです。
余分な部分がないので、どういった構造になっているかの確認がしやすいかと思います。
(あまり需要があるとは思えませんが…)
zenn.dev

Power Automate for Desktop を使って VOICEPEAK にテキストを読み上げてもらおう!

タイトルのまんまです。PAD で VOICEPEAK を動かす内容です。
zenn.dev


あとは、2021年以前に Qiita に書いた記事を置いておきますねー。
qiita.com

年賀クイズの答え

youtu.be

ということで、答えは「VOICEROID」でした!
昨年、VOICEROIDを購入したのですが、キャラクタに声がつくだけでこんなに身近に感じられるようになるのか!と結構衝撃的でした。
ということで、今回のワードは「VOICEROID」にしました。

他にもこんなことをしてたりします。
youtu.be

qiita.com


さて、セル・オートマトンの解き方ですが…年末にこんな記事を書いたので載せておきます。今回は、これを利用すれば解くことができます。
qiita.com

ですが、解答用に改変するのは面倒だと思うので、解答用のVBAコードを載せておきますね。
シートには条件付き書式設定で、セルの値が1の時には紫、0の時には白になるようにしています。

Option Explicit

Public Sub Click_実行()
    Dim r As Long, c As Long, tc As Long
    Dim self As Long
    Dim up_r As Long, down_r As Long, left_c As Long, right_c As Long
    Dim life_count As Long
    
    For r = 1 To 6
        For c = 1 To 6
            self = Cells(r, c).Value    '自分自身の状態(紫:1, 白:0)
            
            up_r = r - 1                '「上」の行番号を計算
            If up_r < 1 Then
                up_r = 6
            End If
            
            down_r = r + 1              '「下」の行番号を計算
            If down_r > 6 Then
                down_r = 1
            End If
            
            left_c = c - 1              '「左」の行番号を計算
            If left_c < 1 Then
                left_c = 6
            End If
            
            right_c = c + 1             '「右」の行番号を計算
            If right_c > 6 Then
                right_c = 1
            End If
            
            life_count = Cells(up_r, left_c).Value + Cells(up_r, c).Value + Cells(up_r, right_c).Value
            life_count = life_count + Cells(r, left_c).Value + Cells(r, right_c).Value
            life_count = life_count + _
                         Cells(down_r, left_c).Value + Cells(down_r, c).Value + Cells(down_r, right_c).Value
            
            If self = 1 And (life_count = 2 Or life_count = 3) Then '紫セルの周りに2つか3つの紫セルがある場合は、そのセルは紫のまま
                self = 1
            ElseIf self = 1 And life_count >= 4 Then                '紫セルの周りに4つ以上の紫セルがある場合は、そのセルは白くなる
                self = 0
            ElseIf self = 1 And life_count <= 1 Then                '紫セルの周りに紫セルが1つ以下しかない場合は、そのセルは白くなる
                self = 0
            ElseIf self = 0 And life_count = 3 Then                 '白いセルの周りに紫セルがちょうど3つある場合は、そのセルは紫になる
                self = 1
            End If
            
            Cells(r, c + 10).Value = self
            
        Next
    Next

    Application.Wait Now() + TimeValue("00:00:02")          '表示遅延用Wait
    
    tc = 11
    For r = 1 To 6
        For c = 11 To 16
            If Cells(r, c).Value = 1 Then
                Cells(r + 8, c).Font.Color = RGB(255, 255, 255)
                Cells(r + 8, c).Interior.Color = RGB(132, 132, 255)
                
                Cells(8, tc).Value = Cells(r + 8, c).Value
                tc = tc + 1
                
                Application.Wait Now() + TimeValue("00:00:01")  '表示遅延用Wait
            Else
                Cells(r + 8, c).Font.Color = RGB(132, 132, 255)
                Cells(r + 8, c).Interior.Color = xlNone
            End If
        Next
    Next
    
End Sub

Public Sub Click_初期化()
    
    Range("K1:P6").Value = 0
    
    With Range("K9:P14")
        .Font.Color = RGB(132, 132, 255)
        .Interior.Color = xlNone
    End With
    
    Rows(8).ClearContents
    Range("J8").Value = "答:"

End Sub

【VBA】リネームする

面白そうだったのでチャレンジしてみました。


f:id:celaeno42:20210405235637p:plain


ワークシートはこんな感じ
f:id:celaeno42:20210405235947p:plain:w420

[標準モジュール]
Option Explicit

Const CL_CHK As Long = 3

Public Sub Click_ランダムソート()
    Dim r As Long
    Dim lastRow As Long
    Dim destRow As Long

    lastRow = Cells(Rows.Count, 1).End(xlUp).Row
    Range(Cells(2, 2), Cells(lastRow, 2)).ClearContents
    
    Randomize
    
    For r = 2 To lastRow
        Do
            destRow = Int((lastRow - 2 + 1) * Rnd + 2)
        Loop Until Cells(destRow, 2).Value = ""
    
        Cells(destRow, 2).Value = Cells(r, 1).Value
    
    Next

End Sub

Public Sub Click_リネーム()
    Dim folderPath As String
    
    folderPath = "C:\Users\xxxx\Desktop\rename\files"
    
    Columns(CL_CHK).ClearContents
    
    Call renameFiles(folderPath, 1, 2)
    
    Columns(CL_CHK).ClearContents
    
End Sub


Public Sub Click_ファイル名を戻す()
    Dim folderPath As String
    
    folderPath = "C:\Users\xxxx\Desktop\rename\files"
    
    Columns(CL_CHK).ClearContents
    
    Call renameFiles(folderPath, 2, 1)
    
    Columns(CL_CHK).ClearContents
    
End Sub

Private Sub renameFiles(ByRef folderPath As String, _
                        ByRef colSource As Long, ByRef colDest As Long)
    Dim cnt As Long         '処理済みカウント
    Dim cntFiles As Long    '処理対象ファイル数
    Dim r As Long
    Dim lastRow As Long
    Dim bufFileName As String  'ファイル名退避用
    Dim srcFileName As String   'リネーム前のファイル名
    Dim destFileName As String  'リネーム後のファイル名
    
    '一時ファイル名
    '何らかの処理で使われていないファイル名にする必要があるが、
    '今回は簡単のため temp.txt とした
    Const TMP_FNAME As String = "temp.txt"
    
    lastRow = Cells(Rows.Count, colSource).End(xlUp).Row
    cntFiles = lastRow - 1
    
    cnt = 0
    Do
        r = 2
        
        '未処理ファイル名の最初のものを temp.txt にリネームする
        '元のファイル名を bufFileName に格納する
        Do
            If Cells(r, CL_CHK).Value = "" Then
                bufFileName = Cells(r, colSource).Value
                Call renameFile(folderPath, bufFileName, TMP_FNAME)
                Exit Do
            End If
            
            r = r + 1
        Loop
        
        destFileName = bufFileName
        
        Do
            'リネーム後のファイル名のある行を探す
            r = getRow(destFileName, colDest, lastRow)
            
            If Cells(r, colSource).Value <> bufFileName Then
                'その行にある元のファイル名が bufFileName でなかったら
                'その行の元のファイル名をリネームして
                'destFileName に元のファイル名を格納する
                srcFileName = Cells(r, colSource).Value
                Call renameFile(folderPath, srcFileName, destFileName)
                Cells(r, CL_CHK).Value = 1
                destFileName = srcFileName
                cnt = cnt + 1
            Else
                '元のファイル名が bufFileName と同じなら
                'temp.txt としていたファイルをリネームして
                '一連の処理を終了し、再度先頭から未処理ファイル名のものを処理する
                Call renameFile(folderPath, TMP_FNAME, Cells(r, colDest).Value)
                Cells(r, CL_CHK).Value = 1
                cnt = cnt + 1
                Exit Do
            End If
        
        Loop
        
    Loop While cnt < cntFiles

End Sub

Private Sub renameFile(ByRef folderPath As String, _
                        ByRef srcFileName As String, ByRef destFileName As String)
    Dim fso As Object
    Dim f As Object
    
    Set fso = CreateObject("Scripting.FilesystemObject")
    Set f = fso.GetFile(folderPath & "\" & srcFileName)
    f.Name = destFileName
    
    Set f = Nothing
    Set fso = Nothing
    
End Sub

Private Function getRow(ByRef fileName As String, _
                        ByRef colTarget As Long, ByRef lastRow As Long) As Long
    Dim r As Long
    
    For r = 2 To lastRow
        If Cells(r, colTarget).Value = fileName Then
            getRow = r
            Exit For
        End If
    Next
End Function



f:id:celaeno42:20181212233850p:plain

【VBA】文字色やセル色に文字を埋め込む(抽出編)

f:id:celaeno42:20210321123441p:plain

Public Sub 文字列を抽出する()
    Dim txt As String
    Dim r As Long
    Dim lngRGB As Long
    
    r = 1
    txt = ""
    Do
        txt = txt & decodeChar(Cells(r, 1).Font.Color)
        txt = txt & decodeChar(Cells(r, 1).Interior.Color)
        r = r + 1
    Loop Until Cells(r, 1).Font.Color = rgb(0, 0, 0)
    
    MsgBox txt

End Sub

'RGBの値を16進表記に変換して、赤、緑、青に分解した値を
'再度10進数に変換し、それをアスキーコードとして文字に変換
Private Function decodeChar(ByVal lngRGB As Long) As String
    Dim res As String
    Dim strHex As String
    
    strHex = Right("000000" & Hex(lngRGB), 6)
    
    res = code2char(CLng("&H" & Right(strHex, 2)))
    res = res & code2char(CLng("&H" & Mid(strHex, 3, 2)))
    res = res & code2char(CLng("&H" & Left(strHex, 2)))
    
    decodeChar = res
End Function

Private Function code2char(ByVal ascCode As Long) As String
    If ascCode = 0 Or ascCode = 255 Then
        code2char = ""
    Else
        code2char = Chr(ascCode)
    End If
End Function