BackupList+ v.8.7.0

Mojave対応で(主にアピアランス面で)、そろそろバージョンが変わるだろうなと思っていましたが、漸くv.8.7.0が出ました。
Buildが11/23日で、まだサイトへは掲載されていないようです。私は、MacUpdateのページからダウンロードしました。アプリケーション内からのアップデートはもう始まっているのではないでしょうか。

変更点は以下のようになっています。

The following changes have been made:

Updated for OS High Sierra 10.13 and 10.14 Mohave
New feature: There are now dedicated multiple backup tasks located below the usual backup task list.
New feature: There are now two buttons in the title bar, one to create new tasks and the other to show helpful tool tips.
Fixed several bugs in Mohave,
Fixed bug where scheduled backups would launch repeatedly when no destination disk was mounted.
Changed some cloning behaviors for the new apfs file system introduced in High Sierra.
Fixed bug preventing remounting of encrypted sparse images.
Latest custom build of rsync 3.1.1 optimized for OS X.

掻い摘んで書けば、外観が変更になって、グループタスクが加わり、インスタントヘルプボタンがついたよ、といったところでしょうか。
肝心のrsyncはカスタムビルドのv.3.1.1で、前バージョンからの変更はないようです。

タスク設定は、前バージョンからそのまま引き継げますから、使い勝手での変更はないといっていいでしょう。

広告

簡易ファイルアップローダー、phpUploader

Webファイルマネージャーを探していた時には全く気がつかなかったのですが、そういえば、かつてはcgiでphpなどを使ったアップロード方式が人気があったなあと思い出し、探してみると恰好なものを見つけました。
phpUploader」というものです。
phpUploaderはオープンソース・ソフトウェア(MIT License)です。

ElFinderBoZonなどのWebファイルマネージャーのように、ブラウザ上でダイレクトにプレビューや編集ができるなどの機能は全くありませんが、Webブラウザ上でファイルのアップロード/ダウンロード、ファイルリスティングが出来るというのは簡潔で便利です。

設置例

リリース版をダウンロードします。展開したファイルの構成は以下のようになっています。

・phpUploader.v1.0:
	┕app:
		┕api:
			┝upload.php
			┝verifydelete.php
			┕verifydownload.php
		┕models:
			┝index.php
			┕init.php
		┕views:
			┝error.php
			┝footer.php
			┝header.php
			┕index.php
	┕asset:
		┕css:
			┕common.css
		┕js:
			┝common.js
			┕modal.js
	┕config:
		┕config.php
	┕delete.php
	┕download.php
	┕index.php
	┕MIT-LICENSE.txt

これらを、htmlルート以下の任意のディレクトリに配置します。

必要な環境は、以下の通りです。

・PHP Version 5.3.3+
・SQLite (PHPにバンドルされたもので可)
・apacheまたはnginxの実行環境

デフォルトファイルの拡張子でphpが指定されていれば、ディレクトリにアクセスすれば次の図のような画面が現れます。

非常に簡潔で、出来ることが一目でわかる整理された画面構成です。

上の図は、転送できるファイルサイズ、ファイルタイプを変更しています。
これらの変更は、”config/config.php”ファイルを開いてから行います。
‘max_file_size’ で、 1件あたりの最大ファイルサイズ(単位 : MByte)を指定します。初期値は”2M”です。
“config/config.php”ファイルに注意書きがありますが、php.iniファイルの”memory_limit, post_max_size, upload_max_filesize”の値以下になるように(”php.ini”ファイルの初期値は2Mとなっていることが多いです)なっている必要があります。つまり、2M以上のサイズ指定をする場合は、”php.ini”ファイルの変更も必要だということになります。
ファイルタイプの変更は、’extension’ => array(‘zip’,’rar’,’lzh’)の部分を書き換えます。

以上です。
Basic認証などの認証方式は持っていないので、.htaccessなどを用いて接続制御をはかるべきでしょう。

気が付いたこと

サーバーの 設置ディレクトリ内では、アップロードされたファイルは、サーバー上ではそのままの名前ではなくdbで管理され、連番処理されて保存されるようです。ファイルIDの連番をリセットしたい場合は、ブラウザの画面上でファイルを空にしてから、(例えばサーバーマシン側のFinderから)db格納ディレクトリの”uploader.db”ファイルを削除する方法しかないようです。

私の設置環境

macOS 10.12 Sierra上で設置してみました。PHPは5.6.xなので問題なく動作します。

私の場合、FileMaker Serverが最優先という環境であるため、アップデート時などにConfigファイルがリセットされることが嫌なので.htaccessを設定したくないという事情があって、
アカウント管理はJavaScriptを使った簡易認証もどきを使って、更に、アカウントごとにディレクトリを切り替えることにしました。
ゲートウェイとするディレクトリにログイン用のhtmlを用意して、JavaScriptで認証部分を負担し、そこからアカウントごとの別なディレクトリにリダイレクトするという方法(ここを参照しました。このやり方では、パスワード認証というよりは、アカウントごとの認証と解釈されるのではと思うのですが…)で設置してみました。
JavaScriptでのなんちゃって認証なので、無いよりはマシという程度ですが、より強固なセキュリティ対策が必要なケースでは”Rumpus”や”CrushFTP”などのエンタープライズクラスのwebファイルマネージャーを導入しようかなと思っています。

BBEdit.app Ver.12.1.5

2018年6月5日のエントリーで、BBEdit.app v.12.1.4で、日本語入力(Japanese InputMethod)で誤動作するということを記しましたが、幸いなことにv.12.1.5では改善した(?治ったというべきかな)ようです。
v.12.1.5は、2018.07.13付でリリースされています。
リリースノートにも以下の記述があります。

Fixed various misbehaviors that would occur during Japanese (and other non-roman) text entry.

BBEdit.appでハードラップを使って箇条書きの整形をしてみる

●ハードラップ(文字数を指定して強制的に改行する)

プレーンテキストで文章を作成している時に、箇条書きのパートを作ることはよくありますが、その時に文字数を決めてリバースインデントを使って2行目以下を折りたたみたいことがあります。
レイアウトソフトで整形するのであれば、原稿は未整形のままであるべきですが、受け取る側もプレーンテキストで見る場合のことです。
プレーンテキストで送信したいメールなどがこのケースでしょう。
BBEdit.appのテキスト整形能力は非常に高いので、組み込みのコマンドで”Hard Wrap…”というものを備えているのですが、日本語を対象にすると指定した文字数で折り返すのではなく、句読点などと一部の記号を折り返しのマークと認識しているようで、意図した文字数以内で折り返してしまいます。
その上で、禁則はほとんど考慮してくれないという症状です。
そこで、やはりスクリプトで対処することにしました。
折り返しの文字数は、任意に指定できます。

property cNum : "38"

tell application "BBEdit"
	activate
	if (selection of text window 1 as string) is not "" then
		display dialog "折り返しの文字数を指定してください。" default answer cNum buttons {"キャンセル", "設定"} default button 2 with title "折り返しの文字数設定" with icon note returning {text returned:theVart, button returned:theVarb}
		set cNum to theVart
		replace "([^\\n]{" & cNum & "})(?=[^\\n$]*)" using "\\1\\n" searching in the selection of text 1 of text document 1 options {search mode:grep, starting at top:true, wrap around:false, backwards:false, case sensitive:false, match words:false, extend selection:false}
	else
		display notification "文字列を選択してから実行しましょう。" with title "Notification" subtitle ""
	end if
end tell

ダイアログ内の初期値は、設定値に置き換わる(前回の設定値を保持する)仕様なので、毎回リセットしたい場合はダイアログから返される値を代入する変数の名前を変えてください。

●ハードラップをリセットする

ハードラップで強制的に整形した段落を元に戻すスクリプトです。
行頭のインデントも削除するようになっていますので、これを1回実行するだけでリセットできるでしょう。

tell application "BBEdit"
	activate
	if (selection of text window 1 as string) is not "" then
		replace "([^。.)」】])([\\r\\n]+)+([> \\s]*)" using "\\1" searching in selection of text window 1 options {search mode:grep, starting at top:false, wrap around:false, backwards:false, case sensitive:false, match words:false, extend selection:false}
	else
		display notification "文字列を選択してから実行しましょう。" with title "Notification" subtitle "" --sound name "Frog"
	end if
end tell

BBEdit.appで箇条書きのリストを作成するスクリプトとそれを削除するスクリプト

嘗てはActaなどのアウトラインプロセッサを使うことが多かったのですが、最近はほとんど手にしなくなりました。そのため、アウトライン的な表現を多用する時にはマークダウンで代用したりしているのですが、プレーンテキストでもそれなりに箇条書きのニーズはあります。
そこで、段落の頭に任意のブレットを付加するスクリプトの登場です。
段落の先頭にブレットを付加するだけですから、折り返しのインデント設定は行っていません。
(プレーンテキストだけでインデント表現をしようと思っていませんので…。要は、レイアウトソフトへ持って行ってから整形するつもりなのです)

●箇条書きのリスト表示をするスクリプト

property Bullet : "• " -- "•, ‣, ⁃, ◦" -- 任意のブレットを設定して下さい。

tell application "BBEdit"
	activate
	if (selection of text window 1 as string) is not "" then
		display dialog "箇条書きのブレットを設定して下さい。" buttons {"キャンセル", "設定"} default answer Bullet default button 2 with icon note returning {button returned:theVarb, text returned:theVart}
		if theVart is not "" then set RtndBullet to theVart
		replace "^[  \\t]*" using RtndBullet searching in selection of text window 1 options {search mode:grep, starting at top:false, wrap around:false, backwards:false, case sensitive:false, match words:false, extend selection:false}
	else
		display notification "文字列を選択してから実行しましょう。" with title "Notification" subtitle ""
	end if
end tell

(*
	初期設定の"• "を起動の度にリセットして表示するようにしていますが、前回の設定を保持したい場合は、
	RtndBulletをBulletに置き換えて下さい。

*)

初期値としてブレット設定のダイアログで、”• “としていますが、任意のキャラクタを設定できます。また、
区切りの半角スペースをタブに設定する場合は、”•\t”とすればOKです。
AppleScriptだからといって、”\\t”でダブルエスケープする必要はありません。

●段落先頭のブレットを削除するスクリプト

tell application "BBEdit"
	activate
	if (selection of text window 1 as string) is not "" then
		replace "^[\\s->•‣⁃◦・*○●]+[\\s]*" using "" searching in selection of text window 1 options {search mode:grep, starting at top:false, wrap around:false, backwards:false, case sensitive:false, match words:false, extend selection:false}
	else
		display notification "文字列を選択してから実行しましょう。" with title "Notification" subtitle ""
	end if
end tell

削除対象のブレットのキャラクタは、任意で書き換えて下さい。(適当に設定しているのですが、※がないではないかと言われそうです…)

●BBEdit.appの”Text”メニューにある”Prefix/Sufix Line…”コマンドでは

“Prefix/Sufix Line…”で”Prefix”の「Insert」を設定すれば、行頭にブレットを付加できます。
注意しなければいけないのは、段落を選択しないで実行した場合、全ての段落にブレットが適用されることで、その点だけ注意が必要です。
上記のスクリプトを書いた時点では、このメニューコマンドに気がついていなくて、気がついた時点で掲載をやめようかとも持ったのですが、まあ、これはこれで…。

BBEdit.appで、行頭に段落番号を追加する/削除するスクリプト

以前、TextWrangler.app用に「Add Line Number.scpt」という名称で、段落番号を追加するスクリプトを公開しましたが、番号が1から開始するだけの仕様だったため、任意の番号から始められるように加筆したものを今回記載します。

●段落番号を追加するスクリプト

選択した範囲の段落の先頭に番号を指定した任意の番号(半角)から順に付加していきます。
オプションとして、桁合わせのために先頭に半角スペースか0を付加することができます。
次に、段落番号の後ろに、区切り文字を入れることができます。デフォルトでは「. 」となっていますが、任意の文字列を指定できます。
(残念ながら、増加分の指定は出来ません)

property Leading : "0"
property SuffixStr : ". "
property ParaList : {}
property LNUm : "1"

on run
	tell application "BBEdit"
		activate
		if (selection of text window 1 as string) is not "" then
			copy every line of selection of text window 1 to ParaList
			set NumParagraphs to count of items in ParaList
			display dialog "段落番号の開始番号を設定してください。" & return & return & "また、桁合わせのリーディングを使用しますか?" buttons {"キャンセル", "使用する", "数字だけ"} default answer LNUm default button 3 with icon note returning {button returned:theVarb, text returned:theVart}
			set LNUm to theVart
			if theVarb is "数字だけ" then
				set Leading to ""
			else
				display dialog "桁合わせのリーディングにゼロ ‘0’を使用しますか?" & return & return & "スペースにしますか?" buttons {"キャンセル", "0", "スペース"} default button 2 with icon note returning {button returned:theVarb}
				if theVarb is "0" then
					set Leading to "0"
				else
					set Leading to " "
				end if
			end if
			display dialog "区切りに ‘.’を使いますか?" & return & return & "スペースにしますか?" default answer SuffixStr buttons {"キャンセル", "設定"} default button 2 with icon note returning {button returned:theVarb2, text returned:theVart2}
			if theVarb2 is "設定" and theVart2 is not "" then
				set SuffixStr to theVart2
			end if
			set theResult to {}
			repeat with i from 1 to NumParagraphs
				if NumParagraphs < 10 then
					set end of theResult to (LNUm - 1 + i) & SuffixStr & item i of ParaList & return
				else if NumParagraphs < 100 then
					set end of theResult to my zeroL2((LNUm - 1 + i), Leading) & SuffixStr & item i of ParaList & return
				else if NumParagraphs < 1000 then
					set end of theResult to my zeroL3((LNUm - 1 + i), Leading) & SuffixStr & item i of ParaList & return
				end if
			end repeat
			set selection of text window 1 to (theResult as string)
		else
			beep
			display notification "文字列を選択してから実行しましょう。" with title "Notification" subtitle "" --sound name "Frog"
		end if
	end tell
end run

to zeroL2(n, leadingChar)
	if n < 10 then
		return leadingChar & n as string
	else if n < 100 then
		return n as string
	else
		return n as string
	end if
end zeroL2

to zeroL3(n, leadingChar)
	if n < 10 then
		return leadingChar & leadingChar & n as string
	else if n < 100 then
		return leadingChar & n as string
	else
		return n as string
	end if
end zeroL3

●行頭の段落番号除去スクリプト

行頭の段落番号除去バージョンです。

tell application "BBEdit"
	activate
	if (selection of text window 1 as string) is not "" then
		replace "^[\\s\\d0-9]+[\\..\\s ]*" using "" searching in selection of text window 1 options {search mode:grep, starting at top:false, wrap around:false, backwards:false, case sensitive:false, match words:false, extend selection:false}
	else
		display notification "文字列を選択してから実行しましょう。" with title "Notification" subtitle ""
	end if
end tell

こちらは区切り文字に合わせて変更しながら使用して下さい。

BBEdit.appのスクリプトパレット

BBEdit.appを使っていると、いつの間にかスクリプトの数が増えて、常用するスクリプトだけをリストアップしているのですが、図のようになっています。

 

図は、スクリプトパレットと呼ばれるようで、「Window」メニューの「Palettes」から「Scripts」を選択することで開けます。
BBEdit.appでは、下の図のようにpreferenceから殆どのメニュー項目にショートカットを設定できますので(ver.11、12で確認)、ここからスクリプトパレットにショートカットを設定しても良いのですが、上の図のようにスクリプトパレットを呼び出す/閉じるスクリプトを書いて、スクリプトパレットに表示させショートカットを割り当てることにしました。

●スクリプトパレットを呼び出す

tell application "BBEdit" to open scripts list

●スクリプトパレットを閉じる

tell application "BBEdit" to close scripts list -- saving no

“open”/”close”だけというシンプルなものです。
ショートカットの設定は、スクリプトパレット上の「Set Shortcut」ボタンをクリックしてから設定するといいでしょう。

BBEdit.appで、「, . .,→。、+全角()[]」の変換スクリプトなど

随分と久し振りに理工学書系統の組版をやりました。以前はほぼ理工学書専門と言っていい時期もあったのですが最近はご無沙汰で、何屋だか分からないような事をやっているのですが…。
そこで、原稿は当然のようにWordということになり、これはもうそれ以外ないようなもので(とは言えTeXで貰ってもねぇ…)Word形式は問題ないのですが、著者ごとに句読点が滅茶苦茶で、半角全角カンマピリオド読点句点のごちゃ混ぜで、かな漢字の間でも半角カンマだったり、今時これはないんじゃないのと頭を抱えたくなる混沌状態でした。
遠い昔、ワープロ全盛期からパソコンへの移行期、プロポーショナルフォントに慣れない世代にこういったことがあったといったことを聞いたことがあります(なんだかこじつけのような気がします…)。
今時こんなでいいのかと思った次第ですが、受けた側としてはなんとかするしかないわけで、結句、今回紹介するようなスクリプトを書く羽目になりました。
これまでも、句読点やパーレンの統一のための変換スクリプトはいくつか書いてはいましたが、今回のようなケースではなんとか手間を省きたいので、半角英数字混じりの文を一括で処理したいと思ったわけです。
原稿によって条件があまりに乱れているので、今回も全てに適用できたわけではないのですが、まあ、一つの足掻きの例として紹介する次第です。

●「, . .,→。、+全角()[]」の変換

変換用のスクリプトは、BBEdit.app用です。

tell application "BBEdit"
	activate
	if (selection of text window 1 as string) is not "" then
		replace "," using "、" searching in the selection of text 1 of text document 1 options {search mode:literal}
		replace "." using "。" searching in the selection of text 1 of text document 1 options {search mode:literal}
		replace "、 *" using "、" searching in the selection of text 1 of text document 1 options {search mode:grep}
		replace "(, *)(?=[^\\x00-\\x7f]+)" using "、" searching in the selection of text 1 of text document 1 options {search mode:grep}
		replace "(\\. *)(?=[^\\x00-\\x7f]+)" using "。" searching in the selection of text 1 of text document 1 options {search mode:grep}
		replace "(?<=[^\\x00-\\x7f])(, *)" using "、" searching in the selection of text 1 of text document 1 options {search mode:grep}
		replace "(?<=[^\\x00-\\x7f])(\\. *)" using "。" searching in the selection of text 1 of text document 1 options {search mode:grep}
		replace "(?<=[^\\x00-\\x7f])( *\\( *)" using "(" searching in the selection of text 1 of text document 1 options {search mode:grep}
		replace "( *\\( *)(?=[^\\x00-\\x7f]+)" using "(" searching in the selection of text 1 of text document 1 options {search mode:grep}
		replace "( *\\) *)(?=[^\\x00-\\x7f]+)" using ")" searching in the selection of text 1 of text document 1 options {search mode:grep}
		replace "(?<=[^\\x00-\\x7f])( *\\) *)" using ")" searching in the selection of text 1 of text document 1 options {search mode:grep}
		replace "(?<=[^\\x00-\\x7f])( *\\[ *)" using "[" searching in the selection of text 1 of text document 1 options {search mode:grep}
		replace "( *\\[ *)(?=[^\\x00-\\x7f]+)" using "[" searching in the selection of text 1 of text document 1 options {search mode:grep}
		replace "( *\\] *)(?=[^\\x00-\\x7f]+)" using "]" searching in the selection of text 1 of text document 1 options {search mode:grep}
		replace "(?<=[^\\x00-\\x7f])( *\\] *)" using "]" searching in the selection of text 1 of text document 1 options {search mode:grep}
		
		replace "([\\x00-\\x7f]+?)(、)([\\x00-\\x7f]+?)" using "\\1, \\3" searching in the selection of text 1 of text document 1 options {search mode:grep}
		replace "([\\x00-\\x7f]+?)(.)([\\x00-\\x7f]+?)" using "\\1. \\3" searching in the selection of text 1 of text document 1 options {search mode:grep}
	else
		display notification "文字列を選択してから実行しましょう。" with title "Notification" subtitle ""
	end if
end tell

かなりの悪足掻きです。まだまだ最終解というわけには行かず、参考文献のフォーマット部分の日本語文献では使えないでしょう。

●逆方向ceでは「。、→.,+全角()[]」

tell application "BBEdit"
	activate
	if (selection of text window 1 as string) is not "" then
		replace "、 *" using "," searching in the selection of text 1 of text document 1 options {search mode:grep}
		replace "、" using "," searching in the selection of text 1 of text document 1 options {search mode:literal}
		replace "。" using "." searching in the selection of text 1 of text document 1 options {search mode:literal}
		replace "(?<=[^\\x00-\\x7f])( *\\( *)" using "(" searching in the selection of text 1 of text document 1 options {search mode:grep}
		replace "( *\\( *)(?=[^\\x00-\\x7f]+)" using "(" searching in the selection of text 1 of text document 1 options {search mode:grep}
		replace "( *\\) *)(?=[^\\x00-\\x7f]+)" using ")" searching in the selection of text 1 of text document 1 options {search mode:grep}
		replace "(?<=[^\\x00-\\x7f])( *\\) *)" using ")" searching in the selection of text 1 of text document 1 options {search mode:grep}
		replace "(?<=[^\\x00-\\x7f])( *\\[ *)" using "[" searching in the selection of text 1 of text document 1 options {search mode:grep}
		replace "( *\\[ *)(?=[^\\x00-\\x7f]+)" using "[" searching in the selection of text 1 of text document 1 options {search mode:grep}
		replace "( *\\] *)(?=[^\\x00-\\x7f]+)" using "]" searching in the selection of text 1 of text document 1 options {search mode:grep}
		replace "(?<=[^\\x00-\\x7f])( *\\] *)" using "]" searching in the selection of text 1 of text document 1 options {search mode:grep}
		replace "([\\x00-\\x7f]+?)(、)([\\x00-\\x7f]+?)" using "\\1, \\3" searching in the selection of text 1 of text document 1 options {search mode:grep}
		replace "([\\x00-\\x7f]+?)(.)([\\x00-\\x7f]+?)" using "\\1. \\3" searching in the selection of text 1 of text document 1 options {search mode:grep}
	else
		display notification "文字列を選択してから実行しましょう。" with title "Notification" subtitle ""
	end if
end tell

こちらも同じように限定された条件では破綻します。
まあ、万能な対応というものは出来ないのでしょうが、なんだか不完全燃焼気味ではありますし、まだまだ何度も書き直しをやることになる気がします。

●行頭行末スペース除去

tell application "BBEdit"
	activate
	if (selection of text window 1 as string) is not "" then
		display dialog "行頭・行末のタブ削除を含みますか?" buttons {"キャンセル", "スペースだけ削除", "タブも含んで削除"} default button 3 with icon note returning {button returned:theVarb}
		if theVarb = "スペースだけ削除" then
			replace "[  ]+$" using "" searching in selection of text window 1 options {search mode:grep}
			replace "^[  ]+" using "" searching in selection of text window 1 options {search mode:grep}
		else if theVarb = "タブも含んで削除" then
			replace "[ \\s]+$" using "" searching in selection of text window 1 options {search mode:grep}
			replace "^[ \\s]+" using "" searching in selection of text window 1 options {search mode:grep}
		end if
	else
		display notification "文字列を選択してから実行しましょう。" with title "Notification" subtitle ""
	end if
end tell

エクセルからのコピーペースト文を対象とした場合に、行頭・行末のタブが邪魔な時には便利です。

●追補-ver.12.1.4で、日本語入力(Japanese InputMethod)が誤動作します

図のように日本語入力(Japanese InputMethod)で変換候補を次々にスクロールしていくと、その変換候補が挿入ポイントのカーソルの右に次々と表示され、それが消えてくれません。
ver.12.1.3まではこんな変な症状は出ませんでしたから、ver.12.1.4固有の問題だと思いたいところです(次のバージョンでは修正されていることを願うばかりです…)。
私は、ダウンロードしておいたver.12.0.2に戻して問題を回避しましたが、旧バージョンをダウンロードしていなくて、オートアップデートで最新版に対応している方は、ver.11をBarebone.comのサイトからダウンロードしてダウングレードするしかないかも知れません。
日本語入力がメインの作業の時は、ソフトラップ時の日本語の折り返し表示に難があるので、CotEditor.appなどを主に使っているので、ver.12.1.4で日本語入力(Japanese InputMethod)が誤動作することに気がつくのが遅れました。
ダウングレードを試している際に、ver.12.1.2ではソフトラップ時の折り返しがウィンドウ幅を超えるという現象にも遭遇しました。日本語環境でBBEdit.appを使い続けるという点で、なかなかハンディが大きいなという思いが湧いてきますが、Grepを使った検索/置換機能の強力さ・式表現の素直さを考えるとそう簡単に手放せないのも現実です。

WindowsからのZipファイルを文字化けしないで解凍するには?

WindowsへMacから文字化けしないZipファイルを手渡すためにはいくつかの方法があることを以下のエントリに書きましたが、逆に、Windowsから手渡されたZipファイルをMacで文字化けしないで解凍するためには、Mac標準のアーカイブユーティリティ.appではダメです。

WindowsマシンへZipファイルを渡すには
WindowsマシンへZipファイルを渡すには – 2
WindowsマシンへZipファイルを渡すには – 3

「20180111171620」という日付を名前にしたZipファイルが宅ふぁいる便経由で送られてきたのですが、Mac標準のアーカイブユーティリティ.appで解凍すると、上の図のように文字化けして開いて見るまで内容がわかりませんし、ファイル名は開いたところで不明のままです。

SHIT_JIS(CP932)でエンコードされたファイル名をUTF-8にデコードして解凍するツールを見つけないといけない訳です。

アーカイブされたファイル/フォルダのエンコーディングを自動判別して解凍してくれるツールがあっても良さそうなものですが、私が知る限りでは、紹介する“The Unarchiver.app”<https://theunarchiver.com>一択のようです(他にもあるはずなのですが…、あってもいいはずなのですが…)。

 

使い方

ダブルクリックで起動した場合、図のようにPreferencesウィンドウが開くので、慣れないとどうやって使うのか分からないかもしれません。図の一番上の項目の「zip」ファイルもチェックして、zipファイルの解凍も“The Unarchiver.app”に指定してしまうのも手でしょう。そして、任意のzipファイルを選択して、“情報を見る”からデフォルトのアプリケーションとして指定すれば、ダブルクリックでの起動で解凍アプリケーションとして“The Unarchiver.app”が使われるようになります。これが一番シンプルで面倒がないです。
個別に判断して、標準のアーカイブユーティリティ.appとThe Unarchiver.appを使い分けるのであれば、The Unarchiver.appのアイコンの上にアーカイブファイルをドロップするか、アプリケーションを指定して開くというのが一般的な使い方となります。

UTF-8以外のエンコーディングのzipファイルを解凍する際には、図のようなダイアログが出て、エンコーディングを確認してくるので、‘Japanese Shift JIS’を選択すれば文字化けしないで解凍できます。解凍後の表示サンプルが表示されますので、確認できる点も分かりやすいです。

ワークフロー、あるいはサービスを使ってThe Unarchiver.appを開く

Maczip4Win.appのワークフローと全く同じ手順で、ワークフローをAutomator.appを使って作成し、Finder上でアーカイブファイルを選択した状態でワークフローをメニューエクストラのスクリプトメニューから起動するといった方法が、私の場合は慣れで一番やりやすい方法です。
設定時のスクリーンショットを置いておきます。

WindowsマシンへZipファイルを渡すには – 3 – windowszipというPHPファイル

「WindowsマシンへZipファイルを渡すには」というエントリで、MacZip4Win.appを紹介しましたが、この度、新たなツールを見つけました。「mac-zip-windowsのwindowszip」です。
分かりにくいですね。githubのmac-zip-windowsサイトで公開されている「windowszip」という名前のPHPファイルが、mac標準のzipに変わって「ウィンドウズに渡しても文字化けしないで解凍できる」zipファイルを作成してくれるというものです。
使い方などの詳細は作者のブログ「MacBookを快適に!快適なマックライフを~」にありますので、そちらを参照すれば分かると思います。
実行ファイル「windowszip」のダウンロードもgithub経由でなくてもブログから直接ダウンロードできるようになっています。

「mac-zip-windowsのwindowszip」の特徴

特徴は、以下の通りです。

・ __MACOSXフォルダを作りません
・ .DS_storeファイルは圧縮対象外
・ 日本語ファイル、日本語フォルダはそのまま日本語で文字化けしません(UTF-8-MACからShiftJIS(CP932)に変換されます)
・ .txt拡張子は自動でWindows改行(CRLF)に変換して圧縮します
・ 圧縮対象のフォルダ・ファイルにWindowsの禁止文字が含まれていたら圧縮を中止して知らせます
・ フォルダ・ファイルでShiftJISに変換できない箇所を表示し圧縮を中止します

インストール

ダウンロードした「mac-zip-windows-master.zip」ファイルを解凍し、その中の‘windowszip’ファイルを任意の場所に置けばいいのですが、私は‘/usr/local/bin/’に置くことにしました。この時、‘windowszip’ファイルに実行権を付与しておくことを忘れないでください(ターミナルから’chmod +x /usr/local/bin/windowszip’のようにするのもいいでしょう。私は、カラムファイルブラウザでやりますが…)。

コマンドの構文

$ /usr/local/bin/windowszip ‘圧縮したいフォルダやファイル名’

引数としてファイル/フォルダ名を渡せばOKです。

automator.appを使ってワークフローを作る

作者のブログでは、mac標準機能の“サービス”を使ってFinder上で‘windowszip’を利用する方法が記載されていますが、私は“ワークフロー”にして、メニューエクストラのスクリプトメニューから実行することの方が好みです。従って、“ワークフロー”を作成することにしました。

作者のブログにある“サービス”と異なるのは先頭のステップで、Finder上の選択項目をシェルスクリプトの実行ステップへ引き渡すステップだけです。
“サービス”と“ワークフロー”の、Finder上の選択項目をシェルスクリプトの実行ステップへ引き渡す方法の違いは、こちらでも記載していますので参考にしてください。

使ってみての印象

処理が速いのでいいです。
Windowsの禁止文字やShiftJISに変換できない文字が含まれていると処理を中止するというのも、慣れればOKです。
MacZip4Win.appのように強制的にzipに入れてしまうというのもケースによってはありだと思っていますが、これはケースによって使い分けることにします。
未だHigh Sierra 10.13でもMacZip4Win.appは動いてくれますが、いつか動作しなくなることがあるかもしれません。その場合でも、この‘windowszip’は基本的にPHPのクラスファイルなので“動作しない”というようなことにはならないでしょう。OSレベルのエンコーディングの扱いが変更になるなどの大きな仕様変更がない限り、長期的に使っていけるだろうと思います。
perl、php、JavaScriptなどで誰か作ってくれないかと思っていましたので、本当に作者に感謝です。