SlideShare a Scribd company logo
1 of 30
Download to read offline
NSURLConnectionの
デリゲートメソッドと認証
Cocoa勉強会 #47
2011/9/3
Masayuki Nii

1
Agenda

NSURLConnectionを利用した通信処理
状況別のメソッド呼び出し順序

**6月の浦和での勉強会と同じネタ**

2
NSURLConnection+デリゲート

通信のためのクラスNSURLConnection

•

同期通信は1行でできるが、低速なiOSでは使うことは少ない

デリゲートされるメソッドを使って組み込み

•
•

メインスレッドで動かせなくもない
別スレッドを作りそちらで動作させるのがいいかも

3
NSURLConnectionの最低限の使用法
NSURLRequest等からインスタンス化
受信を始めると、以下のメドッドが呼び出される

•

- (void)connection:(NSURLConnection *)connection 
didReceiveData:(NSData *)data

受信が完了すると、以下のメソッドが呼び出される

•

- (void)connectionDidFinishLoading:(NSURLConnection
*)connection

いちおうエラー処理くらいしよう

•

- (void)connection:(NSURLConnection *)connection
didFailWithError:(NSError *)error

4
しかしながら…

これであらゆる場合に対処できるのか?
あらゆるエラーを取得できるのか?
SSLや認証はこれでいいのか?
全メソッドをインプリメントしていろいろな状況で動か
してみる

•
•

プロジェクト:ConnectionTest
テスト:iOS 4.3 (シミュレータ)、Mac OS X Server 10.6.x

5
すべてのデリゲートメソッド(1)

通信前

•

- (NSURLRequest *)connection:(NSURLConnection
*)connection willSendRequest:(NSURLRequest *)request
redirectResponse:(NSURLResponse *)redirectResponse

通信中

•
•

- (void)connection:(NSURLConnection *)connection
didReceiveData:(NSData *)data
- (void)connection:(NSURLConnection *)connection
didReceiveResponse:(NSURLResponse *)response

6
すべてのデリゲートメソッド(2)

通信後

•
•
•

- (void)connectionDidFinishLoading:(NSURLConnection
*)connection
- (void)connection:(NSURLConnection *)connection
didFailWithError:(NSError *)error
- (void)connection:(NSURLConnection *)connection
didSendBodyData:(NSInteger)bytesWritten
totalBytesWritten:(NSInteger)totalBytesWritten
totalBytesExpectedToWrite:
(NSInteger)totalBytesExpectedToWrite

7
すべてのデリゲートメソッド(3)
認証

•
•
•
•

- (BOOL)connectionShouldUseCredentialStorage:
(NSURLConnection *)connection
- (BOOL)connection:(NSURLConnection *)connection
canAuthenticateAgainstProtectionSpace:
(NSURLProtectionSpace *)protectionSpace
- (void)connection:(NSURLConnection *)connection
didReceiveAuthenticationChallenge:
(NSURLAuthenticationChallenge *)challenge
- (void)connection:(NSURLConnection *)connection
didCancelAuthenticationChallenge:
(NSURLAuthenticationChallenge *)challenge

8
- (void)downloadData: (NSString *)urlString
{
NSURL *url = [NSURL URLWithString: urlString];
NSMutableURLRequest *urlRequest = [NSMutableURLRequest requestWithURL: url];
NSLog( @"urlString = %@", urlString );
self.receivedData = [NSMutableData data];
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest: urlRequest
delegate: self];
if ( connection == nil )
{
NSLog( @"ERROR: NSURLConnection is nil" );
}
}
- (void)connection:(NSURLConnection *)connection
didReceiveData:(NSData *)data
{
NSLog( @"Calling: connection:didReceiveData:" );
[self.receivedData appendData: data];
}

基本3メソッド

- (void)connection:(NSURLConnection *)connection
didFailWithError:(NSError *)error
{
NSLog( @"Calling: connection:didFailWithError: %@", error );
self.receivedData = nil;
}
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
NSLog( @"Calling: connectionDidFinishLoading:" );
[connection release];
NSLog( @"receivedData = %@", [[[NSString alloc] initWithData: self.receivedData
encoding: NSUTF8StringEncoding] autorelease] );
self.receivedData = nil;
}
9
- (void)
connection:(NSURLConnection *)connection
didReceiveResponse:(NSURLResponse *)response
{
NSHTTPURLResponse *httpRes = (NSHTTPURLResponse *)response;
NSLog( @"Calling: connection:didReceiveResponse: status code=%d", [httpRes statusCode] );
}
- (void)
connection:(NSURLConnection *)connection
didCancelAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{
NSLog( @"Calling: connection:didCancelAuthenticationChallenge: %@", challenge );
}
- (void)

connection:(NSURLConnection *)connection
didSendBodyData:(NSInteger)bytesWritten
totalBytesWritten:(NSInteger)totalBytesWritten
totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite

{
NSLog( @"Calling: connection:didSendBodyData:totalBytesWritten:totalBytesExpectedToWrite:" );
}
- (NSURLRequest *)connection:(NSURLConnection *)connection
willSendRequest:(NSURLRequest *)request
redirectResponse:(NSURLResponse *)redirectResponse
{
NSLog( @"Calling: connection:willSendRequest:redirectResponse: %@", redirectResponse );
return request;
}
- (BOOL)connectionShouldUseCredentialStorage:(NSURLConnection *)connection
{
NSLog( @"Calling: connectionShouldUseCredentialStorage:" );
return NO;
}
10
ネットワーク関連エラー

11
普通にうまくいった場合

didReceiveResponseが先に呼ばれる

urlString = http://msyk.dyndns.org/test.php
Calling: connection:willSendRequest:redirectResponse: (null)
Calling: connectionShouldUseCredentialStorage:
Calling: connection:didReceiveResponse: status code=200
Calling: connection:didReceiveData:
:
Calling: connection:didReceiveData:
Calling: connectionDidFinishLoading:
receivedData = 012345678901234567890…
12
存在しないファイルにアクセスした場合
didFailWithError:は呼ばれない
didReceiveResponse:でのステータスコードのチェッ
クが必要
urlString = http://msyk.dyndns.org/test1.php
Calling: connection:willSendRequest:redirectResponse: (null)
Calling: connectionShouldUseCredentialStorage:
Calling: connection:didReceiveResponse: status code=404
Calling: connection:didReceiveData:
Calling: connectionDidFinishLoading:
receivedData = <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>404 Not Found</title>
13
存在しないURLに接続しようとした

didFailWithError:が呼び出される
エラーは「サーバが見つからない」
urlString = http://msyk1234.dyndns.org/
Calling: connection:willSendRequest:redirectResponse: (null)
Calling: connectionShouldUseCredentialStorage:
Calling: connection:didFailWithError: Error Domain=NSURLErrorDomain
Code=-1003 "A server with the specified hostname could not be found."
UserInfo=0x7013250 {NSErrorFailingURLStringKey=http://
msyk1234.dyndns.org/, NSErrorFailingURLKey=http://
msyk1234.dyndns.org/, NSLocalizedDescription=A server with the specified
hostname could not be found., NSUnderlyingError=0x7013190 "A server
with the specified hostname could not be found."}
14
DNSの応答がない場合

didFailWithError:が呼び出される
エラーは「タイムアウト」

urlString = http://msyk.dyndns.org/
Calling: connection:willSendRequest:redirectResponse: (null)
Calling: connectionShouldUseCredentialStorage:
Calling: connection:didFailWithError: Error Domain=NSURLErrorDomain
Code=-1001 "The request timed out." UserInfo=0x8b14b50
{NSErrorFailingURLStringKey=http://msyk.dyndns.org/,
NSErrorFailingURLKey=http://msyk.dyndns.org/, NSLocalizedDescription=The
request timed out., NSUnderlyingError=0x8b132d0 "The request timed out."}

15
到達しないIPアドレスを指定した場合

didFailWithError:が呼び出される
エラーは「タイムアウト」
urlString = http://192.168.1.98/
Calling: connection:willSendRequest:redirectResponse: (null)
Calling: connectionShouldUseCredentialStorage:
Calling: connection:didFailWithError: Error
Domain=NSURLErrorDomain Code=-1001 "The request timed out."
UserInfo=0x4b25350 {NSErrorFailingURLStringKey=http://
192.168.1.98/, NSErrorFailingURLKey=http://192.168.1.98/,
NSLocalizedDescription=The request timed out.,
NSUnderlyingError=0x4b22330 "The request timed out."}
16
すべてのネットワーク接続がオフ(1)

didFailWithError:が呼び出される
エラーは「インターネットがオフライン」
urlString = http://msyk.dyndns.org/
Calling: connection:willSendRequest:redirectResponse: (null)
Calling: connectionShouldUseCredentialStorage:
Calling: connection:didFailWithError: Error Domain=NSURLErrorDomain
Code=-1009 "The Internet connection appears to be offline."
UserInfo=0x4b34070 {NSErrorFailingURLStringKey=http://msyk.dyndns.org/,
NSErrorFailingURLKey=http://msyk.dyndns.org/,
NSLocalizedDescription=The Internet connection appears to be offline.,
NSUnderlyingError=0x4b0dbe0 "The Internet connection appears to be
offline."}
17
すべてのネットワーク接続がオフ(2)
URLにIPアドレスを指定した場合
didFailWithError:が呼び出される
エラーは「サーバに接続できない」
urlString = http://10.0.1.1/
Calling: connection:willSendRequest:redirectResponse: (null)
Calling: connectionShouldUseCredentialStorage:
Calling: connection:didFailWithError: Error Domain=NSURLErrorDomain
Code=-1004 "Could not connect to the server." UserInfo=0x4e2fa70
{NSErrorFailingURLStringKey=http://10.0.1.1/, NSErrorFailingURLKey=http://
10.0.1.1/, NSLocalizedDescription=Could not connect to the server.,
NSUnderlyingError=0x4e0c4c0 "Could not connect to the server."}
18
リダイレクト
基本3メソッドだけの場合、何もしなくてもOK
willSendRequest:redirectResponse:の呼び出し2回

urlString = http://msyk.dyndns.org/test.php
Calling: connection:willSendRequest:redirectResponse: (null)
Calling: connectionShouldUseCredentialStorage:
Calling: connection:willSendRequest:redirectResponse: <NSHTTPURLResponse: 0x6834f60>
Calling: connection:didReceiveResponse: status code=200
Calling: connection:didReceiveData:
:
Calling: connection:didReceiveData:
Calling: connectionDidFinishLoading:
receivedData = <html lang="ja">
	

<head>
19
SSL

20
正しい証明書のサイト(1)

基本3メソッドだけの場合、何もしなくても接続可能
認証関連のメソッドを単に組み込んだだけの場合だと、
以下のように通信は正しくできない

urlString = https://msyk.net/
Calling: connection:willSendRequest:redirectResponse: (null)
Calling: connectionShouldUseCredentialStorage:
Calling: connection:canAuthenticateAgainstProtectionSpace: <NSURLProtectionSpace: 0x6502
Calling: connection:didReceiveAuthenticationChallenge: <NSURLAuthenticationChallenge: 0x
****何も受信できていない

21
- (BOOL)
connection:(NSURLConnection *)connection
canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace
{
NSString *authMethod = [protectionSpace authenticationMethod];
NSLog( @"Calling: connection:canAuthenticateAgainstProtectionSpace: "
" auth method=%@/host=%@", authMethod, [protectionSpace host] );
if ( [authMethod isEqualToString: NSURLAuthenticationMethodServerTrust] )
secTrustRef = [protectionSpace serverTrust];
if (secTrustRef != NULL)
{
SecTrustResultType result;
OSErr er = SecTrustEvaluate( secTrustRef, &result );
if ( er != noErr) {
return NO;
}
if ( result == kSecTrustResultRecoverableTrustFailure ) {
NSLog( @"---SecTrustResultRecoverableTrustFailure" );
}
NSLog( @"---Return YES" );
return YES;
}
}
if ( [authMethod isEqualToString: NSURLAuthenticationMethodDefault] ) {
NSLog( @"---Return YES" );
return YES;
}
return NO;

{

}

Security.frameworkも参照しておく必要がある
22
正しい証明書のサイト(2)
- (void)
connection:(NSURLConnection *)connection
didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{
NSLog( @"Calling: connection:didReceiveAuthenticationChallenge: %@", challenge );
NSURLCredential *credential = [NSURLCredential credentialForTrust: secTrustRef];
[[challenge sender] useCredential: credential forAuthenticationChallenge:challenge];
}

認証関連メソッドに対応することで接続できる
確認できない証明書にも対応

urlString = https://msyk.net/
Calling: connection:willSendRequest:redirectResponse: (null)
Calling: connectionShouldUseCredentialStorage:
Calling: connection:canAuthenticateAgainstProtectionSpace: auth method=NSURLAuthenticationMe
---Return YES
Calling: connection:didReceiveAuthenticationChallenge: <NSURLAuthenticationChallenge: 0x4d0818
Calling: connection:didReceiveResponse: status code=200
Calling: connection:didReceiveData:
Calling: connectionDidFinishLoading:
receivedData = <html lang="ja">
23
確認できない証明書(エラーにする場合)
SecTrustEvaluate関数の戻り値

•

kSecTrustResultRecoverableTrustFailureの場合にNOを返す

基本3メソッドではこれと同じ状態
urlString = https://coolnotify.com/
Calling: connection:willSendRequest:redirectResponse: (null)
Calling: connectionShouldUseCredentialStorage:
Calling: connection:canAuthenticateAgainstProtectionSpace: auth
method=NSURLAuthenticationMethodServerTrust/host=coolnotify.com
Calling: connection:didFailWithError: Error Domain=NSURLErrorDomain Code=-1202 "The
certificate for this server is invalid.You might be connecting to a server that is pretending to be
“coolnotify.com” which could put your confidential information at risk." UserInfo=0x4b232e0
{NSErrorFailingURLStringKey=https://coolnotify.com/, NSLocalizedRecoverySuggestion=Would
you like to connect to the server anyway?, NSErrorFailingURLKey=https://coolnotify.com/,
NSLocalizedDescription=The certificate for this server is invalid.You might be connecting to a
server that is pretending to be “coolnotify.com” which could put your confidential information
at risk., NSUnderlyingError=0x4b22c10 "The certificate for this server is invalid.You might be
connecting to a server that is pretending to be “coolnotify.com” which could put your
confidential information at risk.", NSURLErrorFailingURLPeerTrustErrorKey=<SecTrustRef:

24
Authentication

25
- (void)
connection:(NSURLConnection *)connection
didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{
NSLog( @"Calling: connection:didReceiveAuthenticationChallenge: %@", challenge );
if ( [challenge previousFailureCount] == 0 )
{
NSURLCredential *credential
= [NSURLCredential credentialWithUser: @"te"
password: @"te"
persistence: NSURLCredentialPersistenceNone];
[[challenge sender] useCredential: credential
forAuthenticationChallenge:challenge];
} else if ( [challenge previousFailureCount] == 1 )
{
NSURLCredential *credential
= [NSURLCredential credentialWithUser: @"msyk"
password: @"12345678"
persistence: NSURLCredentialPersistenceNone];
[[challenge sender] useCredential: credential
forAuthenticationChallenge:challenge];
} else {
[[challenge sender] cancelAuthenticationChallenge: challenge];
}
}

26
認証に失敗する場合

urlString = https://msyk.net/iphone/
Calling: connection:willSendRequest:redirectResponse: (null)
Calling: connectionShouldUseCredentialStorage:
Calling: connection:canAuthenticateAgainstProtectionSpace: auth
method=NSURLAuthenticationMethodServerTrust/host=msyk.net
---Return YES
Calling: connection:didReceiveAuthenticationChallenge: <NSURLAuthenticationChallenge: 0x4b25fd0
Calling: connection:canAuthenticateAgainstProtectionSpace: auth
method=NSURLAuthenticationMethodDefault/host=msyk.net
---Return YES
Calling: connection:didReceiveAuthenticationChallenge: <NSURLAuthenticationChallenge: 0x4b2413
Calling: connection:canAuthenticateAgainstProtectionSpace: auth
method=NSURLAuthenticationMethodDefault/host=msyk.net
---Return YES
Calling: connection:didReceiveAuthenticationChallenge: <NSURLAuthenticationChallenge: 0x9b00b2
Calling: connection:didFailWithError: Error Domain=NSURLErrorDomain Code=-1012 "The operat
couldn’t be completed. (NSURLErrorDomain error -1012.)" UserInfo=0x890d7e0
{NSErrorFailingURLKey=https://msyk.net/iphone/, NSErrorFailingURLStringKey=https://msyk.net/
iphone/}
27
認証に1度失敗し、2度目に成功する場合

urlString = https://msyk.net/iphone/
Calling: connection:willSendRequest:redirectResponse: (null)
Calling: connectionShouldUseCredentialStorage:
Calling: connection:canAuthenticateAgainstProtectionSpace: auth
method=NSURLAuthenticationMethodServerTrust/host=msyk.net
---Return YES
Calling: connection:didReceiveAuthenticationChallenge: <NSURLAuthenticationChallenge: 0x9a030e0
Calling: connection:canAuthenticateAgainstProtectionSpace: auth
method=NSURLAuthenticationMethodDefault/host=msyk.net
---Return YES
Calling: connection:didReceiveAuthenticationChallenge: <NSURLAuthenticationChallenge: 0x700ae90
Calling: connection:canAuthenticateAgainstProtectionSpace: auth
method=NSURLAuthenticationMethodDefault/host=msyk.net
---Return YES
Calling: connection:didReceiveAuthenticationChallenge: <NSURLAuthenticationChallenge: 0x4e0a6f0
Calling: connection:didReceiveResponse: status code=200
Calling: connection:didReceiveData:
Calling: connectionDidFinishLoading:
receivedData = <?xml version="1.0" encoding="UTF-8"?>…

28
その他

なぜかdidCancelAuthenticationChallenge:はコールさ
れなかった
connectionShouldUseCredentialStorageの返り値に
よる違いないとしか思えない

29
まとめ

NSURLConnectionはネットワークに関係なく生成
didReceiveResponse:メソッドでステータスコード
didFailWithError:が呼び出されれば通信エラー
認証への対応はメソッドへの応答として記述する
認証とSSLの両方があるときには要注意

30

More Related Content

What's hot

Passwords#14 - mimikatz
Passwords#14 - mimikatzPasswords#14 - mimikatz
Passwords#14 - mimikatzBenjamin Delpy
 
CQURE_BHAsia19_Paula_Januszkiewicz_slides
CQURE_BHAsia19_Paula_Januszkiewicz_slidesCQURE_BHAsia19_Paula_Januszkiewicz_slides
CQURE_BHAsia19_Paula_Januszkiewicz_slidesZuzannaKornecka
 
DUMP-2013 Serverside - О хранилище “Зебра” - Казаков Александр
DUMP-2013 Serverside - О хранилище “Зебра” - Казаков АлександрDUMP-2013 Serverside - О хранилище “Зебра” - Казаков Александр
DUMP-2013 Serverside - О хранилище “Зебра” - Казаков Александрit-people
 
Metaprogramming with JavaScript
Metaprogramming with JavaScriptMetaprogramming with JavaScript
Metaprogramming with JavaScriptTimur Shemsedinov
 
Webinar slides: How to Secure MongoDB with ClusterControl
Webinar slides: How to Secure MongoDB with ClusterControlWebinar slides: How to Secure MongoDB with ClusterControl
Webinar slides: How to Secure MongoDB with ClusterControlSeveralnines
 
BlueHat v17 || Detecting Compromise on Windows Endpoints with Osquery
BlueHat v17 || Detecting Compromise on Windows Endpoints with Osquery BlueHat v17 || Detecting Compromise on Windows Endpoints with Osquery
BlueHat v17 || Detecting Compromise on Windows Endpoints with Osquery BlueHat Security Conference
 
Black Hat Europe 2017. DPAPI and DPAPI-NG: Decryption Toolkit
Black Hat Europe 2017. DPAPI and DPAPI-NG: Decryption ToolkitBlack Hat Europe 2017. DPAPI and DPAPI-NG: Decryption Toolkit
Black Hat Europe 2017. DPAPI and DPAPI-NG: Decryption ToolkitPaula Januszkiewicz
 
MongoDB Europe 2016 - Debugging MongoDB Performance
MongoDB Europe 2016 - Debugging MongoDB PerformanceMongoDB Europe 2016 - Debugging MongoDB Performance
MongoDB Europe 2016 - Debugging MongoDB PerformanceMongoDB
 
New kid on the block node.js
New kid on the block node.jsNew kid on the block node.js
New kid on the block node.jsJoel Divekar
 
Node 관계형 데이터베이스_바인딩
Node 관계형 데이터베이스_바인딩Node 관계형 데이터베이스_바인딩
Node 관계형 데이터베이스_바인딩HyeonSeok Choi
 
Mongodb index 讀書心得
Mongodb index 讀書心得Mongodb index 讀書心得
Mongodb index 讀書心得cc liu
 
Webinaire 2 de la série « Retour aux fondamentaux » : Votre première applicat...
Webinaire 2 de la série « Retour aux fondamentaux » : Votre première applicat...Webinaire 2 de la série « Retour aux fondamentaux » : Votre première applicat...
Webinaire 2 de la série « Retour aux fondamentaux » : Votre première applicat...MongoDB
 
Getting started with replica set in MongoDB
Getting started with replica set in MongoDBGetting started with replica set in MongoDB
Getting started with replica set in MongoDBKishor Parkhe
 
Open SSL and MS Crypto API EKON21
Open SSL and MS Crypto API EKON21Open SSL and MS Crypto API EKON21
Open SSL and MS Crypto API EKON21Max Kleiner
 
Cracking JWT tokens: a tale of magic, Node.JS and parallel computing - Node.j...
Cracking JWT tokens: a tale of magic, Node.JS and parallel computing - Node.j...Cracking JWT tokens: a tale of magic, Node.JS and parallel computing - Node.j...
Cracking JWT tokens: a tale of magic, Node.JS and parallel computing - Node.j...Luciano Mammino
 
Cassandra summit 2013 - DataStax Java Driver Unleashed!
Cassandra summit 2013 - DataStax Java Driver Unleashed!Cassandra summit 2013 - DataStax Java Driver Unleashed!
Cassandra summit 2013 - DataStax Java Driver Unleashed!Michaël Figuière
 

What's hot (20)

Passwords#14 - mimikatz
Passwords#14 - mimikatzPasswords#14 - mimikatz
Passwords#14 - mimikatz
 
CQURE_BHAsia19_Paula_Januszkiewicz_slides
CQURE_BHAsia19_Paula_Januszkiewicz_slidesCQURE_BHAsia19_Paula_Januszkiewicz_slides
CQURE_BHAsia19_Paula_Januszkiewicz_slides
 
DUMP-2013 Serverside - О хранилище “Зебра” - Казаков Александр
DUMP-2013 Serverside - О хранилище “Зебра” - Казаков АлександрDUMP-2013 Serverside - О хранилище “Зебра” - Казаков Александр
DUMP-2013 Serverside - О хранилище “Зебра” - Казаков Александр
 
Metaprogramming with JavaScript
Metaprogramming with JavaScriptMetaprogramming with JavaScript
Metaprogramming with JavaScript
 
Webinar slides: How to Secure MongoDB with ClusterControl
Webinar slides: How to Secure MongoDB with ClusterControlWebinar slides: How to Secure MongoDB with ClusterControl
Webinar slides: How to Secure MongoDB with ClusterControl
 
MongoDB - Ekino PHP
MongoDB - Ekino PHPMongoDB - Ekino PHP
MongoDB - Ekino PHP
 
BlueHat v17 || Detecting Compromise on Windows Endpoints with Osquery
BlueHat v17 || Detecting Compromise on Windows Endpoints with Osquery BlueHat v17 || Detecting Compromise on Windows Endpoints with Osquery
BlueHat v17 || Detecting Compromise on Windows Endpoints with Osquery
 
Black Hat Europe 2017. DPAPI and DPAPI-NG: Decryption Toolkit
Black Hat Europe 2017. DPAPI and DPAPI-NG: Decryption ToolkitBlack Hat Europe 2017. DPAPI and DPAPI-NG: Decryption Toolkit
Black Hat Europe 2017. DPAPI and DPAPI-NG: Decryption Toolkit
 
MongoDB Europe 2016 - Debugging MongoDB Performance
MongoDB Europe 2016 - Debugging MongoDB PerformanceMongoDB Europe 2016 - Debugging MongoDB Performance
MongoDB Europe 2016 - Debugging MongoDB Performance
 
New kid on the block node.js
New kid on the block node.jsNew kid on the block node.js
New kid on the block node.js
 
Node 관계형 데이터베이스_바인딩
Node 관계형 데이터베이스_바인딩Node 관계형 데이터베이스_바인딩
Node 관계형 데이터베이스_바인딩
 
ION Bangladesh - DANE, DNSSEC, and TLS Testing in the Go6lab
ION Bangladesh - DANE, DNSSEC, and TLS Testing in the Go6labION Bangladesh - DANE, DNSSEC, and TLS Testing in the Go6lab
ION Bangladesh - DANE, DNSSEC, and TLS Testing in the Go6lab
 
Php
PhpPhp
Php
 
Mongodb index 讀書心得
Mongodb index 讀書心得Mongodb index 讀書心得
Mongodb index 讀書心得
 
Webinaire 2 de la série « Retour aux fondamentaux » : Votre première applicat...
Webinaire 2 de la série « Retour aux fondamentaux » : Votre première applicat...Webinaire 2 de la série « Retour aux fondamentaux » : Votre première applicat...
Webinaire 2 de la série « Retour aux fondamentaux » : Votre première applicat...
 
Getting started with replica set in MongoDB
Getting started with replica set in MongoDBGetting started with replica set in MongoDB
Getting started with replica set in MongoDB
 
Open SSL and MS Crypto API EKON21
Open SSL and MS Crypto API EKON21Open SSL and MS Crypto API EKON21
Open SSL and MS Crypto API EKON21
 
Javantura v2 - Replication with MongoDB - what could go wrong... - Philipp Krenn
Javantura v2 - Replication with MongoDB - what could go wrong... - Philipp KrennJavantura v2 - Replication with MongoDB - what could go wrong... - Philipp Krenn
Javantura v2 - Replication with MongoDB - what could go wrong... - Philipp Krenn
 
Cracking JWT tokens: a tale of magic, Node.JS and parallel computing - Node.j...
Cracking JWT tokens: a tale of magic, Node.JS and parallel computing - Node.j...Cracking JWT tokens: a tale of magic, Node.JS and parallel computing - Node.j...
Cracking JWT tokens: a tale of magic, Node.JS and parallel computing - Node.j...
 
Cassandra summit 2013 - DataStax Java Driver Unleashed!
Cassandra summit 2013 - DataStax Java Driver Unleashed!Cassandra summit 2013 - DataStax Java Driver Unleashed!
Cassandra summit 2013 - DataStax Java Driver Unleashed!
 

More from Masayuki Nii

Framework Enabling End-Users to Maintain Web Applications (ICICWS2015)
Framework Enabling End-Users to Maintain Web Applications (ICICWS2015)Framework Enabling End-Users to Maintain Web Applications (ICICWS2015)
Framework Enabling End-Users to Maintain Web Applications (ICICWS2015)Masayuki Nii
 
トップエスイー勉強会2014第1回-INTER-Mediator
トップエスイー勉強会2014第1回-INTER-Mediatorトップエスイー勉強会2014第1回-INTER-Mediator
トップエスイー勉強会2014第1回-INTER-MediatorMasayuki Nii
 
Cocoa勉強会#62-新しい通信クラス群NSURLSessionを使ってみる
Cocoa勉強会#62-新しい通信クラス群NSURLSessionを使ってみるCocoa勉強会#62-新しい通信クラス群NSURLSessionを使ってみる
Cocoa勉強会#62-新しい通信クラス群NSURLSessionを使ってみるMasayuki Nii
 
Cocoa勉強会#34-iPhoneでタブバーを非表示に無理矢理する方法
Cocoa勉強会#34-iPhoneでタブバーを非表示に無理矢理する方法Cocoa勉強会#34-iPhoneでタブバーを非表示に無理矢理する方法
Cocoa勉強会#34-iPhoneでタブバーを非表示に無理矢理する方法Masayuki Nii
 
Cocoa勉強会#61-メインスレッド外でNSURLConnection
Cocoa勉強会#61-メインスレッド外でNSURLConnectionCocoa勉強会#61-メインスレッド外でNSURLConnection
Cocoa勉強会#61-メインスレッド外でNSURLConnectionMasayuki Nii
 
Cocoa勉強会#23-カスタムシートとModality
Cocoa勉強会#23-カスタムシートとModalityCocoa勉強会#23-カスタムシートとModality
Cocoa勉強会#23-カスタムシートとModalityMasayuki Nii
 
Cocoa勉強会#6-SQLiteをCocoaで使う
Cocoa勉強会#6-SQLiteをCocoaで使うCocoa勉強会#6-SQLiteをCocoaで使う
Cocoa勉強会#6-SQLiteをCocoaで使うMasayuki Nii
 
Cocoa勉強会#60-Common Cryptoを使った共通鍵の暗号と復号
Cocoa勉強会#60-Common Cryptoを使った共通鍵の暗号と復号Cocoa勉強会#60-Common Cryptoを使った共通鍵の暗号と復号
Cocoa勉強会#60-Common Cryptoを使った共通鍵の暗号と復号Masayuki Nii
 
Cocoa勉強会#57-Baseによるローカライズまとめ
Cocoa勉強会#57-BaseによるローカライズまとめCocoa勉強会#57-Baseによるローカライズまとめ
Cocoa勉強会#57-BaseによるローカライズまとめMasayuki Nii
 
Cocoa勉強会#56-小ネタ集あなたの常識はすでに通用しない
Cocoa勉強会#56-小ネタ集あなたの常識はすでに通用しないCocoa勉強会#56-小ネタ集あなたの常識はすでに通用しない
Cocoa勉強会#56-小ネタ集あなたの常識はすでに通用しないMasayuki Nii
 
Cocoa勉強会#45-AWS SimpleDBを使ってみる
Cocoa勉強会#45-AWS SimpleDBを使ってみるCocoa勉強会#45-AWS SimpleDBを使ってみる
Cocoa勉強会#45-AWS SimpleDBを使ってみるMasayuki Nii
 
Cocoa勉強会#36-iPhone OS 3.0で変更されたテーブルビュー
Cocoa勉強会#36-iPhone OS 3.0で変更されたテーブルビューCocoa勉強会#36-iPhone OS 3.0で変更されたテーブルビュー
Cocoa勉強会#36-iPhone OS 3.0で変更されたテーブルビューMasayuki Nii
 
Cocoa勉強会#33-意外に楽に使えるlibcurl
Cocoa勉強会#33-意外に楽に使えるlibcurlCocoa勉強会#33-意外に楽に使えるlibcurl
Cocoa勉強会#33-意外に楽に使えるlibcurlMasayuki Nii
 
Cocoa勉強会#28-OpenSSLで暗号化したファイルを復号する
Cocoa勉強会#28-OpenSSLで暗号化したファイルを復号するCocoa勉強会#28-OpenSSLで暗号化したファイルを復号する
Cocoa勉強会#28-OpenSSLで暗号化したファイルを復号するMasayuki Nii
 
Cocoa勉強会#27-QuickLookプラグインの作り方
Cocoa勉強会#27-QuickLookプラグインの作り方Cocoa勉強会#27-QuickLookプラグインの作り方
Cocoa勉強会#27-QuickLookプラグインの作り方Masayuki Nii
 
Cocoa勉強会23-識別情報の変換〜文字エンコードとデータタイプ
Cocoa勉強会23-識別情報の変換〜文字エンコードとデータタイプCocoa勉強会23-識別情報の変換〜文字エンコードとデータタイプ
Cocoa勉強会23-識別情報の変換〜文字エンコードとデータタイプMasayuki Nii
 
Cocoa勉強会#37-シェイクイベントの実装
Cocoa勉強会#37-シェイクイベントの実装Cocoa勉強会#37-シェイクイベントの実装
Cocoa勉強会#37-シェイクイベントの実装Masayuki Nii
 
Cocoa勉強会#32-表形式のデータに順序を記録する方法
Cocoa勉強会#32-表形式のデータに順序を記録する方法Cocoa勉強会#32-表形式のデータに順序を記録する方法
Cocoa勉強会#32-表形式のデータに順序を記録する方法Masayuki Nii
 
Cocoa勉強会#35-iPhoneでのコピペとカスタムUI
Cocoa勉強会#35-iPhoneでのコピペとカスタムUICocoa勉強会#35-iPhoneでのコピペとカスタムUI
Cocoa勉強会#35-iPhoneでのコピペとカスタムUIMasayuki Nii
 
Cocoa勉強会#38-UITableViewテーブル内のナビゲーション
Cocoa勉強会#38-UITableViewテーブル内のナビゲーションCocoa勉強会#38-UITableViewテーブル内のナビゲーション
Cocoa勉強会#38-UITableViewテーブル内のナビゲーションMasayuki Nii
 

More from Masayuki Nii (20)

Framework Enabling End-Users to Maintain Web Applications (ICICWS2015)
Framework Enabling End-Users to Maintain Web Applications (ICICWS2015)Framework Enabling End-Users to Maintain Web Applications (ICICWS2015)
Framework Enabling End-Users to Maintain Web Applications (ICICWS2015)
 
トップエスイー勉強会2014第1回-INTER-Mediator
トップエスイー勉強会2014第1回-INTER-Mediatorトップエスイー勉強会2014第1回-INTER-Mediator
トップエスイー勉強会2014第1回-INTER-Mediator
 
Cocoa勉強会#62-新しい通信クラス群NSURLSessionを使ってみる
Cocoa勉強会#62-新しい通信クラス群NSURLSessionを使ってみるCocoa勉強会#62-新しい通信クラス群NSURLSessionを使ってみる
Cocoa勉強会#62-新しい通信クラス群NSURLSessionを使ってみる
 
Cocoa勉強会#34-iPhoneでタブバーを非表示に無理矢理する方法
Cocoa勉強会#34-iPhoneでタブバーを非表示に無理矢理する方法Cocoa勉強会#34-iPhoneでタブバーを非表示に無理矢理する方法
Cocoa勉強会#34-iPhoneでタブバーを非表示に無理矢理する方法
 
Cocoa勉強会#61-メインスレッド外でNSURLConnection
Cocoa勉強会#61-メインスレッド外でNSURLConnectionCocoa勉強会#61-メインスレッド外でNSURLConnection
Cocoa勉強会#61-メインスレッド外でNSURLConnection
 
Cocoa勉強会#23-カスタムシートとModality
Cocoa勉強会#23-カスタムシートとModalityCocoa勉強会#23-カスタムシートとModality
Cocoa勉強会#23-カスタムシートとModality
 
Cocoa勉強会#6-SQLiteをCocoaで使う
Cocoa勉強会#6-SQLiteをCocoaで使うCocoa勉強会#6-SQLiteをCocoaで使う
Cocoa勉強会#6-SQLiteをCocoaで使う
 
Cocoa勉強会#60-Common Cryptoを使った共通鍵の暗号と復号
Cocoa勉強会#60-Common Cryptoを使った共通鍵の暗号と復号Cocoa勉強会#60-Common Cryptoを使った共通鍵の暗号と復号
Cocoa勉強会#60-Common Cryptoを使った共通鍵の暗号と復号
 
Cocoa勉強会#57-Baseによるローカライズまとめ
Cocoa勉強会#57-BaseによるローカライズまとめCocoa勉強会#57-Baseによるローカライズまとめ
Cocoa勉強会#57-Baseによるローカライズまとめ
 
Cocoa勉強会#56-小ネタ集あなたの常識はすでに通用しない
Cocoa勉強会#56-小ネタ集あなたの常識はすでに通用しないCocoa勉強会#56-小ネタ集あなたの常識はすでに通用しない
Cocoa勉強会#56-小ネタ集あなたの常識はすでに通用しない
 
Cocoa勉強会#45-AWS SimpleDBを使ってみる
Cocoa勉強会#45-AWS SimpleDBを使ってみるCocoa勉強会#45-AWS SimpleDBを使ってみる
Cocoa勉強会#45-AWS SimpleDBを使ってみる
 
Cocoa勉強会#36-iPhone OS 3.0で変更されたテーブルビュー
Cocoa勉強会#36-iPhone OS 3.0で変更されたテーブルビューCocoa勉強会#36-iPhone OS 3.0で変更されたテーブルビュー
Cocoa勉強会#36-iPhone OS 3.0で変更されたテーブルビュー
 
Cocoa勉強会#33-意外に楽に使えるlibcurl
Cocoa勉強会#33-意外に楽に使えるlibcurlCocoa勉強会#33-意外に楽に使えるlibcurl
Cocoa勉強会#33-意外に楽に使えるlibcurl
 
Cocoa勉強会#28-OpenSSLで暗号化したファイルを復号する
Cocoa勉強会#28-OpenSSLで暗号化したファイルを復号するCocoa勉強会#28-OpenSSLで暗号化したファイルを復号する
Cocoa勉強会#28-OpenSSLで暗号化したファイルを復号する
 
Cocoa勉強会#27-QuickLookプラグインの作り方
Cocoa勉強会#27-QuickLookプラグインの作り方Cocoa勉強会#27-QuickLookプラグインの作り方
Cocoa勉強会#27-QuickLookプラグインの作り方
 
Cocoa勉強会23-識別情報の変換〜文字エンコードとデータタイプ
Cocoa勉強会23-識別情報の変換〜文字エンコードとデータタイプCocoa勉強会23-識別情報の変換〜文字エンコードとデータタイプ
Cocoa勉強会23-識別情報の変換〜文字エンコードとデータタイプ
 
Cocoa勉強会#37-シェイクイベントの実装
Cocoa勉強会#37-シェイクイベントの実装Cocoa勉強会#37-シェイクイベントの実装
Cocoa勉強会#37-シェイクイベントの実装
 
Cocoa勉強会#32-表形式のデータに順序を記録する方法
Cocoa勉強会#32-表形式のデータに順序を記録する方法Cocoa勉強会#32-表形式のデータに順序を記録する方法
Cocoa勉強会#32-表形式のデータに順序を記録する方法
 
Cocoa勉強会#35-iPhoneでのコピペとカスタムUI
Cocoa勉強会#35-iPhoneでのコピペとカスタムUICocoa勉強会#35-iPhoneでのコピペとカスタムUI
Cocoa勉強会#35-iPhoneでのコピペとカスタムUI
 
Cocoa勉強会#38-UITableViewテーブル内のナビゲーション
Cocoa勉強会#38-UITableViewテーブル内のナビゲーションCocoa勉強会#38-UITableViewテーブル内のナビゲーション
Cocoa勉強会#38-UITableViewテーブル内のナビゲーション
 

Recently uploaded

Vertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsVertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsMiki Katsuragi
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...Fwdays
 
SAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxSAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxNavinnSomaal
 
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostLeverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostZilliz
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii SoldatenkoFwdays
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationSlibray Presentation
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024Stephanie Beckett
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Commit University
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr BaganFwdays
 
Powerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time ClashPowerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time Clashcharlottematthew16
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024Lonnie McRorey
 
Search Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfSearch Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfRankYa
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsMark Billinghurst
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Manik S Magar
 
DSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningDSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningLars Bell
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupFlorian Wilhelm
 
Artificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxArtificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxhariprasad279825
 

Recently uploaded (20)

Vertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsVertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering Tips
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
 
SAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxSAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptx
 
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostLeverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck Presentation
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan
 
Powerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time ClashPowerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time Clash
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024
 
Search Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfSearch Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdf
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR Systems
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
DMCC Future of Trade Web3 - Special Edition
DMCC Future of Trade Web3 - Special EditionDMCC Future of Trade Web3 - Special Edition
DMCC Future of Trade Web3 - Special Edition
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!
 
DSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningDSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine Tuning
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project Setup
 
Artificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxArtificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptx
 

Cocoa勉強会#47-NSURLConnectionのデリゲートメソッドと認証