手順が詳細にわかっているために、WBSの項目がその手順に
引きずられて細かくなってしまいがちですが、
これはよくあることですが、WBSの目的を見失いがちな点でもあります。
では、どのように修正すればいいのでしょうか。そのポイントを書き出してみます。
<WBSの目的とは?>
WBSの目的は、プロジェクト全体の作業を階層的に分解し、全体像を把握することです。
詳細な手順は、WBSの各項目に対して作成する作業計画書などに記述するのが一般的です。
WBSの粒度を調整するポイント
<作業の目的を見極める>
各作業の目的は何ですか?
その目的を達成するために、どのようなアウトプットが必要ですか?
アウトプットを達成するために必要な最小限の作業は何か?
<管理の視点で考える>
この作業を誰が担当しますか?
進捗をどのように確認しますか?
問題が発生した場合、どこで対応しますか?
<8/80ルールを参考に>
1つの作業にかかる時間が、8時間以上80時間以下になるように
調整すると、粒度が適切になることが多いです。
<詳細な手順は別途管理>
WBSでは、作業の目的とアウトプットを明確にし、
詳細な手順は作業計画書などに記述します。
具体的にどのように調整するか?
例えば、「資料作成」という作業が非常に細かく分かれているとします。
現状:
資料作成
→資料構成を考える
→資料の骨組みを作成
→資料のデザインを決める
→資料を書く
→図表を作成
→資料を修正する
調整後: 資料作成(資料構成、骨組み作成、デザイン決定、執筆、図表作成、修正を含む)
このように、目的が同じ作業はまとめることで、粒度を調整できます。
<まとめ>
WBSは、プロジェクト全体を俯瞰するためのツールです。
詳細な手順にこだわりすぎず、目的を達成するために必要な
最小限の作業に焦点を当てて、適切な粒度でWBSを作成することが重要です。
[0回]
PR
# リモートサーバー名と共有フォルダ名、出力先を指定
$remoteServer = "NameServer01"
$shareName = "G$"
$outputPath = "C:\Temp"
# 出力ファイル名(タイムスタンプ付き)
$outputFile = Join-Path $outputPath ("$($shareName)_DriveInfo_$(Get-Date -Format yyyyMMdd_HHmmss).csv")
# リモートGドライブの情報を取得し、CSVファイルに出力
Get-ChildItem -Path "\\$remoteServer\$shareName" -Recurse | Select-Object Name, LastWriteTime, FullName | Export-Csv -Path $outputFile -NoTypeInformation
# 結果を表示
Write-Host "結果を以下のファイルに出力しました:" $outputFile
[0回]
カレントディレクトリ配下のディレクトリを再帰的に検索して
1GB以上のファイルをDドライブに出力している。
Get-ChildItem -Recurse -Force | Where-Object {$_.Length -gt 1GB} | Select-Object FullName, @{Name='SizeGB';Expression={$_.Length / 1GB}} > D:\largefiles.txt
[0回]
とりあえず形にしました。
#
# Cドライブの空き容量が90GBを下回った場合にのみメッセージを出力したい場合
#
# 監視対象ドライブ
$targetDrive = "C"
# しきい値(GB単位)
$threshold = 90
# パスワードファイルのパス
$credentialFile = "C:\passwords.txt"
# パスワードファイルからユーザー名とパスワードを読み込む
$credentials = Get-Content $credentialFile | ConvertFrom-Csv
# 各サーバに対して処理を実行
foreach ($server in $servers) {
$credential = $credentials | Where-Object { $_.ServerName -eq $server }
# Credentialオブジェクトを作成
$credentialObject = New-Object System.Management.Automation.PSCredential (
$credential.Username,
(ConvertTo-SecureString $credential.Password -AsPlainText -Force)
)
try {
# サーバに接続し、ディスク容量を取得
Invoke-Command -ComputerName $server -Credential $credentialObject -ScriptBlock {
$volume = Get-Volume -DriveLetter $using:targetDrive
if ($volume.Available -lt $using:threshold * 1GB) {
Write-EventLog -LogName Application -Source "DiskSpaceMonitor" -EventID 1001 -Message
"ドライブ$($volume.DriveLetter)の空き容量がしきい値を下回っています。$($volume.Available / 1GB:N2) GB"
}
}
}
catch {
Write-Warning "サーバー $server への接続に失敗しました: $($_.Exception.Message)"
}
}
[0回]
▼Q
pythonコードを検討しています。
引数でホスト名を与え、そのホスト名でjsonファイル内を検索して、同時に、
そのホストのIDとPWも同様にjsonファイルに記載されているので、それを使用して
paramikoでログインします。そして、「uname -a」か「/etc/redhat-release」で
ログインしたホストのバージョンかわかるように表示します。
具体的には下記のように表示します。
ホスト名:OSバージョン:確認日時
また、jsonファイルの名前は「hostList.json」です。
どのようなコードになりますか。
▼A
以下は、Pythonコードの例です。
このコードは、引数として与えられたホスト名を元に`hostList.json`ファイルを読み取り、
対応するホストのIDとPWを取得し、Paramikoを使用してリモートホストにSSH接続して
指定されたコマンドを実行し、結果を表示します。
```python
import json
import paramiko
from datetime import datetime
def get_host_credentials(host_name):
with open('hostList.json', 'r') as file:
data = json.load(file)
if host_name in data:
return data[host_name]['id'], data[host_name]['pw']
else:
raise ValueError(f"Host {host_name} not found in hostList.json")
def ssh_connect_and_execute(host_name, username, password, command):
try:
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(host_name, username=username, password=password)
stdin, stdout, stderr = client.exec_command(command)
result = stdout.read().decode('utf-8').strip()
return result
finally:
client.close()
def main(host_name):
try:
username, password = get_host_credentials(host_name)
# Connect to the remote host and execute the command
result = ssh_connect_and_execute(host_name, username, password, 'uname -a')
# Extract OS version information from the result
os_version = result.split('\n')[0]
# Display the information
current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
print(f"ホスト名: {host_name} / OSバージョン: {os_version} / 確認日時: {current_time}")
except Exception as e:
print(f"エラー: {str(e)}")
if __name__ == "__main__":
host_name_input = input("ホスト名を入力してください: ")
main(host_name_input)
```
このコードは、`paramiko`ライブラリを使用してSSH接続を行います。
また、`get_host_credentials`関数は指定されたホスト名の認証情報を
`hostList.json`から取得します。`ssh_connect_and_execute`関数はSSH接続を確立し、
指定されたコマンドを実行します。
`main`関数はこれらの関数を呼び出して結果を表示します。
[0回]