Squoosh CLIを使って画像圧縮を自動化する

Webに画像を貼り付ける場合、スマホなどで撮影した画像はデータサイズが大きすぎて表示されるまでに時間がかかるため、画像を縮小してデータサイズを減らし表示速度を早くする必要があります。この画像縮小ツールは数多ありますが、圧縮率・GUIの使いやすさの点でSquooshを利用しています。

しかし、ブラウザ上で動作するSquooshは1枚ずつしか変換できない上に、画像を開く度にパラメータがリセットされてしまうため、複数の画像ファイルを一括変換する場合は効率が悪いです。

これを解決する手段としてコマンドライン版Squoosh(Squoosh CLI)を使う方法がありますが、インストールと自動化に難儀したのでメモしておきます。

下記手順はMacOS上で動作確認をしています。Windowsの場合はImageMatickをインストーラを使ってインストールし、さらにgitをインストールしたときに一緒にインストールされるgit-bashから起動すればサンプルプログラムが動作すると思います(未確認)。

Squoosh CLIとImageMagickのインストール(Mac OS 12.5で確認)

node.jsをインストールする

下記サイトよりnode.jsのLTS版のインストーラをダウンロードしてインストールする。
https://nodejs.org/ja/download/

インストール後に ‘node -v’コマンドを実行して、目的のバージョンのnode/npmコマンドが正しく動作することを確認しましょう。node.jsのバージョンが期待したものと違うとsquoosh-cliが正しく動作しない場合があります。

# node -v

v16.16.0

$ npm -v

8.11.0

(*)2022.8.6時点でのLTS版はv16.16.0で、このバージョンで動作することを確認しています。最新版の18.7.0ではsquoosh-cliはコマンド実行中にエラーとなり動作しないことを確認しているため、このバージョンは使用してはいけません。

squoosh-cli のインストール

下記コマンドを実行し、squoosh-cliをインストールする。

$ sudo npm i -g @squoosh/cli

インストールが完了したら、下記コマンドを実行してsquoosh-cliが正しく実行できることを確認すること。

$ squoosh-cli -h

Usage: squoosh-cli [options] <files...>

Options:
  ...

ImageMagickのインストール

下記コマンドを実行してインストールする。

$ brew install imagemagick

ブラウザ上でsquooshで変換する場合は縦画像は縦画像として表示されそれを変換しますが、squoosh-cliで変換するとExifの回転情報は参照しないためか横向きの画像になってしまいます。正しい方向で表示されるようにはImageMagickを使用してExif情報を読み取り、変換前に画像を回転させる必要があります。

これで自動化に必要なソフトはインストール完了です。

変換用スクリプトサンプル

下記はExifのrotation情報を参照して画像を回転させたのち、800×800のサイズに収まるように画像ファイルをjpegファイルへ変換するスクリプトのサンプルです。

#!/bin/zsh

export PATH=$HOME/.nodebrew/current/bin:$PATH
export PATH=/opt/homebrew/bin:/opt/homebrew/opt/coreutils/libexec/gnubin:$PATH
export PATH=/opt/homebrew/Cellar/imagemagick/7.1.0-45/bin:$PATH

for file in "$@"
do
	#Fullパスへ変換
	file_fullpath=`ls $file(:a)`

	#変換ファイル出力先
#	output_directory=$(dirname "$file_fullpath") #出力先を変換元ファイルと同じフォルダにする場合
	output_directory=${HOME}/Downloads #出力先を固定する場合

	#変換ファイルSuffix
	suffix="_resize"

	#変換ファイルサイズ
	max_dimension=800

	filename_extention=$(basename "$file_fullpath")
	filename="${filename_extention%.*}"
	extention="${file##*.}"

	#file_rotate="${output_directory}/${filename}_rotate.${extention}"
	file_rotate="/tmp/${filename}_rotate.${extention}"
	file_squoosh="${output_directory}/${filename}_rotate_squoosh.${extention}"
	file_output="${output_directory}/${filename}${suffix}.${extention}"

	orientation=`identify -format "%[EXIF:orientation]" $file_fullpath`
	case $orientation in
		8) rotate=270;;
		3) rotate=180;;
		6) rotate=90;;
		*) rotate=0;;
	esac
	convert $file_fullpath -rotate +$rotate $file_rotate

	width=`identify -format "%[width]" $file_rotate`
	height=`identify -format "%[height]" $file_rotate`
	param_resize="{enable:true,"
	if [ $width -gt $height ]; then
		param_resize+="width"
		if [ $max_dimension -gt $width ]; then
			max_dimension=$width
		fi
	else
		param_resize+="height"
		if [ $max_dimension -gt $height ]; then
			max_dimension=$height
		fi
	fi
	param_resize+=":${max_dimension}}"
	squoosh-cli --mozjpeg '{}' --resize ${param_resize} -s "_squoosh" -d "${output_directory}" "$file_rotate"
	mv $file_squoosh $file_output 
	rm $file_rotate

	/usr/bin/osascript -e 'display notification "'"${filename_extention//\"/\\\"}"'" with title "Squoooshで圧縮しました"'
done

Synology NASでL2TP VPNサーバーを設定する

Synology NASをバックアップするにあたり、FreeFileSyncを使ってSMB経由でミラーリングバックアップしています。SMB経由であればローカルドライブと同様にFreeFileSyncを使えるので、簡単にミラーリングバックアップができ、大変重宝しています。

一方、地震や火災などに備えて実家においてあるHDDにバックアップする場合、家庭内LANにVPNでSMBでアクセスできるようにしないとFreeFileSyncでバックアップすることはできません。

このVPNサーバーをSynology NASに設置したところ設定に引っかかるところがあり、原因を探るのに時間がかかったので、再度同じことをしないように全体の設定をメモしておきます。

Synology NASにVPNサーバーを立てる

  1. DiskStationで’VPN Server’をインストールする
  1. VPN Serverの’L2TP/IPSec’の項目を以下のように設定する
  1. VPN Serverの’特権’で接続時に使用するアカウントにチェックを入れる

ルーターのポートフォワーディングを設定する

Global IPを割り当てているルーターに対し、下記のようにルーターのポートフォワードを設定する。フォワード先のIPアドレスはLAN内に置いたSynology NASのIPアドレスを設定すること。

VPNクライアントを設定する

Windows

  1. Windowsの’設定’から’ネットワークとインターネット>VPN>VPN接続を追加する’を選択する
  1. 下記のように設定する。’サーバー名またはアドレス’欄にはルーターのWAN側に当てられているFQDNドメインかIPアドレスを設定する。事前共有キーはSynology側で設定したものと同じものを入力すること

  1. LAN内にあるVPNサーバーに接続できるようにレジストリを追加する。

    デフォルトのWindows設定ではLAN内にあるVPNサーバーにアクセスできないようになっています。この制限を解除するには、レジストリエディタで下記パス’HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\PolicyAgent’にあるAssumeUDPEncapsulationContextOnSendRuleの値をDword:2に変更する必要があります。

Mac

  1. システム機能拡張から’ネットワーク’を選択し、下記をクリックしてVPN(L2TP over IPSec)を選択する。
  1. ①にルーターのGlobal IP/Global Domainと接続用アカウントを入力し②を選択して、認証設定ウィンドウを表示してパスワードと事前共有鍵を入力して、設定を完了させる。

Android/iOS

iOS/AndroidでVPNを必要とする場面はあまりないです。しかし標準VPNクライアントを使って接続できるようにしておくと、SimpleComicなどのSMB対応クライアントを使用してアプリから家庭内NAS内のファイルを操作できるので結構便利です。

また、海外にいる際に日本でのみ閲覧可能なサイトにもアクセスできるようになるので、設定しておくといいです。


Androidの設定例
iOSの設定例

参考になれば幸いです。

SmartGitのGitHub連携方法

Gitのクライアントアプリは色々ありますが、マルチクライアント対応やBranch/Tag/Logの一覧性の高さの点でSmartGitを常用しています。

SmartGitはGitHubと連携する機能を持っていますが、設定方法が思い出しにくいため、メモとして残しておきます。

  1. GitHub上でPersonal access tokenを取得する。
    ※取得方法はここを参照してください。
  1. “Edit > Preference”を選択する
  1. ’Hosting Providers’を選択し、GitHub上で取得した個人アクセスTokenを’Token’の欄に入力する。
    このとき、GitHubのID/Passwordの入力を促されるので、個人アクセスTokenを取得したID/Passwordを入力する。
    GitHub Enterpriseを利用している場合は’Use a GitHub Enterprise instance’にチェックを入れて、GitHubサーバーのURLを’Server URL’の欄に入力する。
  1. 設定が成功するとBranch viewにGitHubのアイコンが表示され、Pull Requestがある場合は下記のようにPull Requestの一覧が表示されるようになります。FetchすればPull Requestとmainlineとの差分をLog Window上で表示でき、常用しているDiffツールで差分確認もできるようになります。

参考になれば幸いです。

初めてのPCB設計

ソフト開発エンジニアとして25年以上、趣味レベルだと40年近くプログラミングを嗜んできておりますが、そのソフトを動かす土台のハードウェア開発については知識がなく知ろうとする機会もありませんでした。

今回Arduinoを使ってWindowsからCANを使ってリレーを操作するハードウェアを製作し、その際にPCB設計にトライする機会を得たので、初回トライアル時のメモをここに記録しておきます。

1.ブレッドボードで結線と動作を確認する

まず、ブレッドボードを使ってHW設計と動作確認をする。

この部分については製作するものによって内容が大きく変わるので詳細は触れませんが、目的としては最終的な結線を確認することにあります。

結線方法はプロダクトシートなどから情報を得て設計しますが、ArdiunoNanoやCANモジュールのような広く使われているHWモジュールの場合、下記のような形でネット上に結線方法が載っていることが多いのでそれを参考にした方が時間短縮できます。

2.結線図を書く

上記のような図があれば特に必要はないかもしれませんが、上記のような図だと結線には不要な情報もあり間違いも誘発する可能性があるため、必要な結線のみを下記のように書き下します。

3.KiCadで結線図を書く

まずKiCadをダウンロード・インストールし、Schematice Editorを使用して下記のような回路図を書く。

各パーツのテンプレートは’Place->Add Symbol’でライブラリから選択すれば簡単に配置できます。

WindowsなどのDrawingソフトに慣れている場合、CAD系の癖の強いIFはかなり戸惑います。例えば、

  • パーツ選択の際に、右から左へ矩形を作り選択すると矩形内で触れている全てのパーツが選択対象になるが、左から右へ矩形を作るとパーツ全てが選択された場合のみ選択対象になる。
  • ホイールクリックのダブルクリックで行う操作がある
  • ラベルとパーツは一体だが、選択対象としては別物になるため、文字とパーツの絵面の選択はちがうものと考えなければいけない。
  • ラインを引く際にはクリック&ドラッグではなく始点と終点をクリックする。

4.PCB基盤のパーツ配置を決める

各パーツのFootPrintをライブラリから選択して部品に割り当て、PCB editorを開いてパーツの配置をする。

部品を配置し終えたら紙に印刷して配置や寸法があっているかどうかを確認して微調整を行う。

印刷されたものが実寸大かどうかをチェックするために、5cmの線を書いて同時に印刷するようにするとキャリブレーションしやすいです。

パーツの配置の際には、表と裏のどちらに配置されているかを3D画像を見ながら確認するとよいです。

なお、Schematice editorと同様にPCB editorも操作の癖が強く、この手のソフトではあるはずの下記のような機能が見当たらないです。

  • 水平・垂直のAlignment調整がない
  • キーボードでパーツの位置の微調整ができない

5.パーツ間のPCB上の配線をレイアウトする

下記手順でFreeRoutingというソフトを使って配線を自動生成する。

  1. FreeRoutingをダウンロードし、インストールする。
  2. KiCadでFile->Export->SpectraSGNを選択してSGNファイルを作成する
  3. FreeRoutingに読み込ませる
  4. 画面上にある’AutoRouter’ボタンを押す。すると配線が自動的に行われる
  5. FreeRouting上で’File->Export Spectra Session Fileを選択して配線情報をExpotする
  6. KiCadで’File->Inport->Spectra Session File’を選択する。すると配線がPCB editor上に反映される

基本的に自動レイアウトで問題はないようですが、裏から表への結線の数を減らすなどで編集が必要な場合はPCB editor上で微調整を行います。

結線が済んだらPCB上にシルク印刷文字列を付与します。各コネクタピンのそばに、接続するモジュールに対応するコネクタピンの情報を記載するとよいです。

6.Gerber dataファイルを作成する

下記手順でKiCadからGerber dataを作成する。

  1. ’File->Plot’を選択する
  2. Output directoryにGerber dataファイルの出力先を設定し、下記のチェックボックスにチェックを入れる
  3. ‘Plot’ボタンを押し、Output Messagesでエラーがないことを確認する
  1. ‘Generate Drill Files…’ボタンを押す
  2. 下記のようにラジオボタンを選択し、’Generate Map File’を選択する
  1. 出力フォルダに下記のファイルが出力されていることを確認する
  2. 出力フォルダをzipで圧縮しアーカイブする

7.発注する

https://www.fusionpcb.jpへ移動し、’今すぐ発注’を選択する。

5.で作成したgerber dataファイルのzipをアップロードする。選択肢は下記のデフォルト設定でよい。

支払い手続きを行えば、製造・輸送にトラブルが発生しなければ3-4日で配達される。支払いは支払い保証のあるPaypalがおすすめです。

Fusion PCBの場合、現在のステータスが下記のように表示されるので安心できます。(今回は深圳でコロナによるロックダウンがあったため、ステータスが更新されない状態が二週間ほど続きました)

8.検品

PCBが到着したら発注した図面と違いがないことを確認する。

Gerber dataファイルを使って機械で直接製造するため間違うことはないと思いますが、念の為きちんと確認しましょう。

あとはPCBに部品を載せて組み上げ、動作確認をして問題がなければ完成です。

参考になれば幸いです。