Posted by & filed under 未分類.

共立電子で購入できるAVRライタ。Linuxで使えるかどうかという情報がネット上になく不安だったが、wineと併用で使うことができる。
AVRWRT商品(google検索)

具体的な手順は購入時の添付CDに記載されている(AVRWRT_COMを参照)ので、手順通りにudev/ruleを設定しwine経由でライタソフトを起動すれば良い。

しかし二点注意事項があったので以下に記載する。

シリアルポートのマッピング

FTDIのUSBシリアルデバイスをwineにマップする際、手順書ではCOM(大文字)と指示されているが小文字である。筆者の環境では小文字でないと認識されなかった。COMポートで通信ができない旨のエラーが出たら、capsを替えて試してみよう。

$ ln -s /dev/ttyUSB0 ~/.wine/dosdevices/comN

UIの文字化け

LANG=Cだと全角文字が全滅するし、LANG=ja_JP.UTF-8だと半角文字が全滅するという酷い状況だったが、regeditを使い、以下の設定をすることで回避できた。

HKEY_CURRENT_USER\Software\Wine\Fonts\Replacements

キー名MS UI Gothic
REG_SZ (文字列)
M+ 2c medium
※ M+の部分は普段使っているフォントを指定

参考: Wine で SoundEngine Free を使うときの日本語フォント設定 – 😃 mattintosh note 📝

Posted by & filed under 未分類.

2016/5/13追記 ffmpeg 3.0.2であれば再構築するだけでよさそう

たまに録画したTSで再生開始直後からカーソルが26時間など異常な数字を示すことがあり、早送り等が全部使えなくなる件で、良い知見を見付けたのでリンクだけ貼っておく。また時間見付けて時間を修正するスクリプトなど作りたい。
要約すると、

  1. 頭のタイムスタンプを取得→(1)
  2. (1)の時刻からTSを切り出す

ということらしい。切り出し後のTSでは時間が0にリセットされ、正常に見られるようになるという仕組み。

https://groups.google.com/a/webmproject.org/forum/#!topic/webm-discuss/PgpxqYlnwiU

Posted by & filed under chinachu, Linux.

chinachuで録画しながらおっかけ再生ができるようになった。

わが家では、RasPIでKodi(旧名xbmc)を走らせてchinachu録画サーバをNFS経由で参照するという構成で録画再生をしている。
以前のバージョンでは録画内容がファイルにフラッシュされると、その後xbmc側はバッファが空になるまで再補充しない問題があったが、解消されたようだ。
ちなみにgit版はRasPIのArchに提供されているやつ。

Posted by & filed under 未分類.

技術ページへのリンク。当時解決したかった問題と併せて紹介。

vmware playerなどのvmdkからkvmのqcow2への変換 (Jan 25 2015)

タイトルの通り。仮想マシンをvmwareからkvmへ変換したいというニーズ。

$ qemu-img -f vmdk -O qcow2 myvm/myvm-s0*.vmdk myvm.qcow2

第7章 イメージ形式の変換 – OpenStack 仮想マシンイメージガイド  – カレント
vmware – How do I convert a multiple-part VMDK disk image to qcow2? – Ask Ubuntu
Streaming NBD server | Richard WM Jones

linuxに構築したタイムマシンを正しくネットワーク上に公開する手順 (Jan 25 2015)

タイムマシンボリュームをlinuxのファイルサーバ内に保存していて、そこからMacの復元をしようとしたらホストが見えず困った。
記載の手順でnetatalkとavahiの設定をすると復元コンソールから見えるようになる。
HowTo: Make Ubuntu A Perfect Mac File Server And Time Machine Volume ¦ kremalicious

Posted by & filed under chinachu, debian, RAID.

前回のエントリを読みながらチューニングを施した。全然違う部分で改善ができたのでそのレポート。例によってAS-ISです。

やってみて、chinachuサーバ+NASのPCが割とボトルネックになっていたということに驚いた。RAIDのチューニングはかなり重要という良い気付きになった。

rasPIのチューニング

ウチのrasPIはarch上にkodi(xbmc)を構築している。自分が導入した当時のバージョンではhavegedが動作していてメモリを10MB程度食っていた。乱数ソースに hwrng が使えるので haveged は停止できる。

RNGD_OPTS="-o /dev/random -r /dev/hwrng" # urandom から hwrng に変更

list: /etc/conf.d/rngd

参考: Raspberry Pi – ArchWiki section 11

/var/logをtmpfsにする。

# 
# /etc/fstab: static file system information
#
#
/dev/mmcblk0p1  /boot           vfat    defaults        0       0
tmpfs           /var/log        tmpfs   defaults        0       0
mynas.local:/   /mnt/nas        nfs     nfsvers=3,nolock,proto=udp,intr,noatime,async,noauto,x-systemd.automount   0       0

list: /etc/fstab

参考: Maximizing performance – ArchWiki section 5

RAID チューニング

先読みブロックをデカくする。再生開始直後の再生ストップがなくなった感がある。以下例の65536では 512バイトセクタの数なので32MBの先読みが実行される。

# blockdev --setra 65536 /dev/md0

shell command rc.localに書くのも良いかもしれない。

参考: blockdev(8) – Linux manual page

RAIDの書き込み時のパフォーマンスを改善するため、stripe_cache_sizeを大きくする。起動時に自動反映させる場合はrc.localに以下スニペットを貼る。今日だけ欲しいならスニペットを実行すればその直後から反映される。ウチのホストはメモリを4GB積んでいるので支障無かったが、メモリの搭載が小さいホストにおいては注意が必要。メモリ使用見込は 4(kernelページサイズ|KB) * (物理ディスク本数) * (stripe_cache_size|KB) の式で計算できる。

2番目の参考リンクではRAID再構築を行う場合のチューニング方法が紹介されている。speed_limit_min,maxの設定を広くしておくと(例えば500から1000000など)、m2tsを再生しながらでも効率よくリビルドができる。ウチの環境ではminを2000などにしていると転送が間に合わなかった。なおデフォルトではmaxが小さいためリビルドの転送速度がキャップされてしまう。必ずmaxの数値は上げておく。たまたま今日2TB*3のraidに1本追加(grow)したのでmdstatを監視していると、チューニングをしない場合にはリビルドの完了まで見込40時間程度だったが、15時間になった。queue_depthを1にするチューニングについては体感できる改善はなかった。故障からのリビルドにおいてはbitmapオプションも使うこと。

for a in /sys/block/md?; do
    echo 8192 > $a/md/stripe_cache_size
done

list: /etc/rc.local

# sysctl -w dev.raid.speed_limit_max=1000000
# sysctl -w dev.raid.speed_limit_min=500

shell command (もしくは /etc/sysctl.d/ に同様の設定を書く → sysctl -a | grep speed_limit > /etc/sysctl.d/99_myraid_tuning.conf)
参考: Linux RAID mdraid “stripe_cache_size” vs. transfer rate, 5 Tips To Speed Up Linux Software Raid Rebuilding And Re-syncing

Posted by & filed under 未分類.

m2tsを再生していると、特に再生し始めにハングアップすることが多く、ストレスが溜まる。

mp4では障害が出ないため、転送量が多いことによる過負荷からjournaldの過負荷warningがさらに負荷を増大させるという悪循環に陥っていると予想した。SDカードホンマに遅いね。アップデートもちょっと溜めたら1時間で終わらない。

とりあえず対策はまた後日実施するが、そういう観点で漁ったURLを記載する。

ログをramdiskに

ramdiskで揮発してしまうログを適当に同期する目的で使えそうなサービスAnything-sync-daemon

 

Posted by & filed under chinachu, tips, メモ.

某局で毎朝放送されているドラマ番組など、副音声が含まれる放送を安直にffmpegに掛けてmp4にしようとすると副音声と主音声が混った上にフレームと合わなくなってワヤ*になってしまう。
試行錯誤の結果、以下を付けると正しく主音声と副音声が分離されることがわかった。
忘備録として。

-acodec libfaac -filter_complex channelsplit -ar 48000 -ab 128k

参考1 ffmpegのドキュメント: https://trac.ffmpeg.org/wiki/AudioChannelManipulation#stereo2monostreams
参考2 音声多重放送(wikipedia): http://ja.wikipedia.org/wiki/音声多重放送
* “ワヤ”まったくダメになってしまう意

Posted by & filed under chinachu, Linux, ssh, tips.

前回からの続きである。
前回の構成では録画していない時間帯では5分でシャットダウンしてしまうため、crontabをコメントアウトしないと作業もできない状況になってしまっていた。そこで「使っていない検知」としてwhoコマンドを入れ、ログイン中は落ちない仕組みを作った。あと、電源入れてションベンして帰ってくると落ちてるという事故を繰り返したため、uptimeが15分を過ぎるまで落とさない仕組みを作った。

#!/bin/sh

C=`who -u | wc -l`

if [ "$C" != "0" ]; then
  exit 1
fi

exit 0

code: loginFree

#!/bin/sh

UTIME=`uptime -s`
BASE=`date -d"$UTIME" +%s`
EXP=`date -d-15min +%s`

[ "$BASE" -lt "$EXP" ]

exit $?

code: up15min

raspberry piからはnfsマウントをしてビデオを再生する構成にしているため、showmountコマンドでnfs利用の監視を試みたが切断しても接続の情報が残ってしまい確実ではなかった。
そこでraspberry piからシステム起動時にsshセッションを張り、利用を録画サーバに知らせる方法を考えた。

rpiのArch向けにsystemdのスクリプトを作った。以下はsshを非対話モードで動かす設定である。下記を作成し、systemctl enable naslogin と打つだけで起動時に勝手に動いてくれる。詳細はリファレンスを参照されたい。 hostkey.id_ecdsaなどは作成し、予め対話なしでログインできるようにしておくこと。

[Unit]
Description=Begin login beacon for nas
After=network-online.target

[Service]
Type=simple
ExecStart=/usr/bin/ssh -o BatchMode=yes -t -t -i /etc/hostkey.id_ecdsa chinachu@myhost.local ping -i 10 localhost > /dev/null
Restart=on-failure

[Install]
WantedBy=multi-user.target

code: /usr/lib/systemd/system/naslogin.service

*/5 * * * * /usr/local/bin/up15min && /usr/local/bin/chinachuFree && /usr/local/bin/loginFree && ~root/shutmail.sh && sleep 10 && /sbin/shutdown -h now

code: crontab -e

rpiをブチ切りした時は1時間程セッションが残ってしまうようだが、概ね良好である。

 

Posted by & filed under chinachu, Linux, python.

過去にChinachu向けのスクリプトを少し書いたが、この度ちょっと家を空けるため、それを見越して録画が動作していない場合に自動でシャットダウンする仕組みを作成した。導入方法などはまた今度。

過去のスクリプトに少し手を入れる格好。

#!/usr/bin/env python3

from urllib.request import urlopen
import json
import io
import time

class ChinachuStatus:
    def __init__(self, urlBase):
        self.urlBase = urlBase
    
    def getNextReserve(self):
        response = urlopen(self.urlBase + '/reserves.json')
        res = json.load(io.TextIOWrapper(response, response.getheader('content-type').split('charset=')[1]))
        
        now = time.time()
        for e in [ int(ent['start'] / 1000) for ent in res if ent['start'] / 1000 > now ]:
            return e
    
    def isChinachuBusy(self):
        response = urlopen(self.urlBase + '/recording.json')
        res = json.load(io.TextIOWrapper(response, response.getheader('content-type').split('charset=')[1]))
        if len(res) > 0:
            return True
        if self.getNextReserve() - 600 < time.time():
            return True
        return False

if __name__ == '__main__':
    url = 'http://watson.local:10772/api'
    print(ChinachuStatus(url).getNextReserve())
    print(ChinachuStatus(url).isChinachuBusy())

Code: ChinachuStatus.py

#!/usr/bin/env python3

from ChinachuStatus import ChinachuStatus

if __name__ == '__main__':
    url = 'http://localhost:10772/api'
    print(ChinachuStatus(url).getNextReserve() - 300)

Code: chinachuNext

#!/usr/bin/env python3

import sys
from ChinachuStatus import ChinachuStatus

if __name__ == '__main__':
    url = 'http://localhost:10772/api'
    res = ChinachuStatus(url).isChinachuBusy()
    if res:
        print("Chinachu is busy now.")
        sys.exit(1)
    print("Chinachu is free.")
    sys.exit(0)

Code: chinachuFree

*/5 * * * * /usr/local/bin/chinachuFree && /bin/date | /usr/bin/mail -s "chinachu is going to poweroff" haruo31 && /sbin/shutdown -h now

Code: ~# crontab -e

Posted by & filed under 未分類.

いやはやハマったのでメモ。
以下いくつかのURLで紹介されているdjango.cgiを使ったCGIによってdjangoを動
作させる方法だが、1.7以降ではtranslationが初期化できないなるエラーで動作
しないことがわかった。

http://rokujyouhitoma.hatenablog.com/entry/20100222/1266828762
http://ameblo.jp/dropshipping-dojyo/entry-11285616281.html

1.7のリリースノート
https://docs.djangoproject.com/en/dev/releases/1.7/#wsgi-scripts

リリースノートにあるとおり、
django.core.handlers.wsgi.WSGIHandler()
ではなく
django.core.wsgi.get_wsgi_application()
をつかうようにとのこと。