Posted by & filed under 未分類.

メディア付きの投稿をした場合のコンテンツがどう表示されるかの確認。2

img_0907-1

リンクを挿入する場合のテスト

 

Posted by & filed under 未分類.

Gnomeも便利だったが、タイトルバーが分厚いとかデスクトップの遷移が面倒だとか、ラップトップの画面の狭さもあいまってストレスフルだった。
画面が狭いのなら、そもそもウィンドウをだらだら並べるのがおかしいと気付きタイルWMというのを試してみた。


上記のtweetを参考に、i3wmを使ってみたところ、単体では壁紙すら設定できないというシンプルさで、軽快に動く。かなり良い感じである。
しかしあまりにもシンプル過ぎて多少不便な点もあるため、そのあたりの改善方法をまとめた。
設定はすべて、.config/i3/config に書き足すものとする。

cheatsheet

https://i3wm.org/docs/refcard.html

デスクトップコンポジション

comptonを自動起動するとTearfreeになる。
Arch wikiの記事より。

exec compton -b

ボリュームコントロール

GNOMEの制御がデフォルトでは入らないので、pulseaudioもなくなる。以下は音量ボタンを押すことでalsa mixerをコントロールする設定。
Redditの記事では1単位で制御しているが、筆者の環境では最大が65535なので、512刻みにした。

bindsym XF86AudioRaiseVolume exec "amixer -q sset Master,0 512+ unmute"
bindsym XF86AudioLowerVolume exec "amixer -q sset Master,0 512- unmute"
bindsym XF86AudioMute exec "amixer -q sset Master,0 toggle"

https://www.reddit.com/r/i3wm/comments/2wbv8x/question_how_to_manage_audio_with_i3/

壁紙を有効にする

~/wallpaper.sh として、実行可能シェルを作る。

#!/bin/sh

(while true; do
     find ~/Pictures/wallpepers -type f \( -name '*.jpg' -o -name '*.png' \) -print0 |
         shuf -n1 -z | xargs -0 feh --bg-max
     sleep 15m
 done) &

以下をconfigに書く。

exec sh ~/wallpaper.sh

Posted by & filed under chinachu, Linux, tips.

まだ検証中だけれども、興味深いtipsがあったのでリンクを紹介しておく。
FFmpeg convert video w/ dropped frames, out of sync – superuser

同日 4:00 追記
上記リンクの方法のままではダメだったが、以下のコマンドで破損データの除去とタイムスタンプ情報が正規化されることは確認できた。
ffmpegは3.0.2を使用。

ffmpeg -i source.m2ts -vcodec copy -acodec copy output.m2ts

サイズも1割ほどちっちゃくなるので少し心配になるが、途中で再生がコマ飛びして音声が切れるといった状態だった民放ドラマについては、正常に再生できるようになった。
副音声付きtsを処理すると音声がマージされてしまうため、その部分のフィルタは必要。

Posted by & filed under 未分類.

ローストチキンが好きで年1回は必ず作っているのだが、毎回生焼けで後からレンチンするという情けないことになっている。

焼き過ぎず中まで加熱できればなぁと考えて閃いたのが、ホットプレート + 背の高い蓋 + 温度センサ + リレー + 温度管理ソフト を使い、長時間低温加熱できないか、というアイデア。なお、鳥ハムで定番となっているヨーグルティアでは丸鶏が入らない。

ヨーグルティアでは水に浸した状態で加熱するが、ホットプレートの場合は空気加熱となり、まったく条件が違うことから上手くいくかどうかも不明である。とりあえず適当な蓋すら見付ける事ができなかった。まずそれをコーナンで探すところから始める。ちなみに、鉄板焼き屋などが使っているステーキカバーという鉄板の上で食材に被せる蓋のような物があって、鉄板焼きフリークの間で大活躍しているらしい。

ググっているともはや基礎研究は済んでいる感がある。

参考URL

Arduinoとホットプレートを使ったリフロー装置の製作

Raspberry Pi Temperature Controller

Raspberry PI Temperature control board schematic

5vで20A/100VACパスできるリレー(google)

 

Posted by & filed under 未分類.

統計情報から、トラックバックしていただいていたことに気付いたので、現状どうなっているかをちょろっと書く。

遭遇した問題と対策

  • 連ドラとか短い番組ばかり撮って直ぐシャットダウンしているとEPG情報が枯渇する
    → 最低30分はシャットダウンしない
  • rasPIのKodi(XBMC)で録画を観るため、rasPIが動いている時間は落ちられると困る
    → rasPIのsystemdからchinachuサーバにsshログインし、chinachuサーバ側でSSHセッションを監視、セッションがある間は落とさない
  • ハイバーネートだとPT2やBCASリーダーが起動後に動かないときがある
    → PT2はモジュールのアンロードとロードで解消できたがBCASの方はなお不安定だったので、毎度シャットダウンするようにした。それによりchinachuサービスが先に死ぬようになりREST APIが使えず、jsonファイルを直参照して次回起動を変更するよう変更。

コード

gist良いなぁ。今回はブログ上に掲載。

root ~# crontab -l
# 起動後と3時間おきににlogwatchのレポートをメールする
@reboot /usr/sbin/logwatch --mailto haruo31@underthetree.jp
15 */3 * * * /usr/sbin/logwatch --mailto haruo31@underthetree.com

# upから30分以上経ち、かつchinachuが録画をしておらず、sshセッションがないとき
# メール送信し10秒後にshutdown -h
*/5 * * * * /usr/local/bin/up30min && /usr/local/bin/chinachuFree && /usr/local/bin/loginFree && ~root/shutmail.sh && sleep 10 && /sbin/shutdown -h now

# shutdown -r 10 せず敢えてsleepしているのはshutdown中であることで
# 何か制限があった気がしたから(ソースなし)

 

root ~# cat /usr/local/bin/up30min
#!/bin/sh

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

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

exit $?

 

root ~# cat /usr/local/bin/chinachuFree
#!/usr/bin/env python3
# -*- charset: utf8 -*-

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)

 

root ~# cat /usr/local/bin/ChinachuStatus.py
#!/usr/bin/env python3
# -*- charset: utf8 -*-

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]))
        return len(res) > 0 or self.getNextReserve() - 600 < time.time()

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

 

root ~# cat /usr/local/bin/loginFree
#!/bin/sh

if who -u | grep . > /dev/null; then
  exit 1
fi

exit 0

 

root ~# cat /usr/local/bin/chinachuNext
#!/usr/bin/env python3
# -*- charset: utf8 -*-

from ChinachuStatus import ChinachuStatus

if __name__ == '__main__':
    url = 'http://localhost:10772/api'
    # 5分前に起動
    print(ChinachuStatus(url).getNextReserve() - 300)

 

root ~# cat /etc/init.d/chinachu-nextsched
# /etc/rc6.d/K06chinachu-nextsched にリンクを張るのが多分正解 
#!/bin/sh

# Action script ensure that unattended-upgrades is finished 
# before a hibernate 

PATH=/sbin:/usr/sbin:/bin:/usr/bin
SHUTDOWN_HELPER=/usr/share/unattended-upgrades/unattended-upgrade-shutdown

echo 0 > /sys/class/rtc/rtc0/wakealarm
/bin/rm /home/chinachu/chinachu/data/*.lock’
/usr/local/bin/chinachuNext.old > /sys/class/rtc/rtc0/wakealarm
echo Wakeup schedule has been set successfully.

 

root ~# cat /usr/local/bin/chinachuNext.old
#!/usr/bin/env python3
# -*- charset: utf8 -*-

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

class Reserves:
    def __init__(self, url):
        with open(url, mode='r', encoding='utf8') as f:
            self.o = json.load(f)
    
    def getNextTime(self):
        now = time.time()
        for e in [ int(ent['start'] / 1000) for ent in self.o if ent['start'] / 1000 > now ]:
            return e

if __name__ == '__main__':
    url = '/home/chinachu/chinachu/data/reserves.json'
    print(Reserves(url).getNextTime() - 300)

Posted by & filed under debian, iphone, Linux.

寝かしつけた息子を寝室に置いてテレビを観たいという嫁のリクエストを叶えるべく、ありもののwebcamと古いラップトップでwebcamの配信システムを構築した。およそ30秒ほど過去の息子の動静がiPadから確認できる。(むっちゃずれてるけど)音声も付いているので、起きたかどうかも音で確認できる。

仕様

  • HLSストリーミングの仕組みを利用し、shmに分割されたビデオtsを吐き出し直接nginxで公開する
  • HLS対応の出力はffmpegに実装されているものを使う
  • 音声つきビデオとする。ビデオが記録された時刻を画面左上に表示する

以下のサンプルの場合、iPadなどから http://yourhost/live/home/index.html にアクセスし、ビデオをタップすることでストリーミングが見られる。

構築にあたり気をつけた点

iPad対応にするため、ビデオのキーフレームをドキュメントにある90に指定(たぶん30とかでも良いのだろうが、チャートに従った)。
分割のタイミングとキーフレームが挿入されるタイミングを合わせた(試行錯誤の中でやった工夫なので、実際に必要かどうかは不明)。
ffmpegは使い終ったtsの削除をしてくれない。
音声がずれたりプチプチノイズが入る。サンプリングレートの指定をやめたことでノイズは消えたが、ズレはそのままとなっている。
apacheでなくnginxを使ったのは、最初rtmp方面から攻めたことによる名残である。rtmpの試行ではnginx-rtmp-moduleを使った。レイテンシが1分以上になる上にvlc以外で再生できないようなザンネンなストリームしか吐かせることができなかった。

用意するもの

もともとラップトップに入っていた debian gnu/linux を利用した。ffmpegはdebian-multimedia版のnonfreeライブラリを含むものを使用している。

必須

いずれもaptで導入。
nginx
ffmpeg
mplus fontdone
chrony -> ビデオにインポーズする時刻が狂うといろいろ都合が悪いため

あった方が良い

avahi -> ころころ変わるipなんか打ってられないという方に

デーモン化にはsystemdを利用した。

PCはdell latitude 4200 C2D。LogicoolのWebcam C525を利用。ラズパイで動いたらいいなー。

コード

code: /usr/local/bin/ffmpeg.sh

#!/usr/bin/env bash

BASE=/dev/shm/nginx-hls/home
mkdir -p $BASE
find $BASE -type f -delete

RES=640x360
#RES=960x544
#RES=1280x720

BRATE=600k
#BRATE=1200k
#BRATE=1800k
#BRATE=2500k

W=${RES%%x*}
H=${RES##*x}

cat > $BASE/index.html <<EOF
<html>
<head>
    <title>My son</title>
</head>
<body>
    <video src="http://yourhost/live/home/index.m3u8" height="$H" width="$W" >
    </video>
</body>
</html>
EOF

(sleep 12;
 while [ -e $BASE/index.m3u8 ]; do
   find $BASE -newer $BASE/index.m3u8 -prune -o -name '*.ts' -print | \
     grep -v -f $BASE/index.m3u8 | \
     xargs rm 2> /dev/null && true;
   sleep 6;
 done) &

trap "{ rm $BASE/index.m3u8; exit 0; }" TERM EXIT

ffmpeg \
 -y -threads 0 \
 -f v4l2 \
 -video_size $RES \
 -timestamps abs \
 -r 15 \
 -i /dev/video0 \
 -f alsa -thread_queue_size 1024 \
 -i "default:CARD=C525" \
 -ac 1 -strict -2 \
 -vcodec libx264 \
 -filter:v "drawtext=fontfile=/usr/share/fonts/truetype/mplus/mplus-2m-medium.ttf: text='%{localtime}': fontcolor=white@0.8: x=5: y=5" \
 -profile:v high -level 4.0 \
 -preset ultrafast \
 -pix_fmt yuv420p \
 -force_key_frames 'expr:gte(t,n_forced*6)' \
 -b:v $BRATE \
 -acodec libfaac \
 -b:a 40k \
 -filter:a "aresample=async=100, highpass=f=200, lowpass=f=3500" \
 -f segment -segment_time 6 \
 -segment_format mpegts \
 -segment_list $BASE/index.m3u8 \
 -segment_list_size 12 -segment_list_flags live \
 -segment_list_type m3u8 $BASE/%08d.ts

code: /etc/systemd/service/webcam.service

[Unit]
Description=Webcam HLS service
After=network.target auditd.service

[Service]
ExecStart=/usr/local/bin/ffmpeg.sh

[Install]
WantedBy=multi-user.target

* 以下登録のコマンド

# systemctl daemon-reload
# systemctl enable webcam

code: /etc/nginx/sites-available/default

server {
        ... snip ...
	location /live {
                types {
                    text/html html;
                    application/vnd.apple.mpegurl m3u8;
                    video/mp2t ts;
                }
                alias /dev/shm/nginx-hls;
                add_header Cache-Control no-cache;
	}
        ... snip ...
}

参考文献

iOS対応VIDEOの情報
https://developer.apple.com/library/ios/documentation/…/TP40008332-CH102-SW21

ffmpegで時刻のインポーズ
http://einar.slaskete.net/2011/09/05/adding-time-stamp-overlay-to-video-stream-using-ffmpeg/

grepのパターンをファイルから読む(ts削除のロジック)
http://unix.stackexchange.com/questions/83260/reading-grep-patterns-from-a-file

ALSA使うと [alsa @ 0x1d83640] ALSA buffer xrun. が出る不具合
http://stackoverflow.com/questions/28359855/alsa-buffer-xrun-induced-by-low-quality-source-in-ffmpeg-capture

ビットレート設定など
https://ffmpeg.org/ffmpeg.html

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