2012年12月14日金曜日

MX動画プレイヤーProを買った

Androidの動画プレイヤーですけど。
https://play.google.com/store/apps/details?id=com.mxtech.videoplayer.pro

自分がエンコードしてるファイルHTTP越しに問題なく再生できるし最高だったので広告なし版を買いました。
といってもNexus7購入でもらった2000円クーポンで。

便利です。

2012年11月14日水曜日

Android向けGyazoアプリつくりました

スクリーンショットやギャラリーの画像を簡単にGyazoにアップロードしてURLをシェアできるAndroidアプリをつくりました。

超便利なのでダウンロードとくわしくはこちらのREADMEをどうぞ。
https://github.com/xtuaok/android_share_gyazo

2012年10月26日金曜日

マクロスFB7を観てきました

いやー、ひさしぶりにひどい映画を観た。
ネタバレ要素とか一切ない映画なので適当に書きます

2012年10月13日土曜日

2012年10月12日金曜日

2012年10月8日月曜日

ウシロード会

ウシさん( @gyuque )帰省だか、登山だか長旅から帰ってくるついでに集まって飯食おうという会

2012年10月7日日曜日

iPhone5 かった

iOSのエクスペリエンスは最高だけど、LTE入らないし電池はガンガン減るしという状況。
マップはAndroidの使ってるし。

寿司食った(2)

建屋と呼ばれる悪の枢軸にも良識ある元老院なる賢人会が存在するようで、その方々と寿司食った。

2012年10月6日土曜日

2012年10月1日月曜日

無限焼肉

台風にもめげず、建屋と呼ばれる悪の組織会合の無限焼肉に行ってきた。

2012年9月30日日曜日

髪を斬った

髪を斬ったのだが、美容師に望むのはひとつ、今日の予定を聞くというマニュアル会話はやめて欲しい。
今日は台風だしできる会話はこんなだ。
美容師「今日、このあと予定とかあるんっスか?」
俺「川の様子を見に行く」

2012年9月27日木曜日

とんかつ食った

どこにでもあるチェーン店のさぼてんだけど、ご飯味噌汁キャベツを無限に食えるし普通にうまいのでよく食ってる。
今日は麦ご飯終わったとかいうので二杯で勘弁してやった。


2012年9月25日火曜日

パソコン作った

TVRockを動かしていたマシンがどうもよく再起動するしもうTVRock使いたくないからとレコーダーを作っていたのだ けれど、だいぶ軌道にのってきたのでレコーダー専用にマシンを作ることにした。
自作するのもう学生以来かと思う。

2012年9月24日月曜日

Quiet Comfort 15買った

愛用の AKG K450 の断線がひどいので高級ヘッドフォン Quiet Comfort15 を買いました。
K450 は2年間でだいたい5回くらいケーブル交換してました。

2012年9月20日木曜日

Process::spawnで返ってくるpid

アイオーエススィックス!

Ruby の Process::spawn で返ってくる pid でハマったので、後世にこのことを残してから死のうと思いました。

2012年9月19日水曜日

つらい

睡眠が破滅しててつらい。 
明日あたり意識高めて日記かきます。

2012年9月16日日曜日

2012年9月15日土曜日

餃子食った

インターネットの有名人と、ジュニアアイドルの大先生と、ソシャゲの大手様と餃子食いに行った。
そのまま有名人宅でくつろいでる。

2012年9月14日金曜日

予約の衝突とデバイス選択

皆さんこんにちは。レコーダーネタです。
予約をした際、その時間は録画が実行可能なのかを判断する仕組みについて。

破滅

起きれない。 結局の所破滅。

2012年9月12日水曜日

Groongaのテーブルロック

Groongaのテーブルをロックするときの話。

早起き

昨日は寝ないで早起きしたフリしてたからつらかったけど今日は8時間睡眠からの早起きなんで余裕こいてマックでドヤブックエアーブログ更新なう。

2012年9月11日火曜日

寝てない

破滅を脱するために寝てないんだけど、ねむい眠い。

2012年9月10日月曜日

休んだ

今日は起きたら昼だったので休んでぼーっとテレビみたり昼寝したりと大変有意義な有給だった(涙)

予約の登録、待機、実行

レコーダーネタまだ一杯ある。
というわけで、予約を登録して、実行まで待機して、実行するまでの流れについて。

予約の登録

予約はTwitterで「うぽって録画して」みたいにつぶやくだけである。
中はどうなってるかというと Programs テーブルから要求された単語を検索して、見つかったら Reserves テーブルに追加する。

word = "うぽって"
descs = Groonga['Programs'].select do |record| 
 (record.description =~ word) & (record.stop > Time.now)
end
titles = Groonga['Programs'].select do |record|
  target = record.match_target do |match_record|
    match_record.title * 5
  end
  (target =~ word) & (record.stop > Time.now)
end

programs = descs.union!(titles).sort([ {:key => "_score", :order => "descending" }, 'start', { :key => 'channel.type', :order => "descending" } ])

programs.each do |program|
  unless Groonga['Reserves'].has_key?(program._key)
    reserve = Groonga['Reserves'].add(program._key, {} )
    reserve.title = program.title
    reserve.start = program.start
    # 省略
    break
  else
    # 予約済み
  end
end

ほんとは一連の流れを排他で処理しなきゃならないけどそれはまた今度。まぁこんな感じ。
検索のスコアリングは好き好きあるだろうけどこの例だとタイトルでのヒットは番組詳細に対して5倍のスコアで算出するようにしてる。

予約実行までの待機

予約から実行までの流れをざっくり考えてみる。もっとも単純なのはきっとこう。

  1. 予約リストを開始時間でソートして1番目の開始時間まで sleep
  2. sleepを抜けたら別スレッドで録画開始
  3. 録画開始した予約に実行中フラグを立てて 1 に戻る

でもどう考えてもこんな簡単なのではだめで、予約は任意のタイミングで追加されるし、その都度待機時間を調整しなくてはならない。
それを考慮すると、方法は2つ浮かんできて、

  • 予約リストを監視する
  • 予約リストが更新されたという通知を受け取り、待機をやめる

ようするにパッシブかアクティブかのどちらか。
予約リストの監視をするにはおそらく 短時間 sleep を挟んだ無限ループで行うことになるが、これはどうもスマートではないし、十分なマージンをとって録画を開始しなきゃならない。(まぁどのみちマージンはあったほうがいいのだが)

では、通知を受け取る方法はどうやるのか。
inotify を使うとかもあるけど、簡単なIPCは名前付きパイプでできるし、pipe のIOをselectで待ってれば、タイムアウト付きで待機できる。
次の録画開始までの待機時間をタイムアウトに設定すればうまいことやれそうである。
実際のコードはこんな感じ

シェルで名前付きパイプをつくっとく

$ mkfifo -m 600 var/run/recorder

Ruby のコード

REC_MERGIN = 10 # 10秒マージン
IPC_PIPE = 'var/run/recorder'

ipc = open(IPC_PIPE, "r")

loop do
  reserve = Groonga['Reserves'].select do |r| (r.running == false) end.sort(['start']).first
  wait = reserve.start - Time.now + REC_MERGIN
  ret = IO::select([ipc], nil, nil, wait > 0 ? wait : 0.1)
  if ret
    ipc.gets
    puts "io event"
  end
  reserve = Groonga['Reserves'].select do |r| (r.running == false) end.sort(['start']).first
  if reserve and reserve.start <= Time.now + REC_MERGIN
    start_recording(reserve)
  end
end

適当だけどこんな感じ。
別のスレッドやプロセスから "var/run/recorder" に対して "\n" を書けば select が起きて処理が進むし、でなければ次の録画開始時間まで待機する。
start_recording() は中で reserve.running = true にして 別スレッド生成。
案外簡単。

※ 他プロセスが絡まない待機なら timeout(sec) { Queue.pop } や observer なんかでもいいかもしれない。

あとは、待機時間が大変長い時に適当にEPG取得するような処理いれたり(いつ予約が入るかわからないからいつでも殺せるような仕組みで)したらよい。

注意しなきゃならないのは、外部プログラムで録画していると何が起こるかわからないのでちゃんと例外をキャッチして情報を得られるようにしておかないと後で辛い。
あとは例外でプロセスが死なないようにうまく retry したり。

録画開始から終了までの話はまた別エントリで。

2012年9月9日日曜日

GroongaのトークンナイザーはBigramにしろ

インターネットの文献を見るに Mecab にすると嬉しいみたいな記述をよく見かけるが、EPGのインデックスはBigramにしろ。

2012年9月8日土曜日

レコーダーのSchema

レコーダーのデータベース Schema について。
要するに必要な情報は何かということと情報へのアクセスのしやすさを考えなくてはならない。というメモ。

PT3 recpt1 epgdump

レコーダーを開発するにあたり。
Linux 録画三種の神器というわけでもないが、コレさえあればあとは自分でなんとかできるツールであります。

しかしながら、recpt1/epgdumpについては亜種が多数存在しておりどれを使っていいかわからないという状況でもあります。

当方はこちらの方々を使用させていただいているというメモ。

2012年9月7日金曜日

ちこく

今週4回くらい遅刻してるし破滅っぽい。
きっと自転車の空気が抜け気味なせい

レコーダーを作った

フバレコインスパイアードレコーダー『ツアレコーダー』を作った。
http://recorder.0xc.info/

Twitterのアイコンは画像処理の大先生ウシヤマさんにつくって頂いた。感謝。

2012年9月6日木曜日

日記をつける

拝承。

最近物忘れがひどいので大事なことを忘れないように日記を書きます。