Cocoa 関西 大阪


今回はCyberAgent in 大阪

# カードゲームをObjCで作る

@shudioshin さん

sample code: http://www.studioshin.com/cocoa_sample/

### よくあるのが
ゲーム作りたい
　　　↓
どんなんよ……
　　　↓
オススメはカードゲーム（トランプゲームとか）

### オススメ理由

1. ルール皆知ってる
2. 手軽で結構ハマる
3. 最低限、トンラプの図柄があればいい

## 中身のはなし

トランプカードに必要な要素

1. トランプカード（53枚、ジョーカ有り）
2. デッキ（カードが固まった束）
3. テーブル/ボード

### トランプカード

表裏の図柄を表示する

### デッキ

1. 53枚のカードを持つ
2. カードをシャッフル
3. カードの状態管理（デッキ/場/トレイ）

### テーブル/ボード

1. 任意の枚数を配置
2. 配置したカードを取り除ける（トレイへ）
3. カードをグループでまとめられる

** ただし、ゲームに依存するので柔軟になるように

## ではクラスは？

トランプカード: UIView
デッキ: NSObject
テーブル／ボード: UIView

## では Sample Code

class description

CardDeck: NSObject
CardView: NSView
GameBoardView: NSView

これらを管理するコントローラクラス

## ではブラックジャックを

- ディーラーと複数の子で勝負
- 配られたカードの合計が21になるように。
- 21超えたらドボン
- 絵札は10として
- Aは1か10どちらか都合のいいほう
- ディーラーは数字合計が17になるまで引く


# Levan nghia

@nghialv さん

## High-Quality ViewController

iOS の ViewControoler は太ってる

1. イベント処理
2. tableViewなどのdelegate
3. logic
4. view…

3,4 はファイル分けたらいいので、2の方法を話す。

## ViewController に TableViewのコードを書く

データソースが配列ならば、tableView:cellForRowAtIndexPath: のいち部分が違うだけで、他は同じ

ならば、その部分を別のクラスに置きましょう。


実装： Block/Selector で実装した。

https://github.com/nghialv/TVDataSource

# 初iOSアプリとWWDC

@windblume さん

## はるかまりき

Twitter クライアント

Githubに公開してる github.com/windblume/..?

## WWDC 行ってきた

英語通じない…(´・ω・｀)

# UIURLなんとか

@yashigani

FenrirでMac/IOSアプリを作ってる

## 嘘です。UIWebviewの話をしますです。


UIWebView ってヘボい？

### WebView >> 壁 >> UIWebView

APIとかdelegateの数とか…

ヘボいから補強してやらな…

なんか探して

### NSURLProtocol & NSURLCache？

URL Loading System → NSURLConnection を使った通信を支える仕組み

WebKit は NSURLConnection を使ってる。

## NSURPorotocolとｋは

NSURLRequest の生成

通信を乗っ取れる。Basic認証とか

てことは、WebKitの通信も乗っ取れる。

## NSURLCache

responseやresponse body をキャッシュする。

## Usage

- basic/digest
- content filter
- get a source
- change the text encoding.
- UIWebViewの動作を邪魔すること無く、req,resを操作できる


## まとめ

URLLoadinSystem知ったらUIWebViewは強くなる
APIにないことよりも出来るようになる

# はてなブックマーク iOS

id:nijinkun @ninjinkun さん

## はてなブックマークSDK

８月下旬リリース予定

- ブックマークの追加編集削除
- コメント閲覧
- JSON API追加
- OAuth認証ログイン

## 実装

- ARC
- iOS 5.0以上
- MIT
- CocoaPods ready

## 構成

- Request HTTP Client
- AFOAuthClient 
- 単体で使っていい
- UIActivity 提供
- UIStoryboard利用
- 認証用webview

## 依存モジュール

- AFNwtorking
- AFOauthClient
- Oauth 1.0a の仕様満たすには足りないから、pull request 送ったけど merge される気配なし(バージョンアップしたら追従)
- SFHFKeychainUtils

## まとめ

シード開発者募集中
http://bookmark.hatenastaff.com/entry/2013/08/02/181713


# DI FAQ

@kaniza

## 前回までのあらすじ

私はSingletonが嫌いだ

## おさらい

（前回のスライド）

## 質疑応答

サブクラス必要なの？

TyphoonAssemblyでInjectするためのinitializeを実装出来れば、TyphoonFactoryからmanagedObjectContextをとってくる

## ObjectはContainerから取得？

```objc
- (void) doSome {
  FooManager* manager = [FooManager sharedManager];
  [maanger doSome];
}
```


```objc
- (void) doSome {
  TyphoonFactory* fac = [TyphoonFactory sharedFactory]
  FooManager* manager = …
  [maanger doSome];
}
```

```objc
- (id)initWithFooMnaager(FooManager*)f {
    self.fooManager = fooManager;..
}

- (void) doSome {
    [self.fooManager doSome];
}
```

ちょっとややこしい例

```objc
- (void) doSome {
    FooManager* manager = [FooManager sharedManager];
    Bar* bar = [[Bar alloc] initWithFooManager:manager];
    [bar doSome];
}
```

```objc
/* あんまよろしくない. Bar を作るためだけに依存している */
- (id)initWithFooMnaager(FooManager*)f {
    self.fooManager = fooManager;..
}

- (void) doSome {
    Bar* bar = [[Bar alloc] initWithFooManager:self.fooManager];
    [bar doSome];
}
```

```objc
- (id)initWithFooMnaager(BarFactory*)f {
    self. BarFactory = f;..
}

- (void) doSome {
  Bar* bar = [self.BarFactory bar];
  [bar doSome];
}

@interface BarFactory
- (Bar*) bar
@end
@implementation BarFactory
- (id) initWithFooManager;(FooManager*)..

- (Bar*) bar { return [[Bar alloc] initWithFooManager:self.FooManager; }
```

## 依存でもいろいろ

- どのレベル`が'依存
- ☓インターフェース（影響大）
- ○実装（影響小）

- どのレベルに依存するか
- ○インターフェース（変わり肉い）
- △実装（変わりやすい）

## まとめ

DI こわくないよ
依存関係が綺麗になって暮らしが良くなるよ

## おまけ

SmallTalk

# Cocoa Bindings

富江さん

CramAV とかスキャナー作ってる

## Cocoa Bindings とは

VIewとModelを同期させる機構とかもでるとびゅーとか…

要はデモでみたほうが早い。

仕組みは、KVCodingで動いてる。KVObservingで値監視する事できる。

## Nib が複数の時は？

ObjectControllerに対して、setContent:でモデルを指定してやればいい

## 問題点

Nib同士がわりと強く結びついてる。

- モデルの仕様が変更
- ちょっとUIを試したい
- 変更する時、xibを触る必要ある。（デバッグとか変更忘れとかあって面倒）


## 解決法

各モデルにモデルを付けて、それをKVOで監視するのはどうかしら。

割とコード量増えるので、監視するクラス作った: PsedoBinding

## 欠点

1. Memory 増える。(retainでやればまぁ抑えられる)
2. Over head が大きくなる。（最近のは早いから…）

## 最後に

前回発表しようと考えたけど…

iOS では使えません!!!


# Plugin Architectures in Cocoa

@questbeat さん

nekoze: 猫背になったら知らせてくれる。

http://github.com/questbeat/PluginSample

## Xcode Plugin の lin questbeat/Lin

を作った。多言語の部分をクリックしたら、定義されてる単語一覧が表示される。


Singletonでもいいんじゃないの

## Bundle の話

- .app
- .framework
- .prefPane
- .saver
- .xcplugin

## Locating Bundle

MyApp.app/Contents/Plugins/MyPlugin.bundle
MyApp.app/Contents/Resources/Plugins/MyPlugin.bundle
…

```objc
// /Applications/MyApp.app/Contents/Plugins
NSString* plginsPath = [[NSBundle mainBundle] builtInPlugInsPath];
// /Applications/MyApp.app/Resources/Contents/Plugins
NSString* plginsPath = [[NSBundle mainBundle] pathForResourcesOfType:@"bundle" inDirectory:@"plugins"];
// 長いので力尽きた
```

## Execute Bundle

```obj
NSBundle* bundle = [NSBundle bundleWithPath:…]
if (![bundle loadAndReturnError:&error]) { .. }
```