pandazx's blog

データ分析など雑多な技術ブログ

VBAで多次元配列を多次元辞書(連想配列)に変換

入力データが多次元配列でコメントと日付が入ったデータとする。

これを変換して、辞書のデータ構造が年→月→日→辞書(リスト風)→辞書というデータに変換する。

辞書(リスト風)はキーを0,1,2,3というようにして辞書を登録することを意味する。

VBAの設定として、辞書(Scripting.Dictionary)を使用可能にするため、 Visual Basic Editor画面からツール→参照設定でMicrosoft Scripting Runtimeにチェックをつける。

VBAのコードは以下のようになる。動作確認していないが、概ね以下のイメージ。

Function convertList2Dict(dataList) As Scripting.Dictionary
    Dim yearMonthDayDataDict As New Scripting.Dictionary
    Dim dataDict As New Scripting.Dictionary
    
    Dim idx As Variant
    For idx = LBound(dataList) To UBound(dataList)
        ' 日付を取得し、年月日を抽出
        Dim dateStr As String: dateStr = dataList(idx, 1)
        On Error GoTo Errorhandler
        Dim dateObj As Date: dateObj = dateStr
        Dim yearNum As Integer: yearNumAs = year(dateObj)
        Dim monthNum As Integer: monthNum = month(dateObj)
        Dim dayNum As Integer: dayNum = day(dateObj)
        
        ' 辞書の生成と値の設定
        Set dataDict = New Scripting.Dictionary
        dataDict .Add "comment", dataList(idx, 0)
        dataDict .Add "date", dataList(idx, 1)
        
        ' 該当年の辞書を取得。未登録なら作成
        If Not yearMonthDayDataDict.exists(yearNum) Then
            yearMonthDayDataDict.Add intersectionName, New Scripting.Dictionary
        End If
        ' 該当年、月の辞書を取得。未登録なら作成
        If Not yearMonthDayDataDict(yearNum).exists(monthNum) Then
            yearMonthDayDataDict(yearNum).Add monthNum, New Scripting.Dictionary
        End If
        ' 該当年、月、日の辞書を取得。未登録なら作成
        If Not yearMonthDayDataDict(yearNum)(monthNum).exists(dayNum) Then
            yearMonthDayDataDict(yearNum)(monthNum).Add dayNum, New Scripting.Dictionary
        End If
        ' 辞書を多次元辞書に登録
        Dim listIdx As Integer: listIdx = yearMonthDayDataDict(yearNum)(monthNum)(dayNum).Count
        yearMonthDayDataDict(yearNum)(monthNum)(dayNum).Add listIdx, dataDict
NextData:
    Next idx
    On Error GoTo 0
    Set convertList2Dict = yearMonthDayDataDict
    Exit Function
Errorhandler:
    ' エラーが発生すると、ここに飛ぶ
    ' 不正な日時はスキップ
    Resume NextData
End Function

DynamoDBストリームをLambdaで読み込むと24時間前から開始される

DynamoDBストリームを読み込んでLambdaで処理する実装を行った際に勘違いしたことがあるので、メモ。

DynamoDBにはストリームという更新情報をストリームで流す機能があり、 更新発生をトリガにLambdaで処理することが可能。

ストリーム機能を有効にした際に、有効にした時点からの更新のストリームが流れるのではないことに注意。 ストリームデータは24時間保持されるが、それは有効にする前から保持されているため、 ストリームを読み込んでLambdaが動く場合、Lambdaに入力として渡されるデータは24時間前から始まる。

24時間前のストリームから、追っかけ再生的にLambdaの処理が進んでいくため、 最初は書き込みキャパシティの値を大きくしないと、処理が追いつかないので注意すること。

参考: DynamoDB ストリーム を使用したテーブルアクティビティのキャプチャ - Amazon DynamoDB

python2で実行スクリプト名の判定

以下のようにしておけば、sample.py が他のスクリプトから呼ばれた時に main()を実行することを避けられる。

# sample.py
import sys

def calc(val):
    x = val + 1

def main():
    calc(1)

if sys.argsv[0] == __file__:
    main()

これにより、前に作ったスクリプトのメソッドを流用したい時に、簡単にimportできるようになる。

VirtualboxでRHELを使う時に共有フォルダが使えない

CUI環境を想定。

GuestAdditionsをインストールすればいいのだが、エラーが発生する場合がある。

GuestAdditionsのCDイメージを挿入した後

# Guest Additions CDをマウント
mkdir /mnt/cdrom
mount -o ro /dev/cdrom /mnt/cdrom

# 必要なソフトウェアをインストール
yum install gcc bzip2
yum install kernel-devel-XXX(バージョンを記載)

# Guest Additionsを実行
cd /mnt/cdrom
./VBoxLinuxAdditions.run

必要なソフトウェアが足りない場合は、Guest Additionsを実行した際にエラーメッセージが表示され、 そこに不足するソフトウェア名が書いてあるので、それをインストールすればよい。 上記のバージョンもそこで確認すればよい。

lsした時のフォントカラーの変更

lsした時にディレクトリの色が濃い青で見づらい場合があるので、色を変更する。

まず、デフォルト色の設定ファイルをコピー

cp /etc/DIR_COLORS ~/.dir_colors

DIRと書いてある行を以下のように変更すると、緑で表示されるようになる。リンクのディレクトリは水色になる。

DIR 01;03;34

設定の反映

source /etc/profile

ちなみに、全ユーザ共通で設定変更していいなら、/etc/DIR_COLORSを編集すればよい。

参考