プログラマー、日々の格闘【備忘録】

日々作成しているプログラムについての備忘録を置いておきます。

【C#】キーの検出が出来なかった理由【Keydown】

C#で[KeyDown]イベントを設定してもキー検出されなかった。

原因は[KeyPreview]プロパティがfalseであった事だった。

trueにしたところキー検出されるようになった。

【ClosedXML】リスト型でもワークシートに貼れた話【C#】

データをDBからとってきて、リスト型に入れていたからそのまま貼り付けてみたらいけたってだけ。


//データ取得
List<object[]> list = this.GetAllData();
workSheet.Cell("A5").InsertData(list);

 object[]でDBデータを格納し、そのままInserDataで貼り付けが可能。

 

 

【C#】ClosedXMLで読み取り専用で開く

ClosedXMLで読み取り専用で開いてデータだけが欲しい。

しかし、ClosedXMLにはその機能はなかったので、FileStreamを併用して実現できたのでメモしておく。


    FileStream fs = new FileStream(path,
FileMode.Open,
FileAccess.Read,
FileShare.ReadWrite) using(var workbook = new XLWorkbook(fs, XLEventTracking.Disabled)) { ・・・ }

 1行目のFileStreamでインスタンスを作成し、2行目でインスタンスを利用してExcelを開く処理とすることで読み取り専用として開くことができた。

 

【UE4】コリジョンに触れる

コリジョンについて触れたので書いておく。

今回も学習サイトはYouTube

youtu.be

今回作ったものは、「コインを取ったら消える」というだけのもの。

使用したノードは以下の二つ

  • OnComponentBeginOverlap
  • DestoryActor

BeginOverlapの出し方はSphereコンポーネントを右クリック→「Add Event」→「OnComponentBeginOverlapを追加」

f:id:kanato_710:20210122101748p:plain

BeginOverlapの出し方

DestoryActorはアクターがただ消えるだけのノード。

OnComponentBeginOverlapにDestoryActorを繋げるだけで触れると消えるイベントになる。

f:id:kanato_710:20210122102242p:plain

イベントグラフ

しかし、このままでは人以外の物にも当たり判定があるため人のみにあたり判定を付けるためにコリジョンのプロパティを変更する。

f:id:kanato_710:20210122102829p:plain

コリジョンプロパティ
  1. コリジョンプリセットを「Custom」
  2. オーバーラップを「Pawn」のみとする

以上で人のみ(Pawnオブジェクト)のみに当たり判定が付いた。

f:id:kanato_710:20210122103103p:plain

コイン取る前

f:id:kanato_710:20210122103127p:plain

コイン取った後

 

【UE4】初めてのブループリント【移動床】

UE4

今日からは、UE4(Unreal Engine 4)のブループリントも勉強していく。

手始めに移動する床について勉強したので書いておく。

 

勉強したサイト(YouTube)

少し長いが日本語で丁寧に説明してくれる。

youtu.be

 

制作物

移動する床を作る。今回はY値が800から2500までの間を繰り返し移動している床を作成する。

 

作成結果

結果は以下の通りである。

f:id:kanato_710:20210121162359p:plain

移動床のBP

今回使用したノード

  • AddActorWorldOffset
  • GetActorLocation

AddActorWorldOffsetが移動のメイン機能。

移動のスピードはDelra Locationを右クリック→「変数に昇格」を行い、変数として扱っている。

f:id:kanato_710:20210121165328p:plain

変数へ昇格

 

GetActorLocationはターゲットの現在の位置を知るためのノード

f:id:kanato_710:20210121164723p:plain

GetActorLocation_IF

ここではブランチを使用して2500に到達したかをチェックしている。
なお、GetActorLocationは追加したときは

f:id:kanato_710:20210121164857p:plain

GetActorLocation

このように、Return Valueとなっているが、右クリック→「構造体ピンを分割」でXYZ方向の指定が可能となる。

f:id:kanato_710:20210121164959p:plain

構造体ピンを分割

片方で2500に到達するまでのブランチを設定しておき、もう片方で800に到達するまでのブランチを設定することにより、往復運動するようになった。

以上で、Y値が800から2500までの間を繰り返し移動するBPが完成した。

 

 

【Python】パスワードを生成する

パスワードを生成するプログラムが欲しくなった。

こだわりとして

・パスワードの長さを指定できること

・数字は必ず含めること

・バックアップとしてテキストファイルに記録しておくこと

を盛り込んだ。

import string
import secrets
import re
import sys
import os
import datetime

def pass_gen(size=20):
    chars = string.ascii_uppercase + string.ascii_lowercase + string.digits
   # 記号を含める場合
   # chars += '%&$#()'
    password = ''.join(secrets.choice(chars) for x in range(size))
    if not Check_InWords_Num(password):
        pass_gen(size)
        exit
    return password

#数字が含まれているかチェック
def Check_InWords_Num(password):
    resutlt = re.search('[0-9]',password)
    return resutlt

def Main():
    pass_Length = input('パスワードの長さを指定してください。')
    if not str.isdigit(pass_Length):
        print('数字を入力してください')
        #終了か、再入力かを選択
        isFinish = input('再入力しますか? Y/N\n')
        if isFinish == 'Y':
            Main()
        else:
            sys.exit
    if pass_Length == '':
        pass_Length=20
    result_password = pass_gen(int(pass_Length))
    print(result_password)

    #パスワード生成の履歴も一応残しておく
    historyTextPath = r"./PasswordHistory.txt"
    w = open(historyTextPath,'w')
    w.write(str(datetime.datetime.now())+'\t'+result_password)

Main()

パスワード生成の肝はsecretsモジュール。

charsに生成したい文字列の定義を入れ、

join(secrets.choice(chars)

でつなげる。シンプルに生成のみならば次のプログラムで済む。

import string
import secrets

def pass_gen(size=20):
    chars = string.ascii_uppercase + string.ascii_lowercase + string.digits
   # 記号を含める場合
   # chars += '%&$#()'
    password = ''.join(secrets.choice(chars) for x in range(size))
    if not Check_InWords_Num(password):
        pass_gen(size)
        exit
    return password

次はパスワード生成から管理アプリを作ろうと思う。

その布石としてのパスワード生成履歴なので、履歴がいらなければ、osモジュールもimportする必要はない。