2009年1月29日木曜日

Matz's talk! in "World of OSS" symposium



1月27日にせんだいメディアテークで催された「オープンソースソフトウェアの世界」というイベントに行ってきました。内容は、IPAの三浦広志氏とRubyの作者であるまつもとゆきひろ氏(Matz)の講演。
買ったばかりの、というか出版されたばかりのオライリーのRuby本にサインしていただきました。

軽く緊張してて、帽子被ったままサインを貰いに行ったのは良い(?)思い出。

2009年1月24日土曜日

OSC 2009 Sendai

オープンソースカンファレンス2009仙台
http://www.ospn.jp/osc2009-sendai/

行ってきました。
LiveCDとかいろいろ貰ったり^^


Ubuntu9.04のコードネームはJaunty Jackalope。Jauntyは素早い(ササっとした動作)という意味で、Jackalopeは角ウサギという空想上の生物。ウサギには角のような突起物が頭に生える病気があるらしく、角ウサギ伝説はそこから来たんじゃないかということらしいです。
「病気のウサギ」というコードネームにJapanese Teamの方が不安を抱いてることを漏らしたり。。。セミナーで「ササっと死んじゃうって事ですか?」と言ったのは私です。失礼しました orz

2009年1月22日木曜日

Skype error[Ubuntu8.10][pulseaudio]

昨日、友人とSkypeしようとしたら通話が出来ないという状況に陥った。
「オーディオプレイヤーに問題があります」というエラーが出て、コールすることが出来ない。

ググったらUbuntuのフォーラムで既に解決策が
http://forums.ubuntulinux.jp/viewtopic.php?id=3413

Skypeとpulseaudioが相性悪いらしい。
なので、pulseaudio関係を一期に削除
$ sudo apt-get remove pulseaudio*
$ sudo rm /etc/X11/Xsession.d/70pulseaudio

Xの起動プロセスからもpulseaudioを削除する必要があるので、2つ目のrmもちゃんと行うこと。怠るとXが起動しなくなる。(その場合にはubuntu-desktopパッケージをインストールすれば良いらしいけど)

<追記>
apt-getはremoveじゃなく、purgeでも良さそう。後者の場合、/etc/X11/Xsession.d/70pulseaudioも勝手に削除してくれる……?(未検証です)

2009年1月15日木曜日

How to use GETOPT function in C

端末で使ういろいろなコマンドは大抵はオプションを付けていろいろな機能を使うことが出来る。そういったプログラムをCで書くのに必要なgetopt関数の覚書。
unistd.hをインクルードしておくこと。

引数を取るプログラムをCで書くとき、mainの宣言は
 int main(int argc,char *argv[])
こんな感じに書くのが普通。*argv[]が**argvとなってるコードも見たことがある。

で、getoptの使い方。
while ((ch = getopt(argc, argv, "ab:")) != -1){
switch (ch){
case 'a':
-aオプションの処理
break;
case 'b':
-bオプションの処理
この時、-bの次の引数へのポインタがoptargに収まっている
break;
}
}


初めてgetoptを使おうとしたときに見落としていてちょっと躓いたのが、getoptの引数"ab:"の部分。
これはaは引数を取らない、bは引数を取る、という具合になる。使うオプションを""で括ってずらずらっと書いてやり、引数を取るものの後ろにだけ:(コロン)を付けてやればいい。
引数を取るオプションを見つけたときにgetoptはgetargというcharポインタに引数を与えてくれる。例えばコマンドに「-b hogehoge」というオプションが与えられていたならば、getoptがbを見つけたときに、hogehogeという文字列がoptargに収まる。

2009年1月7日水曜日

Compile error of Rockbox's sendfirm.c with libmtp0.3[Ubuntu8.10][libmtp0.3]

作業環境はUbuntu8.10。検索で来たWindowsユーザはこの記事見ても無意味だと思います。悪しからず。

gigabeatSにRockboxをインストールするには、現時点(20090107)では全て手動でコンパイル〜ファームウェア書き込みを行わなければいけないみたい。同じgigabeatでも、FやXシリーズは解析/開発されきってインストールユーティリティのソフトが用意されているのだけど、まだSシリーズは開発途上。

まだ実際にgigabeatSにRockboxをインストールした訳ではないのだけれど、作業時に必要になるsendfirmプログラムをコンパイルする時点で躓いたのでちょっと書いておく。

sendfirmにはlibmtpが必要になるので、
$ sudo apt-get install libmtp-dev
こんな感じでlibmtpのdevelopmentパッケージをインストールしておく。

http://www.rockbox.org/twiki/bin/view/Main/GigabeatSInstallation#A_Compile_the_sendfirm_utility
Rockbox wikiのgigabeatSへのインストール指南に書かれている通りに、現行ビルド一覧ページ(http://build.rockbox.org/)からソースコードをDL。
アーカイブを展開し、端末でその中のutils/MTPディレクトリに入りmakeすると、sendfirmがコンパイルされる。
rockbox-3.1/utils/MTP$ make
gcc -Wall -lmtp -o sendfirm sendfirm.c
sendfirm.c: In function ‘sendfile_function’:
sendfirm.c:94: error: too many arguments to function ‘LIBMTP_Send_File_From_File’
make: *** [sendfirm] エラー 1
$

LIBMTP_Send_File_From_File関数への引数が多すぎるとエラーを吐かれてしまった。

これはどういうことだろうと思い、ソースを見てみる。
エラーが出ているsendfirm.cの94行め付近は
ret = LIBMTP_Send_File_From_File(device, from_path, genfile, progress,
NULL, parent_id);
となっていて、6つ引数が与えられているのが分かる。
で、Ubuntuのリポジトリから落ちてくるlibmtpのver0.3のソースを見てみる。
http://libmtp.sourcearchive.com/documentation/0.3.0/group__files_g552e760a429b0e47a593b8ade20bb763.html#g552e760a429b0e47a593b8ade20bb763
int LIBMTP_Send_File_From_File(
LIBMTP_mtpdevice_t * device,
char const *const path,
LIBMTP_file_t *const filedata,
LIBMTP_progressfunc_t const callback,
void const *const data
)
与えるべき引数の数は5つだ。そりゃエラーになる筈。

今度はver0.2系のソースを見てみる。
http://libmtp.sourcearchive.com/documentation/0.2.1/group__files_gfaf21159580eef716b24da3a257b3060.html#gfaf21159580eef716b24da3a257b3060
int LIBMTP_Send_File_From_File(
LIBMTP_mtpdevice_t * device,
char const *const path,
LIBMTP_file_t *const filedata,
LIBMTP_progressfunc_t const callback,
void const *const data,
uint32_t const parenthandle
)
こっちは6つになってる。
つまり、libmtpのver0.2系(0.1系も引数は6つだった)を考えて書かれたソースだったのね。

んでまぁ、libmtpの0.2系を持ってきてやるのが正当なんだろうけど、面倒なのでいらなそうな6つ目の引数を削除してみる。sendfirm.cの94行め付近「device, from_path, genfile, progress,NULL, parent_id」となってる箇所からparent_idを抜いて、「device, from_path, genfile, progress, NULL」としてから、改めてmake。
rockbox-3.1/utils/MTP$ make
gcc -Wall -lmtp -o sendfirm sendfirm.c
sendfirm.c: In function ‘sendfile_function’:
sendfirm.c:67: 警告: unused variable ‘parent_id’
$
警告出たけど、案の定parent_idが宣言されたけど一度も使われてないよ、ということなのでキニシナイ。

まぁ、肝心のこっから先をやってないんだけどね。

2009年1月5日月曜日

Happy New Year!/[memo]Rcokbox for gigabeat S/Leap second error of Zune&gigabeat

明けましておめでとうございます。
いきなりですが、暫くの間1日1更新できるか怪しくなります。だって、大学の方で卒論の締切りが迫ってきてますから。。。

というわけで、今日のところはちょっと覚書程度に愛機gigabeatSをRockbox化するために必要なページをbookmark。

Gigabeat S Port - Rockbox
http://www.rockbox.org/twiki/bin/view/Main/GigabeatSPort

Rockbox for Gigabeat S
http://audio-p.hp.infoseek.co.jp/

今までMTPデバイスとして扱う方法をいろいろ試してきましたが、Rhythmboxで楽曲を転送した時にVideoフォルダに入れられるという新たな不具合に出くわし、いよいよRockbox試してみるかという心境になったのです。


ところで、閏秒問題について

Zuneとgigabeatが閏年の処理の問題でフリーズ
http://slashdot.jp/it/article.pl?sid=09/01/01/1247219

記事中ではgigabeatのTとVのシリーズしか触れられてませんが、それらと同じPortable Media Centerをファームウェアとして使っているSシリーズも同じ症状で固まりました。もうサポート終わってるとはいえ、除け者にしなくたっていいじゃない(´・ω・`)
症状は起動画面から進まない、とかの筈らしいんですが、私のは故障メッセージが出てたのでこの問題とは関係なく故障したのだと思ってました。以前にも同じメッセージが出て修理に出したことがあったので、さっくり諦めたわけですハイ。
でも、閏秒後にバッテリを放電しきった後に再起動〜〜という対処法を行ったら何故か直っちゃいました。。。(実際にはバッテリが悪くなってるので勝手に放電しきってしまったのですが)