28/08/13 14:36
iOS6から追加されたUICollectionViewの使い方、UICollectionViewCell カスタムセルの作り方のメモ。基本的には UITableViewと同じ感じ でつくれます。 (1) プロジェクト新規作成して、UIViewController上にCollection Viewを置きます。 後のために、Collection Viewのバックグラウンドをここでは白にしておきます。 (2) 左のCollection ViewからCollection View Cell を選ぶと、その部分が青で四角く表示されるので、その四角を大きくしたり、適当にラベルとか貼り付けます。 (3) 別のカスタムセルを追加してみます。つまり、2つの異なるセルを選べるようにしてみます。右のコンポーネントからCollection View Cellをドラッグして追加。その上に、(2)同様に色々はりつけていきます。 (4) (2) と (3) で作ったセルに、Identifierを設定します。例えば(2)のセルにはcell1, (3)のセルにはcell2 など。セルの中の各要素に後でアクセスするために、各ViewにTagを設定します。下図ではUIImageに2のTagを設定してます。Tagの番号は1からつけてください。 なお、異なるセル内にある部品だったら、Tag番号はかぶっていてもいいです。 このあたりは、UICollectionViewCellのサブクラスをつくってその中で参照をもたせてやって、プログラムからアクセスするみたいなやり方でもいいです。 (5) Collection Viewをソースコードに紐付け。Collection ViewでCtrl押しながらうにょ〜と.hに登録 (6) 後はコードを書くだけ。 [ViewController.h] #import @interface ViewController : UIViewController < UICollectionViewDataSource , UICollectionViewDelegate > @property ( weak , nonatomic ) IBOutlet UICollectionView *myCollectionView; @end [ViewController.m]#import "ViewController.h" @interface ViewController () @end @implementation ViewController @synthesize myCollectionView; - ( void )viewDidLoad { [ super viewDidLoad ]; // Do any additional setup after loading the view, typically from a nib. [myCollectionView setDataSource : self ]; [ myCollectionView setDelegate : self ]; } - ( void )didReceiveMemoryWarning { [ super didReceiveMemoryWarning ]; // Dispose of any resources that can be recreated. }#pragma mark -collection view delegate - (NSInteger )numberOfSectionsInCollectionView:( UICollectionView *)collectionView { // とりあえずセクションは 2 つ return 2 ; } -( NSInteger )collectionView:( UICollectionView *)collectionView numberOfItemsInSection:( NSInteger )section{ if (section== 0 ){ // セクション 0 には5個 return 5 ; } else if (section== 1 ){ // セクション 1 には 7 個 return 7 ; } else { return 0 ; } } //Method to create cell at index path -(UICollectionViewCell *)collectionView:( UICollectionView *)collectionView cellForItemAtIndexPath:( NSIndexPath *)indexPath{ UICollectionViewCell *cell; if (indexPath. section == 0 ){ // セクション 0 のセル cell = [collectionView dequeueReusableCellWithReuseIdentifier : @"cell1" forIndexPath :indexPath]; cell. backgroundColor = [ UIColor greenColor ]; UILabel *label = ( UILabel *)[cell viewWithTag : 1 ]; label. text = [ NSString stringWithFormat : @" ラベル %d-%d" ,indexPath. section ,indexPath.row]; UIImageView *image = ( UIImageView *)[cell viewWithTag : 2 ]; image. backgroundColor = [ UIColor redColor ]; } else if (indexPath. section == 1 ){ // セクション 1 のセル cell = [collectionView dequeueReusableCellWithReuseIdentifier : @"cell2" forIndexPath :indexPath]; cell. backgroundColor = [ UIColor yellowColor ]; UIButton *button = ( UIButton *)[cell viewWithTag : 1 ]; button. titleLabel . text = [ NSString stringWithFormat : @"%d-%d" ,indexPath. section ,indexPath. row ]; UILabel *label = ( UILabel *)[cell viewWithTag : 2 ]; label. text = [ NSString stringWithFormat : @" ラベル %d-%d" ,indexPath. section ,indexPath.row]; } return cell; } - ( void )collectionView:( UICollectionView *)collectionView didSelectItemAtIndexPath:( NSIndexPath *)indexPath { // クリックされたらよばれる NSLog ( @"Clicked %d-%d" ,indexPath. section ,indexPath. row ); } @end こんな感じ。 セルをクリックすると、ログが出ます。23/08/13 14:16
電王戦2.1 タッグマッチが発表されました。8/31に1日をかけて、プロ棋士5名がそれぞれ第2回電王戦で戦ったコンピュータ将棋ソフトとタッグを組み、トーナメントを戦います。 サイト: 電王戦タッグマッチ とっても楽しみです。以下、当たり前のことですが、感じたことを言語化します。 (1)人(感覚)とコンピュータ(計算)がお互いの長所を高め合って、人の能力を押し上げるか? それとも、 (2)人の思考を邪魔してしまい(邪念や迷いを生ませてしまい)、プロ棋士の普段の力より下げてしまうか? など、興味深い結果がみられそうです。 トーナメントが終わった後の、各棋士の感想が気になります。 なお、チェスや囲碁では、コンピュータを使って戦った場合、人の能力はあがった結果がでているそうです。(参考文献どこかな) 将棋の場合、将棋倶楽部24ではレートが200くらいあがる、というコメントもありました。 (電王戦タッグマッチPV より)人間とコンピュータの協調形態のレベル オートメーションのレベル、手動(人間)と自動(コンピュータ)の協調形態のレベルに関しては、Sheridan & Verplanck(1978) Raja Parasuraman ら(2000)による10段階のレベルおよびそれを拡張したモデルの概念等で、議論されています。 Sheridan, T.B., & Verplank, W. (1978). Human and Computer Control of Undersea Teleoperators . Cambridge, MA: Man-Machine Systems Laboratory, Department of Mechanical Engineering, MIT. R.Parasuraman, T.B.Sheridan, and C.D.Wickens. “A model for types and levels of human interaction with automation.”, IEEE Transactions on Systems Man and Cybernetics Part A Systems and Humans, 30(3):286–297, 2000. 反対にして日本語化してみると、 1: コンピュータは何も支援しない。人間が全部判断して実行する。 2: コンピュータは自らが判断した全ての選択肢を人に与える、 3: その選択肢を狭めて、いくつか人に与える 4: 一つの代替案を示す 5: 人が許可すれば、それを実行する 6: 実行する前に、人にそれを禁止する許可を与える 7: 自動的に実行するが、その後それを人間に伝える 8: もし人に聞かれたら、答える 9: もし人に聞かれて、コンピュータが答えようと決めたら答える 10: 全部コンピュータが自動で行う。人を無視する。 みたいな感じでしょうか。電王戦やコンピュータ将棋選手権で戦う将棋ソフトは、将棋ソフト自体が戦うので、レベル7〜ですね。 今回は、あくまで棋士はコンピュータを参考情報として使う、ということで、レベル2もしくはレベル3の協調形態が想定されます。協調形態レベル7〜の将棋ソフトの強さと、レベル2 or レベル3における強さの指標の違い 今回の電王戦タッグマッチでは、協調形態レベル2 or 3 でコンピュータが使われることとなります。 最終の判断基準は、人間。 ということは、電王戦タッグマッチで求められる将棋ソフトとは、「純粋な将棋能力」+「選択肢の意味・意図を人間に理解させる能力」 が重要だと考えられます。 プロ棋士が将棋を指す時は、大局観、を重視している場合が多いと聞きます。大局観:囲碁や将棋、チェスなどに置いて、部分的なせめぎ合いにとらわれずに、全体の形の良し悪しを見極め、自分が今どの程度有利不利にあるのか、堅く安全策をとるか、勝負に出るかなどの判断を行う能力のこと。 大局観に優れると、駒がぶつかっていない場所から意表を突く攻めを行うなど、長期的かつ全体的な視野のもと手を進めることが可能となる。反対に大局観が備わっていなければ、盤上の一部での駒のぶつかり合いや、短期的な駒の損得しか考えられなくなる。多分に直感的なもので、コンピュータでは再現が難しいとされる。( Wikipedia ) 人間は「線」で局面をとらえ、指してを決定する場合が多い。一方、コンピュータはその局面局面を点として捉え、判断をする場合が多い(はず?)。 あくまで人間が指し手を最終的に決定するのであれば、コンピュータ将棋ソフトは指し手の候補を示すだけでなく、その指し手の意味・意図を棋士に伝達し、理解してもらう必要があります。 単に「この手がいいと思うよ」だけじゃなくて、「なぜその手がいいのか」を棋士にわかりやすく理解してもらえないと、その手は採用されない、または採用されるまでにプロ棋士の思考を要するため時間がかかる恐れがあります。 終盤の詰み筋であれば、コンピュータの指し手は無条件に採用できますが、中盤の大局観が重要とされる場面では、プロ棋士はコンピュータの指し手の意図を理解するフェーズが必要となるでしょう。 よって、協調形態レベル2・3に求められるコンピュータの能力とは、「純粋な将棋能力」+「選択肢の意味・意図を人間に理解させる能力」だと推測されます。 すなわち、コンピュータ将棋選手権で強いコンピュータが、そのまま今回の電王戦タッグマッチで強いコンピュータとなるとは限らないと思います。 そして、人間に理解させる能力は、「純粋な将棋能力」=計算能力 とは別次元の能力です。 少し異なりますが、説得型コンピューティング(Persuasive Computing)という分野もあるようです。そこでは、人間の心理を理解することや、わかりやすいユーザインタフェースなど、別の技術が求められるのだと思います。 阿部光瑠四段は、「全部コンピュータに任せてもいいかもしれない」とおっしゃってました。もしかすると、そうしたほうがいい結果が出る場合もあるかもしれません。 選択肢を提示されると、迷います。迷いは正常な思考能力を狂わせ焦りにつながり、結果として悪手につながるかもしれません。 一方で、プロ棋士は異次元の能力をもってるので、単純に手を提示されただけで、瞬時にその意図や流れを把握できるのかもしれません。 コンピュータと人間、コンピュータとプロ棋士と協調するためにはどういう技術・課題を克服する必要があるのか? そもそも、プロ棋士にはそんなもの必要ないのか? それを発見するという意味でも、今回の電王戦タッグマッチは要注目じゃないでしょうかっ 以上、ふと思ったことのメモでした。