2018年4月30日月曜日

dd-WRTでヘアピンNAT

我が家では、BHR-4GRVっていうルータにdd-wrtをインストールして使っているのですが、

・LAN内にウェブサーバを立て、
・Port Forwarding機能を利用して外部からウェブサーバへのアクセスを許容し、
・LAN内から、ルータのWAN側のIPアドレスでウェブサーバにアクセスを試みる。

場合、dd-wrtのデフォルトの設定だと、ウェブサーバにアクセスできません。

これは、デフォルトの状態では、dd-wrtにヘアピンNATの設定がされていない為です。

dd-wrtにヘアピンNATの設定をするのは非常に簡単で、
「Administration」→「Command」のページの「Command Shell」のCommands欄に以下の記述を追加し、「Save Firewall」を選択すればOKです。

LAN=`nvram get lan_ipaddr`/`nvram get lan_netmask`
iptables -t nat -I POSTROUTING -o br0 -s $LAN -d $LAN -j MASQUERADE


クラウド全盛の時代、自分の家にサーバを立てようっていう奇特な方がどの程度いらっしゃるかわかりませんが、ご参考まで。

連番ファイルに降順のタイムスタンプをつける

家でASUS MemoPad ME176CというWi-Fiタブレットを使っているのですが、このデバイスにプリインストールされている「ギャラリー」というアプリで画像を見ると、タイムスタンプ順の降順(新しい順)に表示されます。

自分が撮影した写真だとこれでいいんですが、自炊した画像データをデバイスに流しこんで見るときはとても不便です。

一応ソートの順番を「古い順」や「名前順」に変更できるのですが、アプリはこの設定を覚えてくれないようで、再度ギャラリーを見るとまた新しい順にソートされて表示されます。

なんとかしてギャラリーを開いた時に意図した並び順になるようにしたい。

という事で、連番のファイルに降順のタイムスタンプをつけるプログラムをシェルスクリプトで書いてみることにします。

■シェルスクリプト
#!/bin/sh

target=${1}

if [ -z ${target} ]
then
    echo 'Target is not specified, operation aborted.'
    exit
fi

if [ ! -d ${target} ]
then
    echo 'Target is not a directory, operation aborted.'
    exit
fi

timestump=`date +%s`

find ${target} -type f -print | sort -r | while read file
do
    if [ `uname` = 'FreeBSD' ]
    then
        date=`date -r ${timestump} "+%Y%m%d%H%M.%S"`
    elif [ `uname` = 'Linux' ]
    then
        date=`date +%Y%m%d%H%M.%S --date "@${timestump}"`
    fi

    touch -t ${date} ${target}${file}

    timestump=`expr ${timestump} + 2`
done
上のシェルスクリプトをファイルに保存し、引数に連番の画像が含まれるディレクトリを指定します。

本当はFreeBSDとLinuxで同じ記述にしたかったのですが、dateの使い方が双方のOSで激しく違う為、unameの戻り値で場合分けしています。
やっていることはシンプルで、現在のUNIXTIMEを取得し、そこからファイル名の昇順に2秒ずつ足したタイムスタンプを設定していくだけ。

ちなみに、なぜ2秒なのかというと、SDカードのファイルシステムであるFAT32が、奇数秒のタイムスタンプを許容しない為です。
FAT32では、タイムスタンプに奇数秒の指定をすると、偶数に丸められてしまう(-1秒される)らしい。

2018年4月1日日曜日

マザーボードのIOシールド(リアパネル)の自作

秋葉原やハードオフで、よく中古のマザーボードを購入するのですが、IOシールド(リアパネル)がついていないことがよくあります。

IOシールド自体はeBayとかで単品で売ってたりもするのですが、1,000JPY以上して、下手するとマザーボードより高かったりします。

別になくても実害があるわけではないのですが、ケースに収めた際に隙間が開くのがなんとなく嫌なので、なんとか出来ないか今まで思案していました。

そんな中、たまたま行った近所の100均の店でいいものを見つけました。



植木鉢の土が流れ出さないよう鉢底に敷くプラスチックシートで、もちろん100円です。
プラスチック製なので、ハサミやニッパーで簡単にカットできます。

こいつをIOシールドの形状に加工してみます。

まずは、ハサミでだいたいの大きさにカットした上で、各コネクタのスペースをニッパーで穴あけしていきます。
穴の目の大きさがアナログRGBコネクタなどのスペーサーとちょうど同じなので、スペーサーを外してから再度ネジ止めすると、固定できます。




実際にケースに収めるとこんな感じです。



まあ何もないよりはいいかな。