macOS12.3でスクリプトが動かなくなったので修正した

　先日、macOS12.3へのアップデートを実施したところ、これまで動いていたいくつかのスクリプトが動かなくなりました。調べてみたところどうやら<a href="https://applech2.com/archives/20220309-apple-removed-python-from-macos-123-monterey.html" rel="noopener" target="_blank"><strong>Python2.x系のランタイム環境が削除された影響</strong></a>だったようです。今後のために対処した方法を置いておきます。

<h3 style="border-bottom: medium solid gray">VivliostyleをローカルPC内サーバーで展開するコードの修正</h3>
　以前、<a href="https://vivliostyle.github.io/vivliostyle_doc/ja/vivliostyle-user-group-vol2/JunTajima/index.html" rel="noopener" target="_blank"><strong>こちら</strong></a>に書いたものを社内でもずっと使っているのですが、こちらでローカルWebサーバ起動処理にPython2系を使っていたために動かなくなりました。これは単純にPython3を使ってサーバを起動すればよいので、

 
<pre class="lang:sh decode:true " >python -m SimpleHTTPServer 8000</pre> 

を
 
<pre class="lang:sh decode:true " >python3 -m http.server 8000</pre> 


に書き換えて終了。以下に一応全文を置いておきます。

 
<pre class="lang:applescript decode:true " >######vivliostyleフォルダ、表示するepubファイルの順でパスを指定するとepubファイルをVivliostyleで起動する。Mac専用。######
use utf8;
#Encodeモジュールをインポート
use Encode qw/encode decode/;

######Vivliostyleで表示する際のCSS追加指定######
my $addVivliostyleCss = "&amp;renderAllPages=true&amp;userStyle=data:,/*%3Cviewer%3E*/%0Aimg,%20svg%20%7B%20max-inline-size:%20100%25%20!important;%20max-block-size:%20100vb%20!important;%20object-fit:%20contain%20!important;%20%7D%0A/*%3C/viewer%3E*/%0A\@page%20:left%20%7B%0Amargin-right:%2010mm;%0A\@bottom-left%20%7B%0Acontent:%20counter(page);%0Amargin-left:%205pt;%0Amargin-bottom:%206mm;%0Awriting-mode:%20horizontal-tb;%0Afont-weight:%20normal;%0Afont-family:%20serif-ja,%20serif;%0A%7D%0A%7D%0A\@page%20:right%20%7B%0Amargin-left:%2010mm;%0A\@bottom-right%20%7B%0Acontent:%20counter(page);%0Amargin-right:%205pt;%0Amargin-bottom:%206mm;%0Awriting-mode:%20horizontal-tb;%0Afont-weight:%20normal;%0Afont-family:%20serif-ja,%20serif;%0A%7D%0A%7D%0A\@page%20:first%20%7B%0A\@bottom-left%20%7B%0Acontent:%20%27%27;%0A%7D%0A\@top-left%20%7B%0Acontent:%20%27%27;%0A%7D%0A%7D&amp;spread=true"; #見開き表示、画像表示最適化、ノンブル表示の指定を追加
#############################################

#vivliostyleパッケージのパスを取得
my $vivliostyleFolderPath = $ARGV[0];
$vivliostyleFolderPath = decode('UTF-8', $vivliostyleFolderPath);
#パッケージの親ディレクトリのパスを取得（そこを起点にローカルWebサーバを起動する）
my $currentFolderPath = $vivliostyleFolderPath;
$currentFolderPath =~ s@^(.+?)/[^/]+$@$1@;
#vivliostyleフォルダ名を取得
my $vivliostyleFolderName = $vivliostyleFolderPath;
$vivliostyleFolderName =~ s@^.+?/([^/]+)$@$1@;

#表示するepubファイルのパスを取得
my $epubFilePath = $ARGV[1];
$epubFilePath = decode('UTF-8', $epubFilePath);

#乱数代わりに日時の数字を取得してepub解凍フォルダ名決定
my $getDateTimeNowCommand = 'date "+%Y%m%d%H%M%S"';
chomp(my $datetimenow = `$getDateTimeNowCommand`);
my $epubUnzipFoldername = "vivliostyleepubtmp_" . $datetimenow;
#テンポラリフォルダ無ければ作る
unless (-d $currentFolderPath . "/tmp"){mkdir $currentFolderPath . "/tmp"};
#テンポラリフォルダにEPUBファイルを解凍する
my $epubUnzipCommand = "unzip " . $epubFilePath . " -d " . $currentFolderPath . "/tmp/" . $epubUnzipFoldername;
system $epubUnzipCommand;

#ローカルWebサーバ起動処理
my $serverStartCommand = 'osascript -e \'tell application "Terminal" to do script "cd ' . $currentFolderPath . ';python3 -m http.server 8000"\'';
system $serverStartCommand;

#ディレイ処理
my $delayCommand = "osascript -e 'delay 2'";
system $delayCommand;

#Vivliostyle Viewer起動
my $openVivliostyleCmd = 'osascript -e \'tell application "Google Chrome" to open location "http://localhost:8000/' . $vivliostyleFolderName . '/viewer/index.html#b=http://localhost:8000/tmp/' . $epubUnzipFoldername . $addVivliostyleCss . "\"'";
system $openVivliostyleCmd;</pre> 


<h3 style="border-bottom: medium solid gray">PDFのページ数の取得</h3>
　PDFのページ数を取得して全ページPhotoshopで画像変換する処理をAppleScriptで自動化していましたが、ページ数取得にPython2系を使っていたため動かなくなりました。

　従来のコードは<a href="https://doratex.hatenablog.jp/entry/20150727/1437960383" rel="noopener" target="_blank"><strong>こちら</strong></a>の記事を参照にしたものです。これはPyObjCというものを通じて処理をしているようなので単純なPython3への置き換えではうまくいきそうにありません（無理でした）。ただ、この場合PDFのページ数が取れればよいので手段は何もPythonに限らずともよいはずです。ちょっと調べてみたところシェルでPDFのページ数を取得するための<a href="https://apple.stackexchange.com/questions/198854/shell-command-to-count-pages-in-a-pdf-other-than-pdftk" rel="noopener" target="_blank"><strong>かなりの手段が見つかりました</strong></a>。
　このうち、とりあえず追加インストールが必要なさそうな「mdls」を使用する形で書き換えました（市川せうぞー師匠アドバイスありがとうございます）。Spotlight検索用のメタデータを使用するため<a href="https://doratex.hatenablog.jp/entry/20150727/1437960383#1" rel="noopener" target="_blank"><strong>信頼性は低い</strong></a>とのことなのですが、ユースケース的には支給されたPDFを画像変換し、変換後の画像は目視で確認しますのでまあうちの場合はこれで大丈夫でしょう。コード的には以下のような形です。

 
<pre class="lang:applescript decode:true " >on run {pdfFilePathValue}
	set pagenum to my pdfPageCount(pdfFilePathValue)
end run

--- 与えられたPDFのページ数を返す
on pdfPageCount(aPDF)
	return (do shell script ("mdls -name kMDItemNumberOfPages -raw " &amp; aPDF)) as integer
end pdfPageCount</pre> 


　何か問題が出るようであればexiftoolあたりを使う形に置き換えてもよいかなと思っています。