
私の会社は、セキュリティ上アプリの導入、インストール、ログインなどが許可されていません。必要な場合には申請しなければならないのですが・・
そもそも申請をしても通りません。・・というより上司が申請を出す気がないからです。理由は簡単。面倒臭いからです。
個人で直接システム管理部に申請を出すことはありません。こんな事をしたいからこのアプリを入れたいといった要望は出したことがありますが。まず上司の段階で却下。「別の方法がある」等ですが具体的は方法を教えてくれることはありません。
しかし、課内の提出物は年々高度なものを求められ図面、動画編集、ファイルの圧縮などわかり易くて軽い(容量の少ない)資料と効率化が求められます。(会社のサーバーを圧迫するから)
そこで「シャドーIT(Shadow IT)」(※組織の管理部門が把握していない(=影に隠れている)デバイスやソフトウェア、クラウドサービスなどを従業員が業務で使用すること)に走りがちです。それでも出来上がったものに対して疑問を持つ上司はいません。こんな事が社内のアプリだけでできるはずもないのに・・「結果OK!」そういう時代でした。
今でこそ会社のwindows標準で動画編集ソフトが標準で入っている時代になりましたが、会社の図面管理のためのCAD、業務効率化のための写真圧縮ソフトなど申請しても通らず、無料で有名なJWCADなどは、予算よりもセキュリティの問題でたいした機能も使わないのに高価な有料アプリを買わざるえません。
愚痴はこの辺にしておきましょう・・
アプリが許可されないなら作ればいい..画像圧縮
それでは、本編です。最近はAIが使えるいい時代になりました。会社でもアカウント登録などはもちろん禁止ですが小さなアプリくらいなら閉じたらAPIを使わずともアカウント無しの閉じたら消える汎用の会話AIで作れてしまいます。
まず私が作ったのは画像圧縮です。会社のカメラで撮った画像は、ITに疎い人がMAXの高解像度で撮ったものが多くそれを保存しておくだけでサーバーがいっぱいになってしまいます。ただ数枚の写真程度ならOutlookで自分当てに一度アップロードした段階で圧縮されるのでそれをまとめてダウンロードする事でサイズダウンはできます。しかし何百枚と撮りためた写真はそうはいきません。
画像圧縮 仕様 プロンプト
私がAIに入力したプロンプトは以下のようなものです。
・写真Jpgファイルまたは、写真の入ったフォルダごとドラッグ&ドロップすればまとめてResizeフォルダに圧縮されたものがコピーとして保存される。そう、フリーソフトでいえば「縮専」というアプリに近いものが作りたい。しかも会社のPCで何もいれられないのでwindowsの標準機能だけで動くようにしたい。
AIの出した答え
するとAIが以下のプログラムを書いてくれました。
※ちなみに一回で成功したわけではなく何度かエラーや修正をAIに加えてもらって30分もあれば完成しました。
# --- 初期設定 ---
# スクリプトがある場所(カレントディレクトリ)を取得して移動します
$PSScriptRoot = Split-Path -Parent $MyInvocation.MyCommand.Definition
Set-Location -Path $PSScriptRoot
# 画像処理に必要なライブラリ(System.Drawing)を読み込みます
Add-Type -AssemblyName System.Drawing
# 変換後の最大サイズ(長辺1000px)とJPEGの画質(50%)を指定します
$MaxSize = 1000
$Quality = 50
# --- JPEG保存用関数 ---
function Save-Jpeg($bmp, $path) {
# JPEG用のエンコーダー設定を取得します
$enc = [System.Drawing.Imaging.ImageCodecInfo]::GetImageEncoders() |
Where-Object MimeType -eq "image/jpeg"
# 画質を指定するための設定オブジェクトを作成します
$p = New-Object System.Drawing.Imaging.EncoderParameters(1)
$p.Param[0] = New-Object System.Drawing.Imaging.EncoderParameter(
[System.Drawing.Imaging.Encoder]::Quality, $Quality
)
# 設定を適用してJPEGファイルとして保存します
$bmp.Save($path, $enc, $p)
}
# --- 画像処理のメイン関数 ---
function ProcessFile($file) {
$ext = $file.Extension.ToLower()
# JPEGまたはPNG以外のファイルは無視して終了します
if ($ext -notin ".jpg",".jpeg",".png") { return }
# すでに「Resize」フォルダ内にあるファイルは二重処理を防ぐため無視します
if ($file.FullName -match "\\Resize\\") { return }
# 保存先として「Resize」というフォルダ名を作成します
$outDir = Join-Path $file.DirectoryName "Resize"
# フォルダがなければ新規作成します
if (!(Test-Path $outDir)) {
New-Item -ItemType Directory -Path $outDir | Out-Null
}
# 画像をメモリに読み込みます
$img = [System.Drawing.Image]::FromFile($file.FullName)
# アスペクト比(縦横比)を維持するための計算
$w = $img.Width
$h = $img.Height
if ($w -ge $h) {
$nw = $MaxSize
$nh = [int]($h * $MaxSize / $w)
} else {
$nh = $MaxSize
$nw = [int]($w * $MaxSize / $h)
}
# リサイズ用の新しいキャンバスを作成し、高品質で描画します
$bmp = New-Object System.Drawing.Bitmap $nw, $nh
$g = [System.Drawing.Graphics]::FromImage($bmp)
$g.InterpolationMode = [System.Drawing.Drawing2D.InterpolationMode]::HighQualityBicubic
$g.DrawImage($img, 0, 0, $nw, $nh)
# 出力ファイル名を作成(元のファイル名_rsize.jpg)
$name = $file.BaseName + "_rsize.jpg"
$save = Join-Path $outDir $name
# PNGならそのまま保存、それ以外(JPGなど)は画質調整して保存します
if ($ext -eq ".png") {
$bmp.Save($save, [System.Drawing.Imaging.ImageFormat]::Png)
} else {
Save-Jpeg $bmp $save
}
# メモリを解放するために、使用したオブジェクトを破棄します
$g.Dispose()
$bmp.Dispose()
$img.Dispose()
# 処理完了を画面に表示します
Write-Host "OK: $save"
}
# --- 実行部分 ---
# ドラッグ&ドロップされたファイルやフォルダのパスを取得します
$target = $args[0]
# 何も指定されていない場合のチェック
if (-not $target) {
Write-Host "Please drag and drop a file or folder."
Read-Host "Press Enter to exit"
exit
}
$item = Get-Item -Path $target -ErrorAction SilentlyContinue
# パスが存在するか確認
if (-not $item) {
Write-Host "Path not found: $target"
Read-Host "Press Enter to exit"
exit
}
# フォルダなら中身を再帰的に検索して処理、ファイルならそのファイル単体を処理します
if ($item.PSIsContainer) {
Get-ChildItem $item.FullName -Recurse -File |
Where-Object {
$_.Extension -match "\.jpg|\.jpeg|\.png" -and
$_.FullName -notmatch "\\Resize\\"
} |
ForEach-Object {
ProcessFile $_
}
} else {
ProcessFile $item
}
Write-Host "DONE"
Read-Host "Press Enter to exit"
こちらをメモ帳にでも貼り付けてResize.ps1として保存。次に・・
@echo off
powershell -NoProfile -ExecutionPolicy Bypass -File "%~dp0Resize.ps1" "%~1"
exit
こちらも同様にメモ帳に貼り付けてrun.batとして保存。
※「実行ポリシー」の補足: ExecutionPolicy Bypassを指定している理由は、「PowerShellのセキュリティ制限を一時的に回避してスクリプトを実行するため」
すると画像ファイルをrun.batにドラッグすると同じフォルダ内にresizeというフォルダを作って最大サイズ(長辺1000px)、JPEGの画質(50%)にサイズダウンしたものを入れる。フォルダごとrunl.batにドラッグするとドラッグしたフォルダの中に同じようにrisezeフォルダを作り、サイズダウンしたものが入ります。更にサイズや画質をいじりたい時は上の数値をいじればいいだけ。めちゃくちゃ簡単でしょ。
元ファイルを消すわけではなく、Resizeフォルダにコピーを作成することで、失敗しても元データが残るから安心です。
これでフォルダごと放り込むだけで画像サイズがまとめて縮小していくというプログラムができあがりました。
これは、windows標準のpower-shellを使ったプログラム。最初から入ってる標準機能だけで自分のやりたいことができてしまいます。
こうやって業務の合間に1ページ程度の簡単なプログラムを書かせ自分で直していくとプログラミングの知識も自然についてくるというわけ。自分だけ効率よく仕事できるなんてワクワクしませんか?
注意事項
ただ、1つ注意が必要なのは会社によっては、システム担当でもない個人がここまでのことをやるとシャドーITとみなされてせっかく会社のためにやったことで処分を受けることにもなりかねない事だけは頭にいれておいてください。
私の会社では、先日別の課の人間がアプリを作ったという話を聞いたし。一年前までいた上司もPIとエクセルを使って業務の効率化をしていたので問題ないと思いますが。セキュリティの厳しい会社では、エクセルのマクロですらだめっていうところもあるから気をつけてください。それにアプリを作ったからといっても所詮AIに作らせただけだからあまり得意げに周りに知らせず自分だけこっそり使うのが吉だと思いますよw

コメント