2016年4月30日土曜日

ffplayをおしゃれなメディアプレイヤーにしてみる

ffplayは、ffmpegが提供するコマンドライン型のメディアプレイヤーだ。ffmpegのビルドオプションに対応して、驚くほどの多様なメディア形式に対応できる。

コマンドラインオプションによってさまざまなフィルタを掛けたりできるが、当然のことながら単純にメディアを再生するためだけにも利用可能だ。本稿では単純な再生だけの機能のOSXアプリを作ってみることにする。

本稿は、次のサイトの情報を組み合わせ、自分なりにまとめ直したものである。深く感謝したい。

作業手順
以下の手順ですすめる。

  1. ffplayのインストール
  2. ffplayシェルスクリプトの作成
  3. OSXアプリパッケージ作成シェルスクリプトの準備
  4. ffplayシェルスクリプトのOSXアプリ化
  5. アプリアイコンおよび書類アイコン用画像の準備
  6. アイコン用画像変換シェルスクリプトの準備とアイコンイメージ作成
  7. Resourcesディレクトリの作成とアイコンイメージの格納
  8. Info.plistの準備
  9. Info.plistの格納
  10. アプリケーションフォルダへの格納と確認
  11. ダブルクリックで開けるファイルの登録
  12. 残された課題

以下、詳細を説明していく。

  1. ffplayのインストール
    本アプリはffplayにメディアファイルを引数として渡すだけものである。ffplayがインストールされていないと始まらない。
    本ブログのffplayコンパイルのための追記事項およびffmpegコンパイルガイドを参照するか、本家のガイドに従ってHomebrewを使うか、または、コンパイル済み実行ファイルを入手するかして、ffplayを用意されたい。

  2. ffplayシェルスクリプトの作成
    作成というほどもない一行スクリプトだが、作成しffplay.shという名前で保存する。

    #!/usr/bin/env bash
    
    /usr/local/bin/ffplay $1
    
  3. OSXアプリパッケージ作成シェルスクリプトの準備
    How to create simple Mac apps from shell scriptsにあるOSXアプリパッケージ作成シェルスクリプト:

    #!/usr/bin/env bash
    
    APPNAME=${2:-$(basename "${1}" '.sh')};
    DIR="${APPNAME}.app/Contents/MacOS";
    
    if [ -a "${APPNAME}.app" ]; then
     echo "${PWD}/${APPNAME}.app already exists :(";
     exit 1;
    fi;
    
    mkdir -p "${DIR}";
    cp "${1}" "${DIR}/${APPNAME}";
    chmod +x "${DIR}/${APPNAME}";
    
    echo "${PWD}/$APPNAME.app";
    

    applfy(拡張子なし)という名前をつけ、/usr/local/binに保存、実行権を付与する。

    sudo chmod +x /usr/local/bin/applfy
    
  4. ffplayシェルスクリプトのOSXアプリ化

    cd ~/Desktop
    applfy ffplay.sh FFPlay
    

    デスクトップにFFPlay.app(拡張子は隠されている)ができるはずだ。ちなみにこのファイルは次のディレクトリ構成を持っている。

    FFPlay.app -> Contents -> MacOS -> FFPlay
    
  5. アプリアイコンおよび書類アイコン用画像の準備
    FFPlay.appと、それによって開かれる書類アイコンを用意する。具体的には、大きさが1024x1024ピクセル、アルファチャンネル付きPNG画像を2種類用意する。

  6. アイコン用画像変換シェルスクリプトの準備とアイコンイメージ作成
    次のシェルスクリプトをCreate_icns.shという名前で保存する。

    #!/usr/bin/env bash
    
    Icon1024=$1
    MyIcon=$2
    
    mkdir $MyIcon.iconset
    sips -z 16 16     $Icon1024 --out $MyIcon.iconset/icon_16x16.png
    sips -z 32 32     $Icon1024 --out $MyIcon.iconset/icon_16x16@2x.png
    sips -z 32 32     $Icon1024 --out $MyIcon.iconset/icon_32x32.png
    sips -z 64 64     $Icon1024 --out $MyIcon.iconset/icon_32x32@2x.png
    sips -z 128 128   $Icon1024 --out $MyIcon.iconset/icon_128x128.png
    sips -z 256 256   $Icon1024 --out $MyIcon.iconset/icon_128x128@2x.png
    sips -z 256 256   $Icon1024 --out $MyIcon.iconset/icon_256x256.png
    sips -z 512 512   $Icon1024 --out $MyIcon.iconset/icon_256x256@2x.png
    sips -z 512 512   $Icon1024 --out $MyIcon.iconset/icon_512x512.png
    cp $Icon1024 $MyIcon.iconset/icon_512x512@2x.png
    iconutil -c icns $MyIcon.iconset
    rm -R $MyIcon.iconset
    

    これを用いてアイコン用画像をAppleアイコンイメージ(拡張子がicnsの書類)に変換する。(第一引数:画像ファイルパス、第二引数:アイコンイメージ名)

    sh Create_icns.sh 1024pixel_Image.png Icns_name
    

    筆者はアプリ用にFFPlay.icns、書類用にFFPlay_Doc.icnsを作成した。

  7. Resourcesディレクトリの作成とアイコンイメージの格納
    作成したAppleアイコンイメージはResourcesディレクトリをContentsの下に作成して格納する。

    mkdir -p FFPlay.app/Contents/Resources
    cp FFPlay.icns FFPlay_Doc.icns FFPlay.app/Contents/Resources
    
  8. Info.plistの準備
    アプリや書類のアイコン、拡張子の関連付けを定義した書類を用意する。

    1. Info.plistの骨格は次のようになっている。そこに次項以降で説明する項目が含まれる。
      <?xml version="1.0" encoding="UTF-8"?>
      <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
      <plist version="1.0">
      <dict>
      
      …
      
      </dict>
      </plist>
      
    2. 実行ファイル(FFPlay.app -> Contents -> MacOS内にある)の定義
      <key>CFBundleExecutable</key>
      <string>FFPlay</string>
      
    3. バンドル(アプリ)名の定義
      <key>CFBundleName</key>
      <string>FFPlay</string>
      
    4. バンドルタイプの定義(アプリであることの宣言)
      <key>CFBundlePackageType</key>
      <string>APPL</string>
      
    5. アプリアイコンの定義
      <key>CFBundleIconFile</key>
      <string>FFPlay.icns</string>
      
    6. ドキュメントタイプ(拡張子の関連付け)の定義
      <key>CFBundleDocumentTypes</key>
      <array>
       <dict>
        <key>CFBundleTypeExtensions</key>
        <array>
         <string>avi</string>
        </array>
        <key>CFBundleTypeName</key>
        <string>AVI Container</string>
        <key>CFBundleTypeRole</key>
        <string>Viewer</string>
        <key>CFBundleTypeIconFile</key>
        <string>FFPlay_Doc.icns</string>
       </dict>
      </array>
      
      上記はAVIファイルの例。筆者はVLCのInfo.plistをXcodeで開き、使いそうなものをコピペした。(書類アイコン名は変更した)
  9. Info.plistの格納
    Info.plistは以下の場所に格納する。

    cp Info.plist FFPlay.app/Contents
    
  10. アプリケーションフォルダへの格納と確認
    以上でアプリは出来上がりである。出来上がったアプリはアプリケーションフォルダに格納する。
    格納したら、気持ち時間をおいて、Info.plistで関連付けした拡張子のファイルを右クリックしてみて欲しい。FFPlayという名前がリストに表示されるはずだ。
    またDockやデスクトップにエイリアス登録すれば、対応するファイルはドラッグ&ドロップで開くことができる。

  11. ダブルクリックで開けるファイルの登録
    せっかく開かれる書類のアイコンを作ったのになんのためかと思う向きもあるかと思う。次のコマンドを実行してMacを再起動すると、定義した幾つかの拡張子の書類は、アイコンがFFPlayのものになり、ダブルクリックで開けるようになる。

    /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/lsregister -kill -r -domain local -domain system -domain user;killall Finder
    

    アイコンが不一致な場合は、次のコマンドを実行してMacを再起動する。

    sudo find /private/var/folders/ -name com.apple.dock.iconcache -exec rm {} \;
    sudo find /private/var/folders/ -name com.apple.iconservices -exec rm -rf {} \;
    sudo mv /Library/Caches/com.apple.iconservices.store com.apple.ic
    

    再起動後com.apple.icは削除して良い。(要管理者権限)

    ちなみに、筆者の環境でFFPlayが自動的にデフォルトアプリケーションになったのは、flv、m2ts、mkv、vob、wmvの5種類のファイル拡張子だった。

  12. 残された課題
    本手順で作成したFFPlayアプリは、Finderの情報ウインドウから強制的にデフォルトアプリケーションとして指定することはできない。

    このアプリケーションで開くタブのすべてを変更…を押すと、次のエラーが出る。

    実はInfo.plistCFBundleIdentifierを例えば、次のように定義すれば、デフォルトアプリケーションに指定できるようにはなる。

    <key>CFBundleIdentifier</key>
    <string>jp.someone.ffplay</string>
    

    しかし、このキーを設定すると、FFPlayは、ほとんどのファイルを開けなくなる。(原因は不明)よって本手順ではCFBundleIdentifierキーを設定しないことにした。

作ってみると、一行のシェルスクリプトとxmlプロパティリストの編集だけで、ffplayがこんなおしゃれなOSXアプリに変身することに驚きさえ覚える。
なお、本稿ではffplayを素材にしたが、シェルスクリプトであれば同様の手順でアプリができると思われる。試してみるのも一考であろう。

以上。

2016年4月11日月曜日

smartmontoolsメモ

smartmontoolsを使う上での自分用メモ書き。

入手
こちらからプリコンパイルされたものが入手できる。(拡張子dmgのものをダウンロード)

全情報の表示

smartctl -a /dev/disk2  #Disk番号はdiskutil listで取得

ショートテスト

smartctl -t short /dev/disk2  #Disk番号はdiskutil listで取得

ロングテスト(すごく時間が掛かる)
システム環境設定の省エネルギーパネルで可能な場合はハードディスクをスリープさせるのチェックを外すこと。

smartctl -t long /dev/disk2  #Disk番号はdiskutil listで取得

テスト結果の表示

smartctl -l selftest /dev/disk2  #Disk番号はdiskutil listで取得

2016.5.13 誤記及びロングテスト実施時の注意を追加

El Capitanで外付けHDDのS.M.A.R.T.情報を取得する

Soundflowerにコード署名しただけのバージョンが存在すると思ったら、SAT SMART Driverにもあった。

OS Xで外付けHDDのS.M.A.R.T.情報を取得するには、SAT SMART Driverが必須である。というか唯一の方法だ。その意味でとても有用なソフトウェアなのだが、オリジナル作者はコード署名したくないらしい。おかげで良いのか悪いのか、以下の様なサイトが見つかった。

コード署名されたSAT SMART Driverがあるページ

上記サイトをINSTRUCTIONS FOR THE APP STORE USERSで検索すると、ドライバへのリンクがある。Ver 0.8のfor El Capitan 10.11+と書かれたリンクをクリックしてダウンロードする。使い方は以前から変更はないが、一応書いておく。

  1. 外付けHDDをマウント解除、電源を切る
  2. ダウンロードしたファイルを解凍し、ダブルクリックしてドライバをインストール
  3. 外付けHDDを再マウント

重要なのは、ドライバインストール後、外付けHDDをパワーサイクル(電源オンオフ)することだ。