Amazon Campaign

ラベル プログラミング の投稿を表示しています。 すべての投稿を表示
ラベル プログラミング の投稿を表示しています。 すべての投稿を表示

2018年8月10日金曜日

チームの出欠管理サービス BitScheduler を公開しました

先日、チームの出欠管理を行うWebサービス「BitScheduler」を公開しました。
Googleカレンダーと連携しており、カレンダーに予定を登録するだけで出欠が管理できます。
チーム専用のURLが発行されるので、メンバーはいつでも最新の予定を確認できます。

予定一覧画面

出欠投稿画面

投稿一覧画面


初期設定は少々面倒ですが、はじめだけなので、日々の運用はチョーラクチンになるはずです。
よかったら使ってみてご意見ください!

チームの出欠管理サービス「BitScheduler」


2017年5月13日土曜日

Developer Tools 上の Sources が更新されないときは

Chrome のデベロッパーツール上で参照している JavaScript などのソースがリロードされないときはスパーリロードを試しましょう。


  • Mac : Cmd + Shift + "R"
  • Windows : Ctrl + Shift + "R"


2016年12月2日金曜日

GoogleAppEngineLauncher のデプロイで 403 エラーになる場合の解決方法

MacのGoogleAppEngineLauncherを使ってデプロイするときに 403 エラーになることがあります。

エラーの出力例
Starting update of app: **********, version: 4
12:38 AM Getting current resource limits.
2016-12-02 00:38:08,108 ERROR appcfg.py:2455 An error occurred processing file '': HTTP Error 403: Forbidden Unexpected HTTP status 403. Aborting. 
Error 403: --- begin server output ---
You do not have permission to modify this app (app_id=u'**********').
--- end server output ---
If deploy fails you might need to 'rollback' manually.
The "Make Symlinks..." menu option can help with command-line work.
*** appcfg.py has finished with exit code 1 ***

*** Running dev_appserver with the following flags:
    --skip_sdk_update_check=yes --port=8080 --admin_port=8000
Python command: /usr/bin/python2.7
INFO     2016-12-01 22:00:41,793 devappserver2.py:769] Skipping SDK update check.
INFO     2016-12-01 22:00:41,845 api_server.py:205] Starting API server at: http://localhost:62864
INFO     2016-12-01 22:00:41,850 dispatcher.py:197] Starting module "default" running at: http://localhost:8080
INFO     2016-12-01 22:00:41,853 admin_server.py:116] Starting admin server at: http://localhost:8000


そんな時は、まずGoogleAppEngineLauncherの"Control"メニューから"Clear Deployment Credential"を実行してみましょう。



ググってみると、「異なるアカウントでの認証がキャッシュされている」とか「Google Cloud Platform のサービスアカウントが異なる」とか色々と解決策があるようですが、クリアして再認証するのが簡単です。

2016年10月8日土曜日

Evernote Cloud SDK を Xcode8 で使う際の keychain error 回避方法

「Evernote Cloud SDK 2.0 for iOS」を利用しているアプリを Xcode8 へ移行すると、OAuth でのログイン後に下記エラーが発生します。

2016-10-08 10:02:39.407 VocabularyCards[27586:2139298] Error saving to keychain: Error Domain=com.samsoffes.ENSSKeychain Code=-34018 "errSecDefault" UserInfo={NSLocalizedDescription=errSecDefault} -34018
2016-10-08 10:02:39.409 VocabularyCards[27586:2139298] Error getting password from keychain: Error Domain=com.samsoffes.ENSSKeychain Code=-25300 "errSecItemNotFound" UserInfo={NSLocalizedDescription=errSecItemNotFound}

Xcode8 から keychain を利用する際はアプリのターゲット設定での宣言が必要になったようで、下記設定をすれば解決します。

TARGETS 設定 > Capabilities > Keychain Sharing を "ON"


2015年12月14日月曜日

Calendar API を使って認証なしで公開カレンダーを取得する

先日まで下記URLのような Google Calendar の feed にて公開カレンダーのデータを Json で取得できていたのですが、400エラーが返ってくるようになってしまいました。

https://www.google.com/calendar/feeds/{カレンダーID}/public/embed?ctz=Asia%%2FTokyo&singleevents=true&start-min=2015-12-13T00%%3A00%%3A00%%2B09%%3A00&orderby=starttime&sortorder=ascend&alt=json


そこで、Google Calendar API v3 を使って取得する方法を調べたので解説します。
手順は以下のとおりです。

1)APIs Explorer でのURLと出力フォーマット確認
2)カレンダーIDの確認
3)API Key の取得


APIs Explorer でのURLと出力フォーマット確認

まず、APIs Explorer を使って希望する処理のリクエストURLとレスポンスフォーマットを確認します。

https://developers.google.com/apis-explorer/#p/calendar/v3/


カレンダーIDの確認

取得するカレンダーデータのカレンダーIDを確認します。
確認方法はGoogle Calendarのページで対象カレンダーのドロップダウンメニューから
「カレンダー設定」→設定項目の「カレンダーのアドレス」
に記載されています。

「カレンダー設定」メニュー


カレンダーID


API Keyの取得

クエリパラメタに API Key を付与することで、公開カレンダーであれば認証なしで取得できます。


API Key の取得手順は下記URLに記載されています。

https://support.google.com/cloud/answer/6158862



リクエストURL


パラメタ「カレンダーID」と「API Key」を付与したリクエストURLか下記のようになります。

例)カレンダーリストを取得する場合

https://www.googleapis.com/calendar/v3/calendars/{カレンダーID}/events?orderBy=startTime&singleEvents=true&timeMin=2015-12-13T00%3A00%3A00Z&key={API Key}



ちなみに、開始日時の昇順で取得するため "orderBy=startTime" とし、その場合くり返しイベントを省くパラメタ "singleEvents=true" は必須のようです。


2015年8月23日日曜日

Eclipse MARS でのCVS設定方法

巷はバージョン管理といえばGit全盛ですが、最新の Eclipse 4.5 MARS にてCVSへ接続しようとしたところ、以前と異なり苦労しました。

なぜかEclipseに組み込みの extssh がなくなってしまったので外部のSSHクライアントを利用し接続します。以下手順です。

1) SSHクライアントをインストールする。今回はWindows環境なので、sshクライアント "putty" をインストールしました。
2) Eclipse の下記メニューを開く。

[Window] -> [Preferences] -> [Team] -> [CVS] -> [Ext Connection Method]

3) 設定 [User an external program to connect] を選択する。
4) 設定項目 [CVS_RSH] にインストールした putty に含まれる "plink.exe" を指定する。
5) 設定項目 [Parameters] に下記を指定する。

"-l {user} -pw {password} {host}"
6) [OK] を押す。



7) CVSパースペクティブ "CVS Repository Exploring" を開く。
8) Repository の追加を選択する。
9) CVS設定 > 設定項目 [Connection type] で "ext" を選択する。
10) [Host][Repository path][User][Password] を入力する。
11) [OK] を押す。


以上で接続できました。

2014年9月15日月曜日

PHP で rest する時は var_dump() に注意しましょう

FuelPHP で RestAPI 組んでいて、「なんか出力が2重にされるなぁ。なんでかなぁ?」と悩んだら、どこかで var_dump() していないかを疑いましょう。レスポンスの body に出力されちゃいますよ!

PHPer ならきっと誰でも注意していることなんですよね。まる1日悩んでしまいました。。。(TT)

でも解決してよかった!

2014年8月18日月曜日

【紹介】はじめてのフレームワークとしての FuelPHP 第2版 実践編

この度「はじめてのフレームワークとしての FuelPHP 第2版 実践編」(鈴木憲治 著)をご提供いただいたので紹介したいと思います。 (憲治さん、遅くなってしまいスミマセン。。。)

はじめてのフレームワークとしてのFuelPHP第2版(3) 実践編
鈴木憲治
達人出版会
発行日: 2014-04-23
対応フォーマット: EPUB, PDF

 FuelPHP のオンラインマニュアルはAPIリファレンス的な構成となっているため、用意されている様々な機能を応用しにくく感じていました。
この書籍は「実践編」と銘打っているだけあって、実際のアプリケーション構築の際に必要とされるであろう事項に対して、Fuelを使っていかに実装するかが書かれており非常に実践的です。実際の開発現場できっと役立つと思います。

 そんな中で特に有用だと感じたのは、アプリケーションレイヤー毎のテスト方法について詳しく書かれている点です。例えば「4.7 モデルのテスト」では、データベース上への効率的なテストデータ作成方法や、「第6章 コントローラのユニットテスト」では通常はテストし難いコントローラのテストを AspectMock を用いて行う方法が書かれています。今回はそれぞれ簡単に紹介してみようと思います。

モデルのユニットテスト

モデルをテストするためには事前にデータベース上にテストデータを格納しておく必要があります。ボクは今まで Fuel の Orm\Model クラスを利用してテストデータを作成していました。

 例)Orm\Model を使ったテストデータの作成例
$u = Model_User::forge(array(
    'username' => '担当1',
    'password' => 'KWd27qfZtlw9qbEVMe5v2zRnZUuC0Eqa330cdN+9lro=',
    'email' => 'hoge@hoge.jp',
    'last_login' => '2013-08-30 00:00:00',
    'created_user' => 1,
));
$u->save();

$g = Model_Group::forge(array(
        'name' => 'グループ1',
        'status' => 0,
        'created_user' => 1,
));
$g->save();

書籍では YAML ファイルでテストデータを記述して、Fuel の Format クラスを使ってデータ登録する方法が紹介されています。この方が保守性も汎用性も高くよいですね。さっそく現場で活用できそうです。

 例)YAML ファイルを使ったテストデータの作成(書籍からの引用)
id: 1
name: 小野小町
email: komachi@example.jp
comment: |
    花の色は移りにけりないたづらに
    我が身世にふるながめせし間に
ip_address: 192.168.1.1
user_agent: Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:11.0) Gecko/20100101 Firefox/11.0
created_at: 1333524234
updated_at: 1333524234
-
id: 2
name: 文屋康秀
email: yasuhide@example.jp
comment: |
    吹くからに秋の草木のしをるれば
    むべ山風を嵐といふらむ
ip_address: 10.10.10.10
user_agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:9.0.1) Gecko/20100101 Firefox/9.0.1
created_at: 1333534305
updated_at: 1333534305

上記 YAML を下記コードで配列にして DB へインサート出来ちゃいます。

$data = file_get_contents($fixt_file);
$data = Format::forge($data, static::$file_type)->to_array();

foreach ($data as $row) {
    DB::insert($table)->set($row)->execute();
}

また、ボクは Format クラスの存在を知らなかったのですが便利なクラスですね。YAML 以外にも様々なファイルフォーマットに変換可能で下記フォーマットに対応していて今後活躍してくれそうです。

  • CVS
  • XML
  • json
  • シリアライズ文字列
  • xml:ns


コントローラのユニットテスト

コントローラのユニットテストとして「AspectMock」というモックアップツールを使った方法が紹介されています。 コントローラのユニットテストは難しいのでボクはユニットテストは諦めて、テストサーバを立てて PHPUnit_Extensions_Selenium2TestCase によるUIテストによる自動化を行ってきましたが、AspectMock を使えば簡単にユニットテストができます。
例えば static メソッドである Validation::run() で true を返させたい場合はコントローラを呼ぶ前に下記コードを呼んでおくだけです。

use AspectMock\Test as test;

・・・略・・・

test::double('Fuel\Core\Validation', ['run' => true]);

// HMVCリクエストを実行
$response = Request::forge('form/confirm')->execute()->response();

便利ですねぇ。もう明日からでも使いたい気分です。 他にも

  • 2.1.5 独自検証ルールの作成
  • 2.3 ファンクショナルテストの追加
  • 第7章 コードカバレッジ解析

など、現場で即活用したい内容が目白押しです。すでにFuelを利用している方にはとても役立つ書籍だと思うのでオススメです。


はじめてのフレームワークとしてのFuelPHP第2版(3) 実践編
鈴木憲治
達人出版会
発行日: 2014-04-23
対応フォーマット: EPUB, PDF

2013年12月4日水曜日

FuelPHP カスタムSQLの実行時のエスケープ

FuelPHP の DB への問い合せは SQL を抽象化した「Query Builder」を使いますが、where句が複雑な場合や副問い合せを行う場合などはメソッド呼び出しが多くなりコードの見通しが悪くなってしまうので、直接 SQL を記述したくなります。

例)Query Builder を使う場合


// 下記SQLを Query Builder を使って記述すると
// SELECT * FROM `users` WHERE `name` != "John" AND `surname` = "Doe"
// AND (`email` = "jim@jim.com" OR `email` = "haha@joke.com")

// 下記のようになります。

$query = DB::select('*')->from('users');

// 最初の where ステートメントをセット
$query->where('name', '!=', 'John');

// あたらしい条件を追加
$query->and_where('surname', 'Doe');

// ネストした where をコールバックで
$query->where(function($query){
    $query->where('email', 'jim@jim.com')
        ->or_where('email', 'haha@joke.com');
});

例)SQL を直接記述する場合

SQL を直接記述する際は DB::query() を使いますが、この場合 Query Builder で行われていた値のエスケープは行われませんので、DB::quote() を使って個別に行います。quate() はエスケープの他にもメソッド名の通りクウォーテーションもしてくれます。

$name = DB::quate($name);
$surname = DB::quate($surname);
$email1 = DB::quate($email1);
$email2 = DB::quate($email2);

$query = "SELECT * FROM users WHERE name != $name AND surname = $surname AND (email = $email1 OR email = $email2)";
$users = DB::query($query, DB::SELECT)->as_object('Model_User')->execute();

FuelPHP UA判定に mbstring 拡張モジュールは不要

UserAgent は Agent クラスで判定する

PHP で UserAgent を判定する場合、mbstring 拡張モジュールをインストールし mb_ereg() 関数などを使って判定しますが、FuelPHP を使っている場合は Agent クラスを使って判定することができます。

例)IE9 未満の判定

// IE9 未満の場合は専用の CSS を出力する
if(Agent::browser() == 'IE' and Agent::version() < 9) {
    echo Asset::css('ie.css');
}

2013年10月6日日曜日

FuelPHP を Google App Engine for PHP で動かす

FuelPHP を GoogleAppEngine for PHP (gae)で動かしてみました。

※2013/10/14 ひとまずデプロイして動作するようになったので記事を更新しました。
※2013/10/16 log出力パッチを公開しました。

環境

GoogleAppEngineLauncher(GAEの開発環境)が Webサーバも兼ねているので Apache は不要です。


  • OSX 10.8.5
  • GoogleAppEngineLauncher 1.8.5
  • PHP 5.4.20
  • FuelPHP 1.6


まずは環境定義をします


GAE にデプロイすると当然 URL がローカルとは異なりますので、とりあえずローカルとデプロイ先で環境を切り替えるように定義しておきます。ここではローカルを "development" デプロイ先を "production" とします。Fuel はサーバ変数 "FUEL_ENV"  の値で切り替えられます。GAE の場合は app.yaml で定義可能です。

env_variables:
  FUEL_ENV: 'production'
#  FUEL_ENV: 'development'


app.yaml でリクエストをハンドルする


FuelPHP は全てのリクエストを /public/index.php に処理させる仕組みとなっているので、/public/assets 配下へのアクセスは静的ファイルとしてアクセスさせる必要があります。
そのハンドリングを標準では Apache の .htaccess で行いますが Google App Engine では、それをアプリケーション設定ファイルである app.yaml の handlers で指定してあげます。同様に favicon.ico についても静的ファイルとして設定します。


handlers:
 
# assets dir
- url: /assets
  static_dir: public/assets
 
# favicon file
- url: /favicon.ico
  static_files: favicon.ico
  upload: favicon.ico
 
# php files
- url: /.*
  script: public/index.php


ローカル環境ではこれだけで動いてくれるのですが、GAE に上げると色々あり、以降の設定が必要です。

localでの起動画面
ローカルでは動くのですが。。。


base_url を設定する



GAE に上げた際の URL を定義します。production 環境でのみ有効となるように、production 用の設定ファイルである下記ファイルへ定義します。必要な項目のみ差分で定義できます。


/fuel/app/config/production/config.php

'base_url' => 'http://{your_app_id}.appspot.com/',


logファイルは出力できないのでパッチを作りました


GAE 上ではlogファイルの出力は行えませんので、下記設定で出力しないようにすることで回避は可能です。

/fuel/app/config/production/config.php

'log_threshold'    => Fuel::L_NONE,


ただ、これでは実用的ではありませんので Fuel の Logクラスを改修して、GAE でログ出力を行うためのパッチを作成しました。単純に /fuel/core/classes/log.php のファイル出力部分を syslog() に置き換えただけです。GitHub に公開しましたので自由に使ってください。

https://github.com/isatan/FuelPHP4Gae_patch


/fuel/core/classes/log.php を置き換えるだけで下記のように GAE のコンソールに出力されるようになります。

log をファイル出力すると 500 エラーにもかかわらず何も出力されません。

パッチをあててもらうと Fuel の log 出力も debug log も出力できます。

locale を指定する


Fuel のデフォルト locale は "en_US" ですが、GAE では指定できないようです。いくつか試したところ、Cロケールは認識してくれました。

/fuel/app/config/production/config.php
'locale' => 'C',


assets 関連ファイルは絶対 URL で指定する


どういうわけか、base_url を指定しているのもかかわらず assetes 関連のファイルを見つけてくれず、bootstrap.css の読み込みでエラーになってしまいます。assets 用の設定ファイルに下記の設定することでエラー時に強制実行させることができますが、それでは link タグを出力してくれません。

 /fuel/app/config/production/asset.php


'fail_silently' => true,


仕方がないので view ファイルでの assets 関連ファイルの指定は絶対 URL で指定することにします。

/fuel/app/views/welcome/index.php

echo Asset::css('http://{your app id}.appspot.com/assets/css/bootstrap.css');



動きました

これで FuelPHP の welcome 画面は表示できるようになりました。ここで修正した app.yaml, config.php, log.php は GitHub に上げてありますので自由に使ってください。

https://github.com/isatan/FuelPHP4Gae_patch

ただ、assets ファイルの指定はいただけないので今後なんとかしたいですね。


ようやく appspot.com 上でも Welcome! が拝めました。


2013年10月5日土曜日

FuelPHP まとめ

仕事で利用したPHPのフレームワーク「FuelPHP」がとても便利だったのでコツをまとめておきます。順次以下を項目を予定。




2013年10月4日金曜日

FuelPHP 実行したSQLクエリをdebugログに出力する

FuelPHPで実行したSQLをログに出力する場合、DB::last_query() を使います。最後に実行したSQLが取得できるので、Model内のクエリメソッド内で出力させるといいですね。
$result = DB::query("select * from productusers where product_id = $product_id", DB::SELECT)->as_object('Model_Productuser')->execute();
Log::debug('[sql:'.get_called_class().']'.DB::last_query());

2013年1月18日金曜日

EvernoteAPIでのノートの検索

Evernoteと連携するiPhoneアプリを作成中で、先日、ようやく認証方式をOAuthに移行できました。ただ、移行後はノートの検索が行えなくなってしまい、ようやく解決したので共有します。
ノートの検索を行うためには2つのステップが必要です。

  1. 開発者サポートへ連絡し、アクセス権限を「フルアクセス」へ変更してもらう。
  2. Web画面の設定で、該当アプリの認証許可を1度削除する。


開発者サポートへ連絡し、アクセス権限を「フルアクセス」へ変更してもらう。

開発にあたっては連携用のAPIキーを取得しますが、デフォルトの権限は「ベーシック」となっており、”ノートの作成、ノートブックとタグの検索”しかできません。これを、”ノートの変更、検索、取得”も行えるようにするためには、サポートへ連絡して「フルアクセス」権限にしてもらう必要があります。

該当のFAQ
http://dev.evernote.com/intl/jp/support/faq.php#permdenied


Web画面の設定で、該当アプリの認証許可を1度削除する。

続いて、WebのEvernoteへアクセスします。開発用のアカウントのはずなので、sandboxへのアクセスとなります。画面上のメニューより「設定」->「アプリケーション」と選択すると、OAuthで認証許可を行っているアプリの一覧が表示されます。

権限「ベーシック」での表示

ここで、該当アプリを選択して「アクセスを取り消す」を実行し、再度開発中のアプリ側でOAuth認証を行い、認証トークンを再取得することで無事「フルアクセス」権限となります。

エミュレーター上でアプリを削除すると、端末側では認証トークンも削除されるため、再認証することでトークンが再発行されたものと思い込み、なかなか解決できずに苦労しました。。。

2012年11月26日月曜日

Evernote の OAuth対応 SDK は Snow Leopard ではコンパイルできない

EvernoteがAOuth認証へ移行になったので、iOS用のクラウドAPI SDK(Evernote Web Service API SDK) を最新版の「Evernote SDK for iOS version 0.2.1」へ入換えたところ、Xcode 3.2.5 ではコンパイルができなくなってしまいました。


<コンパイルエラーのメッセージ>
/evernote-sdk-ios/EvernoteUserStore.m:68:0 /Users/isatanisatan/Documents/WordCard5/evernote-sdk-ios/EvernoteUserStore.m:68: error: incompatible block pointer types initializing 'void (^)(struct EDAMBootstrapInfo *)', expected 'void (^)(struct objc_object *)'

正直、勉強不足で原因は不明なのですが " incompatible block pointer types initializing" と言っているので言語的な互換性がなさそう。
そこで、Xcodeを最新版の 4.5 へアップデートしようと思ったのですが、MacOS が Lion 以上でないとインストールできません。

ボクの MacBook Air 2010ではパフォーマンスが心配で最新OSへ上げることはためらっていたのですが、パフォーマンス的に悪い評判は聞かないし、ちょうどiCloudも使ってみたかったので、良い機会だと思い Snow Leopard へ移行しちゃいました。

結果、無事コンパイルすることができました。心配していたパフォーマンスについても、今のところ目に見えて遅くなるようなこともありません。
Xcodeのビルド処理も今まで通りだし、eclipseの起動速度も今までと同じように感じられます。

パフォーマンスを気にして躊躇している方はアップデートを検討してみてもよいと思います。

2012年11月17日土曜日

EvernoteのAPIにおける認証方式がOAuthに変更になったようです

ノロノロとiOSでEvernoteのクラウドAPIを使ったiPhoneアプリを作っているのですが、11月に入ってから認証処理が上手くいかなくなってしまいました。
調べたところ、APIでの認証方式がOAuthに移行し、id, passwordでの認証ができなくなってしまったようです。

ユーザ名とパスワードによる認証から OAuth 認証への移行

http://dev.evernote.com/intl/jp/documentation/cloud/chapters/Transition.php

Evernote日本語版Blog

http://blog.evernote.com/jp/2012/11/02/10913

「ぺんぎんまむ」さんのBlogでとても分かりやすく解説されています。

http://penguin-mam.com/archives/314/

あーぁ。やっと組み上がった認証フォームが不要になってしまいました。。。
APIキー取得時に申込める開発者向けのメーリングリストに入っていれば9月の時点でお知らせが来ていたようなので、今後のために今から再登録することにします。

2012年10月20日土曜日

UIActivityIndicatorView の実装まとめ

iPhoneアプリにおける定番のインジケーター、いわゆる「考え中」アイコンを実装するにあたり、いくつかポイントがあったのでまとめておきます。

UIKitにインジケーターを表現する"UIActivityIndicatorView"があるので、「このViewを表示してあげるだけでいーのね」と思ったら、とんでもない。以下を考慮した実装が必要です。

  • Viewの実装
  • 別スレッドで処理
  • コールバック
  • リリースタイミング

Viewの実装

まずは UIActivityIndicatorView を生成します。これは当然ですね。

UIActivityIndicatorView *indicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
indicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyleWhite;
[indicator setCenter:CGPointMake(self.bounds.size.width / 2, self.bounds.size.height / 2)];

別スレッドで処理

インジケーターを表示したいってことは、当何らかの処理をさせたい訳なんですが、同一スレッド上で
インジケーター生成 → インジケーターViewを追加 → やりたい処理 → インジケーターView削除
ではダメなんです。
インジケーターViewを追加した状態でViewControllerの処理をいったん抜けて、端末上で描画処理まで進めてあげなければいけません。だから別スレッドで「やりたい処理」を実行させないとダメなんです。
そこで、メソッド"performSelectorInBackground"で別スレッドを立てて、引数のselectorで「やりたい処理」を呼び出してあげます。

// インジケーターView追加
[self.navigationController.view addSubview:self.indicator];

// インジケーター再生
[self.indicator startAnimating];

// 別スレッドで処理
[self performSelectorInBackground:@selector(othreProcess) withObject:nil];
[self.window makeKeyAndVisible];


コールバック

続いて、別スレッドでの「やりたい処理」が終わったら、メインスレッドへ処理が終わった旨を通知(コールバック)し、インジケーターの表示を止めてあげます。ここでは"hideIndicator"というメソッドを呼び出しています。
また、別スレッドを立てる場合は新たなスレッドでのautoreleaseを格納する"NSAutoreleasePool"を宣言してあげる必要があるようです。

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

//
//  ここでやりたい処理を実行。
//

[pool release];
 
// 終了処理をメインスレッドへ通知
[self performSelectorOnMainThread:@selector(hideIndicator) withObject:nil waitUntilDone:NO];
-(void)hideIndicator {
 [self.indicator removeFromSuperview];
 [self.indicator stopAnimating];
}


リリースタイミング

最後に、別スレッドで実行した「やりたい処理」で、何らかのインスタンスを生成する場合、慣習的に "autorelease" を明示していると、先ほどの"NSAutoreleasePool"のreleaseメソッドを呼んだタイミングで開放されてしまいます。
ですので、autorelease とせずに、適切なタイミングを考慮して "release" を呼んであげる必要があります。

なんかインジケーターってよく見るので、もっと簡単、簡潔に実装できるもんだと思っていましたが、結構手間ですね。UIKit ってやつは。。。

Amazon_ad