std::unordered_map erase() 関数ではメモリは解放されない "swap trick"しよう

std::unordered_map における erase() メンバ関数は、指定されたキーに関連する要素をマップから削除します。しかし、erase() を呼び出しただけで、マップの実際に確保されたメモリが自動的に縮小するわけではありません。

C++ の標準ライブラリのコンテナは、メモリの再利用を目的として、通常、要素を削除した際にメモリを解放しない設計になっています。そのため、要素を erase() で削除しても、std::unordered_map の内部に確保されているバケットの数や容量は変わらないことが多いです。

もし、メモリを手動で解放したい場合、コンテナの容量を手動で調整する方法や、新しい std::unordered_map を作成して要素をコピーするなどの方法が考えられます。たとえば、"swap trick" として知られる方法を使用して、現在のマップと空のマップをスワップすることでメモリを解放することができます。

std::unordered_map<KeyType, ValueType>().swap(my_map);

この方法で、my_map のメモリが解放されます。

ただし、頻繁にメモリを解放するとパフォーマンスが低下することがあるため、この操作を行う際には注意が必要です。

python tweepy使った X(Twitter) API v2での投稿

pip install tweepy

CONSUMER_KEY = '<input plase>'
CONSUMER_SECRET = '<input plase>'
ACCESS_TOKEN = '<input plase>'
ACCESS_TOKEN_SECRET = '<input plase>'

def authenticate_to_twitter():
    api = tweepy.Client(
        consumer_key        = CONSUMER_KEY,
        consumer_secret     = CONSUMER_SECRET,
        access_token        = ACCESS_TOKEN,
        access_token_secret = ACCESS_TOKEN_SECRET,
    )
    return api

def post_tweet(api, tweet_text):
    tweet = api.create_tweet(text = tweet_text)


tweet_text = "投稿文字列"
api = authenticate_to_twitter()
post_tweet(api, tweet_text)

ネタ元

qiita.com

ExcelVBA 指定列にオートフィルタON

.AutoFilter すると ON/OFF トグルするので、指定行にオートフィルタ適用されてるか確認して処理してます。

' オートフィルタの範囲の最初の行がRowNum行目か確認
Function IsAutoFilterOnRow(WorkBookName, SheetName, RowNum) As Boolean
    Dim ws As Worksheet
    Set ws = Workbooks(WorkBookName).Sheets(SheetName)  ' シート名を必要に応じて変更
    
    ' オートフィルタが設定されているか確認
    If ws.AutoFilter Is Nothing Then
        IsAutoFilterOnRow = False
    Else
        ' オートフィルタの範囲の最初の行がRowNum行目か確認
        If ws.AutoFilter.Range.Row = RowNum Then
            IsAutoFilterOnRow = True
        Else
            IsAutoFilterOnRow = False
        End If
    End If
End Function

' 指定行にオートフィルタ設定
Sub SetAutoFilterForRow(WorkBookName, SheetName, RowNum, bEnable)

    Dim ws As Worksheet
    Set ws = Workbooks(WorkBookName).Sheets(SheetName)

    If bEnable = True Then
        If IsAutoFilterOnRow(WorkBookName, SheetName, RowNum) = True Then
            'pass
        Else
            ws.Rows(RowNum).AutoFilter
        End If
    Else
        If IsAutoFilterOnRow(WorkBookName, SheetName, RowNum) = True Then
            ws.Rows(RowNum).AutoFilter
        Else
            'pass
        End If
    End If

End Sub

ExcelVBA タブで区切られたデータをクリップボード使わずに指定セルから貼り付け

Sub PasteTabDelimitedDataWithoutClipboard()

    Dim Data As String
    Dim Rows() As String
    Dim Cells() As String
    Dim r As Long, c As Long
    Dim StartCell As Range

    ' タブで区切られたサンプルデータ
    Data = "Name" & vbTab & "Age" & vbTab & "Address" & vbCrLf & _
           "John" & vbTab & "25" & vbTab & "Street 123" & vbCrLf & _
           "Jane" & vbTab & "30" & vbTab & "Avenue 456"

    ' データを行ごとに分割
    Rows = Split(Data, vbCrLf)

    ' 開始セルを設定
    Set StartCell = ThisWorkbook.Sheets("Sheet1").Range("B2")

    ' 各行とセルのデータを処理
    For r = LBound(Rows) To UBound(Rows)
        Cells = Split(Rows(r), vbTab)
        For c = LBound(Cells) To UBound(Cells)
            StartCell.Offset(r, c).Value = Cells(c)
        Next c
    Next r

End Sub

ExcelVBAでESCキー押された判定する関数作成

標準モジュールでのみ実装可能です

#If Win64 Then
Declare PtrSafe Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
#Else
Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
#End If

Function IsEscPressed() As Boolean
    ' VK_ESCAPE = &H1B
    If GetAsyncKeyState(&H1B) Then
        IsEscPressed = True
    Else
        IsEscPressed = False
    End If
End Function

Excel VBAからSlackに投稿する

Slackのアプリ追加

・Slack ワークスペースにログインします。
Slack APIのページ にアクセスして、Your Apps をクリックします。
・Create New App ボタンをクリックします。
・アプリの名前とワークスペースを選択し、Create App ボタンをクリックします。
・OAuth & Permissions セクションに移動します。
・Scopes セクションの下で、chat:write / channels:read 権限を追加します。
・サイドバーからApp Homeを選択 Botの名前を編集
・ページの上部にある Install App to Workspace ボタンをクリックして、アプリをインストールします。
・アプリがインストールされたら、OAuth & Permissions ページに表示される OAuth Access Token をコピーして、後で使用するために保存しておきます。

VBAコード

Sub SendMessageToSlack(channel As String, message As String)

    Dim objRequest As Object
    Dim strURL As String
    Dim strToken As String
    Dim strPostData As String

    ' Slack APIのURL
    strURL = "https://slack.com/api/chat.postMessage"

    ' OAuth Access Tokenをセット
    strToken = "xoxb-HOGEHOGE" ' この部分を取得したトークンに置き換えてください

    ' POSTデータの作成
    strPostData = "token=" & strToken
    strPostData = strPostData & "&channel=" & channel
    strPostData = strPostData & "&text=" & message

    ' HTTPリクエストの作成
    Set objRequest = CreateObject("MSXML2.ServerXMLHTTP")
    With objRequest
        .Open "POST", strURL, False
        .setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
        .send strPostData
    End With

    ' レスポンスを確認 (オプション)
    Debug.Print objRequest.responseText

    Set objRequest = Nothing

End Sub


Sub mess()
    Call SendMessageToSlack("追加したbotのチャンネルID", "テストメッセージです")

End Sub

タスクスケジューラの設定をエクスポート/インポートする

poweshellのスクリプトで実現します。

エクスポート

$outPathは書き換えてください。

エクスポート.ps1

if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole("Administrators")) { Start-Process powershell.exe "-File `"$PSCommandPath`"" -Verb RunAs; exit }

$outPath = "C:\Users\hogehoge\Desktop\tasks"
$outtask = "\"
$outFileName = "{0}.xml"

$sch = New-Object -ComObject("Schedule.Service")
$sch.Connect("localhost")
$tasks = $sch.GetFolder("$outtask").GetTasks(0)
 
$outfile_temp = Join-Path $outPath $outFileName
 
$tasks | %{
$xml = $_.Xml
$task_name = $_.Name
$outfile = $outfile_temp -f $task_name
$xml | Out-File $outfile
}

インポート

$XmlinPathは書き換えてください。
$TaskinPathも適当に変えてください。タスクスケジューラ内のこのフォルダにインポートされます。

インポート.ps1

if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole("Administrators")) { Start-Process powershell.exe "-File `"$PSCommandPath`"" -Verb RunAs; exit }

$XmlinPath = "C:\Users\hogehoge\Desktop\tasks\"
$TaskinPath = "\hoge\" 

$tasks = Get-ChildItem  "$XmlinPath\*.xml" -name

foreach ($i in $tasks)
  {
    schtasks /create /XML $XmlinPath$i /TN "$TaskinPath$i".Replace(".xml","")
  }

python chromedriverの自動バージョンアップ対応

追加記事

もう勝手にドライバーバージョンアップしてくれるそうです
daeudaeu.com

過去記事

pip install webdriver-manager

コードをこんな感じにする。
例外でるときあるので対応もしとこう

from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager
 
try:
    driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()))
except Exception:  # This will catch any type of Exception
    driver = webdriver.Chrome()

driver.get('https://google.com')

ネタ元

yuki.world