SlideShare une entreprise Scribd logo
1  sur  37
Blocksの活用
                   iOS版 

            Hidetoshi Mori
自己紹介

森 英寿

Facebook hidetoshi.mori
Twitter: @h_mori
フリーランスプログラマ
自己紹介

主開発言語

Java/.net/Objective-C/Ruby/PHP

アプリ開発実績

SOICHA iPhone (TweetMe)
ATND暦
Blocks?                 ?



iOS4, MacOSX 10.6から導入
無名関数、クロージャ、 Lambda
Blocksの利点
メソッド定義なく関数を記述できる

関数を変数のように扱える

performedSelectorの代わりに使える

別のソースから処理の差込が行える

まとまった処理の記述が可能
Blocksの構文
^戻り値の型(引数リスト){処理} (実装)
 ^NSInteger(NSInteger i){ return i++; }
 ^{ NSLog(@”block”); }
  ※戻り値の型voidと(引数無し)は省略可

戻り値の型 (^Block変数名)(引数リスト); (宣言)
 id (^block)(NSArray *array, NSUInteger index);
 void (^block)(void);
Block内の自動変数
int val = 1;
void (^block)(void) = ^{NSLog(@”val=%d”, val)};
val = 2;
block(); //blockの実行

> val=1

 Block定義時点のローカル変数がコピーされる
__block指定子
__block int val = 1;
void (^block)(void) = ^{val=2)};
block();
NSLog(@”val=%d”, val);

> val=2

  Blockスコープを超えるには__blockを使う
Blockの格納領域
グローバル(データ)領域 (グローバル変数領域)
  _NSConcreteGlobalBlock

ヒープ領域 (オブジェクト変数領域)
  _NSConcreteMallocBlock

スタック領域 (ローカル変数領域)
  _NSConcreteStackBlock
Blockのコピー
Blockはプリミティブ変数らしきもの
 スタック領域Blockはスコープ終了後、破棄される

Blockを維持するためヒープ領域に手動コピーが必要
 Blockのpropertyは基本 copy で宣言する
Block内変数のコピー
BlockコピーでBlock内変数は浅いコピーになる

ARC時
 BlockはBlock内変数の__strong参照を保持

非ARC時
 Blockは__blockがないBlock内変数をretainする
Blockによる循環参照
BlockのBlock内変数への強参照による循環参照
@property (retain) NSMutableArray array;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-(void)addBlock {
  id block = ^{
     [self method];             self         array
  };
  [array addObject block];
}
                                       block
Blockによる循環参照回避
BlockのBlock内変数への参照を弱参照にする
@property (retain) NSMutableArray array;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-(void)addBlock {
  __block __weak MyClass *weakSelf = self;
  id block = ^{
                                 self          array
     [weakSelf method];
  };
  [array addObject block];
}                                        block
循環参照の予防策
deallocにサウンドBreakPointを設定
BlocksKitの紹介
BSD, MITライセンス

iOS4、MacOSX 10.6以上

A2DynamicDelegateが必要
A2DynamicDelegateの紹介
AssociatedObjectを利用した動的な読込を可能にする
 動的なインスタンス変数の差し込み
 動的なプロトコルの差し込み

カテゴリでインスタンス変数のような仕組みを作れる
BlocksKitの導入手順
BlocksKit/A2DynamicDelegate/に2クラスをコピー
  A2BlockDelegaete、A2DynamicDelegate
自分のプロジェクトにBlocksKit.xcodeprojを追加
libBlocksKit.a、MessageUI.frameworkを追加
その他リンカフラグに「-ObjC -all_load」を追加
ヘッダ検索パスに/BlocksKit**を設定
pchにBlocksKit/BlocksKit.hをimport
BlocksKitの便利メソッド
UIActionSheet#addButtonWithTitle:handler:
- (void)showSheet1 {
    UIActionSheet *sheet1 = [UIActionSheet actionSheetWithTitle:@"Sheet"];
    if (condition1) {
         [sheet1 addButtonWithTitle:@"Action1" handler:^(void) {
            //Action1の処理
       }];
    }
    [sheet1 setCancelButtonIndex:[sheet addButtonWithTitle:@"Close"]];
    [sheet1 showInView:self.view];
}
BlocksKitの便利メソッド
UIAlertView#addButtonWithTitle:handler:
UIAlertView *alert =
[UIAlertView alertViewWithTitle:@"Alert" message:@"UIAlertView Test"];
[alert addButtonWithTitle:@"Action" handler:^(void) {
    NSLog(@"Action");
}];
[alert addButtonWithTitle:@"Close"];
[alert show];
BlocksKitの便利メソッド
NSURLConnection#startConnectionWithRequest:successHandler:

NSURLRequest *req =
[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://d.hatena.ne.jp/h_mori/"]];

[NSURLConnection startConnectionWithRequest:req
               successHandler:^(NSURLConnection *con, NSURLResponse *res, NSData *data){
                   NSString *html =
                   [[[NSString alloc] initWithData:data encoding:NSJapaneseEUCStringEncoding] autorelease];
                   NSLog(@"html=%@", html);
               }
               failureHandler:^(NSURLConnection *con, NSError *err){
                    NSLog(@"NSURLConnection failed : %@", [err localizedDescription]);
               }];
BlocksKitの便利メソッド
UIWebView#didFinishLoadBlock
UIWebView#didFinishWithErrorBlock
UIWebView *webView = [[[UIWebView alloc] init] autorelease];
webView.didFinishLoadBlock = ^(UIWebView *v) {
   NSLog(@"didFinishLoadBlock");
};
webView.didFinishWithErrorBlock = ^(UIWebView *v, NSError *err) {
   NSLog(@"didFinishWithErrorBlock");
};
[webView.dynamicDelegate webViewDidFinishLoad:webView];
[webView loadRequest:[NSURLRequest requestWithURL:[NSURL
URLWithString:@"http://d.hatena.ne.jp/h_mori/"]]];
BlocksKitの便利メソッド
MFMailComposeViewController#completionBlock
MFMailComposeViewController *ctl =
[[[MFMailComposeViewController alloc] init] autorelease];
ctl.mailComposeDelegate = self;
ctl.completionBlock = ^(MFMailComposeViewController *controller,
MFMailComposeResult result, NSError *err){
   if (result == MFMailComposeResultSent) {
        //成功時の処理
  }
};
[self presentModalViewController:ctl animated:YES];
BlocksKitの便利メソッド
UIControl#addEventHandler:forControlEvents:
UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
button.frame = CGRectMake(40, 20, 240, 44);
[button setTitle:@"Caption" forState:UIControlStateNormal];
[button addEventHandler:^(id sender) {
    //Action
} forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:button];
BlocksKitの便利メソッド
UIBarButtonItem#initWithBarButtonSystemItem:handler:
self.navigationItem.leftBarButtonItem =
[[[UIBarButtonItem alloc]
    initWithBarButtonSystemItem:UIBarButtonSystemItemCancel
    handler:^(id sender) {
        //Cancel Action
    }] autorelease];
BlocksKitの便利メソッド
UIGestureRecognizer#initWithHandler:
UISwipeGestureRecognizer *swipe =
[[UISwipeGestureRecognizer alloc]
    initWithHandler:^(UIGestureRecognizer *sender, UIGestureRecognizerState state,
CGPoint location){
        //Swipe Action
    }];
[self.view addGestureRecognizer:swipe];
BlocksKitの便利メソッド
NSObject#performBlock:
[NSObject performBlock:^(void) {
   NSLog(@"fire");
} afterDelay:1];
BlocksKitの便利メソッド
NSTimer#scheduledTimerWithTimeInterval:block:
[NSTimer scheduledTimerWithTimeInterval:1
 block:^(NSTimeInterval time) {
    //action every 1 sec.
 }
 repeats:YES];
UITableViewのカテゴリ拡張
UITableViewはDelegate, DataSourceを利用する

カテゴリはインスタンス変数を保持できない
 A2DynamicDelegateを使って動的に保持
UITableViewの拡張
  A2DynamicUITableViewDelegateの実装
- (void)tableView:(UITableView *)tableView
    didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
	     id realDelegate = self.realDelegate;
	     if (realDelegate && [realDelegate
respondsToSelector:@selector(tableView:didSelectRowAtIndexPath:)]) {
	     	     [realDelegate tableView:tableView didSelectRowAtIndexPath:indexPath];
   }
   NSString *key = [NSString stringWithFormat:@”%@_%@_%@”,
        kHandlerDidSelectRow, indexPath.section, indexPath.row];
   BKTableViewBlock block = [self.handlers objectForKey:key];
   if (block) {
        ((BKTableViewBlock)block)(tableView, indexPath);
   }
}
UITableViewの拡張
    UITableView (BlocksKitExtends)
- (id)initWithFrame:(CGRect)frame
    style:(UITableViewStyle)style
    delegate:(id)delegate
    dataSource:(id)dataSource {
    UITableView *tableView = [self initWithFrame:frame style:style];
    tableView.delegate = self.dynamicDelegate;
    ((A2DynamicDelegate *)self.dynamicDelegate).realDelegate = delegate;

    tableView.dataSource = self.dynamicDataSource;
    ((A2DynamicDelegate *)self.dynamicDataSource).realDelegate = dataSource;

    return tableView;
}
UITableViewの拡張
  UITableView (BlocksKitExtends)
typedef void (^BKTableViewBlock)(UITableView *tableView, NSIndexPath *indexPath);

- (void)setHandler:(BKTableViewBlock)block
    forDidSelectRowAtIndexPath:(NSIndexPath *)indexPath {
   NSString *key = [NSString stringWithFormat:@”%@_%@_%@”,
        kHandlerDidSelectRow, indexPath.section, indexPath.row];
   if (block) {
	     	    [[self.dynamicDelegate handlers] setObject:block forKey:key];
   } else {
	     	    [[self.dynamicDelegate handlers] removeObjectForKey:key];
   }
   [self setHandler:block forKey:key target:self.dynamicDelegate];
}
UITableViewの拡張
    使い方
- (UITableViewCell *)tableView:(UITableView *)tableView
   cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@”Cell”];
	    if (cell == nil) {
	    	     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1
              reuseIdentifier:@”Cell”] autorelease];
	    }
	    if (indexPath.section == 0) {
   	       cell.textLabel.text = [_rows objectAtIndex:indexPath.row];
   	       [tableView setHandler:^(UITableView *tv, NSIndexPath *ip){
   
       
     //Cell選択時の処理
    	        } forDidSelectRowAtIndexPath:indexPath];
	       }
	       return cell;
}
UIViewControllerの基底拡張
UIViewControllerのView LifesycleでBlock差込を行う
  loadView:
  viewDidLoad:
  viewWillAppear:
  viewDidAppear:
  viewWillDisappear:
  viewDidDisappear:
UIViewControllerの基底拡張
BaseViewController

 void (^_viewWillAppearBlock)(BOOL);

 - (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    if (_viewWillAppearBlock) {
        _viewWillAppearBlock(animated);
    }
 }
UIViewControllerの基底拡張
画面の遷移管理に使える
     callback block for B


       viewWillAppear:
                            B
     execute block from B


           A
     callback block for C


       viewWillAppear:
                            C
     execute block from C




利点:B,CはAを意識する必要がない(疎結合になる)
まとめ
Blockの活用により疎結合な構成が組みやすくなる

Delegateパターンを使わなくてよくなる

performedSelectorを使わなくてよくなる

循環参照に注意
ご清聴ありがとうございました
     m(_ _)m

Contenu connexe

Tendances

iOSビヘイビア駆動開発
iOSビヘイビア駆動開発iOSビヘイビア駆動開発
iOSビヘイビア駆動開発Brian Gesiak
 
JavaScript/CSS 2015 Autumn
JavaScript/CSS 2015 AutumnJavaScript/CSS 2015 Autumn
JavaScript/CSS 2015 AutumnKoji Ishimoto
 
FxUG in Toyama - ASphalt2 container -
FxUG in Toyama - ASphalt2 container -FxUG in Toyama - ASphalt2 container -
FxUG in Toyama - ASphalt2 container -Akio Katayama
 
Pro aspnetmvc3framework chap19
Pro aspnetmvc3framework chap19Pro aspnetmvc3framework chap19
Pro aspnetmvc3framework chap19Hideki Hashizume
 
Active Directoryデータのプロパティ出力(Output Properties)
Active Directoryデータのプロパティ出力(Output Properties)Active Directoryデータのプロパティ出力(Output Properties)
Active Directoryデータのプロパティ出力(Output Properties)Michio Koyama
 
はじめてのVue.js
はじめてのVue.jsはじめてのVue.js
はじめてのVue.jsKei Yagi
 
LINQ 概要 + 結構便利な LINQ to XML
LINQ 概要 + 結構便利な LINQ to XMLLINQ 概要 + 結構便利な LINQ to XML
LINQ 概要 + 結構便利な LINQ to XMLShinichiAoyagi
 
Vue.jsの関連ツール・ライブラリ(Vuex, Vue-Router, Nuxt)
Vue.jsの関連ツール・ライブラリ(Vuex, Vue-Router, Nuxt)Vue.jsの関連ツール・ライブラリ(Vuex, Vue-Router, Nuxt)
Vue.jsの関連ツール・ライブラリ(Vuex, Vue-Router, Nuxt)Kei Yagi
 
CoreData 非同期データ処理
CoreData 非同期データ処理CoreData 非同期データ処理
CoreData 非同期データ処理次朗 永島
 
はじめてのCouch db
はじめてのCouch dbはじめてのCouch db
はじめてのCouch dbEiji Kuroda
 
Easy Going Groovy(Groovyを気軽に使いこなそう)
Easy Going Groovy(Groovyを気軽に使いこなそう)Easy Going Groovy(Groovyを気軽に使いこなそう)
Easy Going Groovy(Groovyを気軽に使いこなそう)Uehara Junji
 
Vue.js 基礎 + Vue CLI の使い方
Vue.js 基礎 + Vue CLI の使い方Vue.js 基礎 + Vue CLI の使い方
Vue.js 基礎 + Vue CLI の使い方Kei Yagi
 
Vue Router + Vuex
Vue Router + VuexVue Router + Vuex
Vue Router + VuexKei Yagi
 
T90 きっと怖くないmvvm & mvpvm
T90 きっと怖くないmvvm & mvpvmT90 きっと怖くないmvvm & mvpvm
T90 きっと怖くないmvvm & mvpvm伸男 伊藤
 
Type Safe Assets Handling in Swift
Type Safe Assets Handling in SwiftType Safe Assets Handling in Swift
Type Safe Assets Handling in SwiftKazunobu Tasaka
 
ADRという考えを取り入れてみて
ADRという考えを取り入れてみてADRという考えを取り入れてみて
ADRという考えを取り入れてみてinfinite_loop
 

Tendances (20)

iOSビヘイビア駆動開発
iOSビヘイビア駆動開発iOSビヘイビア駆動開発
iOSビヘイビア駆動開発
 
jQuery超入門編
jQuery超入門編jQuery超入門編
jQuery超入門編
 
Try Jetpack
Try JetpackTry Jetpack
Try Jetpack
 
JavaScript/CSS 2015 Autumn
JavaScript/CSS 2015 AutumnJavaScript/CSS 2015 Autumn
JavaScript/CSS 2015 Autumn
 
FxUG in Toyama - ASphalt2 container -
FxUG in Toyama - ASphalt2 container -FxUG in Toyama - ASphalt2 container -
FxUG in Toyama - ASphalt2 container -
 
Pro aspnetmvc3framework chap19
Pro aspnetmvc3framework chap19Pro aspnetmvc3framework chap19
Pro aspnetmvc3framework chap19
 
Active Directoryデータのプロパティ出力(Output Properties)
Active Directoryデータのプロパティ出力(Output Properties)Active Directoryデータのプロパティ出力(Output Properties)
Active Directoryデータのプロパティ出力(Output Properties)
 
はじめてのVue.js
はじめてのVue.jsはじめてのVue.js
はじめてのVue.js
 
LINQ 概要 + 結構便利な LINQ to XML
LINQ 概要 + 結構便利な LINQ to XMLLINQ 概要 + 結構便利な LINQ to XML
LINQ 概要 + 結構便利な LINQ to XML
 
ゲンバのSwift
ゲンバのSwiftゲンバのSwift
ゲンバのSwift
 
Vue.jsの関連ツール・ライブラリ(Vuex, Vue-Router, Nuxt)
Vue.jsの関連ツール・ライブラリ(Vuex, Vue-Router, Nuxt)Vue.jsの関連ツール・ライブラリ(Vuex, Vue-Router, Nuxt)
Vue.jsの関連ツール・ライブラリ(Vuex, Vue-Router, Nuxt)
 
CoreData 非同期データ処理
CoreData 非同期データ処理CoreData 非同期データ処理
CoreData 非同期データ処理
 
はじめてのCouch db
はじめてのCouch dbはじめてのCouch db
はじめてのCouch db
 
Easy Going Groovy(Groovyを気軽に使いこなそう)
Easy Going Groovy(Groovyを気軽に使いこなそう)Easy Going Groovy(Groovyを気軽に使いこなそう)
Easy Going Groovy(Groovyを気軽に使いこなそう)
 
Vue.js 基礎 + Vue CLI の使い方
Vue.js 基礎 + Vue CLI の使い方Vue.js 基礎 + Vue CLI の使い方
Vue.js 基礎 + Vue CLI の使い方
 
Vue Router + Vuex
Vue Router + VuexVue Router + Vuex
Vue Router + Vuex
 
T90 きっと怖くないmvvm & mvpvm
T90 きっと怖くないmvvm & mvpvmT90 きっと怖くないmvvm & mvpvm
T90 きっと怖くないmvvm & mvpvm
 
Type Safe Assets Handling in Swift
Type Safe Assets Handling in SwiftType Safe Assets Handling in Swift
Type Safe Assets Handling in Swift
 
ADRという考えを取り入れてみて
ADRという考えを取り入れてみてADRという考えを取り入れてみて
ADRという考えを取り入れてみて
 
swooleを試してみた
swooleを試してみたswooleを試してみた
swooleを試してみた
 

En vedette

コンシューマアプリを作るということ
コンシューマアプリを作るということコンシューマアプリを作るということ
コンシューマアプリを作るということHidetoshi Mori
 
20130216 magical record
20130216 magical record20130216 magical record
20130216 magical recordHidetoshi Mori
 
Framerで始めるプロトタイプコーディング
Framerで始めるプロトタイプコーディングFramerで始めるプロトタイプコーディング
Framerで始めるプロトタイプコーディングmasaaki komori
 
プロジェクト管理しないという提案
プロジェクト管理しないという提案プロジェクト管理しないという提案
プロジェクト管理しないという提案Hidetoshi Mori
 
最適化超入門
最適化超入門最適化超入門
最適化超入門Takami Sato
 
How to Make Awesome SlideShares: Tips & Tricks
How to Make Awesome SlideShares: Tips & TricksHow to Make Awesome SlideShares: Tips & Tricks
How to Make Awesome SlideShares: Tips & TricksSlideShare
 
Getting Started With SlideShare
Getting Started With SlideShareGetting Started With SlideShare
Getting Started With SlideShareSlideShare
 

En vedette (12)

Facebook api for iOS
Facebook api for iOSFacebook api for iOS
Facebook api for iOS
 
20130216 小ネタ集
20130216 小ネタ集20130216 小ネタ集
20130216 小ネタ集
 
コンシューマアプリを作るということ
コンシューマアプリを作るということコンシューマアプリを作るということ
コンシューマアプリを作るということ
 
20130216 magical record
20130216 magical record20130216 magical record
20130216 magical record
 
Storyboard
StoryboardStoryboard
Storyboard
 
Evernote連携
Evernote連携Evernote連携
Evernote連携
 
Photo mosaic 検証
Photo mosaic 検証Photo mosaic 検証
Photo mosaic 検証
 
Framerで始めるプロトタイプコーディング
Framerで始めるプロトタイプコーディングFramerで始めるプロトタイプコーディング
Framerで始めるプロトタイプコーディング
 
プロジェクト管理しないという提案
プロジェクト管理しないという提案プロジェクト管理しないという提案
プロジェクト管理しないという提案
 
最適化超入門
最適化超入門最適化超入門
最適化超入門
 
How to Make Awesome SlideShares: Tips & Tricks
How to Make Awesome SlideShares: Tips & TricksHow to Make Awesome SlideShares: Tips & Tricks
How to Make Awesome SlideShares: Tips & Tricks
 
Getting Started With SlideShare
Getting Started With SlideShareGetting Started With SlideShare
Getting Started With SlideShare
 

Similaire à Blocksの活用法

ハイブリッドアプリへのLocalytics導入ガイド
ハイブリッドアプリへのLocalytics導入ガイドハイブリッドアプリへのLocalytics導入ガイド
ハイブリッドアプリへのLocalytics導入ガイドLocalyticsJP
 
Spring mvc
Spring mvcSpring mvc
Spring mvcRyo Asai
 
RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介
RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介
RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介Fumiya Sakai
 
20130924 Picomon CRH勉強会
20130924 Picomon CRH勉強会20130924 Picomon CRH勉強会
20130924 Picomon CRH勉強会Yukihiro Kitazawa
 
FxUG in Toyama - ASphalt2 container -
FxUG in Toyama - ASphalt2 container -FxUG in Toyama - ASphalt2 container -
FxUG in Toyama - ASphalt2 container -Akio Katayama
 
Let's build a simple app with .net 6 asp.net core web api, react, and elasti...
Let's build a simple app with  .net 6 asp.net core web api, react, and elasti...Let's build a simple app with  .net 6 asp.net core web api, react, and elasti...
Let's build a simple app with .net 6 asp.net core web api, react, and elasti...Shotaro Suzuki
 
JavaFX 2.0 - リッチクライアントのためのUI基盤
JavaFX 2.0 - リッチクライアントのためのUI基盤JavaFX 2.0 - リッチクライアントのためのUI基盤
JavaFX 2.0 - リッチクライアントのためのUI基盤Yuichi Sakuraba
 
OpenGLプログラミング
OpenGLプログラミングOpenGLプログラミング
OpenGLプログラミング幸雄 村上
 
Google App Engine for Java
Google App Engine for JavaGoogle App Engine for Java
Google App Engine for JavaTakuya Tsuchida
 
「Windows 8 ストア アプリ開発 tips」 hokuriku.net vol.11 (2013年1月26日)
「Windows 8 ストア アプリ開発 tips」  hokuriku.net vol.11 (2013年1月26日)「Windows 8 ストア アプリ開発 tips」  hokuriku.net vol.11 (2013年1月26日)
「Windows 8 ストア アプリ開発 tips」 hokuriku.net vol.11 (2013年1月26日)Fujio Kojima
 
LabVIEW NXG Web Module Training Slide
LabVIEW NXG Web Module Training SlideLabVIEW NXG Web Module Training Slide
LabVIEW NXG Web Module Training SlideYusuke Tochigi
 
Cakephp2.1 ViewBlock view-inheritance
Cakephp2.1 ViewBlock view-inheritanceCakephp2.1 ViewBlock view-inheritance
Cakephp2.1 ViewBlock view-inheritanceKohji Tanaka
 
20120422i phonedeveloperworkshoppublished
20120422i phonedeveloperworkshoppublished20120422i phonedeveloperworkshoppublished
20120422i phonedeveloperworkshoppublishedYoichiro Sakurai
 
WKWebViewとUIWebView
WKWebViewとUIWebViewWKWebViewとUIWebView
WKWebViewとUIWebViewYuki Hirai
 

Similaire à Blocksの活用法 (20)

Ll xcode
Ll xcodeLl xcode
Ll xcode
 
Swiftyを試す
Swiftyを試すSwiftyを試す
Swiftyを試す
 
ハイブリッドアプリへのLocalytics導入ガイド
ハイブリッドアプリへのLocalytics導入ガイドハイブリッドアプリへのLocalytics導入ガイド
ハイブリッドアプリへのLocalytics導入ガイド
 
Mvc conf session_4_ono
Mvc conf session_4_onoMvc conf session_4_ono
Mvc conf session_4_ono
 
20110607
2011060720110607
20110607
 
Spring mvc
Spring mvcSpring mvc
Spring mvc
 
iOS WebView App
iOS WebView AppiOS WebView App
iOS WebView App
 
RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介
RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介
RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介
 
20130924 Picomon CRH勉強会
20130924 Picomon CRH勉強会20130924 Picomon CRH勉強会
20130924 Picomon CRH勉強会
 
FxUG in Toyama - ASphalt2 container -
FxUG in Toyama - ASphalt2 container -FxUG in Toyama - ASphalt2 container -
FxUG in Toyama - ASphalt2 container -
 
Let's build a simple app with .net 6 asp.net core web api, react, and elasti...
Let's build a simple app with  .net 6 asp.net core web api, react, and elasti...Let's build a simple app with  .net 6 asp.net core web api, react, and elasti...
Let's build a simple app with .net 6 asp.net core web api, react, and elasti...
 
Wicket勉強会2
Wicket勉強会2Wicket勉強会2
Wicket勉強会2
 
JavaFX 2.0 - リッチクライアントのためのUI基盤
JavaFX 2.0 - リッチクライアントのためのUI基盤JavaFX 2.0 - リッチクライアントのためのUI基盤
JavaFX 2.0 - リッチクライアントのためのUI基盤
 
OpenGLプログラミング
OpenGLプログラミングOpenGLプログラミング
OpenGLプログラミング
 
Google App Engine for Java
Google App Engine for JavaGoogle App Engine for Java
Google App Engine for Java
 
「Windows 8 ストア アプリ開発 tips」 hokuriku.net vol.11 (2013年1月26日)
「Windows 8 ストア アプリ開発 tips」  hokuriku.net vol.11 (2013年1月26日)「Windows 8 ストア アプリ開発 tips」  hokuriku.net vol.11 (2013年1月26日)
「Windows 8 ストア アプリ開発 tips」 hokuriku.net vol.11 (2013年1月26日)
 
LabVIEW NXG Web Module Training Slide
LabVIEW NXG Web Module Training SlideLabVIEW NXG Web Module Training Slide
LabVIEW NXG Web Module Training Slide
 
Cakephp2.1 ViewBlock view-inheritance
Cakephp2.1 ViewBlock view-inheritanceCakephp2.1 ViewBlock view-inheritance
Cakephp2.1 ViewBlock view-inheritance
 
20120422i phonedeveloperworkshoppublished
20120422i phonedeveloperworkshoppublished20120422i phonedeveloperworkshoppublished
20120422i phonedeveloperworkshoppublished
 
WKWebViewとUIWebView
WKWebViewとUIWebViewWKWebViewとUIWebView
WKWebViewとUIWebView
 

Plus de Hidetoshi Mori

20130515 diary euglena_en
20130515 diary euglena_en20130515 diary euglena_en
20130515 diary euglena_enHidetoshi Mori
 
Nodejsによるapiサーバ構築事例
Nodejsによるapiサーバ構築事例Nodejsによるapiサーバ構築事例
Nodejsによるapiサーバ構築事例Hidetoshi Mori
 
mongodbの簡易ストレージ化
mongodbの簡易ストレージ化mongodbの簡易ストレージ化
mongodbの簡易ストレージ化Hidetoshi Mori
 
汎用apiサーバの構築
汎用apiサーバの構築汎用apiサーバの構築
汎用apiサーバの構築Hidetoshi Mori
 
UITableViewで無限CoverFlowを作る
UITableViewで無限CoverFlowを作るUITableViewで無限CoverFlowを作る
UITableViewで無限CoverFlowを作るHidetoshi Mori
 
モバイルビジネスの動向
モバイルビジネスの動向モバイルビジネスの動向
モバイルビジネスの動向Hidetoshi Mori
 
インタラクションデザインの考察
インタラクションデザインの考察インタラクションデザインの考察
インタラクションデザインの考察Hidetoshi Mori
 
モバイルビジネスの動向
モバイルビジネスの動向モバイルビジネスの動向
モバイルビジネスの動向Hidetoshi Mori
 
サービス開発における工程
サービス開発における工程サービス開発における工程
サービス開発における工程Hidetoshi Mori
 
ゲリラ的サービスの育て方
ゲリラ的サービスの育て方ゲリラ的サービスの育て方
ゲリラ的サービスの育て方Hidetoshi Mori
 
インタラクションデザインの考察
インタラクションデザインの考察インタラクションデザインの考察
インタラクションデザインの考察Hidetoshi Mori
 
Presentation of TapkuLibrary
Presentation of TapkuLibraryPresentation of TapkuLibrary
Presentation of TapkuLibraryHidetoshi Mori
 

Plus de Hidetoshi Mori (15)

Git超入門
Git超入門Git超入門
Git超入門
 
20130515 diary euglena_en
20130515 diary euglena_en20130515 diary euglena_en
20130515 diary euglena_en
 
Nodejsによるapiサーバ構築事例
Nodejsによるapiサーバ構築事例Nodejsによるapiサーバ構築事例
Nodejsによるapiサーバ構築事例
 
mongodbの簡易ストレージ化
mongodbの簡易ストレージ化mongodbの簡易ストレージ化
mongodbの簡易ストレージ化
 
汎用apiサーバの構築
汎用apiサーバの構築汎用apiサーバの構築
汎用apiサーバの構築
 
UITableViewで無限CoverFlowを作る
UITableViewで無限CoverFlowを作るUITableViewで無限CoverFlowを作る
UITableViewで無限CoverFlowを作る
 
モバイルビジネスの動向
モバイルビジネスの動向モバイルビジネスの動向
モバイルビジネスの動向
 
インタラクションデザインの考察
インタラクションデザインの考察インタラクションデザインの考察
インタラクションデザインの考察
 
モバイルビジネスの動向
モバイルビジネスの動向モバイルビジネスの動向
モバイルビジネスの動向
 
サービス開発における工程
サービス開発における工程サービス開発における工程
サービス開発における工程
 
ゲリラ的サービスの育て方
ゲリラ的サービスの育て方ゲリラ的サービスの育て方
ゲリラ的サービスの育て方
 
インタラクションデザインの考察
インタラクションデザインの考察インタラクションデザインの考察
インタラクションデザインの考察
 
Presentation of TapkuLibrary
Presentation of TapkuLibraryPresentation of TapkuLibrary
Presentation of TapkuLibrary
 
Facebook API for iOS
Facebook API for iOSFacebook API for iOS
Facebook API for iOS
 
FacebookAPI for iOS
FacebookAPI for iOSFacebookAPI for iOS
FacebookAPI for iOS
 

Dernier

PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000Shota Ito
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Danieldanielhu54
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxAtomu Hidaka
 
UPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdfUPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdffurutsuka
 

Dernier (7)

PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
 
UPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdfUPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdf
 

Blocksの活用法

Notes de l'éditeur

  1. \n
  2. \n
  3. \n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n
  18. \n
  19. \n
  20. \n
  21. \n
  22. \n
  23. \n
  24. \n
  25. \n
  26. \n
  27. \n
  28. \n
  29. \n
  30. \n
  31. \n
  32. \n
  33. \n
  34. \n
  35. \n
  36. \n
  37. \n