iPhone

【中級】iPhone Core Audio入門セミナー:Core Audioの概要から”ボイスメモ”アプリケーションの作成まで

Posted in iPhone on 5月 22nd, 2010 by Norihisa Nagano – Be the first to comment

MOSAでセミナーをやらせていただくことになりました。
おそらく国内初のCore Audioの入門セミナーです。

日 時:2010年6月24日(木)9:45~13:15(休憩含む)
会 場:大橋会館
地下鉄田園都市線「池尻大橋」駅下車(渋谷駅より1つ目)。東口から駅前商店街を直進。徒歩約5分。

内容は

難しい、ややこしい、と敷居の高いイメージがあるらしいCore Audioですが、サウンドファイルの再生、マイクからの録音程度であればそんなに難しくありません。ただし、単純な再生と録音であっても、それに付随して必要な設定操作など知っておくべきポイントがいくつかあります。

本セミナーでは、アプリケーションにサウンド再生、録音機能を組み込むケースを想定しCore Audioを基礎から解説します。具体的には、Core Audioの概要からはじまり、iPhoneの”ボイスメモ”アプリケーションと同等なものが作れるようになるところまで解説します。

となっています。

Core Audio本でいうと、7章ぐらいまでをぎゅっと凝縮してお話する予定です。
逆に言えば、Core Audio本を既に読まれて理解されている方には必要ない内容になると思います。
あ、けど、HMDTで実案件でいろいろ経験値が増えているので、こういう時に〜みたいな話は盛り込む予定です。
人気があれば続編もできるかもしれないので、よろしくお願いします。

同日の午後は、社長の木下が
【中級】iPad開発セミナー~電子書籍アプリケーションを作る~
というセミナーをやります。
合わせて受講いただくとお得になっていますので、ぜひ24日はMOSAでiPhone開発どっぷりな一日にしていただければと!

そういえば、同僚に教えてもらったのですが、Core Audio本がTV(NHKのITホワイトボックス)に出てました。カヤックの方ありがとうございます。

iPhone関連本 * 2

Posted in iPhone on 12月 27th, 2009 by Norihisa Nagano – 4 Comments


iPhone関連の特定フレームワーク、ジャンルに特化した本が二つ出ました(出ます)。

横江 宗太さんの「OpenGLで作るiPhone SDKゲームプログラミング
所 友太さんの「iPhoneプログラミングUIKit詳解リファレンス」

です。

「OpenGLで作るiPhone SDKゲームプログラミング」

iPhoneでOpenGLな本出ないかなぁ、と思っていたら出ました。

感想としてはともかく明解。OpenGL、ゲーム開発ってこんなに簡単に説明できるの?というぐらい明解。
第1章で以降の章で使うグラフィック・ライブラリを自作し、2章以降で実際に使ってゲームを作る、という進行になっています。
で、このグラフィック・ライブラリの自作(とゲームの制作過程)が面白い。
ちょっと進めたらリファクタリング、また進めたらリファクタリングと、どんどん読みやすくコンパクトなコードに直しながら進めていきます。
このプロセスのおかげで、次この機能追加するよーというときにサクっとできてしまいます。

僕は過去にOpenGLがっつりなものを作ったことがあるので、OpenGLがはじめてな人が理解できるのかは判断できませんが、他の本でiPhoneアプリケーションを作ったことがある人なら大丈夫でしょう。
というか、入門本やってCore Audio本やって、さてグラフィックどうしよう、という人に一番に勧めたい本です。
コードも全部載っているし、読みやすく構成されているしで、100点。

はえたたきゲーム(2D)とレーシングゲーム(2D -> 3D)を作るのですが、どちらも面白くてかっこよい。すげぇ。

ちなみにiPhoneでは現在、OpenGL ES 1.1とOpenGL ES 2.0、二つの系統のOpenGLが機種によって使えるのですが
この本はOpenGL ES 1.1に絞った内容となっております。

「iPhoneプログラミングUIKit詳解リファレンス」

発売日は2010/1/12となっているのですが、新宿紀伊国屋本店でフライング販売していたので買ってきました。

もう一つ。入門本、Core Audio本、OpenGL本とくれば、あとはUIKitを詳細に扱った本が欲しいところですが、はい、ずばりが出ました。UIKitのみに特化したリファレンス本です。
UIKitの全てのクラスが載っています。
Interface Builderを使わないで全部コードで説明してあります。

たとえば、UIImageなんかを重ねて描画するときにブレンドモードで結果が変わるって知ってますか?
UIImageの拡大縮小時の挙動をいろいろ変更できるって知ってますか?
この辺の細かいことがじゃんじゃん載ってます。

しかも色が関係するところはカラーです。素晴らしい。

頻繁に使うUIViewControllerなんかは、こういう構造になっているよーとしっかり図解してあります。
UIKitはかなり使っているので、ほとんど知ってるかな、と思っていたのですが、知らないことがいっぱい書いてありました。
僕的には、自分で調べたらこの本に追記して自分リファレンスにする形で使っていこうと思っています。

しかし、Core Audio本を皮切りに(なのか?)フレームワーク、ジャンルに特化した本が続々登場しています。
かつて、他のプラットフォームでこういうことってあったんでしょうか。
今、iPhoneの開発環境を整えると、いろんなことに挑戦できるようになってきている気がします。

というわけで、二冊ともめちゃオススメです。
Core Audio本も買ってください。

ちなみに、Twitterで
「@7gano iPhone関連本は、Core UIKit ! みたいなガチなUIKit大全があれば、僕は他はいらんな。きっと誰か書いてるだろう」
と書いたら所さんから
「@tokorom ちょうど執筆終えました『iPhoneプログラミング UIKit 詳解リファレンス』& CoreAudio本購入させていただきました」
とreplyが来てUIKit本の存在を知りました。

「 @7gano: パンカクさんのOpenGL本、神だなぁ。こんなに面白く書けるもんなのか。とBlog見ると、Core Audio本読んでもらっているようでうれしい」
と書いたら横江さんから
「@sugarcape なんと、iPhone Core Audio プログラミングの著者の方が僕の本を読んでくれたみたいです。」
とreplyが来て時代は変わったなぁ、と思いました。

オトカメラ(PhonoCam) (3) 1.1 Update

Posted in iPhone on 4月 8th, 2009 by Norihisa Nagano – Be the first to comment

オトカメラをUpdateしました。(version 1.1)

App StoreへのLink

変更点は4つです。
1. iPhone OS 2.1に対応しました。

2. http://localIP:8080/new
コマンドでまだバックアップしていないファイルのみをダウンロード(PCに転送)できるようになりました。

3. 撮影時にプレビューする
シャッターを押した後、プレビュー画面で確認するかどうかを設定できるようになりました。

4. 起動が若干速くなりました。

そ、し、て、 今なら115円です!!

内蔵ビュワー内で音の再生終了時に再生ボタンに戻らない問題がありました。
すでに修正版1.1.1を申請済みですので、少々お待ちください。

開発者向け情報

MainWindow.xibを使わないようにして、起動を若干速くしたんですが、カメラの初期化があるので時間かかるときはかかってしまうという。

オトカメラでやっている処理はAudio Queue Servicesだけでできるのに、試しにAVFoundation Framework(AVAudioPlayer)を使っていました。
しかし、iPhone2.2〜対応だと、ユーザーの母数が少なくなるので、AVAudioPlayerを廃止して2.1〜対応にしまました。
具体的には、Audio Queue ServicesでAVAudioPlayerと同じインターフェイスのクラスを実装しました。ちょっとめんどくさかったけど、おかげでコードの変更は少なく済みました。Core Audioやっててよかった :)

しかし、2〜10秒の記録時間を設定している場合のオーディオファイルの切り出しにExtended Audio Fileを使っているので、2.1までしか対応できず。
Extended Audio FileはAudio File Servicesのラッパーなので、Audio File Servicesを使うように書き換えることができる。けど、2.0はさすがにサポートきついなということで2.1〜対応ぐらいでいいかなと。

というわけで、iPhone OSはCore Audio FrameworkがiPhone OS 2.0〜2.2.1の間に相当変わっているので注意が必要デス!

kAudioServicesPropertyCompletePlaybackIfAppDies

Posted in iPhone, iPhone Core Audio on 4月 3rd, 2009 by Norihisa Nagano – 1 Comment

System Sound Servicesを調べていて、謎なPropertyがあることを知りました。

AudioServicesSetPropertyで
Property : kAudioServicesPropertyCompletePlaybackIfAppDies
value : 1
をセットすると、アプリが終了した後も音を鳴らし続けることができます。
System Sound Servicesは最大で30秒の長さのサウンドファイルが扱えるので
最大で30秒、アプリを終了しても音が鳴り続けます。

これは何のために存在するのだろう。
警告音が途中で終わらないためか?
アラーム系アプリを開発する人は使えるかもですね。(どんなアプリだ)

こんな感じで動かします。お試しあれ。

Example

NSString *path = [[NSBundle mainBundle] pathForResource:@"FM" ofType:@"aif"];
NSURL *fileURL = [NSURL fileURLWithPath:path];

OSStatus err;
err = AudioServicesCreateSystemSoundID((CFURLRef)fileURL, &systemSoundID);
if(err){
    NSLog(@"AudioServicesCreateSystemSoundID err = %d",err);
    exit(1);
}

UInt32 flag = 1;
err = AudioServicesSetProperty(kAudioServicesPropertyCompletePlaybackIfAppDies,
                               sizeof(UInt32),
                               &systemSoundID,
                               sizeof(UInt32),
                               &flag);
if(err){
    NSLog(@"AudioServicesSetProperty err = %d",err);
}

AudioServicesPlaySystemSound(systemSoundID);
exit(0);

オトカメラ(PhonoCam) (2)

Posted in iPhone on 3月 29th, 2009 by Norihisa Nagano – Be the first to comment

App StoreへのLink

オトカメラ、発売になってから、いくつかのサイトで紹介いただきました。
ありがとうございます!

音も記録するiPhoneカメラ「オトカメラ」 (PBWEB.jp)

iPhoneで音と一緒に写真を撮ることができる「オトカメラ」 (キタミテレビ)

写真というものは、過去のことを思い出すことに必須のものと言えます。
それが音と一緒に記録できたとすると過去の思い出も格段に思い出しやすくなるでしょう。

PhonoCam | iPhone 3G Wiki blog

iPhoneではビデオ録画できませんが、周囲の音が入るだけでその写真を見たときに様々な記憶がよみがえるかもしれません。

App Storeでも予想以上に高評価をいただいております。

Twitterでもいくつかコメントをいただきました。
反映したアップデートを考え中です。

Mac/PCへの転送方法が分からないというコメントがあったので、チュートリアルを書きました。
PhonoCam File Backup Tutorial
ご参照ください。

もちろん、WindowsのiTunesでも同様にCoverFlowできます!

現在の状況はというと、ミュージックカテゴリでは最高9位まで行きましたが、総合TOP100に入るのはやっぱり難しいですね。
3万もアプリあるしなぁと。
20090326-2000

オトカメラ(PhonoCam)リリース!

Posted in iPhone on 3月 25th, 2009 by Norihisa Nagano – 3 Comments

本日、オトカメラ(PhonoCam)がリリースされました。

App StoreへのLink

PhonoCam -Record an ambient image.
オトカメラは音も記録するカメラ・アプリケーションです。

シャッターを押すまでの数秒間を記録します。 時間は2秒~10秒まで設定できます(無制限もあり)。
記録したファイルをコンピューターのiTunesに読み込むと、カバーフローを使って音を聞きながら写真をブラウズできます(CDジャケットの部分が撮影した画像になります)。
コンピューターへはiPhoneからWi-Fi経由で転送できます。

アイディア自体は去年からあったのですが、いろいろ合間を縫っての制作になってしまって、少々時間がかかりました。
音も記録する、というアイディアはまぁ、誰でも思いつきそうですが、記録したとして、どのメディア・プレーヤーで再生するのか?というのが問題になります。iPhotoのPluginを書くのも可能だったのですが、それじゃPluginのインストールが必要になるし・・・。
そこで、音はiTunesで管理したい、じゃぁジャケット部分を画像にしようということで、このアプリケーションが完成しました。

こんな感じでブラウズできます。

PCへの転送は、ファイル一つ一つもできますが、全部のファイルをまとめて転送もできるようになっております。
http://****(localhostIP):8080/backup というコマンドで全部のファイルをまとめたZIPファイルがdownloadできます。
ZIPファイルを解凍して(Safariなら自動で解凍されますが)、フォルダをiTunesの左側、プレイリストの部分にDropすれば、それだけでスライドショーの出来上がり!。CoverFlowが勝手にスライド再生してくれます。
録音時間が設定できるので、例えば5秒に設定しておけば、最大5秒の音付きスライドショーが完成です。

Audible Realitiesのアプリケーションとしては、初?日常的に使えるものになったと思います。

App Storeで購入いただけますので、よろしくお願いします!

ご意見・ご感想、是非是非およせください。

アイコンはWorld 9のウェブデザインも担当してもらったIAMASの筒井くん(Ryota Tsutsui)によるものです。多謝。

read more »

class_replaceMethod (Objective-C 2.0)

Posted in iPhone on 3月 21st, 2009 by Norihisa Nagano – Be the first to comment

Objective-C 2.0で(instance)methodを書き換えたい.
そんな時は,Objective-CのRuntime関数をいろいろ使えばできます.
Objective-C 2.0なので,当然iPhoneでも動きます.

method書き換えには,class_replaceMethodを使います.

@interface HogeA : NSObject{
}
@end

@implementation HogeA
-(void)print{
    NSLog(@"Hoge A!");
}
@end

@interface HogeB : NSObject{
}
@end

@implementation HogeB
-(void)print{
    NSLog(@"Hoge B!");
}
@end

というクラス2個があるとして

    //#import <objc/runtime.h>が必要

    HogeA*   hogeA = [[HogeA alloc]init]; //これは別に必要なし.imp(hogeA, selector);用
    SEL  selector = @selector(print);

    IMP imp = class_getMethodImplementation([HogeA class], selector);
    Method method = class_getInstanceMethod([HogeA class], selector);
    struct objc_method_description *desc = method_getDescription(method);
    char *types = desc->types;

    HogeB*   hogeB = [[HogeB alloc]init];
    [hogeB print];

    class_replaceMethod([HogeB class], selector, imp, types);

    [hogeB print];

    [hogeA release];
    [hogeB release];

こういうコードを実行すると,[hogeB print];[hogeB print];と実行しているのに

Hoge B!
Hoge A!

とprintされます.
class_replaceMethodでHogeBのprintをHogeAのprintに置き換えています.
その前の段階で,class_replaceMethodに必要なHogeAのIMPとMethodからtypesを取得しております.

MethodとかIMPの詳細については,ダイナミックObjective-Cが詳しい.
この辺の話は本にも載るのだろうか.

いろいろHackに使える(はずな)のでお試しあれ.

ちなみに,この辺のRuntime関数をばりばり使えば,Objective-C(の[ ])を使わないでCocoaTouchレイヤーが叩けるはず.いじでもC++でやる人等は要チェックです.
たとえば,上記例だと,IMP取得後に,imp(hogeA, selector);を実行すればHogeA :: printが実行できます.

iPhone x Music「iPhoneが予言するいつか音楽と呼ばれるもの」

Posted in iPhone, iPhone x Music on 2月 10th, 2009 by Norihisa Nagano – 3 Comments

2009 2/27 本が出ます.

iPhone x Music -iPhoneが予言するいつか音楽と呼ばれるもの

徳井さん金子さんと3人で書きました.

最初に書いておくと,プログラミング本ではありません!
まさか,最初の著書が技術本じゃないとは思いもしませんでした.

内容は,iPhoneを通して音楽の「いまとこれから」を考える,というものです.

本の流れとしては
1章. iPhoneがなぜ音楽を変えるのか,なぜiPhoneなのか
2章. 実際にApp Storeではどういうアプリケーションが登場しているのか
3章. それらをふまえ,最近の音楽の流れと合わせ,どういうことが起ころうとしているのか
4章. インタビュー集
となっています.

僕は主に2章を担当しました.(1章もちょっと書きました + コラム2個)

1章. iPhoneがなぜ音楽を変えるのか,なぜiPhoneなのか
ということで,背景について.

2章はミュージックカテゴリのアプリケーションのレビューです,
「iPhone,そしていつか音楽と呼ばれるもの」で書いてきたレビュー(論考?試論?)のスタイルで,ほかのアプリケーションにも言及しています.
というか,実は「iPhone,そしていつか音楽と呼ばれるもの」はこの本を書くにあたって,試しに書きはじめたものなのですが,RjDjの記事が結構評判がよかったので,同じスタイルで書きました.
つまり,(技術的に)どういう設計がなされていて,それがどういう可能性をもっていて,今度どういうことが起こるのか,もしくは,どういう意味を持ちうるのか,を明らかにすることを目指す,という書き方です.

この,2章のかなりの部分は金子さんとの共同作業で仕上げました.
そのための議論は数十時間に及びました.

3章は主に徳井さんによる,音楽のこれから話がぎっしりです.
どんな立場の人(レコード会社の人,リスナー,音楽家,プログラマー,etc)でも,これから音楽をどうとらえ,どう実践していくのか,という指針をそれぞれに考えていける,そんな内容になっています.
加えて,Audible Realitiesの活動についても書いてあります.
(最近アプリケーションを出せてませんが,近々出します)

4章はインタビュー集です.
「音楽未来形」の著者の谷口 文和さん
だれが音楽を殺すのか」等の著者,音楽ジャーナリストの津田大介さん
RjDjの開発者

にインタビューしています.
どれも非常に濃い内容になっております.

その他,城さんとアスキーの伊藤さんのコラムも掲載されております.
どれも面白いです.
僕はiPhoneアプリケーションの開発環境についてとRjDjについてのコラムを書きました.

というわけで,iPhoneで,いやiPhoneにかかわらず,これからどういうことができるか,というアイディア満載の本になっています(& 目指して書きました).
ぜひぜひ,お手に取ってみてください or 予約してください!
Blog等で宣伝していただけるとうれしいです.

追記:徳井さんによる解説

次は技術本を書くぞー

iPhoneのImage系API いろいろ(1)

Posted in Quartz/OS X Graphics, iPhone on 12月 14th, 2008 by Norihisa Nagano – 2 Comments

iPhoneで画像を扱うときは、CocoaのNSImageに変わって、UIImageを使います。
UIImageはproperty、.CGImageでCGImageRefを取得できます。
で、UIImageはいろんな方法で作れたり取得できるのですが、retain関係がどうなってるのか、いまいちよくわからない!

@property(nonatomic,readonly) CGImageRef CGImage;
こうなっております。
readonlyはgetterのみ。入れ替えできない、という意味ですね。
nonatomicって何よ?ということで調べてみると

Objective-C 2.0プログラミング言語: プロパティの宣言と実装

nonatomic
合成されるアクセサが非アトミックになるように指定します。

デフォルトでは、合成されるアクセサはすべてアトミックです。これは、マルチスレッド環境でプロパティへの堅牢なアクセスを可能にすることを意図しています。つまり、getterから返される値やsetterを通じて設定される値は、ほかのスレッドが同時に実行しているかどうかに関係なく必ず完全に取得または設定されます。

アトミックな実装の目的は堅牢なアクセサを提供することであり、コードの正確性を保証することではないことを理解することが重要です。「アトミック」とは、プロパティへのアクセスがスレッドセーフであるという意味ですが、単にクラス内のすべてのプロパティをアトミックにするだけでそのクラス(一般にはオブジェクトグラフ)が「スレッドセーフ」になるということではありません。

とのこと。全般的によくわかりませんが

@property(readonly)

@property(atomic,readonly)
という意味(atomicってpropertyは無いけど)
ということがわかる。

ということで、non atomicなので、atomicじゃないよ、ということになる。
そうすると、スレッドセーフじゃない代わりにスピードが早いということか?
@synchronized(property)しないよ、ってな意味ですかいね。
そうすっと、main threadからのみアクセスしろ!ということ?
よくわからん。誰か頭いい人おしえて。

ともあれ、retain countには関係無い様子。

次。CGImageをCrop(Clip)できる関数。
CGImageRef CGImageCreateWithImageInRect(CGImageRef image, CGRect rect)

Thumbnail作るときなんかに便利です。こいつはどうなんだ。

The resulting image retains a reference to the original image, so you may release the original image after calling this function.

と書いてあるのに、original imageをrelease(CGImageRelease)したらBugります。すばらしい。意味がわからない。
英語の読み方が間違っているのだろうか。

次に、いろいろ登場の出番が多そうな

UIImage* UIGraphicsGetImageFromCurrentImageContext(void);

はDocumentによると

Return Value
An autoreleased image object containing the contents of the current bitmap graphics context.

なので、autoreleaseされたUIImageが返ってきます。
UIImageのallocしないmethodもautoreleaseで返ってきます(たぶん)。
例えば、imageNamedとか。

UIImage/CGImageRefの保存

UIImage/CGImageRefの作成を見たので、次は保存です。
QuartzでCGImageRefの保存といえば、CGImageDestinationなのですが
iPhoneでは
ImageIO.frameworkがPrivate.frameworkです。

つ、ま、り
ImageIO.h
CGImageProperties.h
CGImageSource.h
CGImageDestination.h
が使えなーい。
ImageIO.frameworkをリンクして、CGImageSource関係を呼び出してみたけど、nullが返ってきます。

iPhoneでは、前ここで書いた保存方法がつかえなーい。

ということで、UIImage関係のAPIを使います。
こんな感じで書き出しできます。

BOOL writeCGImageTo(NSString *path, CGImageRef cgImage){
	NSURL *url = [NSURL fileURLWithPath:path];
	UIImage *saveImage = [UIImage imageWithCGImage:cgImage];
	NSData *data = UIImagePNGRepresentation(saveImage);
	BOOL result = [data writeToURL:url atomically:YES];
	return result;
}

これで書き出しできるなら、特別なことでもやらない限り、CGImageDestinationとかいらんよねぇということですかね。

iPhoneはファイルをセーブできる領域が限られているので、こんな感じで使います。

//CGImageRef targetImageが保存するCGImageRef
//pngでhoge.pngという名前で保存する
NSString *path = nil;
NSArray *directories =
NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
                                    NSUserDomainMask,YES);
if([directories count] == 1){
    NSString *documentDirectory = [directories objectAtIndex:0];
    NSString *imageName = @"hoge.png";
    path = [documentDirectory stringByAppendingPathComponent:imageName];
}
if(path){
    writeCGImageTo(path,targetImage);
}

上の例はじゃっかんアホなコードなので、pngしか保存できませんが
UIImageJPEGRepresentation
で、jpgで保存もできます。tiffは無いのか。

iPhoneは画像のリサイズとか死ぬほど遅いので、何度も使うことになりそうなthumbnailなんかは、こういうAPIあたりを駆使してキャッシュしておくと、ずいぶん早くなります。

OpenGL ESのTexture

Image系といえば、OpenGL ESのTexture.
描画は、Textureの描画がぶっちぎりで高速です。Quartzは全般的に遅くて、frame rate 10fpsも出ればがんばってるなーという感じでしょう(とうぜんものによります)。
速さが求められる場合、読み込みまでも考慮するならば、PVRTC formatのtextureがダントツ速いです。

Technical Q&A QA1611 Creating textures in the PVRTC compression format
(iPhone dev Centerでログインしないと見れません)
問題は、この変換がめんどくさいこと。

高frame rateが必要ない、GUIなんかならQuartzが圧倒的に便利。UIKitが用意しているGUIはcustomViewってな感じで独自のUIViewを貼れるようになっているものが多数あります。

ゲームなどでスピードとパフォーマンスが求められるならOpenGL ES。けど、そうするとGUIもほとんどOpenGLで用意せにゃなりません。
(ドキュメントにOpenGL context以外のものを混ぜるな危険!って書いてあったけど、どうなるんだろう)

そんなわけで、iPhoneやる上ではQuartzを覚えておいて損は無いと思います。

UIImagePickerController,UINavigationController, UIImageView

Posted in iPhone on 11月 22nd, 2008 by Norihisa Nagano – 2 Comments

UIImageViewを持つ,UIViewControllerであるimageViewControllerがあったとして
UIImageView.imageにUIImageを表示したいとする.

そのimageViewControllerがUINavigationControllerのコントロール下にあって
pushViewControllerでコントローラーを切り替えるときに,切り替える前にUIImageをセットすると,表示されません!
しかも最初だけ.2回目からは表示される.ちとハマりました.

以下のように,pushViewControllerの後にセットするとちゃんと表示されるし,アニメーション時にセットしたUIImageもちゃんと表示されます.
ドキュメントちゃんと調べてないけど,画面の更新なんかが現在表示されているViewじゃないと有効じゃないのかも.


[self.navigationController pushViewController:imageViewController animated:YES];

imageViewController.imageView.image = image;

しかし,UIImagePickerControllerの制限がきつ過ぎる.ライブラリの表示方法とか,まったくカスタマイズできん・・.