SlideShare una empresa de Scribd logo
1 de 55
Descargar para leer sin conexión
RFC Viewer開発を通して学ぶ!!
iOS開発のパターン化
2013.10.22 Bitz Co., Ltd.	

村上幸雄 @m_yukio
自己紹介
• 村上幸雄 @m_yukio	

	


• ビッツ有限会社 http://www.bitz.co.jp/	

	


• 節電対策, Bitz NowPlaying, RFC Viewer(申請中)	

	


• UNIX系ソフトハウスと組み込みシステムのベンチャーを経て2001年に
独立。
プラットフォームを限定せずに何にでも挑戦してきましたが、最近は
iOSアプリ開発に注力しています。
本日の内容
•  iOSアプリケーションについて	

•  iOSアプリケーション開発の流れ	

•  iOSアプリケーション開発のパターン化	

•  RFC Viewerの製作
iOSアプリケーション
開発について
•  Mac OS XのCocoaの機能縮小版。ただ

し、独自のUIや改良個所があるので、
単なるサブセットでない。	


•  使用禁止APIがあるが、C言語によるネ
イティブ開発が行える。	


•  iOSはUNIX系のOSで、32bit/64bit対応。
Objective-C	

•  C言語にオブジェクト指向の拡張を施し
たもの。	


•  Objective-C 2.0から、より使いやすくす
る為の拡張が行われたが、基本は簡素
な言語。	


•  歴史は非常に古い。
@protocol プロトコル名メソッド宣言;
:@end	
	
@interface クラス名 : スーパークラス名 プロトコル名	
:	
@end	

@interface クラス名 : スーパークラス名
{
型名 インスタンス変数名;
:}
メソッド宣言;
:@end@implementation
クラス名メソッド定義{
処理内容}
:
@end	

@interface クラス名 (カテゴリ名)	
メソッド宣言;
:	
@end
クラス定義 インターフェイス
クラス名

#include	

親クラス

#import Cocoa/Cocoa.h	
	
インスタンス変数
@interface Song : NSObject
{
id
title;}- (id)title;	
メソッド
- (void)setTitle:
(id)aTitle;@end
クラス定義 クラス実装
#include	

実装するクラス名
#import “Song.h”	
	
@implementation Song- (id)title	
インスタンス変数を返す
{	
return title;	
}	
以前の変数をオートリリースし
	
- (void)setTitle:(id)aTitle	
{	
[title autorelease];	
渡された変数を所有している
title = [aTitle retain];	
}@end
カテゴリ定義
拡張するクラス名

カテゴリ名

#import “NSString.h”	
	
@interface NSString (Hello)	
- (NSString *)helloString;@end
カテゴリ実装
拡張するクラス名

カテゴリ名

#import “Hello.h”	
	
@implementation NSString (Hello)	
- (NSString *)helloString	
{	
return @”hello, world!”;	
}@end
形式プロトコル
@protocol Playable	
- (void)play;	
- (void)stop;@end	

プロトコル名
プロトコルの採用

#import Cocoa/Cocoa.h	
#import “Playable.h”	
	
@interface Song : NSObject Playable {	
id title;	
プロトコル準拠の確認
}	
- (id)title;	
- (void)setTitle;@end	
if ([song conformsToProtocol:@protocol(Playable)]) {	
[song play];	
}	
else {	
}
クラスメソッド
+ (id)alloc;	
	
NSObject *obj = [NSObject alloc];	
	
	
クラス
	
	
	
- (void)display;	
	
[obj display];	

インスタンス

インスタンスメソッド
メモリ管理
/* 生成(retain) */	
NSString *title = [[NSString alloc] initWithString:@”hello”];	
	
/* 解放 */	
[title release];	
	
	
/* autorelease */	
for (;;) {	
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];	
	
NSString *s1 = [[NSString alloc] initWithString:@”hello”];	
[s1 autorelease];	
	
NSString *s2 = @”hello”;	
	
NSString *s3 = [NSString stringWithString:@”hello”];	
	
[pool release];	
}
#import	

#include “MyClass.h”	

#ifndef _H_MyClass	
#define _H_MyClass	
	
@interface MyClass : NSObject	
:	
@end	
	
#endif	

#import “MyClass.h”	

=

#import “MyClass.h”	
	
@interface MyClass : NSObject	
:	
@end
Xcode 5 から @import が利用できるよう
になった。(Modules)	
	
例)	
@import UIKit;	
@import UIKit.UIView;
Objective-C 2.0以降のクラス実装のパターン
@interface Document : NSObject!
@property (strong, nonatomic) NSString *version;!
!
- (id)init;!
- (void)dealloc;!
@end!

プロパティを利用

!

@interface Document ()!
@property (strong, nonatomic) NSString *text;!
- (void)_init;!
@end!

プライベート宣言はク
ラス拡張で

!

@implementation Document!
!
@synthesize version = _version;!
@synthesize text = _text;!
!

- (id)init!
{!
self = [super init];!
if (self) {!
[self _init];!
}!
return self;!
}!
!

- (void)dealloc!
{!
self.version = nil;!
self.text = nil;!
}!
!
- (void)_init!
{!
_version = @”1.0”;!
_text = @”This is a pen.”;!
}!
!
@end!

ARC有無に関わらず汎用的に
使える
宣言済みプロパティ
@property (nonatmic) NSString *value;	
- (NSString *)value;	
- (void)setValue:(NSString *)newValue;	

同等

@synthesize value = _value;	
@interface MyClass : NSObject	
@property (nonatmic) NSString *_value;	
@end	
@implementation MyClass	
- (NSString *)value { return _value; }	
- (void)setValue:(NSString *)newValue	
{	
[_value release];	
_value = [newValue retain];	
}	
@end	

自動に宣言

ARCなしの場合は	

こんな感じ?
プロパティ
@interface Song : NSObject {	
id _title;	
}	
- (id)title;	
- (void)setTitle:(id)title;	
@end	
	
@implementation Song	
	
- (id)title	
{	
return _title;	
}	
	
- (void)setTitle:(id)title	
{	
[title release];	
_title = [title retain];	
}	
	
@end	

@interface Song : NSObject	
@property (strong, nonatmic) NSString *title;	
@end	
	
@implementation Song	
	
@synthesize title = _title;	
	
@end	

プロパティを利用すれば、
ARCの利用有無に関わらず、
同じ記述が出来る。
Cocoa touch	

•  iOSアプリ開発にはC言語の知識も必要。
C++も知っておくと便利。	


•  Objective-Cは簡素。Cocoa touchの知識
の有無が重要。
Machのタスクとスレッド
実行状態
実行状態
実行状態
実行状態
実行状態

Machスレッド

プロセスのデータと保護

プロセスのデータと保護

メモリ管理

メモリ管理

シグナル管理

シグナル管理

ディスクリプタ管理

ディスクリプタ管理

タイミングと統計情報

タイミングと統計情報

リソース制御

リソース制御

UNIXプロセス

Machタスク
Run Loop	

Events	


Run
Loop	


Timers	


Application
開発の流れ
Apple Developerサイトにアクセス	

http://developer.apple.com/jp/	


iOS Developer Programに参加

Xcodeを入手し、インストールする

シミュレータ/実機で開発

実機でAdHoc版の動作を確認

Storeに申請
休憩
WWDCノススメ
Appleが年に一回世界中の開発者を集めて、新技術の紹介や開発にあたっての細かな
技術を説明する為のイベント。

• 方向性を肌で感じる。	

• Apple技術者から直接情報を得られる。	

• フィードバックも期待できる。	

• 全体像をつかめる。とっかかりとなる。	

• 参加者同士の交流。	

• サードパーティとの交流。	

• @twitterapi meetupなど
パターン化
パターン化について
•  自分の型を持つ事は、コードの再利用
はもちろん、継続的な改善が期待でき
る。	


•  以下をバイブルとした。

『iOS開発におけるパターンによるオー
トマティズム』木下誠 著
Model-View-Controllerパターン
Controller	

UI操作

更新

更新
通知

View	


Model	


状態取得

従来型
Controller	

UI操作
更新

更新
通知

View	


Model	


Cocoa
RFCViewerでのMVC	

AppDelegate	


View	

View	

View	


UI操作
更新

Controller	


ViewController	

ViewController	

ViewController	

更新

通知

Document	


更新
通知

Model(データ)を管理するコント
ローラとしてDocumentを用意。

データ
通信/並列処理のパターン

ViewController	


Connector	


ResponseParser	


ResponseParser	


ResponseParser
要求/応答のパターン
•  1対n(お互い知らない)	

•  通知センター	

•  1対n(通知元を知っている)	

•  キー値監視	

•  1対1	

•  デリゲート	

•  Blocks
通知センター
/* 通知元 */!
NSString
*ConnectorDidBeginRfc = @ConnectorDidBeginRfc;!
!
!
[[NSNotificationCenter defaultCenter] postNotificationName:ConnectorDidBeginRfc!
object:self userInfo:userInfo];!
!
!
/* 受信メソッドの登録 */!
[[NSNotificationCenter defaultCenter] addObserver:self!
selector:@selector(_connectorDidBeginRfc:) !
name:ConnectorDidBeginRfc!
object:nil];!
!
!
/**!
* 受信メソッド!
*/!
- (void)_connectorDidBeginRfc:(NSNotification*)notification!
{!
RFCResponseParser *parser;!
parser = [[notification userInfo] objectForKey:@parser];!
!
...!
}!
キー値監視
/* Connectorの networkAccessingキーを監視 */!
[[Connector sharedConnector] addObserver:self!
forKeyPath:@networkAccessing!
options:0!
context:NULL];!
!
!
/* 値の変更を受信 */!
- (void)observeValueForKeyPath:(NSString*)keyPath!
ofObject:(id)object!
change:(NSDictionary*)change!
context:(void*)context!
{!
if ([keyPath isEqualToString:@networkAccessing]) {!
[self _updateNetworkActivity];!
}!
}!
!
!
/* 通知 */!
[self willChangeValueForKey:@networkAccessing];!
[self didChangeValueForKey:@networkAccessing];!
デリゲート

/* プロトコル */!
@protocol RFCResponseParserDelegate NSObject!
- (void)parser:(RFCResponseParser*)parser didReceiveResponse:
(NSURLResponse*)response;!
@end!
!
!
/* デリゲートのメソッドを呼び出す */!
if ([self.delegate respondsToSelector:@selector(parser:didReceiveResponse:)]) {!
[self.delegate parser:self didReceiveResponse:response];!
}!
Blocks	

/* Blocks定義 */!
typedef void (^RFCResponseParserCompletionHandler)(RFCResponseParser *parser);!
!
!
/* 要求メソッドでBlocksを受け取る */!
- (void)rfcIndexWithCompletionHandler:(RFCResponseParserCompletionHandler)completionHandler;!
!
!
!
/* Blocksの呼び出し */!
if (parser.completionHandler) {!
parser.completionHandler(parser);!
}!
!
!
/* Blockの生成 */!
__block MasterViewController * __weak blockWeakSelf = self;!
[[Connector sharedConnector] rfcIndexWithCompletionHandler:^(RFCResponseParser *parser) {!
MasterViewController *tempSelf = blockWeakSelf;!
if (! tempSelf) return;!
!
[Document sharedDocument].indexArray = parser.indexArray;!
[tempSelf _updateSectionIndexArray];!
[tempSelf.tableView reloadData];!
}];!
休憩
Cocoa勉強会

http://www.cocoa-study.com/
RFCViewerの製作
RFC	

•  以下にインデックスがある。

http://www.rfc-editor.org/rfc/rfc-index.txt	


•  RFC文書のURL

http://www.ietf.org/rfc/rfc四桁の数値.txt
例)http://www.ietf.org/rfc/rfc0821.txt
RFCとは
•  TCP/IPプロトコルの詳細が記述されて
いるレポート。以下に例をあげる。	


•  793: TCPプロトコルの仕様。	

•  822: 電子メールの形式。
ファイル構成
アプリケーション・デリゲート

テーブル(RFCのインデックス)
詳細画面(RFC文書表示)
データ

通信(コネクタ/パーサ)
アプリのデリゲート

通信中インジケータ

@implementation AppDelegate- (BOOL)application:(UIApplication *)application	
willFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
/*
ConnectのnetworkAccessingキーを監視 */
[[Connector sharedConnector]
addObserver:self
forKeyPath:@networkAccessing
options:
0
context:NULL];
return YES;}(void)observeValueForKeyPath:(NSString*)keyPath
ofObject:(id)object
change:(NSDictionary*)change
context:(void*)context{
/* networkAccessingキーに変化あり */
if
([keyPath isEqualToString:@networkAccessing]) {
[self
_updateNetworkActivity];
}}- (void)_updateNetworkActivity{
/* 通信中な
らインジケータを表示 */
[UIApplication
sharedApplication].networkActivityIndicatorVisible
= [Connector
sharedConnector].networkAccessing;}@end	

真:表示	

偽:非表示

ココ
通信開始
- (void)parse{
DBGMSG(@%s, __func__);
NSString
*urlString = nil;
/* 通信先 */
if (self.index == 0) {
/* 目次文書 */
urlString = [Document sharedDocument]	
.indexUrlString;
}
else
{
/* 指定された番号のRFC文書 */
urlString = [[Document sharedDocument]	
rfcUrlStringWithIndex:self.index];
}
/*
URLからNSURLRequestのインスタンスを生成 */
NSURLRequest
*urlRequest = nil;
if
(urlString) {
NSURL
*url;
url =
[NSURL URLWithString:urlString];
if (url)
{
urlRequest = [NSURLRequest	
requestWithURL:url];
}
}
DBGMSG(@%s urlString(%@),	
__func__, urlString);	

if (! urlRequest) {
/* NSURLRequestインスタンスの生
成失敗 */
self.networkState = kRFCNetworkStateError;
self.error = [self _errorWithCode:	
kRFCResponseParserGenericError
localizedDescription:	
@NSURLRequestの生成に失敗しました。];
return;
}
/* 受信データの格納バッファの用意 */
self.downloadedData = [[NSMutableData alloc] init];
/
* NSURLConnectionインスタンスの生成	
(並列処理の為のキューを設定) */
self.urlConnection =
[[NSURLConnection alloc]	
initWithRequest:urlRequest
delegate:self
startImmediately:NO];
[self.urlConnection setDelegateQueue:self.queue];
/*
通信中インジケータの更新 */
[self
willChangeValueForKey:@networkState];
self.networkState
= kRFCNetworkStateInProgress;
[self
didChangeValueForKey:@networkState];
/* 通信開始 */
[self.urlConnection start];}	

前のスライド
受信データの格納

- (void)connection:(NSURLConnection*)connection didReceiveResponse:
(NSURLResponse*)response{
/* デリゲートに通知 */
if ([self.delegate
respondsToSelector:@selector(parser:didReceiveResponse:)]) {	
/* 主スレッドで実行 */
dispatch_async(dispatch_get_main_queue(),
^{
[self.delegate parser:self didReceiveResponse:response];
});
}}(void)connection:(NSURLConnection*)connection didReceiveData:(NSData*)data{
/* 受信したデータ
をバッファに格納 */
[self.downloadedData appendData:data];
/* デリゲートに通知 */
if
([self.delegate respondsToSelector:@selector(parser:didReceiveData:)]) {	
/* 主スレッドで実行 */
dispatch_async(dispatch_get_main_queue(),
^{
[self.delegate parser:self didReceiveData:data];
});
}}
通信終了

- (void)connectionDidFinishLoading:(NSURLConnection*)connection{
/* 通信中インジケ
ータの更新 */
[self willChangeValueForKey:@networkState];
self.networkState
= kRFCNetworkStateFinished;
[self
didChangeValueForKey:@networkState];
/* 目次文書 */
if (self.index == 0)
{
/* 受信データのパース */
[self _parseIndexArray];
}
/* 主スレ
ッドで実行させる */
dispatch_async(dispatch_get_main_queue(), ^{
[self
_notifyParserDidFinishLoading];
});
self.urlConnection = nil;}(void)_notifyParserDidFinishLoading{
/* デリゲートに通知 */
if ([self.delegate
respondsToSelector:@selector(parserDidFinishLoading:)]) {
[self.delegate
parserDidFinishLoading:self];
}}
通信を要求する
/* 通信中パーサを配列に格納 */
[self.parsers
addObject:parser];
/* 通信中インジケータの更新 */
if
(networkAccessing != self.networkAccessing) {
[self
- (void)rfcWithIndex:(NSUInteger)index	
willChangeValueForKey:@networkAccessing];
[self
completionHandler:(RFCResponseParserCompletionHandler)	didChangeValueForKey:@networkAccessing];
}
/* 通
completionHandler{
BOOL
信開始を通知 */
NSMutableDictionary *userInfo	
networkAccessing = self.networkAccessing;
/* パーサの
= [NSMutableDictionary dictionary];
[userInfo
インスタンスを生成 */
RFCResponseParser
*parser	
setObject:parser forKey:@parser];
= [[RFCResponseParser alloc] init];
parser.index
[[NSNotificationCenter defaultCenter]	
= index;
parser.queue = self.queue;
parser.delegate =
postNotificationName:ConnectorDidBeginRfc	
self;
parser.completionHandler =
object:self userInfo:userInfo];}	
completionHandler;
/* 通信開始 */
[parser parse];
if (parser.error) {
/* 通信開始エラー */
NSMutableDictionary *userInfo	
= [NSMutableDictionary dictionary];
[userInfo setObject:parser forKey:@parser];
[[NSNotificationCenter defaultCenter]	
postNotificationName:ConnectorDidFinishRfc
object:self
userInfo:userInfo];
if (parser.completionHandler)
{
parser.completionHandler(parser);
}
return;
}
応答を受け取る

- (void)parserDidFinishLoading:(RFCResponseParser *)parser{
if ([self.parsers
containsObject:parser]) {
[self _notifyRfcStatusWithParser:parser];
}}(void)_notifyRfcStatusWithParser:(RFCResponseParser *)parser{
NSMutableDictionary
*userInfo = [NSMutableDictionary dictionary];
[userInfo setObject:parser
forKey:@parser];
/* 通信完了を通知(通知センター) */
[[NSNotificationCenter
defaultCenter] postNotificationName:ConnectorDidFinishRfc
object:self
userInfo:userInfo];
/* 通信完了を通知(Blocks) */
if (parser.completionHandler)
{
parser.completionHandler(parser);
}
/* 通信中インジケータの更新 */
[self willChangeValueForKey:@networkAccessing];
[self.parsers removeObject:parser];
[self didChangeValueForKey:@networkAccessing];}
要求を投げる

- (void)viewDidLoad{
[super viewDidLoad];
if (self.rfc.text)
{
[self configureView];
}
/* RFC文書の取得要求を投げる */
__block
DetailViewController * __weak blockWeakSelf = self;
[[Connector
sharedConnector] rfcWithIndex:[self.rfc.rfcNumber integerValue]	
completionHandler:^(RFCResponseParser *parser)
{
/* 応答を受けた際の処理 */
DetailViewController *tempSelf =
blockWeakSelf;
if (! tempSelf) return;
if (parser.rfc)
tempSelf.rfc.text = parser.rfc;
[tempSelf configureView];
}];}
NSURLSession	

iOS7で追加された機能で、NSURLConnection
に変わるもの。
Demo
AdHoc
Q  A

Más contenido relacionado

La actualidad más candente

Unity ネイティブプラグインの作成について
Unity ネイティブプラグインの作成についてUnity ネイティブプラグインの作成について
Unity ネイティブプラグインの作成について
Tatsuhiko Yamamura
 

La actualidad más candente (16)

CEDEC2021 ダウンロード時間を大幅減!~大量のアセットをさばく高速な実装と運用事例の共有~
CEDEC2021 ダウンロード時間を大幅減!~大量のアセットをさばく高速な実装と運用事例の共有~ CEDEC2021 ダウンロード時間を大幅減!~大量のアセットをさばく高速な実装と運用事例の共有~
CEDEC2021 ダウンロード時間を大幅減!~大量のアセットをさばく高速な実装と運用事例の共有~
 
プログラミング .NET Framework 第4版
プログラミング .NET Framework 第4版プログラミング .NET Framework 第4版
プログラミング .NET Framework 第4版
 
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Springドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
 
RUNNING Smalltalk - 実践Smalltalk
RUNNING Smalltalk - 実践SmalltalkRUNNING Smalltalk - 実践Smalltalk
RUNNING Smalltalk - 実践Smalltalk
 
Unity ネイティブプラグインの作成について
Unity ネイティブプラグインの作成についてUnity ネイティブプラグインの作成について
Unity ネイティブプラグインの作成について
 
XpagesDay 2014 [A-2] スタンダードクライアントで xpages を使ってみよう
XpagesDay 2014 [A-2] スタンダードクライアントで xpages を使ってみようXpagesDay 2014 [A-2] スタンダードクライアントで xpages を使ってみよう
XpagesDay 2014 [A-2] スタンダードクライアントで xpages を使ってみよう
 
XPages Day 2013 [B-3] XPages開発を始める Notes技術者のためのWeb技術概論
XPages Day 2013 [B-3] XPages開発を始める Notes技術者のためのWeb技術概論XPages Day 2013 [B-3] XPages開発を始める Notes技術者のためのWeb技術概論
XPages Day 2013 [B-3] XPages開発を始める Notes技術者のためのWeb技術概論
 
ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門
 
基礎から学ぶ組み込みAndroid
基礎から学ぶ組み込みAndroid基礎から学ぶ組み込みAndroid
基礎から学ぶ組み込みAndroid
 
uroboroSQLの紹介 (OSC2017 Nagoya) #oscnagoya
uroboroSQLの紹介 (OSC2017 Nagoya) #oscnagoyauroboroSQLの紹介 (OSC2017 Nagoya) #oscnagoya
uroboroSQLの紹介 (OSC2017 Nagoya) #oscnagoya
 
Java仮想マシンの実装技術
Java仮想マシンの実装技術Java仮想マシンの実装技術
Java仮想マシンの実装技術
 
2015/11/15 Javaでwebアプリケーション入門
2015/11/15 Javaでwebアプリケーション入門2015/11/15 Javaでwebアプリケーション入門
2015/11/15 Javaでwebアプリケーション入門
 
Game BaaS Implemented in Ruby
Game BaaS Implemented in RubyGame BaaS Implemented in Ruby
Game BaaS Implemented in Ruby
 
Unityネイティブプラグイン
UnityネイティブプラグインUnityネイティブプラグイン
Unityネイティブプラグイン
 
ゲームエンジニアのためのデータベース設計
ゲームエンジニアのためのデータベース設計ゲームエンジニアのためのデータベース設計
ゲームエンジニアのためのデータベース設計
 
PHPにおけるRIA事情と開発
PHPにおけるRIA事情と開発PHPにおけるRIA事情と開発
PHPにおけるRIA事情と開発
 

Similar a RFC Viewer開発を通して学ぶ!! iOS開発のパターン化

関数型言語ElixirのIoTシステム開発への展開
関数型言語ElixirのIoTシステム開発への展開関数型言語ElixirのIoTシステム開発への展開
関数型言語ElixirのIoTシステム開発への展開
Hideki Takase
 
第1回 コデアルiOSアプリ勉強会
第1回 コデアルiOSアプリ勉強会第1回 コデアルiOSアプリ勉強会
第1回 コデアルiOSアプリ勉強会
codeal
 
Office365 api dev_20140624
Office365 api dev_20140624Office365 api dev_20140624
Office365 api dev_20140624
Seiji Noro
 
福井スマートフォンハッカソン Titanium Mobileの紹介
福井スマートフォンハッカソン Titanium Mobileの紹介福井スマートフォンハッカソン Titanium Mobileの紹介
福井スマートフォンハッカソン Titanium Mobileの紹介
Mori Shingo
 

Similar a RFC Viewer開発を通して学ぶ!! iOS開発のパターン化 (20)

Xcode 7 の新しいところ #cm_ios9
Xcode 7 の新しいところ #cm_ios9Xcode 7 の新しいところ #cm_ios9
Xcode 7 の新しいところ #cm_ios9
 
関数型言語ElixirのIoTシステム開発への展開
関数型言語ElixirのIoTシステム開発への展開関数型言語ElixirのIoTシステム開発への展開
関数型言語ElixirのIoTシステム開発への展開
 
Xcode 再入門「Xcode の検索機能」 #さいたまdev
Xcode 再入門「Xcode の検索機能」 #さいたまdevXcode 再入門「Xcode の検索機能」 #さいたまdev
Xcode 再入門「Xcode の検索機能」 #さいたまdev
 
Objective-Cプログラマのためのswift導入法
Objective-Cプログラマのためのswift導入法Objective-Cプログラマのためのswift導入法
Objective-Cプログラマのためのswift導入法
 
iOS 8/Swift 概要 #ios8yahoo
iOS 8/Swift 概要 #ios8yahooiOS 8/Swift 概要 #ios8yahoo
iOS 8/Swift 概要 #ios8yahoo
 
Core Graphics on watchOS 2
Core Graphics on watchOS 2Core Graphics on watchOS 2
Core Graphics on watchOS 2
 
第1回 コデアルiOSアプリ勉強会
第1回 コデアルiOSアプリ勉強会第1回 コデアルiOSアプリ勉強会
第1回 コデアルiOSアプリ勉強会
 
はじめてのiOSアプリ開発 ①
はじめてのiOSアプリ開発 ①はじめてのiOSアプリ開発 ①
はじめてのiOSアプリ開発 ①
 
Xamarin 概要 2014年08月版
Xamarin 概要 2014年08月版Xamarin 概要 2014年08月版
Xamarin 概要 2014年08月版
 
Xcode4 project template (slide)
Xcode4 project template (slide)Xcode4 project template (slide)
Xcode4 project template (slide)
 
アプリケーションエンジニアのためのクラウドインフラ再入門 (2/3)
アプリケーションエンジニアのためのクラウドインフラ再入門 (2/3)アプリケーションエンジニアのためのクラウドインフラ再入門 (2/3)
アプリケーションエンジニアのためのクラウドインフラ再入門 (2/3)
 
The evolution of c#
The evolution of c#The evolution of c#
The evolution of c#
 
Office365 api dev_20140624
Office365 api dev_20140624Office365 api dev_20140624
Office365 api dev_20140624
 
XcodeのTargetについてのTIPS
XcodeのTargetについてのTIPSXcodeのTargetについてのTIPS
XcodeのTargetについてのTIPS
 
福井スマートフォンハッカソン Titanium Mobileの紹介
福井スマートフォンハッカソン Titanium Mobileの紹介福井スマートフォンハッカソン Titanium Mobileの紹介
福井スマートフォンハッカソン Titanium Mobileの紹介
 
Keep a diary
Keep a diaryKeep a diary
Keep a diary
 
.NET の今と未来 ~ デバイス&クラウド ネイティブを目指して
.NET の今と未来 ~ デバイス&クラウド ネイティブを目指して.NET の今と未来 ~ デバイス&クラウド ネイティブを目指して
.NET の今と未来 ~ デバイス&クラウド ネイティブを目指して
 
Xcode 5 で見つけた「どうでもいい」機能(厳選6つ) #cocoa_kansai, #yidev
Xcode 5 で見つけた「どうでもいい」機能(厳選6つ) #cocoa_kansai, #yidevXcode 5 で見つけた「どうでもいい」機能(厳選6つ) #cocoa_kansai, #yidev
Xcode 5 で見つけた「どうでもいい」機能(厳選6つ) #cocoa_kansai, #yidev
 
Blackberry introduction
Blackberry introductionBlackberry introduction
Blackberry introduction
 
動的なILの生成と編集
動的なILの生成と編集動的なILの生成と編集
動的なILの生成と編集
 

Más de 幸雄 村上

Más de 幸雄 村上 (20)

アプリケーション識別子.pdf
アプリケーション識別子.pdfアプリケーション識別子.pdf
アプリケーション識別子.pdf
 
圧縮ネイティブ・ライブラリについて.pdf
圧縮ネイティブ・ライブラリについて.pdf圧縮ネイティブ・ライブラリについて.pdf
圧縮ネイティブ・ライブラリについて.pdf
 
分散環境におけるジャストインタイム設定の試み
分散環境におけるジャストインタイム設定の試み分散環境におけるジャストインタイム設定の試み
分散環境におけるジャストインタイム設定の試み
 
SwiftのOptionalを理解する
SwiftのOptionalを理解するSwiftのOptionalを理解する
SwiftのOptionalを理解する
 
え!それって参照渡し?
え!それって参照渡し?え!それって参照渡し?
え!それって参照渡し?
 
プライバシーとセキュリティ(リモート通知のデバイストークンの扱いなど)
プライバシーとセキュリティ(リモート通知のデバイストークンの扱いなど)プライバシーとセキュリティ(リモート通知のデバイストークンの扱いなど)
プライバシーとセキュリティ(リモート通知のデバイストークンの扱いなど)
 
AppleScriptなど
AppleScriptなどAppleScriptなど
AppleScriptなど
 
MojaveのDark Mode
MojaveのDark ModeMojaveのDark Mode
MojaveのDark Mode
 
AppleScriptとは何ぞや
AppleScriptとは何ぞやAppleScriptとは何ぞや
AppleScriptとは何ぞや
 
Web API 通信の符号化について
Web API 通信の符号化についてWeb API 通信の符号化について
Web API 通信の符号化について
 
Master-Detail App を実装する
Master-Detail App を実装するMaster-Detail App を実装する
Master-Detail App を実装する
 
SwiftのOptionalを理解する
SwiftのOptionalを理解するSwiftのOptionalを理解する
SwiftのOptionalを理解する
 
Getting a packet trace
Getting a packet traceGetting a packet trace
Getting a packet trace
 
The Bash in Tokyo : AppKitとUIKit
The Bash in Tokyo : AppKitとUIKitThe Bash in Tokyo : AppKitとUIKit
The Bash in Tokyo : AppKitとUIKit
 
RUDP
RUDPRUDP
RUDP
 
Swiftでブロックチェーンを実装する
Swiftでブロックチェーンを実装するSwiftでブロックチェーンを実装する
Swiftでブロックチェーンを実装する
 
ゲームの企画書づくりに挑戦
ゲームの企画書づくりに挑戦ゲームの企画書づくりに挑戦
ゲームの企画書づくりに挑戦
 
IBM Watson Services for Core ML
IBM Watson Services for Core MLIBM Watson Services for Core ML
IBM Watson Services for Core ML
 
独自Documentクラス
独自Documentクラス独自Documentクラス
独自Documentクラス
 
独自Documentクラス
独自Documentクラス独自Documentクラス
独自Documentクラス
 

RFC Viewer開発を通して学ぶ!! iOS開発のパターン化