Puppeteer で要素を削除する

Puppeteer で シングルページアプリケーション(SPA)などページ遷移により要素がリセットされない場合など強制的に消しておきたいときに使いました。

await page.evaluate(() => {
    elementDelete = document.querySelector('#id');
    elementDelete.parentNode.removeChild(elementDelete);
});

Powershell ADSIで指定OUのユーザー一覧取得

別ドメインのサーバから、Powershellを使って指定のActiveDirectory、OUのユーザー一覧を取得するスクリプトです。

# 資格情報取得
$Credential = Get-Credential

# オブジェクト作成
$Searcher = New-Object -TypeName System.DirectoryServices.DirectorySearcher

# 検索対象のADオブジェクトを定義
$Searcher.Filter = "(ObjectClass=user)"

# 検索対象のドメインを指定
$DomainDN = "LDAP://<AD SERVER NAME>.hogehoge.local/OU=<OUNAME>,DC=hogehoge,DC=local"

# 「DirectoryEntry」オブジェクトを作成し、ドメイン、資格情報を追加
$Domain = New-Object `
    -TypeName System.DirectoryServices.DirectoryEntry `
    -ArgumentList $DomainDN,
        $($Credential.UserName),
        $($Credential.GetNetworkCredential().password)

# 検索情報を追加
$Searcher.SearchRoot = $Domain

# 配列定義
$arg = @()

# 必要なプロパティのみ取得(任意に指定してください)
# ここでは「UserAccountControl」は16進数に変換している(末尾が 0x0002 はアカウントが無効)
# https://support.microsoft.com/ja-jp/help/305144/how-to-use-useraccountcontrol-to-manipulate-user-account-properties
foreach($list in $Searcher.FindAll()){
    $arg += $list.properties["name"][0] + "," + $list.properties["displayname"][0] + "," + $list.properties["useraccountcontrol"][0].Tostring("x")
} 

# CSVファイルに書き出し
$arg > AdUserList.csv

海外モデルのスマホでRakuten UN-LIMIT を使う

Xiaomi Mi Mix 2s で Rakuten UN-LIMIT を使ってみた。

楽天回線エリアとパートナー回線エリアの境目あたりだったためか、通話が不安定だった。(データ通信はできていたので、auの「CDMA 1X WIN」に対応していないせいかな)

この機種で利用する場合、パートナー回線エリアでの利用も想定し、VoLTEを有効にしておく必要がありそう。

Xiaomi 端末でVoLTEを有効にす方法

電話アプリから以下の番号を発信することで、[設定]-[SIMカードとモバイルネットワーク]のメニューに「VoLTE」のメニューが表示されるようになります。

*#*#86583#*#*

参考サイト

MySQL バージョンアップ後にクエリ パフォーマンスが低下する

MySQL 5.6から、AWS Aurora MySQL へ移行後にクエリのパフォーマンスが低下したため原因を調査

色々メモリ関連のオプションなどを調整したが、解決できず以下の文言を発見

通常、デフォルト値が推奨されます。オプティマイザによるクエリプランが不適切な場合、または推定が誤っている場合は、これらのフラグを調整する必要があるかもしれません。たとえば、optimizer_switch フラグの condition_fanout_filter および derived_merge を無効化することで、5.6 から 5.7 へのアップグレード後の、クエリにおけるパフォーマンス低下を緩和できます。フラグはパフォーマンスに大きな影響を与える可能性があるため、これらのフラグを有効化する前にワークロードを入念にテストしてください。

https://aws.amazon.com/jp/blogs/news/best-practices-for-configuring-parameters-for-amazon-rds-for-mysql-part-1-parameters-related-to-performance/

オプティマイザスイッチのパラーメーターを調整して解決

optimizer_switch
condition_fanout_filter=off,derived_merge=off

AWS EC2 Windowsで壁紙にインスタンスの情報が表示されなくなった場合の対処

AWS EC2 Windowsで壁紙にインスタンスの情報が表示されなくなった場合の対処について記載します。

1.管理者としてPowerShellを起動し、以下のコマンドを実行

Import-Module "C:\ProgramData\Amazon\EC2-Windows\Launch\Module\Ec2Launch.psd1"
Get-ChildItem $env:LOCALAPPDATA -filter ec2Wallpaper*.jpg | Remove-Item
Clear-Wallpaper
Set-Wallpaper
New-WallpaperSetup

2.以下のファイルを作成(コマンド実行時に削除されるので、ベースの壁紙を置いておく)
C:\Users\Administrator\AppData\LocalEc2Wallpaper.jpg

Windows イベントログのCSVエクスポート

WindowsのイベントログをCSVでエクスポートする要件が出たので、PowerShellのGet-EventLogでエクスポートを考えていたのですが、Message部分に改行が含まれて、1イベントで1行になってくれないため、後々集計しづらくなってしまう。
それを避けるため、「PsTools」の「PsLogList.exe」を使って実現しました。

使い方

PsToolsをダウンロードし、解答すると以下のexeファイルが展開されるので、以下のように実行する。

PsLogList.exe system -s >> EventLog_System.csv

・オプション
-s:このスイッチを指定すると、PsLogList では、イベント ログのレコードを 1 行に 1 つずつ出力します (区切り記号にはコンマを使用します)。この形式は、文字列を検索する場合 (例、psloglist /i <文字列>、findstr /i <文字列>) や出力を Excel ブックにインポートする場合に便利です。

ダウンロード

PsLogList

Windows 10 で MySQL ODBCドライバ(64bit版)のインストールエラー

Windows 10 に64bit版のMySQL ODBCドライバのインストールをすると、以下のエラーが表示される

エラーメッセージ
Error 1918,Error Instaling ODBC driver MySQL ODBC 8.0 ANSI Driver, ODBC error 13: システムエラーコード126: 指定されたモジュールが見つかりません。…\myodbc8S.dll) のために、MySQL ODBC 8.0 ANSI Driver ODBC ドライバーのセットアッププログラムを読み…

https://dev.mysql.com/downloads/connector/odbc/

解決策

以下のサイトから最新版(現時点ではVS2019)の「Visual Studio 2019 の Microsoft Visual C++ 再頒布可能パッケージ」をダウンロードしインストールします。

https://visualstudio.microsoft.com/ja/downloads/

Windows Remote Management(WinRM)設定

Windows 環境においてAnsibleのようにリモートから対象サーバのコマンドやスクリプトを実行するためにWindows Remote Management(以下WinRM) を利用して実行する方法を記載します。
※ここではWindowsファイアウォールなどのネットワーク設定は割愛します。

準備(接続先サーバ)

Powershell(管理者として実行)から以下のコマンドを実行しサービスを有効化します。
詳細なオプションはこちらを参照

Enable-PSRemoting -Force

準備(接続元サーバ)

Powershell(管理者として実行)から以下のコマンドを実行し接続先ホストを許可します。ここでは *(アスタリスク) を指定しています。(どこでも接続可能)

Set-Item WSMan:\localhost\Client\TrustedHosts * -Force

接続方法

「Enter-PSSession」コマンドで接続できることを確認します。
資格情報を入力するダイアログが表示されますので、接続先のユーザー/パスワードを入力します。

$credential = Get-Credential
接続先資格情報を入力
Enter-PSSession -ComputerName <HOSTNAME> -Credential $cred

サンプルスクリプト

スクリプトでバックグラウンドで実行する場合は、資格情報をファイルに暗号化した状態で保管しておくと良いかと。
Powershellでのパスワードをセキュア ストリングファイルとして保存する方法はこちらを参照

#パスワードファイルを読み込み
$pass       = Get-Content <FILENAME> | ConvertTo-SecureString

#復号化
$credential = New-Object System.Management.Automation.PSCredential "<USERNAME>",$pass

#リモートホストの資格情報とコマンドを指定
Invoke-Command <HOSTNAME> -credential $credential -ScriptBlock { C:\tools\run.ps1 }

必要となる権限やポートについて

Administratorであればデフォルトのまま接続可能ですが、AdministratorやAdministratorsの権限を付与したくない場合、以下のグループへ参加することにより必要最小限の権限で接続できます。

またネットワークで接続する場合はポートは以下のとおりです。

HTTP: 5985/tcp
HTTPS:5986/tcp

https://support.microsoft.com/ja-jp/help/2019527/how-to-configure-winrm-for-https

参考

http://www.vwnet.jp/Windows/PowerShell/2018020501/ConnectRemotePS6.htm
https://yomon.hatenablog.com/entry/2015/03/30/133450

WSUS 4.0の自動承認スクリプト

WSUS4.0から、PowerShellで操作できることが格段に増えたので、手動で運用しているようなものをバッチ回して自動的に処理させる。

1. Itanium系のパッチ拒否
2. 数日経過してから承認する(WSUSの基本機能だと適用期限しか設定できないため)
3. 先行適用グループと全体適用グループで承認間隔を分ける
4. クリーンナップ

注意点

先行適用グループと全体適用グループ用に承認スケジュールを分けると、「未承認」、「承認済み」で検索条件を分ける必要がある。
未承認と承認済みは、以下のパラメータとなる。

未承認

IsApproved = False
IsDeclined = False

承認済み

IsApproved = True
IsDeclined = False

スクリプト

#
# WSUS4.0サーバ用 自動承認スクリプト
#

# パラメータ設定
$day = get-date -format "yyyyMMdd"
$log_dir = "C:\Tools\wsus_maintenance\log"

# WSUSのポートをデフォルトから80へ変更している場合(WSUSサーバ上で実行)
$wsus = Get-WsusServer -name localhost -PortNumber 80

# 日付設定
$5daysago = Get-Date (Get-Date).AddDays(-5) -format "yyyy/MM/dd 0:00:00"
$6daysago = Get-Date (Get-Date).AddDays(-6) -format "yyyy/MM/dd 0:00:00"
$7daysago = Get-Date (Get-Date).AddDays(-7) -format "yyyy/MM/dd 0:00:00"
$8daysago = Get-Date (Get-Date).AddDays(-8) -format "yyyy/MM/dd 0:00:00"


# Itaniumの拒否: Itaniumのクライアントがいない場合はこれらは不必要

$ia64 = $wsus.GetUpdates() | Where-Object {$_.title.indexof("Itanium") -gt 1 -and $_.title.indexof("x64") -eq -1 -and $_.ArrivalDate -gt [datetime]::Now.AddDays(-7)}
foreach($patch in $ia64) {
  $wsus | Get-WsusUpdate -UpdateId $patch.id.updateid | Deny-WsusUpdate
}

#
# 自動承認(先行適用グループ用)
# 6日前にダウンロードされたものを承認
#

$ahead = $wsus.GetUpdates() | Where-Object {$_.ArrivalDate -gt $6daysago -and $_.ArrivalDate -lt $5daysago -and $_.IsApproved -eq $False -and $_.IsDeclined -eq $False}
foreach($patch in $ahead) {
  $wsus | Get-WsusUpdate -UpdateId $patch.id.updateid | Approve-WsusUpdate -TargetGroupName "先行適用G" -Action Install
}

#
# 自動承認(その他すべて)
# 8日前にダウンロードされたものを承認
#

$allgroup = $wsus.GetUpdates() | Where-Object {$_.ArrivalDate -gt $8daysago -and $_.ArrivalDate -lt $7daysago -and $_.IsApproved -eq $True -and $_.IsDeclined -eq $False}
foreach($patch in $allgroup) {
  $wsus | Get-WsusUpdate -UpdateId $patch.id.updateid | Approve-WsusUpdate -TargetGroupName "すべてのコンピューター" -Action Install
}

# クリーンアップ:置き換えられたパッチや拒否済みのものを削除する
$wsus | Invoke-WsusServerCleanup -CleanupObsoleteUpdates -CleanupUnneededContentFiles -CompressUpdates -DeclineExpiredUpdates > C:\Tools\wsus_maintenance\log\$day.log

# ログローテーション
forfiles /P $log_dir /M * /C "cmd /c if @isdir==FALSE del /s @path" /D -30

参考

http://kkamegawa.hatenablog.jp/embed/20121209/p1kkamegawa.hatenablog.jp

WordPress.com Blog.

ページ先頭へ ↑