Archive for the 'プログラム' Category

podcastの自動取得(5)

podcastの自動取得にはもっと楽な方法があるのだと思うが、ちょっと探して出てきた中ではなかなか良い方法が見つからなかったのでじたばたしてみた。

自分でコードを書かなくても、例えば castget を使えば通常は大丈夫だ。.castgetrc に、ほんの少し設定すればファイルをダウンロードしてくれる。少なくとも キラ☆キラは大丈夫だ。ところがゴールデンラジオだと表示用のjpegファイルしかダウンロードしてくれなかった。また、wgetと異なり、タイムスタンプを保存してくれないので、再生するMP3プレイヤーによっては若干不便である。

他に YouTube 用の youtube_dl という便利ツールもあった。今のところ出番はそれほど無いが、そのうち使い道が分かるかもしれない。

これらのツールは cron で自動起動して、取得したデータをサーバに保存しておく。保存ディレクトリを samba で参照できるようにすれば、出がけに MP3 プレーヤーに簡単に転送できる。USBメモリ状のプレイヤーなら、サーバにコンソールをつけておいて、直接送り込んでも良い。

次の課題はファイルの整理だ。昔のラジオ番組などとあわせてうまく整理する方法を考えている。

podcastの自動取得(3)

「ありがとう浜村淳です」は毎日更新されるので、これこそ毎日サーバで自動的にダウンロードしたい。ところが Windows Media なので、便利ツールは大抵 Windows で手動取得である。なんとかFreeBSDでダウンロードできないだろうか。ということで探してみると mimms という大変便利なツールの有ることがわかった。早速導入。

portinstall multimedia/mimms

試しにPR音声を取得してみたい。使い方は? …

$ mimms --help
Usage: mimms [options]  [filename]

mimms is an mms (e.g. mms://) stream downloader

Options:
  --version             show program's version number and exit
  -h, --help            show this help message and exit
  -c, --clobber         automatically overwrite an existing file
  -r, --resume          attempt to resume a partially downloaded stream
  -b BANDWIDTH, --bandwidth=BANDWIDTH
                        the desired bandwidth for stream selection in
                        BANDWIDTH bytes/s
  -t TIME, --time=TIME  stop downloading after TIME minutes
  -v, --verbose         print verbose debug messages to stderr
  -q, --quiet           don't print progress messages to stdout

 

実は元々、mms: って何?状態だった。知っているURIは  http: で始まって asx で終わるのだ。そこで asx ファイルの中身を見てみると、XMLっぽいテキストファイル。この中に  mms: で始まる URI 発見。なるほどそれでツールの名称にも mms が含まれるのだと納得。試しにその URI を指定して実行したら、時間はかかるけれどもファイルは取得できた。

mimms mms://mbs.sswmt1.smartstream.ne.jp/mbs/arigatou/ari_intro.wma

ディレクトリを掘ったりはしないらしい。

というわけで、この mimms を呼び出すスクリプトを、podcast用のを改造して書いてみた。

<?php

// 起動パラメータがなければ異常終了
if($argc <= 1) {
    exit(1);
}

// 適当なUser-Agentを設定
ini_set("user_agent","Mozilla/2.0 (compatible; get-mbs.php)");

// 指定されたパラメーターをXMLだと思って開く
$file = simplexml_load_file($argv[1]);

// falseが返ってきたら異常終了。
if(!$file) {
    exit(2);
}

// 直接欲しいエレメントを取ってくる。SimpleXMLは便利。
$result = $file->xpath('/ASX/Entry/Ref');

foreach($result as $elm) {
    if(is_null($elm["href"])) {
        continue;
    }
    // URIっぽいものを指定して mimms で取得
    $cmd = "/usr/local/bin/mimms -r -q -b 131072 ";
    //print $cmd . $elm["href"] . "\n";
    exec($cmd . $elm["href"]);
}

exit(0);

?>

これでどうかな、と実行してみたら、やっぱり上手く行かない。がっくし。URIを直接指定して mimms 起動だと上手く行くのだが。

podcastの自動取得(2)

せっかく自動取得できると思ったら、サーバ上では上手く動かない。困った。

エラーには’simplexml_load_file’という関数はない、と書いてある。CentOS5.6にはphp53パッケージをベースに関連パッケージを色々入れているのだが、FreeBSDの方にはphp5本体とDBモジュールだけしか入れていないのではなかったか。portsから入れた時に確かに設定項目が少ない気はしてはいた。

php -info

にて表示させてみると、FreeBSD側にはそもそも SimpleXML と出てこない。CentOS5.6の方では出る。
というわけで話は簡単。探してみた。textproc/php5-simplexml というパッケージがあって、導入されていない。
早速導入する。

portinstall php5-simplexml

試してみるとちゃんと動作した。これでキラ☆キラが電車の中でも良い音で聴ける。ついでにゴールデンラジオも聴ける。めでたしめでたし。

ここまで出来たら欲が出てきた。radiko登場以前によく聴いていた「ありがとう浜村淳です」も聴きたい。「ありがとう浜村淳です」は基本当日のみ公開で翌日消されてしまうが自動取得しておけば聞き逃しもなくなる。何とかならないだろうか。

podcastの自動取得(1)

おそらく世間では iTunes で自動取得しているのだと思うが、私としては最近あまり役に立っていないサーバに仕事させたいので、取得スクリプトを書くことにした。

とりあえずお手軽にPHPで。

ざっと調べてみると、podcastのフィードを拾って音声または動画ファイルを普通にHTTP で取り込めば良いらしい。そこで

  1. URI決め打ちでフィード取得
  2. メディアだけをダウンロード

というPHPスクリプトを書く。

まずは開発用のCentOS5.6環境で次のようなスクリプトが動作することをまずは確認する(した)。

<?php
// パラメーターがなければ異常終了
if($argc <= 1) {
     exit(1);
} 

// それらしいUser-Agetに設定
ini_set("user_agent","Mozilla/2.0 (compatible; get-cast.php)");

// 指定されたパラメーターをXMLだと思って開く
$xml = simplexml_load_file($argv[1]);

// 失敗したら異常終了
if(!$xml) {
    exit(2);
}

// 直接欲しいエレメントを取ってくる。SimpleXMLは便利。
$result = $xml->xpath('/rss/channel/item/enclosure');

foreach($result as $elm) {
    if(is_null($elm["type"])) {
        continue;
    }
    if(is_null($elm["url"])) {
        continue;
    }
    // メディアファイルがあれば
    if( (strncasecmp($elm["type"], "audio", 5) == 0)
     || (strncasecmp($elm["type"], "video", 5) == 0) ) {
        // wgetコマンドでダウンロードする
        $cmd = "/usr/bin/wget -q -c -nd ";
        //print $cmd . $elm["url"];
        exec($cmd . $elm["url"]);
    }
}

exit(0);

?>

上のスクリプトを呼び出すシェルスクリプトを書く。指定ディレクトリに変更してファイルをがばっと取ってくるようにする。例は自分ちでキラキラのpodcastを定期取得する場合のもの。ファイルが存在するとダウンロードしないで終了してしまう(wgetの起動オプション参照)ので毎日実行しても大丈夫。

#!/bin/sh -
#

HOMEDIR=/home/myhome
PHPCMD="/usr/local/bin/php ${HOMEDIR}/get-cast.php"

# kirakira
cd ${HOMEDIR}/Kirakira
${PHPCMD} http://www.tbsradio.jp/kirakira/index.xml

cronに登録する。

$ crontab -l
SHELL=/bin/sh
PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin
#
#minute hour    mday    month   wday    command
55      3       *       *       2-6     /bin/sh /home/myhome/get-cast.sh

これで、寝ている間にダウンロード完了だ。設置先のサーバはFreeBSD8.2なのでwgetのパスなどを軽く修正。その後、シェルスクリプトの方を実行してみた。

が、なんと、上手く行かない。困った。

ようやくWordPress3.1を入れられた

WordPress3.1がphp5.2未満に対応しないということで当サイトはアップデートを見合わせていた。自前ビルドや自前パッケージの作成は最近では荷が重く感じていて、CentOSが6になるまで待つかいっそUbuntuにするか悩んでいたのだ。

さて、今日CentOS5.6公開のアナウンスがあり、とりあえず一カ所アップデートしてみたら5.5からはあっさり完了。落ち着いたところでphpに関連するパッケージをみてみるとphp53というパッケージが並んでいる。これを使わない手はないので総入れ替えしてみた。手順は簡単で、yumで導入済みのphp-*のモジュールを一覧を出し、該当のものに相当するパッケージをphp53-*にする。手順としては次の通り。

1.httpdを止める。

service httpd stop

2.phpパッケージを消す。このサイトではこういう感じだった。

yum remove php php-cli php-common php-devel php-mbstring php-mysql php-pdo

このときphp-pearも削除されてしまうので注意。

3.php53パッケージに入れ替える。一緒にphp-pearも再導入。

yum install php53 php53-cli php53-common php53-devel php53-mbstring php53-mysql php53-pdo php-pear

4. httpdをあげる。

service httpd start

この後Wordpressを3.0から3.1に注意深く更新(ここのサイトではほとんど吊しの状態で使っているので自動アップデート)。

今のところ問題はない。

XBeeのアンテナ

前の仕事でXBeeを試していた。

ちょっとしたメッセージを送るのに便利なので提案したのだが、実際に設置したら電波が届かない事があるという。

設置場所は地上と、そこから上100m前後。試しに同程度のビルの上と下でXBee-PROでレンジテストしてみたところ、特に問題は無さそうだった。この時は、ビルの上ではXBeeのループバックを手で持ち、下からはパソコンでX-CTUでチェックだったと思う。ところが実際に設置して上下で試すと30mも届かないという。違いはアンテナがチップアンテナからダイポールアンテナに変わったことと、手持ちではなく、あるところに固定で設置された事だ。

代替品を求めて他の製品のメーカーに訊ねたり、電波に詳しい代理店の方に伺ったりしたところ、次のような原因が考えられるとのこと。

  1. マルチパスがあるのではないか。
  2. ダイポールアンテナでは指向性がおおむねドーナツ型になるので、上下の配置では両方とも穴にあたり、電波が非常に弱くなっているのではないか。
  3. そもそもホイップアンテナやダイポールアンテナでは片一方に地面があることを仮定している。上の方に設置したXBeeでは地面がないのでアンテナとして機能していないのではないか。

その後深くは追っていないが、twitterで距離が出なくて困っている方をお見かけした。私だけがこういう現象に遭遇しているのではなさそうだ。

なお、地面がないので上手く動作しない場合の対策として、18cm程度の長さ(2.4GHzの波長に相当)の金属板を指向性の軸に対して下にしたら、もしかしたら上手く行くかも、というアドバイスを得た。試せていないのであくまでメモとして記述しておきたい。

さらについでに、アンテナ毎の指向性についての説明と実測値については次の文書が参考になる。

XST-AN019a_XBeeAntennas.pdf

twitterのプラグインを追加してみた

長らくtwitterばかりに投稿していたが、仕事の内容が変わるので、当サイトの内容を修正した。

ついでにtwitterの投稿を表示するプラグインを追加した。WordPressのプラグイン追加は非常に簡単である。欲しいプラグインを名前で検索して選べば良い。

今回はTwitter Goodiesというプラグインを入れてみた。どんなもんだろうか。

組込系こそC++で

手続き指向のもっとも良いサンプルはお役所の窓口だ。

何でもかんでも手順化してあり、その意味を知る必要がないようにしてある。

これには頭を使わなくて良いという素晴らしいメリットがある。

しかし、実体としては1つしか存在していない一人一人の人間を、あるときは住民基本台帳で、あるときは年金受給者の一覧表で、あるときは納税者の一人としてそれぞれ別個のものとしてみるため、それぞれの用途・物差しに合わない使い方が現れた時に対応が難しい。新しい手続きを作る事になる。

オブジェクト指向というのは日本語としてはダメで、私も「目的」というとらえていた時期もある位(それでもある程度理解は可能)、訳分からない言葉なのだが、要は対象物(オブジェ)をそのまま対象物としてとらえるための仕組みだ。行方不明の100歳以上のある一人のおじいさんは、そのおじいさん自身であって、住民基本台帳には存在していたり、履歴には存在していなかったりする名前の事だけではなく、そのおじいさん自身としてとらえ、見方によってどのように変わるかを表現するための仕組みなのだ。

だから、どのような切り口で見たら振る舞いがどのように変わるかという点では手続き指向な見方と大差ないのだが、実体が存在しないとなれば、直ちにどの切り口からも見えなくなるという点で、実に現実に近い「存在」というものの表現方法だと思う。

手続き指向が縦割り行政なら、オブジェクト指向は何だろう。国民総背番号制、は単なる実装方法だな。

さて、組込系といえばアセンブラ、RISCプロセッサだと面倒だから高級言語で、アセンブラと同様手続指向な言語で、という流れでCが採用されるんじゃないかと思うが、やっぱりここでもオブジェクト指向の方が向いていると思う。

ハードウェアは大抵限られた実体しか持たないが、プログラム上ではそれを別の概念で取り扱う事は多い。ここで実体は一つの仮想的なクラスの一例として予め持っておき、必要に応じて実体の参照をもらうように実装すれば、割とよくある表現で記述できる。手続き指向だとおまじないがたっぷり続くが、オブジェクト指向なら、継承したクラスで実体化する手順として隠蔽できるから、本来のロジックだけが浮き上がるように記述でき、プログラムがすっきりするのである。

ハードウェアの操作ではなく、例えばその結果として生成されたメモリオブジェクトなんかは、普通のクラスの実体として生成・消滅させれば良い。オブジェクトがなくなっても、消滅時にデストラクタが評価されて話は済む。

手続き指向からオブジェクト指向への壁は割と高くて厚いが、乗り越えると色々と楽になる。組込系のしちめんどくさい約束事羅列的な記述もかなり隠せるようになるので組込系こそCやインチキC++(C++で拡張された文法を使って記述したC)ではなくC++で実装して欲しいと思う。

PHPだからといって必ず手続き指向なわけではない

今日WordBench埼玉WordPress3.0勉強会に参加させていただいた。

他の参加者が前からディープ’に使っている方々ばかりなので、どうしても以前と現在の違いという切り口になってしまう。私は3.0より前の事は知らないのではっきりと見えない話が沢山あった。その上、昔の仕事で懲りて、べたっと書かれたPHPに対する好ましくない感情もある。出来合いのテーマを使って、またはテーマは外部にお願いしてサイトを構築する方が良いと思っていた。なのでプログラムの話はどうもなぁと、最初は思っていた。
しかし、WordPress3.0の既定のテーマである2010の構造の説明を聞いて気が変わった。

コードはチラ見しかしていないし、ドキュメントらしいドキュメントはちっとも読んでいないので、PHPだからべたっと書かれているのだろうと誤解していたが、かなり今時な構造を持っているらしい、特に2010は。時間ができたらこのサイトも2010に戻してみよう。いや、その前にドキュメントを読む方が先か。

私家版コンピュータの基本

私から見えているコンピュータというのは次の3つ機能からできているモノである。

1. 計算をする

簡単なものから難しいものまで、とにかく計算をする。だって計算機だもん。

2. 何かの知らせをやりとりする

まずは計算の基になるデータを受け取り、結果をどこかに返す

データはキーボードから受け取り、結果をディスプレイに送って表示させる。

あるいは、キーボードから受け取ったデータを、ネットワークでサーバに送る

サーバのデータを取り出し、結果をディスプレイに送って表示させる。

3. データを記録する

メモリでも何でも良いが、データは一定期間保持する必要がある。そうでないと計算結果は誰も受け取れない。

計算はCPUの花形たる仕事、通信はなんとかバス・なんとかケーブル、データ記録はデータベース(生ディスクにしたところで、リニアアドレスによるデータベースだ)、と、これだけ理解していれば基本的にはOK。

コンピュータの基本はこれだけじゃないか。MS-WORDとMS-EXCEL使い方より、上のような事の方が応用が効く。と私は思っている。