FedoraでBluetoothのヘッドセットを使ってみるテスト


メルブラWindows版はどこぞの誰かが作ったネット対戦ツールがある。
友人とプレイするも、CPUの占有率を上げてるため、Skypeが落ちる。
なので、別マシンでSkypeやろうぜって事に。

幸い、我が家にはサーバー機としてFedora7があったので、それにSkypeインスコ
んで、意気揚々とBluetoothアダプタを装着。
で、いざヘッドセットを認識させるもうんともすんとも言わない。
/var/log/messageを見る限り、通信しようとリクエストを送った所で止まってるっぽい。

んで、挫折しかけてググった。
日本人はどうも、WindowsでしかBluetoothのヘッドセット使ってないらしいな。
Linuxで使ったよって猛者は大抵、キーボードかマウス。
ここで、1度目の挫折。

んで後日、会社の先輩に聞いたら同じヘッドセットで同じ問題にあたってた。
なんで、会社に泊まったついでに認識させてみることに。

以下、インスコ履歴。

$ yum install bluez-utils bluez-libs gnome-bluetooth bluez-hcidump bluez-libs-devel gnome-bluetooth-libs bluez-gnome
$ hcitool dev
Devices:
        hci0    01:23:45:67:89:AB
$ yum install alsa-tools alsa-lib alsa-utils alsa-lib-devel


ここで、ヘッドセットを接続待機?状態にしておく。

$ hcitool scan
Scanning ...
        FE:DC:BA:98:76:54       HOGE 350
$ hcitool cc FE:DC:BA:98:76:54
$ yum install automake kernel-devel
$ cvs -d:pserver:anonymous@bluetooth-alsa.cvs.sourceforge.net:/cvsroot/bluetooth-alsa login
$ cvs -z3 -d:pserver:anonymous@bluetooth-alsa.cvs.sourceforge.net:/cvsroot/bluetooth-alsa co -P btsco
$ cd btsco
$ ./bootstrap
$ ./configure
$ make
$ make install
$ make maintainer-clean
$ cd kernel
$ make
$ make install
$ depmod -e
$ make clean
$ modprobe snd-bt-sco
# btsco -v FE:DC:BA:98:76:54
btsco v0.42
Device is 1:0
Voice setting: 0x0060
RFCOMM channel 2 connected
Using interface hci0

あい、これで繋がった筈。例外は認めてません。
先輩は繋がって、サウンド設定で音が出ることまで確認したのに
Skypeが起動しないと言う本末転倒な状態になってた。
とりあえず、友人とメルブラ頑張ろうと思う。

あ、オレと対戦したい方はどうぞ遠慮なく。
2chのVIP初心者スレに出没してるから。
秋葉、動きおせぇよ・・・orz

C言語でPerlのメソッドを呼び出してみるテスト


前回はC言語からPerlスクリプトを呼び出すだけだった。
今回はC言語からPerlスクリプトのメソッドだけを呼び出す。


main.c

#include <EXTERN.h>
#include <perl.h>

int main(int argc, char **argv){
    PerlInterpreter* my_perl = perl_alloc();
    perl_construct(my_perl);
    char* perl_argv[] = {"", "sample.pl"};

    perl_parse(my_perl, NULL, 2, perl_argv, NULL);

    // スカラー変数が引数のメソッド
    char* scalar_args[] = {"PerlInterpreter", NULL};
    call_argv("scalar_argument", G_DISCARD | G_VOID, scalar_args);

    // リスト変数が引数のメソッド
    char* array_args[] = {"1", "2", "3", "4", "5", "6", "7", "8", "9", NULL};
    call_argv("array_argument", G_DISCARD | G_ARRAY, array_args);

    // ハッシュ変数が引数のメソッド
    char* hash_args[] = {"key1", "1", "key2", "2", "key3", "3", NULL};
    call_argv("hash_argument", G_DISCARD | G_ARRAY, hash_args);

    perl_destruct(my_perl);
    perl_free(my_perl);

    return 0;
}


sample.pl

#!/usr/bin/perl

use strict;


sub scalar_argument {
    my($scalar) = @_;

    printf("%s\n", $scalar);
}

sub array_argument {
    my(@array) = @_;

    foreach my $data (@array){
        printf("%s\n", $data);
    }
}

sub hash_argument {
    my(%hash) = @_;

    foreach my $key (sort(keys(%hash))){
        printf("%s => %s\n", $key, $hash{$key});
    }
}


コンパイル

$ cc -o callsub main.c `perl -MExtUtils::Embed -e ccopts -e ldopts`


実行

$ ./callsub


結果

PerlInterpreter
1
2
3
4
5
6
7
8
9
key1 => 1
key2 => 2
key3 => 3


余談だが、このプログラムだとBEGINは実行されるが、ENDは実行されない。
perl_parse関数でPerlの解析を行う。つまりPerlで言うところのuseと同じ。
で、perl_runメソッドでPerlスクリプト自体を実行するので
このプログラムではENDは実行されない。

C言語でPerlを使ってみるテスト。


C言語Perlを使うメリットとして

  • 文字列処理が非常に楽なPerlに文字列処理を行わせる事ができる
  • PerlCUIメインだが、GUIという選択も出来る


perlinc.c

#include <EXTERN.h>
#include <perl.h>


int main(){
    // Perlインタプリタ
    PerlInterpreter* perl;

    // Perlインタプリタの確保
    // Perlを利用するための領域(メモリ)を確保
    perl = perl_alloc();

    // Perlインタプリタを初期化
    perl_construct(perl);

    // perl_parseに渡すコマンドライン引数的なもの
    char *perl_argv[] = {"", "hello.pl"};

    // PerlインタプリタにPerlスクリプトを解析することを伝える
    // 第一引数
    //   Perlインタプリタ
    // 第二引数
    //   よくわかりません。NULLでいいと思う。
    // 第三引数
    //   第四引数の要素数を入れる。
    //   Perlっぽく書くならscalar(@ARGV)
    // 第四引数
    //   Perlを実行するためのコマンドライン要素を入れる。
    //   argvをそのまま使ってもいい。
    //   argvとはPerlでいうところの@ARGVのこと。
    // 第五引数
    //   通常、envと呼ばれる特殊変数を入れる。
    //   envとはmain関数の第三引数のことで
    //   環境変数が入ってくる。
    //   環境によって対応しているかどうかまちまち。
    perl_parse(perl, NULL, 2, perl_argv, (char**)NULL);

    // Perlインタプリタに実行を伝える
    perl_run(perl);

    // Perlインタプリタの終了処理
    perl_destruct(perl);

    // Perlインタプリタのメモリ解放
    perl_free(perl);

    return 0;
}

hello.pl

#!/usr/bin/perl


use strict;

BEGIN {
    print "--- BEGIN $0 ---\n";
}

END {
    print "--- E N D $0 ---\n";
}

print "Hello, World!!\n";

コンパイル

$ cc -o perlinc perlinc.c `perl -MExtUtils::Embed -e ccopts -e ldopts`

実行

$ ./perlinc

結果

--- BEGIN hello.pl ---
Hello, World!!
--- E N D hello.pl ---