月別アーカイブ: 2010年6月

BlackBerry Ubuntu Connect

Ubuntu 10.04 を二ヶ月も利用していて今頃気がついた。
Rhythmbox も Totem もボリューム弄くったらまれに落っこちるじゃないの!

Y901x が落ちまくる原因が解らなくて困っていたんだが、そういうことか。
show event 吐いた時点で pulseaudio ボリューム調節しているんだもの。
相性問題なのか pulseaudio か GStreamer のバグなのか、これじゃお手上げ。

とにかく原因だけは解った、pulseaudio か GStreamer の更新を待つだけ。
自分でフロントエンドを作っていると同系アプリを使わないので気がつかなかった。

というか。
Linux をメインで使うようになって三年だが始めて Rhythmbox を使った。
BlackBerry に何故か音楽を入れたくなった、利用するかはやってみた後で考える。

BlackBerry 付属の USB コネクタでパソコンを繋げば普通に認識されるんだね。
ついでに USB 経由の充電も行われるようだ。

いや、「デジタル・オーディオ・プレイヤー」では無いんですけど…
microSD を差し込んでいるとソッチも認識される。

Windows でも試してみたけど同じように認識するようです。
いや普通なら Windows を基準に説明するだろ?はどうでもよくて。
とっとと手持ち CD をリッピング。

mp3 か aac でエンコードしたいんですけど…

編集ボタンを押すとこんなダイアログが出るけど出てこない…
試しに ogg でエンコードしてみたら

遅っ!

Windows の WMP で MP3 にエンコードしました、十倍以上早いんですけど。
やっぱり再生はともかくエンコードや編集は Windows に限るわ。

んで music というディレクトリにディレクトリごとコピーする。
アンマウントして USB コネクタを外しメディアプレイヤーを立ち上げる。
あっさり認識するけど .trash 内にあるファイルまで認識する、ちょっと迷惑。

よしよし、とにかくこれで BlackBerry に音楽が入れられた。

ついでに。
最近の YouTube FLV は普通に再生しても H.264 と AAC なんだね。
ちょっと前まで通常は H.263 と MP3 だったと思うんだけど。
これは簡単に見つかる ffmpeg コマンドで MP3 を抜く方法は使えないな。
AAC でいいなら

#!/usr/bin/env python
#-*- coding:utf-8 -*-

import os

FFCOMMAND = "ffmpeg -y -i %s -acodec copy %s.aac"

path_array = os.environ["NAUTILUS_SCRIPT_SELECTED_FILE_PATHS"].split("\n")
for f in path_array:
    pos = f.rindex(".")
    os.system(FFCOMMAND % (f, f[:pos]))

みたいなのを Nautilus スクリプトを登録して AAC を抜けばいい。
拡張子を aac にしないと上手くいかなかった、いや悪用厳禁で。
やってみたらそのまんま BlackBerry で再生できました。
こういうのは Linux に限るね。

g_utf8_collate_key_for_filename of ctypes

g_utf8_collate_key_for_filename
がいったいどういう変換をしているかもう少し。

ところで端末に長々と打ち込むのが面倒なので GEdit 外部ツールに以下を指定。
GTK+ を使うには pkg-config 指定が必要なのよね、キーは F7 にした。

/*
gedit tool script

#!/bin/sh
gcc $GEDIT_CURRENT_DOCUMENT_PATH `pkg-config --cflags --libs gtk+-2.0`
*/

#include <stdio.h>
#include <gtk/gtk.h>
#include <glib.h>

int main() {
    gchar c[4];
    int i;
    for (i=0; i<105; i++) {
        sprintf(c, "%d", i);
        gchar *s = g_utf8_collate_key_for_filename (c, -1);
        printf("%s\n", s);
        g_free(s);
    }
    return 0;
}

端末だと解り難いにでリダイレクトしてみる。

十進で桁が増える毎にコロンが一つ付加されていくようだ。
なんだかよく解らない変換だけどこれで自然順ソート比較は上手くいくようだ。
色々やってみたけど結局 Python から ctypes を使う。

14.14.1 ctypesチュートリアル

ココに全部書いているんだが、Linux はちびっと面倒なのね。

glibc = ctypes.cdll.LoadLibrary('libglib-2.0.so.0')
cmpstr = glibc.g_utf8_collate_key_for_filename("a")

とやっても int が戻ってくる、実際にはポインタだが Python にはポインタ型が無いので。
つまり restype をキッチリ指定しないと全部 int になるってことですね。
ということで。

#! /usr/bin/env python
# -*- coding: UTF-8 -*-

import ctypes

glibc = ctypes.cdll.LoadLibrary('libglib-2.0.so.0')
cmpstr = glibc.g_utf8_collate_key_for_filename
cmpstr.restype = ctypes.c_char_p
cmpstr.argtypes = [ctypes.c_char_p, ctypes.c_int]

def sort_nicely(l):
    l.sort(lambda x, y : cmp(cmpstr(x, -1), cmpstr(y, -1)))

たまには lambda を使ってみようと思ったので。
ガベージコレクションなのだからコレでいいはずだけど…
とにかくこれでどうだ?

よし Nautilus とはドットファイルを除けば一致するようになった。
隠しファイルはリストアップに含めないようにする予定なのでどうでもいいけど。

でも Mandriva KDE 上で動かしたら何故か数値ソートしてくれなかった。
って ./ を付け忘れで以前のバージョンを起動しただけだった、GNOME と同様になる。
つか Dolphin のソートって以前の関数とまったく同じ結果じゃん!

これじゃ設定でどちらかに振り分けしてもらうしか両対応の方法が無さそう。

utf8_collate_key

いいかげんに Y901x が落ちまくる件とソート問題を解決させねば。
なんとかさせないと追加機能もやれないよ。
落ちる件は色々試しているんだがまだ原因が解らない、困った…

ソートに関しては自力を諦め Nautilus のコードをひたすら追う。
libnautilus-private/nautilus-file.c
に compare_by_display_name というソレっぽい関数をやっと見つける。

display_name_collation_key を strcmp で比較しているだけなのか。
g_utf8_collate_key_for_filename という glib の関数で代入している。

Unicode Manipulation

あれ、もしかして数値もドットもこの関数一つで解決してまうの?

The Whole PyGTK FAQ

Python には実装されていないようで。
最近のバージョンではあるかもと dir() で探しまくるも見つからず。

とにかくこの関数でどう変換されるのか気になるので C でやってみる。
Ubuntu 10.04 デフォルトでは gcc はあるけど gtk や glib のヘッダは無い。
Glade を入れれば依存関係で Devhelp を含めまとめて入るので Glade を入れる。

/*
gcc  b.c `pkg-config --cflags --libs gtk+-2.0`
*/

#include <stdio.h>
#include <gtk/gtk.h>
#include <glib.h>

int main() {
    gchar *c;
    c = "a1.mp4";
    gchar *u;
    u = g_utf8_collate_key_for_filename (c, -1);
    printf("%s to %s\n", c, u);
    /*g_free(c); is Segmentation fault*/
    g_free(u);
    return 0;
}

久々の C なんだがこんな感じでよかったかなぁ…
strcpy で警告になったのが Visual Studio と同じだったが代替が解らない。
とにかく結果。

なんだかよく解らないのに変換されとる。
後は比較関数を作って実験して上手くいったら…
Python で使うんだが、ctypes しか手が無いかな?

WordPress だけ?の小ネタ。

三点リーダー → …
を入力するのに「てん」等から変換している人いるかな。
半角でピリオドを三つ連続打ち込むだけで &#8230; に変換してくれます。

もうすぐ WordPress も v3 になるけど同じかな?

Human sort 2

仕事関連でドタバタしており Blog の更新が止まりがちになっています。
今月は落ち着きそうな希望が少々持てるのでちょっぴりがんばってみる予定。
ということで

前々回(って半月前か…)

の自然順ソート仕様で我が Y901x のリストアップを色々試していた。
サボっていたのではなく地味にテストはしていた、とにかく解ったのは問題だらけ!

最大の問題は aa.mp4 aa1.mp4 等というファイルがあったとき。
Nautilus では aa.mp4 が当然のように上になる、前々回の関数では逆になってしまう。

原因が解らなくてしばらく悩んだけど解ってしまえば単純。
前々回のコードではドットは単なる文字列の一部としか認識しないからだ。
分離され整数変換された値とドットという文字列を比較ならば当然ドットのほうが大きな値と認識する。
結果 aa.mp4 のほうが aa1.mp4 より大きいと認識するファイル名になってしまう。

なんだそれ…
これじゃ拡張子が付いたファイル名では全部同じようになってしまう。
いや Linux の場合はそれだけじゃない、ドットファイルという文化があるのだから。
以下のようなファイル名を用意してテスト、nautilus は隠しファイルを表示設定に。

Python の文字列比較は先頭から一文字単位で照合しているだけ、当然の結果。
整数文字列の比較は確かに行っているけどこうなってしまう、落とし穴が深すぎだった。
Windows の Explorer 名前順ではドットファイルは先頭になるが Nautilus は日本語より下。
同じ自然順ソートでもドットをどう扱うかが違うようで。

とにかくファイル名の場合は前々回のソート関数では Nautilus とは同じにはならない。
というかドットファイルどころかバックアップファイルにも無考慮だと今頃気がつく私であった。
後日に続く(終わりカヨ!