複数画像の一括リサイズをコマンドラインで行う最小コマンド(ImageMagickのみ)

複数の写真画像をリサイズする作業はたまに発生します。
Linux環境だと特に、コマンド一発での処理を考えます。その度にGoogle検索でImageMagickの使い方を調べて、上位サイトの紹介するオプションを継ぎ接ぎしてい使っていたのですが。
毎回調べるのは面倒なので、覚えられるよう最低限の長さにまとめました。

本当に最低限は以下。
mogrify -resize 800x *.JPG
それなりに必要性のあるオプションを追加して、以下を覚えると良いです。
mogrify -strip -format jpg -quality 90 -resize 800x *.JPG




画像ファイル一覧

明度調整などのマトモな画像加工は諦めましょう。またはその都度調べましょう。
既にパイプを使いこなしているなら良いのですが、find,grepをパイプしてxargsで流しこむ、なんて流れを画像変換のためだけに覚えるのは面倒かと思います。
Gimpがコマンドラインからシェルスクリプトで使えたりすればよかったのですが、あちらは魔窟なので。
画像リサイズ程度の要望は、可能な限りImageMagickで処理。


以下解説。

mogrify
どう考えても同じImageMagickで"convert"のほうが覚えやすいですし、mogrifyでは通常は元ファイルが上書きされてしまいます。しかしconvertでは出力ファイル名が元ファイルを紐付けられない変なものになるので、すっきり諦めてmogrifyを覚えましょう。
なお、上書きには対象画像ファイルをまとたフォルダごとコピーして元画像をバックアップすることで対応します。下手に追加のコマンドを覚えるよりはるかに楽です。

-strip
EXIF情報を切り落とすオプション。ファイルサイズへの影響はともかく、当然付けておきます。

-format jpg
元ファイルが何JPGなのかわからないので標準的なjpg形式に。
format指定で拡張子が変更になる場合、元ファイルが保持されるという嬉しい副作用もあります。

-quarity 96
デフォルト92だという話ですが。デフォルト値があるならそれを使ったほうが良い派なのですが。これに関しては、写真によっては激しく劣化することがあったので。

-resize 800x
縦横比を保持するために横サイズのみ指定。お約束です。

*.JPG
対象ファイルを一括指定する記法。ワイルドカードを使ったありきたりな指定で覚えやすい。ImageMagickで完結するし。

以上です。

Ubuntu14.04ネットワークブート(pxe-pdhcp環境構築)

既にDHCPサーバがある環境で、DHCPとは独立したPXE Bootサーバを立てることができるpxe-pdhcpというソフトウェアがあります。今回はpxe-pdhcpで、Ubuntu14.04をディスクレスで起動させるまでの備忘録です。

PXE Bootによるネットワークブート環境を持っておくと、HDDを乗せないディスクレスクライアントを用意したり、ディスクドライブ無しでUbuntuなどのインストールができて便利です。



なお、ネットワークブート環境を構築したのは、10インチノートPCであるN10Jcを、Ubuntu14.04-32bitで動作確認するためです。
(N10Jcは、EeePC的ノートPCでありながら、nVidiaのGPUを搭載している珍しい機体です。
一方で搭載CPUが比較的初期のAtom N270であり、32bit版OSしか動作しないため、他PCを64bit環境で統一していると、現在では運用が少しめんどうな機体でもあります。)
こちらが、PXEでディスクレス起動するゲストPCになります。

PXEサーバとなるホストPCは、普通の64bitシステムです。(Ubuntu15.04-amd64)


こちらのブログのSadayuki Furuhashi氏が書いたpxe-pdhcpを使用します。
http://frsyuki.hatenablog.com/entry/20070926/p1

基本の手順は、11.04での設定・手順を紹介しているこちらから。
http://kimamahitori.blog.shinobi.jp/Entry/317/
UbuntuディスクISOのマウントなどはこちらを参考にしました。
http://blog.akagi.jp/archives/3391.html
なお、こちらで紹介されているのはサーバUbuntu版で、今回ネットワークブートさせたデスクトップ版とはディスク内の構成が違う模様です。
今回はデスクトップ版(LiveCD)の設定・起動方法を扱います。

ネットワークブートの設定手順

tftp

最初にpxeのディレクトリを作成します。
書き込み権限を付けておいたほうが、あとの作業が楽です。
mkdir /pxe
sudo chmod a+rw /pxe

ftpサーバを導入します。
sudo apt-get install -y inetutils-inetd tftpd-hpa -y


設定ファイルを編集します。
sudo vim /etc/default/tftpd-hpa

以下の内容に書き換え。
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/pxe"
#TFTP_ADDRESS="[::]:69"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="--secure -vvv"
RUN_DAEMON="yes"


再起動して設定を反映します。
sudo service tftpd-hpa restart

nfs

nfsサーバを導入します。
sudo apt-get install nfs-kernel-server -y

設定ファイルを書き換えます。
sudo vim /etc/exports
以下の内容を追記(設定はひとつにつき一行に書いて折り返さない)。
/pxe/images/ubuntu-14.04-amd64  *(no_root_squash,ro,async,insecure)
/pxe/images/ubuntu-14.04-i386  *(no_root_squash,ro,async,insecure)


nfsサーバを再起動して設定を反映します
sudo service nfs-kernel-server restart

Ubuntu Disc Image

ftpでブートメニューが読まれた後に要求される、
起動したいUbuntu(Linux) のディスクイメージを、nfs上に展開します。
下記の空ディレクトリを作成します。
mkdir -p /pxe/images/ubuntu-14.04-amd64
mkdir -p /pxe/images/ubuntu-14.04-i386

ディレクトリにマウントします。
sudo mount -r -t iso9660 -o loop ~/ubuntu-14.04.1-desktop-i386.iso /pxe/images/ubuntu-14.04-i386/
sudo mount -r -t iso9660 -o loop ~/ubuntu-14.04-desktop-amd64.iso /pxe/images/ubuntu-14.04-amd64/

pxelinux.cfg/default (bootmenu)

クライアントPCがPXE機能で読み込む、ブートメニューや必要なバイナリを、ftp上に展開します。



ネットワークブート・メニュー表示に必要なバイナリを、以下から取得・配置します。
バイナリを取得
wget http://www.kernel.org/pub/linux/utils/boot/syslinux/syslinux-4.04.tar.gz
解凍し、中のファイルを以下のパスに配置します。
/pxe/menu.c32
/pxe/pxelinux.0

ネットワークブートのブートメニューを以下に設定ファイルとして配置します。
vim /pxe/pxelinux.cfg/default

設定ファイルの内容は以下 (IPアドレスは環境により適切に読み替えます。)
# /pxe/pxelinux.cfg/default
DEFAULT menu.c32
PROMPT 1
NOESCAPE 0
ALLOWOPTIONS 0
TIMEOUT 100

MENU TITLE PXE Boot Menu

LABEL Ubuntu 14.04 amd64
kernel images/ubuntu-14.04-amd64/casper/vmlinuz.efi
append boot=casper netboot=nfs nfsroot=192.168.1.21:/pxe/images/ubuntu-14.04-amd64 initrd=images/ubuntu-14.04-amd64/casper/initrd.lz -- splashd

LABEL Ubuntu 14.04 i386
kernel images/ubuntu-14.04-i386/casper/vmlinuz
append boot=casper netboot=nfs nfsroot=192.168.1.21:/pxe/images/ubuntu-14.04-i386 initrd=images/ubuntu-14.04-i386/casper/initrd.lz -- splashd

LABEL Ubuntu 14.04 amd64(non splash)
kernel images/ubuntu-14.04-amd64/casper/vmlinuz.efi
append boot=casper netboot=nfs nfsroot=192.168.1.21:/pxe/images/ubuntu-14.04-amd64 initrd=images/ubuntu-14.04-amd64/casper/initrd.lz


pxe-pdhcp

Sadayuki Furuhashi氏が作成したpxe-pdhcpをソースで取得し、ビルドして使用します。
今回はroot直下に/pxe-pdhcpディレクトリとしてソースとバイナリを展開しました。
sudo make  /pxe-pdhcp
chmod a+rw /pxe-pdhcp
cd /pxe-pdhcp
git clone https://github.com/frsyuki/pxe-pdhcp
なお、いくつかのブログでバッファオーバーフロー警告に対するコード修正が紹介されていますが、今回はしなくても動作したので、とりあえずコードを書き換えていません。

ビルドします。
make
実行します。(IPアドレスは環境により適切に読み替えます。)
sudo /pxe-pdhcp/pxe-pdhcp -l 0.0.0.0 -b 255.255.255.255 -t 192.168.1.21 -d pxelinux.0

クライアントPCからネットワークブートを実行

PXEサーバ(pxe-pdhcp)が起動している状態でクライアントPCからネットワークブート操作を行うことで、ネットワークブート可能です。



クライアントPCのネットワークブート方法は、マシンにより異なるので、サイト・マニュアル・グーグル検索を活用してください。
BIOS/EFIの設定画面で、PXEを有効にする必要があるかと思います。
とりあえず、一般的にはBIOS/EFI設定画面に行くなら、起動画面でDeleteキー押下かと思います。

また、ESC/F2キーなどでブートセレクタを呼び出せるPCもあります。
ブートセレクタにPXE(Network boot)が無い場合、BIOS/EFIの設定でPXEが無効になっているかもしれません。

ちなみに今回クライアントPCとして使用したN10Jcの場合は、
F2:BIOS設定
ESC:ブートメニュー
でした。

その他

手順中に、2箇所ほど、PXEサーバのIPアドレスを指定する個所があります。
(特にネットワークブートメニューのnfsroot設定)
そのため、PXEサーバマシンはIPアドレスを固定設定にすると、今後の利用が楽になります。

Ubuntuのディスク内容をNFS上に置く必要がありますが、毎度ISOファイルをマウントするのが面倒であれば、コピーして配置してしまうと楽になります。

技術書典5「クロス本」売り上げ報告ほか

この記事は 技術同人誌 その2 Advent Calendar 2018 Advent Calendar 2018 の17日の記事です。 #技術書典 daisy bell #技術書典5 | 一般 当落状況:当選(き08) 16:00 時点で、事実上の完売というこ...