foobar2000 @ Mac で DLNA over SSH する

X. 結論

DLNA サーバが HTTP で建つので単純にポートフォワードしてクライアントにサーバの情報を追加するだけ。
UPnP は LAN 内でのサーバの相互確認に使われるだけなので端折れる)

0. 概要

foo_upnp には DLNA をインターネットに公開する為の設定があるが、わざわざその為にポートを開けるのは面倒だし、セキュリティ的にもユーザ・パスワード認証があるとは言えなんか心許ない。また、なによりもユーザ・パスワードの管理の手間を無闇に増やしたくない。

なので、できるなら SSH のトンネリングでセキュリティ・認証共に賄って楽をしたい。

けど UPnP とか絡んできてるし複雑そう…もぅマヂ無理。。…と思いきや UPnPDLNA は切り離せると分かったので DLNA over SSH しょ。。。

1. 必要なもの

2. セットアップ

※ Wine, foobar2000, foo_upnp のインストール・設定などは割愛
※ Server には直接 SSH できるか、他のマシン経由で SSH するなどして、該当ネットワークにトンネリングできる必要がある

  • Server
    1. foo_upnp の設定で Media Server のポートを任意のもの(ここでは 33333)にする
      • ※デフォルト (56923) 以外が望ましい
        →デフォルトだと Client 側の設定を変えない限りポートがバッティングする為
  • Client
    1. ssh でローカルフォワードを行う
      $ ssh -fN -Llocalhost:33333:localhost:33333 HOST_TO_SERVER
      • ※フォワード元/先のポートの番号は揃える必要がある
        DLNA が返す URI のポートが Server 画面で設定した値のものになる為
    2. foobar2000 にて UPnP Browser を立ち上げる
      • メニューViewUPnP Browser
    3. 右クリックメニューの Add remote Internet UPnP Server を選択
    4. 出現したダイアログの Host に以下を入力して OK を押下
      http://127.0.0.1:33333
      • 127.0.0.1 ではなく localhost にしてしまうと Client 側の OS の設定で IPv6 を無効にしていなかったり、hosts に IPv6localhost の記載があったりする限り IPv6 で繋ぎに行ったり IPv4 で繋ぎに行ったりして挙動が変になるので注意
        → 具体的にはトラックのローディングが延々と終わらなかったりする
    5. enjoy!

3. その他

  • 簡略化のために Mac に限定したが、もちろん Server, Client 共に Windows でも Linux(w/ Wine) でも代替可能
  • IPv6 の問題で割とはまった…。悩んだら tcpdump

root 権限がなく、ビルドツールもインストールされていない環境でビルド環境を整える

CentOS 6 で git, zsh, tmux 等をビルドしたいけど、root 権限もなければインストールされているコンパイラは cc だけ…、というようなケースでビルド環境をそろえる方法。

0. 想定しているケース

  • CentOS 6 (x64)
  • 一般ユーザ権限のみ
  • ビルドツールのインストール先は ~/local/
  • 使用するシェルは bash

1. yumdownloader (yum-utils) のインストール

yumdownloader (yum-utils) が入っていなければインストールする。

$ type yumdownloader >/dev/null 2>&1 || (mkdir ~/local; cd ~/local && releasever=$(head -n1 /etc/issue | perl -ne '/\b(\d+(?:\.\d+))\b/; print $1;') && wget -qO - "http://ftp.sakura.ad.jp/pub/linux/centos/${releasever}/os/$(uname -i)/Packages/yum-utils-1.1.30-14.el6.noarch.rpm" | rpm2cpio | cpio -id && ./usr/bin/yumdownloader --version)

2. ビルドツールのインストール

上記 1 で yumdownloader をインストールした場合は事前にパスを通しておくか、以下の各コマンドを置き換える。

$ mkdir ~/local; cd ~/local
$ yumdownloader $(repoquery --resolve --requires gcc gcc-c++ kernel-headers autoconf automake binutils libtool make bison gettext pkgconfig | sort -u)
$ find -maxdepth 1 -name '*.rpm' -print0 | xargs -0 -n1 -I '{}' sh -c 'rpm2cpio {} | cpio -id'

3. 環境変数を設定する

ビルド時に設定されていれば良いので、シェルの設定ファイルに記述する必要は特にない。

$ export LOCAL_ROOT="${HOME}/local"
$ export PATH="${LOCAL_ROOT}/usr/bin:$PATH"
$ export LD_RUN_PATH="${LOCAL_ROOT}/lib64:${LOCAL_ROOT}/usr/lib64"
$ export LDFLAGS="-L${LOCAL_ROOT}/lib64 -L${LOCAL_ROOT}/usr/lib64 -R${LD_RUN_PATH}"
$ export CPPFLAGS="-I${LOCAL_ROOT}/usr/include"

4. ビルド

後は普通にビルドを行うだけ。

Grunt.js でファイルを個別に minify する

grunt-contrib-uglify などで minify を行う際、そのままだと src に指定したファイルが一つにまとまった上で minify されるが、これをそれぞれのファイルで個別に minify したい場合はタスクのオプションで expand を true にし、動的なビルドを行う。

例えば、

assets
|-- javascripts/
|   |-- moment.js
|   `-- underscore.js
`-- styles/
    |-- cssreset-context.css
    `-- cssreset.css

の各 *.js, *.css をそれぞれ assets/javascripts/min/*.js, assets/styles/min/*.css として minify したい場合、Gruntfile は次のようになる。

サンプルプロジェクト

https://github.com/waltarix/grunt-minify-separately-sample

$ git clone https://github.com/waltarix/grunt-minify-separately-sample
$ cd grunt-minify-separately-sample
$ npm install
$ grunt
$ tree -sF assets
assets
|-- [        170]  javascripts/
|   |-- [        136]  min/
|   |   |-- [      14436]  moment.js
|   |   `-- [      13422]  underscore.js
|   |-- [      43905]  moment.js
|   `-- [      41426]  underscore.js
`-- [        170]  styles/
    |-- [       2478]  cssreset-context.css
    |-- [       1554]  cssreset.css
    `-- [        136]  min/
        |-- [       1642]  cssreset-context.css
        `-- [        719]  cssreset.css

4 directories, 8 files

dnsmasq で特定のアドレスにバインドさせたい場合は bind-interfaces を有効にする

dnsmasq でループバックアドレスなどにバインドさせたい場合、

listen-address=127.0.0.1

の様に設定するが、これだけではワイルドカードアドレス (0.0.0.0) にバインドされてしまう。

これを打開するには上記設定と併せて、

bind-interfaces

を設定する必要がある。