2016年12月29日木曜日

Bloggerで自分のページビューを追跡しないブックマークレット

Bloggerで自分のページビューを追跡しない方法というのは、検索すればわらわらと出て来る。だが、そのためだけにブラウザ機能拡張を導入するのはゴメンだし、javascriptを使う方法では、Cookieの有効期限設定がないなど、帯に短したすきに長しの感がある。

本稿では、ブラウザ機能拡張を導入せず、javascriptによるブックマークレットで、自分のページビューを追跡しないように設定する方法を記す。

使うスクリプトは、この記事を参考にした以下のものである。
var expire = new Date();
expire.setTime( expire.getTime() + 1000 * 3600 * 24 * 365 );

document.cookie = '_ns=2; expires=' + expire.toUTCString();

上記を、この記事を参考にブックマークレット化したものが以下のものである。

javascript:var%20expire%20=%20new%20Date();expire.setTime(expire.getTime()+1000*3600*24*365);document.cookie%20=%20'_ns=2;%20expires='+expire.toUTCString();

この一行を例えばGoogle Chromeならブックマークマネージャ > ページを追加 を選択し、URLの部分に貼り付ける。名前は分かりやすいものならばなんでも良い。

ブックマークレットは、自分のブログURL(xxx.blogspot.jp)を表示させた状態で起動する。これで有効期限1年のCookieが設定できる。

2016年11月12日土曜日

Command Line Tools for Xcodeのもう一つの顔

以前、Command Line Tools for Xcodeのアンインストール方法という記事を書いた。
が、実は、この記事には見落としがあった。ただし、本稿は、その見落とし部分についてアンインストール方法を述べるものではない。

Command Line Tools for Xcodeのディスクイメージ、あるいはxcode-select --installコマンドによってインストールされるパッケージは2種類あったのだ。

ひとつはcom.apple.pkg.CLTools_Executablesで、これのアンインストールは、件の記事にある通り簡単だ。
もうひとつはcom.apple.pkg.DevSDK_OSX1012(macOS 10.12向けの場合)で、その名の通りSoftware Development Kitだ。こちらがインストールするものは多岐にわたるので、アンインストールは一筋縄ではいかない。

確認したところ、OS X Yosemite用のCommand Line Tools for Xcodeディスクイメージでも、SDKを含んでいた。それ以前のディスクイメージも入手可能だが、確認していない。

ここからは、アンインストールしたい人ではなく、使いたい人のための内容になる。

OS X El Capitanから、OSには/usr/includeディレクトリが含まれなくなった。もちろん、そこに入っているべきヘッダファイルも含まれなくなった。これらはSDKの形で、Command Line Tools for Xcodeに含まれるようになった。

つまり、UNIX資産のコンパイルを含めたソフトウェア開発または、それに準じたことをしたい人は、OS X El Capitan移行は、Xcodeだけでは不十分になったのだ。

このことは、ffmpegコンパイルガイドを改訂していて判明、検証した。

最後に、SDKを含めたアンインストールだが、インストーラパッケージがインストールする内容を知る方法というのはある。だから、応用すればアンインストールはできるはずである。
だが、リンクにある手順で生成したシェルスクリプトを管理者権限で実行しても、削除できるのは/usr/share/man以下にあるマニュアルだけであった。おそらくはSIP (System Integrity Protecton)のせいである。SIPを解除すれば消せるかも知れないが、筆者はSDKが必要なのでやる気はない。

参考までにSDKがファイルをインストールする場所(最上位のみ)を書いておく。並の神経では触る気にならない場所だと思うが、いかがだろうか?

/System/Library/Frameworks
/usr/include
/usr/lib
/usr/share/man

以上。

2016年11月11日金曜日

MacではGNU libiconvは必要ないみたいだ

これは、以前から経験していたことだが、今回ffmpegコンパイルガイドで同じ轍を踏んだので、戒めとして書く。

GNU libiconvは、例えばWindowsから受け取ったzipアーカイブを文字化けさせないunzipをコンパイルするために必要なライブラリだ。

だが、macOSには昔から標準でlibiconvが入っている。こちらを使わないとコンパイルできないものもあり、例えばrsyncなどはそうだ。(筆者はOS標準でないrsyncを使っている)

実はMacでffmpegをコンパイルする時もmacOS標準のlibiconvを使うべきだったのだ。今回メーリングリストでカールという偉い人に怒られて(笑)初めて気がついた。(Time Machineの記録を辿ると、仕様変更があったのかもしれない)

発端は2016年9月24日に発表されていたffmpegのSDL1からSDL2への移行であった。筆者は呑気にもこれに気づかず、ffmpegコンパイルガイドの更新を怠っていた。そして2016年11月8日になってガイドを更新し、ffplayがビルドされないことに気がついた。

SDL2をコンパイル、インストールしてみたものの、一向にffmpegのconfigureはそれを認識しない。大いにハマった。
ハマった中でどうもlibiconvが絡んでいるらしいことはなんとか把握した。ffmpegコンパイル環境を最初から作り直す過程でそれを確認し、メーリングリストで吠えついたら、逆に怒られた。「お前、どうしてOS標準じゃないlibiconvを入れるんだ!」と…。

恥をさらけ出してしまうのだが、筆者がffmpegコンパイル環境にGNU libiconvを入れていたのは、Windows版のffmpegコンパイルガイドを流用していたことと、OS標準のlibiconvが日本語に対応していないと信じていたのが理由だった。

2013年10月にガイドを書いて以来、最大の間違いが3年の時を経て修正された。筆者の乏しい経験に限るという条件はつくが、MacではGNU libiconvは必要ないみたいだ。

2016年11月8日火曜日

フォルダ階層構造を維持したまま、まとめて画像を見る

筆者はグラビアアイドルが好きだ。ただしおっぱい星人ではない。話がずれるのでこれ以上書かないが、とにかく、筆者のピクチャフォルダには、フォルダがいくつもの階層構造になった画像がたくさんある。

これらの画像をフォルダ階層構造を維持したまま、まとめて見ることができないか悩んできた。Finderは当然試した。ただし自分が普段使っているカラム表示とアイコン表示で。

図を見れば一目瞭然だが、すべての01.jpgという画像がフォルダ階層構造を無視して抽出されている。これでは、フォルダごとにあるストーリー(順番)が無視されてしまい、使いものにならない。

次に試したのはコマンドラインだ。次のコマンドはカレントディレクトリにあるjpg画像を、コマンドラインからQuickLookを呼び出して表示することができる。

find . -iname "*.jpg" -exec qlmanage -p "$@" >& /dev/null {} +;
find . -iname "*.jpg" -print0 | sort -n | xargs -0 qlmanage -p "$@" >& /dev/null

このコマンドの難点は

  1. ファイル名が桁揃えされていない場合、順番が狂ってしまう。(1.jpg、2.jpg、10.jpg…が1.jpg、10.jpg、2.jpg…になる)
  2. コマンドラインから呼び出すQuickLookはデバッグモードで、フルスクリーン表示ができない。

そこで筆者は一気に突っ走ってしまった。できないならアプリを作ろう…と。

紆余曲折の結果、できることはできた。アプリの名前は眼福である。グラビアアイドルを見るのは目の保養だから、そういう名前をつけた。

誰もダウンロードしてくれないので、せめて自身のブログで紹介しようと思い、この記事を書き始めた。

そして気づいた。

Finderでもリスト表示とカバーフロー表示では、フォルダの階層構造が維持されて抽出できることに!
(正確には、並び替え条件を設定しなければ、最後に開いた日順に表示される)

筆者は今慟哭している。なぜ11,800円(税込み12,744円)もの金を投じて、Apple Developer Programに加入してしまったのかと! アプリを作って公開する前にFinderの機能に気付けなかったのだろうかと!

来年の10/24(Apple Developer Program加入日)までに、何か他のアプリを作れるだろうか? いや作るしかない。取り返すんだ!

何の記事か分からなくなってきたので、このあたりで筆を置く。

2016年10月9日日曜日

BloggerでFirebaseホスティングを用いてSyntaxHighlighterを使う

SyntaxHighlighterというのは、プログラミングコードの予約語に色付けして、コードを見やすくしてくれるもので、本ブログでも多用している。
だが、しばらく放置している間に、SyntaxHighlighter本家が用意しているホスティングサービスが使えなくなってしまった。
本稿では、FirebaseのWebホスティングを用いてSyntaxHighlighterを使う方法を解説する。アイディア自体はこの記事の通りなのだが、初心者向けとは言えない内容なので、自分の備忘録の意味を含め、改めて筆を起こす。

  1. Googleアカウントの準備
    Bloggerを使っている時点でアカウントはあると思うが、Firebaseには、Googleアカウントが必要だ。用意されたい。
  2. Webサイト用プロジェクトの作成
    Firebaseにアクセスし、無料で開始ボタンを押してWebサイト用のプロジェクトを新規作成する。
  3. Node.jsとnpmのインストール
    npmというのは、Node Packaged Modulesの頭文字を取ったもので、Node.jsのライブラリやパッケージを管理することができるツールだそうだ。
    FirebaseでWebサイトをホスティングするためのツールを動かすためには、これが必要らしいのでインストールする。
    ちなみにNode.jsというのは、イベント化された入出力を扱うUnix系プラットフォーム上のサーバーサイドJavaScript環境だそうだ。本稿はNode.jsやnpmの解説記事ではないので、これ以上書かない。(要はjavascriptの実行環境なんだろう、多分…。)

    インストールはこちらにアクセスすれば、プラットホーム(MacとかWinとか)に合ったインストーラーを表示してくれるので、それをダウンロードして実行するだけである。(Macでインストラーパッケージを扱う手順は、流石に書かない)
  4. firebase-toolsのインストール
    ターミナル.appを開き、次のように入力する。
    sudo npm install -g firebase-tools
    
    Macの場合、sudoをつけて実行する必要がある。
  5. firebaseへのログイン
    上記に続き、ターミナル.appの画面で、次のように入力する。
    sudo firebase login
    
    Macの場合、sudoをつけて実行する必要がある。

    ターミナル.appの画面で次のように表示され、yを入力すると、Webブラウザの認証画面(Googleアカウントとの紐付け)が開くので、許可する。
    ? Allow Firebase to collect anonymous CLI usage information? (Y/n)  yes
    
    Visit this URL on any device to log in:
    https://accounts.google.com/....(省略)
    
    Waiting for authentication...
    
    
    許可すると、ターミナル.appの画面で次のように表示される。これでログインは完了である。
    Success! Logged in as youreGMailAccount@gmail.com
    
    ブラウザの画面は下図のようになる。
  6. Webサイト用プロジェクトの設定
    FirebaseのWebホスティングでは、ターミナル.appのカレントディレクトリにpublicというフォルダを作成して、そこにローカルのファイルを保存する。
    よってまず、ターミナル.appの画面でpublicというフォルダを作成すべき任意のディレクトリに移動する(筆者はSitesにHP関連のファイルを置いているので、Sitesにした)
    cd Sites
    
    次に、そのディレクトリで、次のようにタイプする。
    sudo firebase init
    
    Macの場合、sudoをつけて実行する必要がある。

    すると、ターミナル.appの画面に次のように表示されるので、Databaseをスペースキーで非選択にした上で、Hostingの方に矢印キーで移動してEnterを押す。 続けてターミナル.appの画面に次のように表示されるので、さきほど新規作成したプロジェクトに矢印キーで移動しEnterを押す。
    === Project Setup
    
    First, let's associate this project directory with a Firebase project.
    You can create multiple project aliases by running firebase use --add, 
    but for now we'll just set up a default project.
    
    ? What Firebase project do you want to associate as default? (Use arrow keys)
      [don't setup a default project] 
    >  YourFirebaseProjectName (YourFirebaseProjectName-XXXXX) 
      [create a new project]
    
    続けてターミナル.appの画面に次のように表示されるので、そのままEnterを押す。
    ? What do you want to use as your public directory? (public) 
    
    続けてターミナル.appの画面に次のように表示されるので、yと入力しEnterを押す。
    ? Configure as a single-page app (rewrite all urls to /index.html)? (y/N)
    
    完了すると、ターミナル.appの画面に次のように表示される。
    === Hosting Setup
    
    Your public directory is the folder (relative to your project directory) that
    will contain Hosting assets to uploaded with firebase deploy. If you
    have a build process for your assets, use your build's output directory.
    
    ? What do you want to use as your public directory? public
    ? Configure as a single-page app (rewrite all urls to /index.html)? Yes
    ? File public/index.html already exists. Overwrite? Yes
    ✓ Wrote public/index.html
    
    i  Writing configuration info to firebase.json...
    i  Writing project information to .firebaserc...
    
    ✓ Firebase initialization complete!
    
    なお、Macではsudoをつけて実行するため、出来上がるpublicディレクトリの所有者がrootになる。これでは、ファイルの出し入れに一々認証が必要になるので以下を実行する。
    sudo chown yourMacAccount:staff public
    
  7. SyntaxHighlighterの準備
    SyntaxHighlighterは、こちらからダウンロードする。ダウンロードしたZIPアーカイブは展開し、中身のscriptssrcstylesフォルダを前項で作成したpublicフォルダに入れる。
  8. FirebaseWebサイトへのアップロード
    敢えてアップロードという言葉を使ったが、Firebaseでは、デプロイと言うらしい。いずれにせよローカルのpublicフォルダの内容は、次のように入力することで、インターネット上に公開される。
    sudo firebase deploy
    
    Macの場合、sudoをつけて実行する必要がある。
  9. FirebaseWebサイトのURL確認
    まず、Firebaseホームページ右上のコンソールへ移動リンクをクリックする。 移動したコンソール画面で、先程Webホスティングに設定したプロジェクトリンクをクリックする。 横に並んだメニューのHostingをクリックすると、次の画面になり、ドメインと書かれているところにFirebaseWebサイトのURLが書いてある。
  10. SyntaxHighlighter本家のホスティングURLの置き換え
    あとは、Bloggerのテンプレートに書いてあるSyntaxHighlighter本家のホスティングURLを、前項で確認したURLに置き換えれば良い。
    ちなみに置き換える対象は次の部分である。
    http://alexgorbatchev.com/pub/sh/current/
    
  11. 参考サイト
    Google Driveのホスティングサービス終了によるSyntaxHighlighter周りの修正
    FirebaseでWebをホスティングしてみた
    FirebaseでWebサイトを無料でサクッと公開してみる

以上。

2016年10月8日土曜日

macOS SierraでMacBook ProのFaceTime HDカメラが動かない問題

最初に断っておくが、本件は既にVMware社が問題として認識している案件である。それでもなお記事にするのは、筆者がmacOS Sierra Public Betaで同様の問題を経験しており、その記事が「FusionとFaceTime HDカメラ」という検索で引っかかるからである。

現象
MacBook ProのFaceTime HDカメラが、FaceTime.appやPhoto Booth.appを起動しても、カメラが動かない。

ハードウェア故障の確認
macOS SierraからDキー起動でApple Diagnosticsが動くようになったらしいが、終了コードはADP000で異常なしである。もし、カメラに異常があれば、NDC001〜NDC006のいずれかが出るらしい。
参考:Apple Diagnostics:リファレンスコード

原因
VMware社がFusion 8.5のリリースノートで明記しているとおり、これはMacBook Pro 10.1、すなわちMacBook Pro (Retina, Mid 2012)及びMacBook Pro (Retina, 15-inch, Early 2013)にmacOS Sierra 10.12をインストールした上で、VMware Fusion 8.5を起動すると発生する問題である。(仮想マシンの起動の必要はない)
参考:MacBook Pro モデルを識別する方法

対策(暫定)

  1. FaceTime.appやPhoto Booth.appなどでFaceTime HDカメラを使用する場合
    VMware Fusion 8.5を終了した上で、macOS Sierraを再起動する。FaceTime HDカメラを使用するアプリケーションを利用している間は、VMware Fusion 8.5を起動しないこと。
  2. VMware Fusion上の仮想マシンでカメラが必要な場合
    安い外付けのWebカム等を購入して用いる。

以上。

2016年7月22日金曜日

OS X El Capitanアップデート直後の英語表記画面を治す

OS X El Capitanアップデート直後の英語表記画面を治すは更新して移転しました。

5秒後に自動転送します。
転送されない方はこちらをクリックして下さい。

2016年7月11日月曜日

macOS Sierra Public Beta(16A238m)とVMWare FusionのゲストOS

本記事はmacOS Sierra Public BetaとVMWare Fusion 8.1.1に適用される。VMWare FusionはVer.8.5でmacOS Sierraに正式対応しており、本稿の対応は必要ない。

今年もMacの新OSの季節がやってきた。今度から、OS XではなくmacOSと呼ぶらしい。まぁ世の中の大部分にとってどうでも良い枝葉末節的な呼称の変更だ。

例によってAppleはベータ版OSをサブパーティションにインストールすることを推奨している。だが、それではβテストにならないというのが筆者の持論である。
当然今回もメインのMac(MacBookPro with Retina Display Early 2013)にインストールした。もちろん上書きインストールだ。

現時点で分かっている問題点は、カスペルスキー インターネット セキュリティ 16 for Macが起動しないことと、VMWare FusionのゲストOSがそのままでは起動しないことぐらいだ。
フィードバックすべき項目すらない。もしかしてEl Capitanにsi○iを追加しただけなのではと疑うほどだ。

そうは言っても、VMWare FusionのゲストOSが動かないのは困る。よって本稿では、ゲストOSを動かすために必要なちょっとした一工夫について説明することにする。

VMWare Fusion 8.1.1を起動してEl Capitanで使っていたゲストOSを起動しようとすると、次のエラー(内部エラー)が表示され起動しない。

対処は簡単で、ゲストOSをシャットダウンした上で、設定 > ディスプレイで3Dグラフィックスの高速化チェックボックスをオフにすれば良い。

なお、ゲストOSがサスペンド状態の場合は、Option(alt)キーを押しながら仮想マシンメニューを表示させると、強制的にパワー・オフできる

参考情報
MacOS Sierra and VMware Fusion 8.1
Forcing a virtual machine to power off in VMware Fusion (1006215)

予め断っておくが、3Dグラフィックスの高速化をしないということは、それを使うアプリケーションが動かないまたは遅いという結果をもたらすと推定される。それが嫌な場合は、まだmacOS Sierra Public Betaは利用すべきではないのだろう。

以上。

2016年6月11日土曜日

人工無脳ReudyをTwitterで動かしてみる

人工無脳という言葉をご存知だろうか? 今をときめく人工知能ではなく人工無脳である。コンピュータとの会話を目的とするプログラムだが、コンピュータが言葉を理解しているわけではないので、調子パズレの音楽のようにお馬鹿な会話になってしまうものだ。

実は今、人工知能についていくつかの本を読んでいる。本当にマスコミを騒がせているような事が起きるのかを知っておくのが目的だ。その途中で、人工無脳の話が出てきて、昔夢中になったのを思い出したのが、本稿執筆の理由だ。

無謀にも筆者はTwitterを利用した人工無脳を作りたいと考えた。りんなほど有名な存在(それにりんなは人工知能だ。無脳にしか思えないけど…)ではなくても、結構な数の無脳さんが、Twitterには生息しているらしい。

いざ作るとなると、人が作ったものをそのまま動かすのでは面白くない。だが、残念ながらブームを過ぎているようで資料が少ない。その中で見つけたのが人工無脳Reudyである。試し斬りの意味で動かしてみようと思った。

だが、Reudy19というファイルをダウンロード、説明通りに進めようとして、すぐ、つまずいた。最終的には、スクリプトの一部を書き換えないと動かないことが判明するのだが、誰か物好きがいないとも限らないので、動作させるための手順をまとめておく。

  1. 必要なRubyライブラリの導入(OSXではsudoが必要)
    sudo gem install rubytter highline
    
  2. Twitterアプリの登録
    https://apps.twitter.com/app/newを開いてTwitterアプリを登録する。
    1. アプリ名称(Name)と説明(Description)は日本語でOK。
    2. Websiteは取り敢えずアプリを動かすTwitterアカウントのURLを記入。
    3. Developer Agreementの合意をチェックして、Create Your Twitter Applicationボタンを押す。
    4. PermissionsタブでRead and Writeのラジオボタンがオンになっているのを確認してから、Keys and Access tokensタブを開き、
      • Consumer Key (API Key)
      • Consumer Secret (API Secret)
      の2つのキーを控える。
  3. Consumer key/secretの記入
    記入先はtwitter_reudy.rbではなく、publicというディレクトリにあるsetting.ymlである。記入にはOSX標準のテキストエディットを用いるのが良いと思われる。またはターミナル経由でnanoを使う。AdobeのBracketsでも良い。
  4. Scriptの改造
    配布されているスクリプト通りでは、認証をクリアしてもRubytter::APIErrorが連発する。twitter_reudy.rbを開いて以下の改造を行う。

    • Twitter認証のURLを変更
      - cons = OAuth::Consumer.new(key, secret, :site => "http://api.twitter.com"
      + cons = OAuth::Consumer.new(key, secret, :site => "https://api.twitter.com"
      
    • since_id初期値の変更
      (何故ループ内で毎回-1にセットするのか不明。-1だと"Rubytter::APIError"になる。1で正しいかも未検証)
      -      since_id = -1
      +      since_id = 1
      
    • タイムライン取得方法変更(friends_timelineは使えない。"Rubytter::APIError"になる)
      -      client.r.friends_timeline(since_id: since_id).each do |status|
      +      client.r.home_timeline({:since_id => since_id}).each do |status|
      

    以上の変更の差分ファイルをこちらにアップロードした。使われる方があればどうぞ!

    cd Reudy19
    patch -p1 < twitter_reudy.diff
    
  5. スクリプトを動かしてみる。
    スクリプトは以下のコマンドで実行することができる。
    cd Reudy19
    ruby twitter_reudy.rb
    
    初回起動時のみ、URLが表示される。アプリ登録したTwitterアカウントでログインしたブラウザにコピペしてPINを取得する。それを入力すると動作開始する。

以上。

2016.6.12改訂
PIN認証で読み取り専用になるという誤記の訂正。それに伴う内容の変更、追記。タイトル変更

2016年5月26日木曜日

JuliusをOS Xで動かしてみた。

同趣旨の記事があるにはあるのだが、少なくとも自分の環境では動かなかったので、自分なりにまとめることにする。ちなみに参考にしたのは以下のサイトである。

Julius(シリウス)は日本語音声認識を行うオープンソースソフトウェアだ。Androidで音声認識を必要とするソフトを作ろうか考えている時に、その存在を見つけた。

実のところ、AndroidにはGoogleが提供する音声認識があって、これを使えばほんの10数行のコードを書くだけで利用できる。できるのだが、例えば10秒間発音がなければ打ち切るという調整ができない。粗っぽく測って5秒で終了と検知している。

そこで、オープンソースながら評判は高いように思えたJulius(シリウス)を試してみることにした。OSX上で実行して使えるようなら難易度が高いらしいAndroidへの移植も考えてみようかと思ったわけだ。

結論
先に結論を言うと、デモレベルで提供されている機能では、とても使えたものではない。Juliusを理解するまでに至れば別かも知れないが、Juliusを使うのが目的ではなく、音声認識を使うのが目的なので、これはボツだというのが筆者の感想だ。

使い方
結論でボツと書いておきながら書くのは無意味なのだが、次のように準備すればJuliusは試すことができる。

  1. PortAudioのインストール
    Juliusを動作させるためにはPortAudioが必要なのでインストールする。
    PortAudioは、こちらから最新版(本稿執筆時点ではpa_stable_v19_20140130.tgz)をダウンロードする。
    1. 圧縮ファイルを解凍し、次のようにconfigureする。
      tar xf pa_stable_v19_20140130.tgz
      cd portaudio
      ./configure --disable-mac-universal
      
    2. portaudioディレクトリに出来上がるmakefileを開き、CFLAGS から-Werrorを削除する。
    3. include/pa_mac_core.hを次のように編集する。
      - #include <AudioUnit/AudioUnit.h>
      - #include <AudioToolbox/AudioToolbox.h>
      + #include <CoreAudio/CoreAudio.h>
      
    4. ビルドしてインストールする。
      make
      sudo make install
      
  2. Juliusのビルド 音声認識を試すだけならJuliusはビルドするだけで良い。
    Juliusはこちらから最新版(本稿執筆時点ではjulius-4.3.1.tar.gz)をダウンロードする。
    tar -xzf julius-4.3.1.tar.gz
    cd julius-4.3.1
    env CFLAGS='-O3 -arch i386' LDFLAGS='-arch i386' ./configure --enable-words-int
    make
    
  3. ディクテーションキットのダウンロードと展開
    音声認識を試す上で最低限必要なキットなので入手する。
    ディクテーションキットはこちらから最新リリースパッケージ(本稿執筆時点ではdictation-kit-dictation-kit-v4.3.1.zip)をダウンロードして展開する。
    1. julius実行ファイルの入れ替え
      先ほどビルドしたjulius-4.3.1 -> juliusにあるjulius実行ファイルをコピーしてdictation-kit-dictation-kit-v4.3.1 -> bin -> osxにあるjulius実行ファイルと入れ替える。
      (もともと入っているjulius実行ファイルはportaudioに依存するため)
    2. DNN版シェルスクリプトの修正
      dictation-kit-dictation-kit-v4.3.1ディレクトリにあるrun-osx-dnn.shを開き、以下の編集を加える。
      -xterm -e python ./bin/common/dnnclient.py dnnclient.conf &
      +python ./bin/common/dnnclient.py dnnclient.conf &
      -xterm -e ./bin/osx/adintool -in mic -out vecnet -server 127.0.0.1 -paramtype FBANK_D_A_Z -veclen 120 -htkconf model/dnn/config.lmfb.40ch.jnas -port 5532 -cvn -cmnload model/dnn/norm.jnas
      +./bin/osx/adintool -in mic -out vecnet -server 127.0.0.1 -paramtype FBANK_D_A_Z -veclen 120 -htkconf model/dnn/config.lmfb.40ch.jnas -port 5532 -cvn -cmnload model/dnn/norm.jnas
      
  4. Juliusを試してみる。
    ディクテーションキット内でシェルスクリプトを起動することにより、Juliusを試すことができる。シェルスクリプトはGMM版とDNN版の2つが用意されている。
    GMM版
    cd dictation-kit-dictation-kit-v4.3.1
    ./run-osx-gmm.sh
    
    DNN版
    cd dictation-kit-dictation-kit-v4.3.1
    ./run-osx-dnn.sh
    

以上。

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をパワーサイクル(電源オンオフ)することだ。

2016年3月3日木曜日

Soundflowerbedを手に入れる

Soundflowerには、El Capitanに対応しているバージョンがあるのを知った。ただし、これはオリジナルのSoundflowerに含まれていたSoundflowerbedがない。

Soundflowerに振り向けた音声を聞くには、Soundflowerbedか、またはLineInというアプリケーションが必要になる。本稿では、Soundflowerbedを入手する方法を書く。

  1. こちらからオリジナルのSoundflowerのソースコードを入手する。(右端のDownload ZIPボタンを押す)
  2. ZIPファイルを解凍する。
  3. 次のコマンドを実行する。Passwordを要求されるので管理者パスワードを入力する

    cd Soundflower-Original-master/Tools
    ./build.rb Deployment
    Password:
    
  4. 次のメッセージが表示されれば成功

      Building the new Soundflower.kext with Xcode
      Building the new Soundflowerbed.app with Xcode
        BUILD SUCCEEDED
      Done.
    
  5. 次のコマンドを実行する

    open Soundflower-Original-master/Build/InstallerRoot/Applications/Soundflower
    
  6. 開いたFinderウインドウにはSoundflowerbedがあるので、アプリケーションフォルダにコピーする

以上。

2016年1月20日水曜日

MEGA (http://mega.co.nz)のChrome拡張機能によるスリープ抑制

MEGA (http://mega.co.nz) は、オンラインストレージの一つだ。これにはブラウザ拡張機能が用意されているのだが、この拡張機能が動作すると、珍妙な形でスリープが抑制されることが分かったので、メモしておく。

スリープ抑制の状態は、次のコマンドで調べることができる。

pmset -g assertions

図にある通り、coreaudiodがpid 395のために、スリープ抑制を行っているのが分かる。

pidからプロセスの名前を得るのは、アクティビティモニタで確認するのが簡単だが、次のコマンドで調べることができる。

lsof +c 0 -p 395 | head -n 2

図から分かる通り、pid 395はGoogle Chromeだ。
だが、この議論でrobin051氏が、スリープを抑制しているのはGoogle Chrome自身ではなくプラグインであることが多いと書いている通りで、これは、MEGAのブラウザ拡張機能のことである。

coreaudiodというMEGAとは全く関係ないと思われるものを使っている辺り、まことに珍妙な仕掛けである。

本稿は、Macがスリープしない理由を調査していて分かったことを逆順に書いている。さも分かっていたように書いているがMEGAが犯人とわかってホッとしてるというのが実態である。