前回 コーディングの無くて七癖 からの続き
Michiは、趣味で始めてプロトタイプからの延長そのままに拡張していたので、
コードがごちゃごちゃになってました。
クラスの区分けは割とちゃんできていたと思います。
しかし、クラス内での処理が、我ながら解りにくくなっていた。
リファクタリングすると、変数の数がずいぶん少なくなりました。
改めて気づいたこと、それは、
3. (変数の)スコープの重要性
オブジェクト指向の肝は、同時に扱う部分を最小化してシンプルに考えること。
それをクラス内で考えると、
一連の処理の流れでも変数のスコープを意識して、それを最小にすると良い。
このことは、これまで(仕事でも)あまり意識していなかったので、ちゃんと考えよう。
コーディングの無くて七癖
久しぶりに比較的濃いコーディングをしてみて、自分のスタイル(?)には色々と癖があることに気がつきました。
主に自分の今後のためにメモしておきます。
1. enumをあまり使わない
私が初めて触ったモダンな言語Javaには、当時enumが実装されていませんでした。
その後仕事でC++を使い始めenumを知り、なるほど便利だと思いました。
無くてはならないものではないので忘れがちです。
しかし、コーディング前の設計段階では、enumの使いどころを考えるべきですね。
構造を明示的に意識できるように。
2. 構造体をあまり使わない
Javaではむしろclassを使うので、そちらの流儀になれているせいかも。
classだと初期値の設定なども自由度が高いので、その方が個人的につかいやすい。
構造体のバイトアライメント など、思わぬところで引っかかることもあるので注意が必要だなぁ。
私は特に高級言語が好きで、メモリの取得・開放などハードウェア依存なことはできる限りタッチしたくないので、ここらへんが鬼門かも。
まだまだ癖がありそうだけど、今日はここまで。
DVDをリッピング
※ 本記事では私的な利用のためにDVDをリッピングしておりますが、
2012年10月1日の著作権変更で、法に触れる可能性があります。
1枚だけregion code 2のDVDがあり、これのみPCで再生しております。
また、唯一のPALなので、いっそのことリッピングしてmini DLNAに乗せて汎用プレイヤーで見られるようにしておこう。
以前やったときとは色々と状況が異なっていたので簡単にメモしておきます。
なお、環境は:Debian Wheezy 7.3 (AMD64)
$ sudo aptitude install dvdbackup
$ mkdir dvd
$ dvdbackup -M -i /dev/dvd -o ./dvd
なお、libdvdcss2 はdebianのリポジトリnon-freeからも消えたので、
入手は次を参考に。
https://wiki.debian.org/CDDVD#DVD
mp4への変換は、
$ ffmpeg -i hoge.VOB -vcodec libx264 -strict experimental hoge.mp4
Functionキーの行末
iPadが普及して、マウスが要らないものになりました。
そして、これまでは当たり前と思われていたパソコンのインターフェースにも変化が出てきました。
というか、当分は変化が続くのでしょうね。
私の現在のマシン(端末)はThinkPad EDGE E135。
トラックポイント含めキーボードに定評があるlenovoです。
なお、タッチパッドは使用していません。
さて、先般発表された新型ThinkPad X1 CarbonではFunctionキー(以下、Fnキー)がプログラマブルになりました。
参考:なぜ新型ThinkPad X1 Carbonに適応型キーボードを採用したのか @PC Watch
http://pc.watch.impress.co.jp/docs/column/ubiq/20140110_630300.html
とうとうFnキーも変化の波にもまれる運命らしいので、対応を考えてみることにします。
すぐさまFnキーが無くなることはないでしょうが、linux用のドライバがすぐに出てこないなど、移行期には問題がたくさん出てきそう。
具体的には、Fnキーが無くなっても困らない方法を探ってみます。
私はマウスが嫌いなので、比較的にキーバインド各種を使うほうだと思います。
考えてみると、IMEでは[F6]〜[F9]は頻繁に。
またウィンドウの終了に[Alt]+[F4]、
また、非常時に[Alt]+[Ctrl]+[Bs]、[Alt]+[Ctrl]+[F1/F2]など。
Gnome 3, KDE, MS Windowsで共通のモノも多いですね。
要は、Fnキーを使わずにこれらのキーバインドを実現できればよいわけです。
ざっと調べてみると、IMEの場合は次で可能でした。
[F6]〜[F9] → [Ctrl]+[u/i/o/p]
つづくかも。
オートパイロットな未来
近年では自動車の自動運転が次世代技術として注目されているようです。
実際に民用車にこの技術が搭載されるのは数年後なのかも知れませんが、いずれ全ての自動車に当たり前の装備になるのでしょう。
私も工学的には自動運転に興味はあるのですが、その後が気になります。
いずれ人が自動車を運転することが禁止される時がくる。
始めは人の運転のアシストに過ぎないでしょう。
しかし車同士の情報の連携が本格的に進むと、早々に人の運転技術を超えるのは間違いないでしょう。
例えば、自車から見えない歩行者でも、他の車が認識している情報を共有すれば、人が死角で見えない情報を得ることができます。
このように共有される情報は幅広く、時々刻々変化するものです。
すぐに人が処理できうる範疇を超えてしまうでしょう。
遠からず人が運転するほうが危険、という時代になるのでしょうね。
そうなるとマイカーの時代は終わるのでしょう。
より集約されたカーシェアになるのかな?
iPadなどタブレットが普及し始めて従来型PCのシェアがしぼんだように、
自動運転が自動車の世界を再編成するのではないでしょうか?
ところで自動車というものは技術的にはまだまだ進展する余地があると思います。
私が乗っている三菱アイ(軽自動車)でもエンジンは(ターボ)64馬力。
馬力の定義はともかく、本当に必要なエネルギーはせいぜい2〜3馬力ではないでしょうか。
少なくとも現在の自動車はかなり無駄なエネルギーを費やしていると思います。
もちろん内燃機関・ピストンエンジン・モーターなど技術的なネックに由来するのですが、現在のような自動車は長期スパンで考えると数百年後には跡形もなくなっている気がします。
miniDLNA over ssh
お正月には実家で数日過ごします。
昨年までと環境が変わった点といえば、音楽の大部分をDLNAサーバに依存していることです。
実際には数日程度なら、clientに適当にコピーしておけば困らないのですが、
外からいつでもDLNAに接続できるようにしておくのもいいかも。
ということで試してみました。
まぁ、sshでトンネル掘ってDLNAを通す、というのが現実的な解法でしょう。
1. miniDLNAの現状確認
miniDLNAのport番号を確認するため、
/etc/minidlna.conf の設定をみる。
# Port number for HTTP traffic (descriptions, SOAP, media transfer).
port=8200
デフォルトです。
2. ssh接続
とりあえずlocalにsshした端末内だけで使えればよいので、
次のように接続する。
> ssh -L 8200:localhost:8200 foo@server.jp
結果はダメでした…
PC (rhythmbox), iPhone 4S (MLPlayer, Twonky Beam)で試してみましたがどちらも同じ。
DLNAの仕様では 7ms以内のレスポンスがないとイケナイらしいです。
radiko.jpのonDemand化
前置き:
私のネット環境はちょっと普通と違って2つのエリアのラジオを聴くことができます。
iPhoneでは住んでいる石川エリア、
PC(フレッツ光)では富山エリアです。
そもそも富山に住んでいた時にプロバイダと固定IP接続の契約をして、後に石川に越してきました。
toyamaの文字が入ったホスト名を(結果的に)維持しています。
radikoの地域判別の実装がどのようなものかは知らないのですが、google等でも地域を「富山」と仮定した情報が出てくるので、そんなオカシナことはしていないのでしょう。
一方iPhoneでは3Gで地域を認識したのか、普通に石川の放送が聴けます。
これまで、radikoはほとんどiPhoneで聴いていたので、特に問題ありませんでした。
実践:
では、onDemand化してみましょう。
超!A&Gの時と同じく次を参考にさせていただきました。
http://wiki.sarami.info/index.php?GetRadiko2.sh
スクリプトをそのまま活かして使わせて頂きます。
Debian Wheezyではswfextractとxmllintが必要なのでインストールします。
xmllintは次でインストール。
> sudo apt-get install libxml2-utils
swfextractは次を使用。
http://www.swftools.org/swftools-0.9.2.tar.gz
ダウンロードして展開し、
> ./configure
すると、
ERROR:
You need zlib to compile swftools
synapticでzlibを見てみるとzlib1gはインストール済みなので、zlib1g-devに必要なものがあるっぽい。
なので、インストール。
> sudo apt-get install zlib1g-dev
再び
> ./configure
> make
> sudo make install
これで準備はOK。
放送局、エリアコードは次のリストにあった。
http://www.dcc-jpl.com/foltia/wiki/radikomemo
エリアコード
富山: JP16
石川: JP17
チャンネルは次で取得できる。
http://radiko.jp/v2/station/list/${エリアコード}.xml
チャンネル コード 共通:
RN1 ラジオNIKKEI第1
RN2 ラジオNIKKEI第2
HOUSOU-DAIGAKU 放送大学
チャンネル コード JP16:
KNB KNBラジオ
FMTOYAMA FMとやま
チャンネル コード JP17:
MRO MRO北陸放送ラジオ
HELLOFIVE エフエム石川
テスト〜
> saveradiko.sh test 5 KNB
これで録音できました。
もちろんフレッツ光では石川(JP17)の放送局は聴けません/録音できません。
超!A&G onDemand化
超!A&G http://www.agqr.jp/ をよく聴いています。
リピート放送もあるのですが、拘束時間帯が決まってしまうのでその点が不便、
onDemandサービスのAG-ONもあるけれど、番組が限られていて一部は有料〜。
なので、自前onDemand化を考えてみます。
なお、前提として私の個人的な視聴を目的としています。
これらのコンテンツはもちろん著作権フリーではありません。
法的な問題を起こさないことはもちろん、クリエイターや製作関係諸氏の不利益や、結果的にデジタル ラジオ界隈の衰退を招くような行為がないようにと考えております。
では技術的な話へ進みます。
以前ちょっとgoogleった時に、超!A&Gがswfで配信されているということは知っていました。
次のURLを直接browserで開くと視聴できますね。
http://www.uniqueradio.jp/agplayerf/LIVEPlayer-HD0318.swf
特にDRMなどなく、技術的にこったことも必要ありません。
こういうオープンなシステムが一般的になるためにも、違法な配信など製作者側が困ることが無いようにしたいです。
それをどのように記録するか?ということ。
次が参考になりました。
http://wiki.sarami.info/index.php?GetAG.sh
スクリプトの中身を眺めてみると、ストリームを記録するには最低限rtmpdumpが必要ですね。
私はDebian Wheezyを使っているので次でインストール。
> sudo apt-get install rtmpdump
上記スクリプトの必要な部分のみを取り出してテストしてみるとOK。
後はこれを自動的に実行すると。
週に数番組聴いているので、
1. 30分毎にcronで管理スクリプトを起動
2. 目的の番組の開始タイミングであれば録画スクリプトを開始
のような処理をすればいいかな?
今日の不調
サーバから異音が…
まぁ、ファンがガナっているだけなのですが。
過去ログを辿ってみたら、ちょうど2年ごとに何かしら問題が起こってる。
サーバは4年前に購入、2年前に内蔵NICが故障。
バックアップ マシンは2年半前に購入、半年前にCPUファン不調。
ついでにバックアップ マシンに仕事を代替させるテストをして、
その間にサーバを止めて開けてみた。
う〜ん、異音がしているのは電源のファンでした。
筐体のファンとかCPUファンなら、それだけ替えれば簡単なのですが。
元に戻して再び電源を入れると音がしなくなったので、様子見します。
電源が調子悪くて電圧が落ちて/上がってファンに影響が出ている、とかだと心配だなぁ。
原因不明
メイン クライアント マシンのDebian Wheezyが起動中にコケるようになった。
ThinkPad E135
gdm3あたりでbalck outしてしまい、[Alt]+[Ctrl]+云々も効かない。
recovery modeで起動して、dmesgやXorgのログを見ても、原因を特定できない。
直前に変わったことをしていたわけでもないハズ。
半日くらい探ってみたが、手がかりなし…
ちょうど7.3がリリースされていたので、起動USBのテストも兼ねて再インストールしました。
何だか気持ち悪い。