2011年11月8日火曜日

おちゅ〜しゃをさしてみる

2chはROM専ですが、たまに眺めたりするので
普通のブラウザだと閲覧しにくいので導入してみました。

最初はDEにKDEを使っているのでkita/kita2を考えてましたが
どうも安定しないので日本語Ubuntuデスクトップにも入っている
おちゅ〜しゃをビルドして入れてみました。

どうも最後のコミットから1年以上経過していて、
tarボールのソースからだとコンパイルエラーが出て最後まで
進めませんでした。

とりあえずエラー内容から、
●型キャスト変換違反
●gtk2のAPI変更
が問題になっているみたいです。


・ソースの修正
エラーがでるソースファイルはいずれもC++ソースで、
Cスタイルの型キャストでコードされている部分です。
gcc4.3までは問題なかったようですが、4.4以降では
C++スタイルでの型キャストを使用しないとエラーになるようです。
debian/squeezeではgcc4.4.5)

該当部分のキャスト及び型修飾子などをいじったパッチを作りました。
こちらからどうぞ

・gtk2のAPI変更に対応
gtkwidgetの関数名が変更になったため、gtk-2.20以降を
使用している場合には関数呼び出しを変更するか、
後方互換性マクロを明示してコンパイルする必要があります。
これはconfigure時のコンパイルオプションの指定で対処できます。

/usr/include/gtk-2.0/gtk/gtkwidget.hにもありますが、
GTK_DISABLE_DEPRECATEDをdefineしていない
該当する旧名呼び出しを置換するマクロが記述されています。
よってコンパイル時にundefしてあげれば解決できます。


以上の点を踏まえてビルドします。

$ ./configure --with-x 
  CFLAGS="-UGTK_DISABLE_DEPRECATED"  \
  CXXFLAGS="-UGTK_DISABLE_DEPRECATED" \
  FFLAGS="-UGTK_DISABLE_DEPRECATED" 
  CPPFLAGS="-UGTK_DISABLE_DEPRECATED"

$ make && make install

最後に、/usr/local/libにライブラリパスを通して実行すれば完成です。


CVSを覗いてみたら、0.6のtarボールより少し修正が入っている模様。
使えるかは分からないし、メンテも当分入ってないみたいです。

2011年10月21日金曜日

avidemuxでAVC/H.264動画

最近PSP用のメモリースティックを16GBのものに
新調しましたが、それなりに容量が余っているので
適当な動画を入れて視聴しています。

720pに対応しているので、それなりの画質で
見ることができています。
普通はHandbrakeとか使うところですが、
音量を調整したいので、ゲインの調整ができる
Avidemuxを使っています。
あ、Linux版です。しかもなぜかqt4(w


Avidemuxには最初からPSPのカスタムスクリプト及び
x264の設定プロファイルが用意されています。
ただし、平均ビットレート1000kbpsだったり、
いじりたい項目が結構あったりします。
そのPSP用設定プロファイルを元にいろいろ調整をして、
ユーザープロファイルとして保存して作業しています。

なのですが。
Avidemuxのデフォルト設定がちょっと曲者で、
Minimum Quantizer(qmin)が0に設定されています。
正確には設定されていない="0"のようです。
x264的には問題ないのですが、後で保存した設定を
読み込む際に問題になります。

AvidemuxではMinimum Quantizerの最小値を『10』に
規定しているようです。
そのため、設定読み込みを行うときにqmin=0として
読み込もうとするとinvalid valueを返し、
設定を反映してくれないという困った仕様があります。

根本原因としてはdefaultのqmin=NULLのくせに、
GUI上では0として設定され、ご丁寧にもSaveAsしたときに
0を書き出すにもかかわらず最小値は10じゃないとダメ!
っていう変な矛盾があるためです。
debianだと2.5.4だからかなー?


ちょっと納得いきませんが解決方法は、
SaveAsするときにMinimum Quantizerを10にしてから
保存することです。
xmlの要素を消してもいいですが。


あ、Windows版はノーチェックです。
Win版はaviutl+拡張x264Exに、SoundEngine Freeの
音量調整で済ませているので。

:追記
一応Windows版のAvidemux(Stable)を触ってみましたが、
普通に変換できました。英語版UIですが。
Windows版ではユーザープロファイルの読み込み要素のバグは
なくなっているみたいですね。
やっぱりDebianだからセキュリティ以外の更新は
後回しになっているのかなあ。

2011年10月1日土曜日

firefox7.0を自前ビルドする

…あれ?もうfirefox7.0?
高速リリースサイクルとはいえ6週間早すぎ(笑

いちいちソースアーカイブをとってからビルドするのも
面倒な気がしてきたので、バージョン管理システムを
利用したやり方で今回はビルドしてみた。

6.0でも少し触れていたけども、mozillaのソースコード管理は
今はmercurialというソフトで行われており、cvsやgitと同じような
コマンドで操作できます。

コマンドラインで操作する場合は
 mercurial mercurial-common

GUIで操作したい場合は
 tortoisehg

をインストールします。

◯firefox(release)のソース取得

firefoxの開発ブランチは
Nightly→Aurora→Beta→Release
と4つに分かれており、安定版はReleaseとなります。

今回はこのReleaseを使ってビルドしていきます。

・開発クローンの取得
$ hg clone \
  http://hg.mozilla.org/releases/mozilla-release/ firefox-release


firefox-release以下にtarボールと同じようなソースが
コピーされます。

$ cd firefox-release 
$ hg tags

とするとタグとリビジョン番号の対応が確認できます。
もし特定のバージョンにロールバックしたい場合等はこれを
参照してリビジョン番号を指定して変更できます。

クローンの際や更新の場合には最新版を示すtipタグの
リビジョンで保存されます。


◯日本語パッケージの取得
日本語パッケージもhgで管理されてます。今回は公式の
l10n/releaseから取得したものを使いました。

$ hg clone \
 http://hg.mozilla.org/releases/l10n/mozilla-release/ja/ l10n/ja_JP

こちらもほぼ同様です。.mozconfigにランゲージパックのパスを
間違わずに設定して下さい。

◯ツールの追加

yasm-1.1.0以上なのは前回と同様で、
今回はtarボールではなくmercurialから直接DLしてきているので、
Makefileの作成のためにautoconf/automakeが必要になります。
デフォルトのautoconfではなく、autoconf2.13
明示的に必要なので注意して下さい。


あとは以前と同じようにビルド・アーカイブ化するだけです。
tagsとかをよく見てみると…
バージョン7.0.1 (笑)

というわけでhgで最新版を取得すると7.0.1になりました。
7.0.0にしたい場合はリビジョン指定して変更して下さい。

2011年9月3日土曜日

firefox6.0を自前ビルドする

Firefoxが妙に早いサイクルで更新されるようになりましたが、
「どーせ4.0と使いまわせるだろ」と思っていたら
望外に面倒だったのでメモしておきます。
使ったのはFirefox-6.0.1。

○最新版yasmの導入 
 
4.0ではDebian/Squeezeのyasm-0.8.0でも問題ありませんでしたが、
5.0以降ではyasm-1.1.0以上でないとconfigureで弾かれます。

こちらから http://yasm.tortall.net/

コンパイルしてyasmの実行ファイルにパスが通っていれば
make installまでしなくても問題ありません。
アセンブルコードの最適化に使っているだけなので。

○l10nの日本語パッケージの導入

4.0の時はl10-centralのリポジトリからダウンロードしてきましたが、
最近はどうも別の所に保存しているようで、l10-centralは
しばらく更新はされていないようです。

・Mozilla HG-repository http://hg.mozilla.org/

l10nのHGサーバにある、リポジトリレイアウトから
releases/l10n/mozilla-releaseあたりを選んでください。
好みでbetaとかauroraでもいいかもしれません。











選んだ先の、tagsからFirefox6.0.1-releaseを選びます。











この時点でのチェックアウトしたファイルのクローンアーカイブを
保存します。












あとは4.0で行った通りにビルドすれば自前ビルド版
Firefox6.0.1(ja_JP)のtar.bz2が出来上がります。

ちなみにmozjaのhgサーバからmercurialクライアントを
使用してl10n日本語パッケージのローカルクローン取得も
できます。(ただし未確認です)

mozja(Mozilla Japanese Localization)

なぜ日本語化ファイルの取得に面倒な手順を踏んでいるかというと、
mozilla-releaseでもauroraでもbetaでも、最新のアーカイブ取得だと
ベータ版(?)のリビジョンのものを落としてくるため、
ビルド時に足りないファイルが出てくるためです。
リポジトリによって足りないファイルが違う上、補完しようとしても
互換性がないため、実行時にxmlパースエラーが発生します。

なのでしっかりFirefoxのバージョンに合わせたl10nのリビジョンを
明示的に指定して落とさないとうまくビルドできないという状態でした。
(ちなみにこのあたりが一番苦労した所)

それでもって6.0.1を無事にビルドできたわけですが…
あれ、もうリビジョンに6.0.2のタグがある…
再ビルドは近そうです。(笑)

にしても5.0も6.0もauroraかよ

2011年7月22日金曜日

flacをなんとか2GB以上のファイルを吐き出すようにする

少し前にCDをひとまとめにする方法を書きましたが、
flacでなぜか2GBでとまってしまうという現象の原因がわかりました。

まあ原因そのものは割りとすぐにわかって、fseek/ftellのポインタサイズが
32ビットなのが原因です。約2GB分のオフセットしか表現できないことになります。

通常のオフセットの型は符号付整数longで、コンパイラ依存ですがgccでもVCでも
4byteになります。これを64ビット対応したfseeko64/ftello64にして、
引数のオフセット変数の宣言をlong long型にしてやれば解決なのですが・・・

本来-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64をgccに
渡してあげればいいようなのですが、どうも適用になっていないようです。

なのでconfigureに渡すパラメータとソースファイルの調整が必要になります。

以下、Xiph.orgのflac1.2.1のソースコードとMinGW64の環境で実験しております。

①off_t型の強制書き換え
sys/types.hを見てもらえばわかるように、オフセットのoff_tもしくは
_off_t型はlongで宣言されています。
これをプリプロセスの時点でoff64_tに上書きします。
いちいちソースファイルに#DEFINEを書く必要はありません。
CFLAGSなどにセットするだけで書き換えができます。
./configure --prefix=/usr/local --enable-sse \
--disable-shared --enable-static \
--disable-xmms-plugin -with-ogg=/usr/local \
CFLAGS="-D_off_t=_off64_t -Doff_t=off64_t -D_OFF_T_DEFINED -D_OFF_T_" \
CPPFLAGS="-D_off_t=_off64_t -Doff_t=off64_t -D_OFF_T_DEFINED -D_OFF_T_" \
CXXFLAGS="-D_off_t=_off64_t -Doff_t=off64_t -D_OFF_T_DEFINED -D_OFF_T_" \
FFLAGS="-D_off_t=_off64_t -Doff_t=off64_t -D_OFF_T_DEFINED -D_OFF_T_"

長いので自分はスクリプトにしてbashに渡しています。
ちなみに環境はWindows7HomePremium(x64)で、MinGWはx86_64の環境です。
MinGW32(pc-i686)だとtypes.hが微妙に違ったりするので、マクロの構成は
自前で確認してください。

やってることはoff_tの書き換えと、off_tの定義済みフラグを立てることです。

②fseek/ftellのマクロ修正
64ビット対応したfseeko64/ftello64に置き換えるようプリアンブルのマクロを
修正します。基本セットはfseeko/ftelloになっているので
環境に合わせて分岐させればいいです。
ちなみにVC++2010ではfseeki64/ftelli64というメソッドが用意されてます。

記述するとえらいことになるのでpatchを用意しました。
ファイルはこちら

それでもってmakeすると(ウチの環境では)64bitのflacの出来上がりです。
2GBの制限もきれいさっぱりなくなりました。
なぜかnasm通すとエラーになりますが(汗

あ、あと調査の中でわかったのは、fseekのオフセットはフロントエンドに
依存するっぽいです。元のソースのまんまでもライブラリを
直接叩くようなアプリならちゃんと2GB超えても作成できました。
ぶっちゃけWinampなんですが。

VisualC++2010でも無理やりビルドして動作するのを確認はしましたが・・・
いかんせん、疲れた。

2011年7月13日水曜日

Ubuntuマシン起動不能?

ウチにはx86省電力作業マシンとしてEeeBoxをUbuntu化したものを
稼動させているのですが、今日突然うんともすんとも言わなくなりました。
外部ログインすら受け付けなくなったので、ローカルで様子をみることに。

普段は電源とLANケーブル以外とっぱらってるので、
ディスプレイとキーボードを接続。いろいろ入力しても真っ暗。
フリーズしているっぽい。
しょうがないので電源を強制OFFして再起動したところ。。。

mount: mounting /dev/disk/by-uuid/なんたらかんたら on /root failed: Invalid argument
mount: mounting /dev on /root/dev failed : No such file or directory
mount: mounting /sys on /root/dev failed : No such file or directory
mount: mounting /proc on /root/dev failed : No such file or directory
Trarget file system doesn't have /sbin/init.
No init found. Try passing init= booting

と表示され、rootfsのプロンプトになってしまいました。
ブートレコードが壊れたのか、grubの問題なのか・・・
起動しないことにはなんとも言えないので、例によってGoogle先生に頼ることに。

とりあえずUbuntuの起動用CDとしてライブCDのイメージをDLしてCDRに焼く。
EeeBoxなので内蔵CDドライブはないので外付けドライブを接続。
まずはディスクチェック・・・問題なし。
bootargをUUIDからsda1に変えて起動させてみる。
・・・あ、真っ暗になってとまった。

しょうがないのでライブCDを立ち上げて起動。
ターミナルからディスクの状態を確認することに。
  1. UUIDの確認 bootargでのUUIDと実際の/dev/disk/by-uuidの対応がおかしくなってないか確認。
  2. マウントできるか確認、できるようならchrootしてディスク内のgrub-installerでMBRを再構成。
  3. e2fsckでパーティションのチェック。
んで、結局のところsda2がマウントできずにエラーで帰ってきたので、
dmesgで読んでみると、

sd 2:0:0:0: [sda] Add. Sense: Unrecovered read error - auto reallocate failed
sd 2:0:0:0: [sda] CDB: Read(10): ...............
end_request: I/O error, dev sda, sector なんたらかんたら
ata3: EH complete
JBD: Failed to read block at offset (忘れた)
JBD: recovery failed
EXT4-fs (sda2): error loading journal

…えー、どうもext4のジャーナルが壊れているのが原因のようで。
ちなみにsda1は/bootに割り当てているため、普通にマウントできました。
3のe2fsckでどうにもならなかったらすべてを消して再セットアップに(汗
さすがにユーザデータもろもろ設定なんかが入っているのでそれは勘弁願いたい。

sda2のチェックして、
どうも壊れたブロック?かジャーナルがあるけど上書きしていい?
と聞かれたのでドキドキしつつyes。
修復が完了し、あらためてマウント。
お、今度はできた。
あとは設定や過去のデータに影響がないか軽くチェックして再起動。

こんどは普通に起動できた!
ディスクチェックが走ったけど問題なくログイン画面に。

それにしてもまあヒヤヒヤさせるぜ(汗

おまけ
ubuntu.canonical.com/lucid/partnerが重過ぎてjava6の更新ができねえじゃねえかw

2011年7月10日日曜日

複数CDをまとめて1つのファイルにする

あ゛ーもう夏に入って日中は非常に暑くてたまらんですね。
先日物の整理をしていたら、某ドラマCDのシリーズが見つかって、
この際だからいつものMatroskaでまとめられないかなって思ったのが
今回の事の次第。

んでもって適当にEACとflacとmkvtoolnixでやってみようとしたら・・・
foobarで再生できなかったり、途中で音がなくなったりでなんじゃこりゃと
いろいろ調べて複数CDを1つにまとめる際には問題点が2つほどあることが
わかりました。
  • CUEシートの合成とトラック制限
EACでCUEシート+WAVでCDから取り込んだ後、各CDのWAVとトラック情報を
統合する必要があるのですが、CUEシート(CDDA)の規格上99トラックまでという
制限があります。また、CUEシートの結合は再生時間の計算なども必要で、
手動でやるには骨が折れます。
  • WAVE(RIFF)のサイズ制限
一般的なWAVファイルはリニアPCMの波形データにチャンク(ヘッダのようなもの)が
ついており、これにWAVEのサイズデータが記録されているのですが、これが
符号(無でしたorz)32ビットのため、約4GBまでしか取り扱えないという問題があります。


これらの問題を解決するために試行錯誤していたのですが、
結局いつもプレイヤーとして使っているfoobar2000と
検索で見つけたxrecodeIIを使うことにしました。
具体的な手順としては次のとおり
  1. EACでCUE+WAVでリッピング
  2. fb2kでWave64(RF64)にCDごとにCUE+WAV64に変換
  3. xrecodeIIでCUEシート結合・形式をRAWにする
  4. RAW→MP3/OGG/WAVPACKなどに変換(好みで)
  5. CUEシートを変換後の形式に整える
  6. mkvtoolnixでmkaコンテナに変換する
  7. fb2kで読み込ませ、CDタイトルなどを編集する
fb2kはWav64へのトランスコーディングとトラック情報の編集に、
xrecodeIIはCUEシートの結合とWAVの統合をさせています。

RF64(WAV64)は4GBを超えるWAV(PCM)を扱うために作られた規格のようです。
ただし、対応しているフロントエンドはあまり多くないようです。
後方互換性を持つため、RF64非対応のソフトは4GBまでの通常のwavとして
動作します。
RAWはリニアPCMのデータそのものです。ここから再生や変換を行うには
フロントエンドに本来WAVファイルのチャンクにある情報を与える必要があります。

なんでこんな回りくどい方法をしているのかというと、
fb2kは1ファイルにまとめる動作でなぜかCUEシートを出力しない
xrecodeIIはRF64は読めても書き出せない(設定項目が見つからない)
たいていのエンコーダがRF64チャンクを読めない
よってfb2kもxrecodeIIもエンコーダに渡すときはWAVで渡してしまう
という糞のような問題があるためです。
100トラック以上あるCUEシートの場合はMatroskaに変換すると
再生できるようになります。なんでんなもん出力するんだ



とりあえずRAW入力がありそうなエンコーダで試してみました、

・OGG Vorbis
rawファイルやリダイレクト、パイプによるPCM入力をサポートし、標準的な
WAVファイルの設定をデフォルト値で持ってくれるため、RAW→OGGの変換が
一番楽。

・LAME(MP3)
OGG同様、rawファイルをサポートし、標準的なデフォルト値を持つ。
ただし、なぜかフレームが一定値を超えると進捗率が100%になり、
勝手にエンコードを終わらせてしまうので、リダイレクトをしないと最後まで
エンコードしてくれない。なんでだ。

・FLAC
RAWファイル入力をサポートしているが、チャンクのパラメータを省略できない。
なぜか2GBで終わる。原因はまだ不明。どうも仕様くさい。

・TTA
RAWをサポートしてないのでダメ。

・WAVPACK
RAWファイルをサポートし、デフォルト値も持ってくれるのでロスレスでは使いやすい。
Matroskaコンテナにも入れられるのでロスレスで100トラック以上ひとまとめしたい場合におすすめ。

みたいな結果に。
不可逆でいいならOGGかMP3で。可逆は…バラでやってプレイリストにするのと
大差ないかも。やるならWAVPACKで。
不可逆はほかにも使えそうなコーデックがあるかも。

これで一応複数CDを1ファイルにするためのルーチンはできあがり。
試行錯誤が多くて疲れた・・・
あ、それと無圧縮ファイルを3種類使うので外付けHDDがあるといいですよ。
システムドライブでやっていて容量の警告がでてびびった。