2013年12月2日月曜日

iOS で Amazon A/B テストサービスを試してみた 1


Amazon A/B Testing Service (beta) というページができてました
なので、試してみるよ。

ちなみに、利用するには Amazon のアカウントが必要になります。

さて、さっさと試したいところですが、W8BENという米国非居住者用の免税書類が必要になってきます。
書類と言っても全部オンライン上でできます。

W8BEN の作成に時間がかかったため、今回はそれを作るところまでです。

このエントリの目次
  1. A/Bテストとは
  2. アプリをAmazon Mobile App Distribution Portal に登録する
  3. 「税に関するインタビュー」の入力
  4. さいごに
1.A/Bテストとは
ITproによると、
A/Bテストとは、例えば画像や説明文など複数パターンの素材を用意し、それらを入れ変えたWebサイトやバナー広告などを並列で公開・配信することで、利用者の反応を探る方法。
ということです。

つまり、複数パターンのページなどを同時に公開して、利用者にはいずれかを表示し、「どちらのページがコンバージョンが高いのか?」をテストすることです。

Web だとやりやすいけど、アプリでどう実現するのだろう...というところです。

2.アプリをAmazon Mobile App Distribution Portal に登録する
A/B Testing consoleから設定できます。

Amazon アカウントでログインすると、下記のような画面になります。


名前や電話番号、住所などの必須項目を入力して、ページ下部の「保存して続行」を押します。


利用規約が表示されるページに遷移します。
ページ下部の「承認して続行」を押します。


次に、アプリで収益を得るかどうか(有料アプリだったり、アプリ内課金だったり)を聞かれます。
選択して、「保存して続行」を押します。


すると「税に関するインタビュー」というページになります。


ここからが長いです。
僕のように税務や法律に疎い人にはここはかなり辛いので、心してかかってください。

3.「税に関するインタビュー」の入力
さて、ややこしそうですがとりあえず「続行」を押します。
すると下の画面になりました。
いきなり意味分からないページです、これあかんやつやで...

とにかく翻訳していきます。

もし間違っていても責任は一切負いませんので悪しからず。

Consent for Electronic Signature and 1099 Form
電子署名と1099フォームの同意

1099フォームでいきなり詰まりました。

1099フォームとは、2012年の米国連邦タックスカレンダー 2012/01/04 | 永野・森田会計事務所によると、
日本の支払調書にほぼ対応するフォーム1099があり、銀行やその他の事業者が個人等に一定の支払をした場合、当該支払者はその支払タイプ毎に受取者、支払額等を書いたフォーム1099を年度終了後IRSに提出する。報告すべき支払タイプは、利息、配当やその他分配、賃借料、従業員以外の個人に支払った報酬、ロイヤルティー等多岐にわたり、様々な様式が用意されている。
とのことです。

支払調書??
それは支払調書は確定申告のための大事な資料 | S&S Accounting Staff Blog によると、
支払調書を交付しなければならない人たちは、主には「個人事業主」と呼ばれる人です。個人事業主はサラリーマンとは異なり、自らの事業で得た稼ぎを毎年3月に確定申告をすることにより、前年1~12月の所得を確定させます。
とのことです。

つまり、日本において(主に)個人事業主が交付するのが源泉徴収票と似ている支払調書で、この支払調書にほぼ対応するのがアメリカのフォーム1099、ということです。

何となく項目の意図が分かったところで質問項目を確認していきます。

You may be required to sign your tax identity document.
In order to electronically sign your tax identity document, it is necessary to obtain your consent.
If you do not provide your consent, at the end of the interview you may be required to print the form, sign it with a blue or black pen, and mail it to the address that is provided.
「tax identity document」に署名しなければならない場合があります。
電子的に署名するためには、同意が必要です。
あなたの同意を得られない場合は、このインタビューが終わったら、フォームを印刷して青や黒のペンを使って署名し、提供された住所にそれを郵送する必要がある場合があります。

I consent to providing my electronic signature.
Yes
No
私は、私の電子署名を提供することに同意します。
はい
いいえ

If you would like us to provide your information reporting documentation that is required by law (for example, 1099-MISC, 1099-K) electronically, it is necessary to obtain your consent to receive these documents electronically.
あなたが私たちに情報報告文書 ー法的に必要なもの(例えば、1099-MISC、1099-K)ー を電子的に提供したい場合、私たちが電子的に文書を受信するためには、あなたの同意を得ることが必要です。

I consent to electronic receipt of my information reporting documentation.
Yes
No
私は情報報告文書の電子領収書に同意します。
はい
いいえ

文中に出てきた 1099-MISC、1099-K は、フォーム1099 の一種のようです。
1099-MISCについてはForm 1099-MISC Independent contractorへの支払い | アメリカで生活する日本人のための税金ブログ、1099-K についてはForm 1099Kってなに? | 石上洋のブログ で書かれています。

ページ右下の「続行」を押します。

Tax Status
課税状態。



In general, you are considered a U.S. resident if (1) at any time during the calendar year you were a lawful permanent resident of the United States immigration laws and this status has not been rescinded or administratively or judicially determined to have been abandoned or (2) you have been physically present in the United States on at least 31 days during the current year, and 183 days during the 3 year period that includes the current year and the 2 years immediately before.
一般的には、下記のいずれかの条件を満たしていればあなたは米国の居住者だと見なされます。
  1. あなたが米国居住者であり、それが取り消されていない、また行政上・司法上放棄されたと決定していない。
  2. あなたは今年 31日間は米国にいて且つ、今年と過去2年間の計3年間は183日間米国にいた

For tax purposes are you a U.S. citizen, U.S. resident, U.S. partnership, or U.S. corporation?
Yes
No
税務上、あなたは米国市民、米国居住者、米国のパートナーシップ、または米国法人ですか?
はい
いいえ

アメリカ行った事すらないので「いいえ」を選択します。
ページ右下の「続行」を押します。

Non-U.S. Person
非米国居住者



You have selected that you are a non U.S. Person for tax purposes.
Next we will gather your personal or business information.
あなたは、税務上の非米国人であることを選択しました。
次に、私たちはあなたの個人情報やビジネス情報を収集します。

ページ右下の「続行」を押します。

Personal Information
個人情報。



ここは、本名や住所を入力していきます。

企業としての導入でなければ、
Select the place of incorporation or organization
のところは選択せずに「Please select ...」として下さい。
選択していると怒られて次に進めません。

最後に
Is your mailing address the same as permanent address?
あなたの郵便住所は実際の住所と同じですか?

と聞かれます。
「はい」を選択して、ページ右下の「続行」を押します。

Foreign Tax Identification Number
外国の納税者番号



If you have a tax identification number for your country of residence, enter that information here.
あなたがお住まいの国の納税者番号を持っている場合、ここにその情報を入力します。

日本では納税者番号制度は導入されていないため、空欄のままです。
ページ右下の「続行」を押します。

U.S. Person tests - Individual
米国人審査 - 個人



U.S. tax law requires Amazon to test whether any of the following conditions apply that could change your tax status for U.S. tax purposes from a Non U.S. Person to a U.S. Person.
米国の税法により、アマゾンはあなたが以下の条件に当てはまるかどうか審査します。
条件に当てはまれば、あなたの納税状態を税制上、非米国市民から米国市民に変更できます。

Select all the items that apply:
当てはまるものを全て選択してください。
  1. I have a U.S passport
    私はアメリカのパスポートを持っている
  2. I was born in the U.S. and have not renounced my birth rights
    私はアメリカで生まれ、生得権を放棄していない
  3. One or both of my parents were born in the U.S.
    親のうちどちらかもしくは二人ともアメリカで生まれた。
  4. I currently hold or have held a Green Card
    私はグリーンカードを持っている、もしくは持っていた
  5. I have spent time in the U.S. in the past 3 years
    私は過去三年間米国に住んでいた
  6. Held temporary nonimmigrant Visa type "F" ,"J","M" or "Q"?
    一時的な非移民のVISAであるF、J、M、Q のいずれかを持っている

どれにも当てはまらないので、何も選択せずにページ右下の「続行」を押します。

Do you have a US Tax Identification number?
あなたは米国の納税者番号を持っていますか?



In order to claim treaty benefits or to claim that income is effectively connected with a US trade or business, you will need to provide your Tax Identification Number (TIN), which is either your Individual Tax Identification Number (ITIN), Social Security Number (SSN) or Employer Identification Number (EIN).
租税条約に基づく特典を受けるため、もしくは、収入が米国での貿易やビジネスに基づくものだと主張するためには、あなたはの納税者番号(TIN)を提供する必要があります。TIN とは個人納税者番号(ITIN)、社会保障番号(SSN)、雇用者識別番号(EIN)のいずれかです。

※ちなみに、Effectively Connected Income について。
外国人への支払い時の源泉税IRS税務調査強化(3) | 専門家のためのアメリカ・タックス(米国税務) によると、
非米国市民が受け取る所得のうち、米国事業活動に関連するものをECI(Effectively Connected Income)という。
とのことです。

If you do not have a TIN, you can apply for an ITIN or EIN with the IRS.
納税者番号(TIN)を持っていない場合は、アメリカ合衆国内国歳入庁に個人納税者番号(ITIN)もしくは雇用者識別番号(EIN)を申請する事ができます。

It is not necessary to have a TIN in order to determine if you are a U.S. or non U.S. person for U.S. income tax purposes. However, any reduction of the standard withholding rate (30%) will not apply until you can provide a TIN.
税制上あなたが米国人かそうでないかを判断するとき、納税者番号(TIN)は必須ではありません。
ただし、納税者番号(TIN)を提供しない限り、標準的な源泉徴収税率の割引(30%)が適用されることはありません。

Do you have a TIN?
Yes
No
あなたは納税者番号(TIN)を持っていますか?
はい
いいえ


「いいえ」を選択してページ右下の「続行」を押します。

Review your W-8BEN information
W-8BEN情報の確認。

W-8BEN のプレビュー画面です。



W-8BENとは-FORM W-8BENとは?- | 111 Social Lending.comによると、
利子、配当、使用料、賃貸収入や年金などを米国法人から受取る際に、米国上、外国法人や非居住者であることを証明するためのフォームです。
とのことです。

パッと見すぐ分からないものをピックアップしていきます。

Part I Identification of Beneficial Owner
法的な実質的な所有者の種類

3 Type of beneficial owner
3 法的な実質的な所有者

individual(個人), Corporation(法人), Disregarded entity(みなし事業体), Grantor trust(グランター・トラスト), Complex trust(複合信託), Estate(財産), Goverment(行政), Central bank of issue(中央銀行), Tax-exempt organization(非課税機関), Private foundation(慈善団体), Partnership(組合関係), Simple trust(単純信託), International organization(国際機関)


Part II Claim of Tax Treaty Benefits
租税条約の特典

I certify that (check all that apply)
チェックされているもの全てが適用されることを証明します。

The beneficial owner is a resident of within the meaning of the income tax treaty between the United States and that country
所有者は、米国との間に租税条約を結んでいる国の居住者であることを示します。

If required, the U.S taxpayer identification number is state on line 6
要求される場合、アメリカの納税者番号は6行目(6 U.S. taxpayer identification number, if required (see instructions)) のものです

The beneficial owner is not an individual, derives the item (or items) of income for which the treaty benefits are claimed, and, if applicable, meets the requirements of the treaty provision dealing with limitation on benefits.
所有者は個人ではなく、そして租税条約の特典を要求するための収入の項目を出せる。これを満たすということはつまり、租税条約の特典制限条項を扱う条約規定を満たしているということです。

Part III Certification
証明

Under penalties of perjury, I declare that I have examined the information on this form and to the best of my knowledge and belief it is true, correct, and complete. I further certify under penalties of perjury that:
私は偽証罪の何たるかを知っています。私はこのフォームの情報を検討した結果、知識と信念をもって正しく且つ完全であることを宣言します。
  1. I am the beneficial owner (or am authorized to sign for the beneficial owner) of all the income to which this form relates,
    私は、このフォームに関連するすべての収入の所有者(または所有者であると署名することを認可されている)です。
  2. The beneficial owner is not a U.S. person,
    所有者は米国市民ではありません。
  3. The income to which this form relates is (a) not effectively connected with the conduct of a trade or business in the United States, (b) effectively connected but is not subject to tax under an income tax treaty, or (c) the partner's share of a partnership's effectively connected income, and
    このフォームに関連する所得は、米国での取引または事業とは関係ありません。もしくはこのフォームに関連する収入は米国での取引または事業に基づくものであるが所得税条約に基づいた税の対象ではありません。もしくはこのフォームに関連する収入はパートナーの米国事業活動による収入のパートナーの分け前です。
  4. >For broker transactions or barter exchanges, the beneficial owner is an exempt foreign person as defined in the instructions.
    斡旋売買もしくは物々交換において、所有者は命令で定義されている非課税の外国人です。

Furthermore, I authorize this form to be provided to any withholding agent that has control, receipt, or custody of the income of which I am the beneficial owner or any withholding agent that can disburse or make payments of the income of which I am the beneficial owner.
さらに、私が所得の所有者であるとき、源泉徴収義務者(その所得を管理しているか領収書を持っているか監督している、もしくはその所得を融資できるもしくは支払える)にこのフォームを提供することを許可します。

「続行」を押します。

Certification
証明。



先の書面に書かれていた項目についてチェックが入ります。
繰り返しになりますが、そのまま載せます。

Under penalties of perjury, I declare that I have examined the information on this form and to the best of my knowledge and belief it is true, correct, and complete. I further certify under penalties of perjury that:
私は偽証罪の何たるかを知っています。私はこのフォームの情報を検討した結果、知識と信念をもって正しく且つ完全であることを宣言します。
  1. I am the beneficial owner (or am authorized to sign for the beneficial owner) of all the income to which this form relates,
    私は、このフォームに関連するすべての収入の所有者(または所有者であると署名することを認可されている)です。
    チェックを入れます。
  2. The beneficial owner is not a U.S. person,
    所有者は米国市民ではありません。
    チェックを入れます。
  3. The income to which this form relates is (a) not effectively connected with the conduct of a trade or business in the United States, (b) effectively connected but is not subject to tax under an income tax treaty, or (c) the partner's share of a partnership's effectively connected income, and
    このフォームに関連する所得は、米国での取引または事業とは関係ありません。もしくはこのフォームに関連する収入は米国での取引または事業に基づくものであるが所得税条約に基づいた税の対象ではありません。もしくはこのフォームに関連する収入はパートナーの米国事業活動による収入のパートナーの分け前です。
    チェックを入れます。
  4. >For broker transactions or barter exchanges, the beneficial owner is an exempt foreign person as defined in the instructions.
    斡旋売買もしくは物々交換において、所有者は命令で定義されている非課税の外国人です。
    チェックを入れます。

Furthermore, I authorize this form to be provided to any withholding agent that has control, receipt, or custody of the income of which I am the beneficial owner or any withholding agent that can disburse or make payments of the income of which I am the beneficial owner.
さらに、私が所得の所有者であるとき、源泉徴収義務者(その所得を管理しているか領収書を持っているか監督している、もしくはその所得を融資できるもしくは支払える)にこのフォームを提供することを許可します。

To comply with the eSignatures ACT, we require that you sign by typing your full name, enter the date and the email address that you used to access the registration site.
電子署名法に準拠するために、あなたはフルネームと日付、そして登録サイトにアクセスするために使用したメールアドレスを入力する必要があります。

Capacity in which acting
どのような資格をもってこのフォームを記入しているか。
個人で試すので individual を選択します。

Once you are satisfied with the information presented in your W-8BEN, and you have signed the certification above, select the Submit W-8BEN button to send your document to Amazon.
W-8BEN の情報に問題がなく、上記の証明書に署名したら、「W8を送信」ボタンを押して書類をAmazon に提出してください。

というわけで「W8を送信」ボタンをクリックします。

すると下記の画面があらわれて、これで完了です!



Information awaiting validation
Your information has been received and is awaiting validation.
We will contact you if we require additional information.
認証待ちの情報。
あなたの情報を受け取り、現在認証待ちです。
追加情報が必要な場合はご連絡いたします。

「終了」ボタンを押してこれでやっと完了!

すぐに認証されます
「税に関する情報は無事認証されました。」という通知が!



詳細を見に行くと、「税に関する情報は米国国税庁で無事認証され、税制上のステータスは「完了」に更新されました。」と言われました。
長かった…。



今日はこれくらいにしといたろか。

4.さいごに
長くて難しかった…。
もし間違っていても責任は一切負いませんので悪しからず。

この調子だと色々つまづきそうな予感がします。
が、次はSDKを入れたいです(問題なく進められれば)。

それでは。

2013年10月28日月曜日

iOSのメモリ管理 その1


retainとかreleaseとか意味分からないんですけど!
という訳で、今更ですがObjective-Cのメモり周りについて調べてまとめました。

このエントリは
という本を参考にしています。

ARC全盛の昨今ですが、この本はオススメなので買うといいよ!

このエントリの目次
  1. 参照カウント方式
  2. retain と release
  3. retainしなくても参照カウントが上がるメソッドがある
  4. メモリが解放されるタイミング
  5. さいごに

1.参照カウント方式
Objective-Cのメモリ管理は参照カウント方式で行われます。

「高度なメモリ管理プログラミングガイド」によると、 所有権に関する処理は、参照カウントを使って実装されています。通常、retainメソッドの呼び出し後は、これを「保持カウント」と呼びます。各オブジェクトに保持カウントがあります。
  • オブジェクトを作成すると、オブジェクトの保持カウントは1になります。
  • オブジェクトにretainメッセージを送信すると、保持カウントが1つ増えます。
  • オブジェクトにreleaseメッセージを送信すると、保持カウントが1つ減ります。
    オブジェクトにautoreleaseメッセージを送信すると、現在の自動解放プールブロックの末尾で、保持カウントが1つ減ります。
  • オブジェクトの保持カウントがゼロになると、割り当て解除されます。

はい、全然意味が分かりませんね。

もう少し具体的に
以下のようなコードがあるとします。
NSString *str = [NSString stringWithFormat:@"test"];
[str retain];
1行目でstr 変数に「test」というNSString インスタンスを設定しました。
2行目のretain で、保持カウント(=参照カウント)が1つ増えます。

このretainにて、str 変数を持つインスタンスが「『str変数が保持しているNSStringオブジェクトのアドレス』を参照しているよ」ということを明示的に示しています。

この、「オブジェクトが参照されている数」が、そのオブジェクトの参照カウントの数になります。

参照されていると何が嬉しいのか
参照されているということは保持カウントが1以上であるということです。
そして保持カウントが1以上のとき、メモリが勝手に解放されることがなくなります。

つまり、後でstr変数を参照しようとしたときに「『str変数が保持していたNSStringオブジェクトのアドレス』が既に解放されていて存在しておらず、EXEC_BAD_ACCESSエラーが起こる」ということがなくなります。
(このときの「既に存在しないNSStringオブジェクトのアドレス」を保持しているstr変数を、ゾンビオブジェクトと呼びます)

逆に保持カウントが0になると、そのメモリは即座に解放されます。

2.retain と release
どちらも、オブジェクトの参照カウントを即座に変化させるものです。

繰り返しになってしまいますが、
  1. オブジェクトにretainメッセージを送信すると、保持カウント(=参照カウント)が1つ増えます。
  2. オブジェクトにreleaseメッセージを送信すると、保持カウントが1つ減ります。

これら保持カウントの増減は即座に行われます。

オブジェクトに対してreleaseメッセージを送信して参照カウントが即座に0になったとき、それ以降そのオブジェクトはゾンビオブジェクトになります。

では、参照カウントが1以上の場合はどうなるでしょうか。
メモリ解放という後片付けをしてあげないと、ずっとメモリ上にそのアドレスが確保されることになります。

どのオブジェクトからも参照されないのにメモリ上にアドレスが確保されている状態、これをメモリリークと呼びます。

3.retainしなくても参照カウントが上がるメソッドがある
大きく言うと4種類あります。

「高度なメモリ管理プログラミングガイド」から抜粋すると、
オブジェクトの作成は、「alloc」、「new」、「copy」、「mutableCopy」で始まる名前のメソッド(たとえば、alloc、newObject、mutableCopy)で行います。

従って、先述したサンプルコードにあった
NSString *str = [NSString stringWithFormat:@"test"];
のときは、『str変数が保持していたNSStringオブジェクトのアドレス』の参照カウントが増えません。
「alloc」、「new」、「copy」、「mutableCopy」で始まる名前のメソッドが使われていないからです。

つまり、このあとで
[str retain];
のように retain メッセージを送信してあげないと、既にメモリ解放されていてEXEC_BAD_ACCESSエラーが起こってしまいます。

下記のようにalloc で始まる名前のメソッドを使えば、参照カウントは増えます。
NSString *str = [[NSString alloc] initWithFormat:@"test"];

そしてこのときは retain メッセージを送信する必要はありません。
送信すると参照カウントが更に増えて 参照カウントが0にならずにメモリ解放されることがなくなり、メモリリークしてしまう恐れがあります。

と言いつつ他のメソッドでも参照カウンタが増減します
addSubView をするとカウンタが1増え、removeFromSuperView すると1減ります。

UIView を addSubView したときは、参照カウンタが増えていることに気をつけましょう。

4.メモリが解放されるタイミング
参照カウントが0になったオブジェクトはいつメモリ解放されるのでしょうか。

自動解放プールブロックが利用されます。
暗黙的に使用されているのですが、明示的に使用する場合は下記のように書きます。
@autoreleasepool {
     SampleViewController *sampleViewController = [[[SampleViewController alloc] init] autorelease];
     self.window.rootViewController = sampleViewController;
}

ここで先述したことを思い出してください。
「高度なメモリ管理プログラミングガイド」に下記の記述がありました。
オブジェクトにautoreleaseメッセージを送信すると、現在の自動解放プールブロックの末尾で、保持カウントが1つ減ります。

もう少し具体的な仕組みを説明します。

オブジェクト(上の例で言う sampleViewController)は、autorelease メッセージを投げられると自身を自動解放プールに登録します。
他のオブジェクトも autorelease メッセージを投げられるたびに、自身を自動解放プールに登録します。

そして、自動解放プールの末尾にきたとき、つまり } に処理がきたとき、登録されたすべてのオブジェクトに対して release メッセージを送ります。
ここで初めて参照カウントが減ります。

でも autorelease を使わない場合はいつ解放されているのか
イベント毎に、自動解放プールが作られています。
そしてイベントに対応したメソッドが終わるごとに自動解放プールも終わり、メモリが解放されます。

イベントとは、
UITableViewController にてセルが表示されるとき(- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath)や、
セルをタップしたとき(- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {)
などのことです。

それらのイベントのメソッドが完了したとき、メモリは解放されるのです。

逆に言うと、上記のように表示とタップしたときのようにメソッドをまたいで変数を使いたいときは、reatain メッセージを送信して参照カウンタを1つ増やしておく必要があるのです。

ちなみに、自動解放プールは入れ子にできます。

例えば、自動解放プールAの中に自動解放プールBを作成できます。
そして、自動解放プールAにとうろくしたオブジェクトは、自動解放プールBが完了しても、自動解放プールAが完了するまではメモリ解放されません。

変数のスコープと同じように考えられますね。

さいごに
ARCを使っていればあまり意識することはないかもしれませんが、内部の動きを把握しておくのは大切なことだと思います。

他にもアクセサメソッドの挙動やインスタンス変数の宣言の意味も把握しておきたいです。

というわけで、続く!

認識違いがあればご指摘頂きたいです!

参考書籍

2013年7月3日水曜日

ユーザビリティテストのインタビューのコツ


ユーザビリティテストとは
またの名をユーザテスト。
製品やサービスを実際に使ってもらい、改善点を洗い出すテスト手法です。

ポイントは下記の2点です。
  1. ユーザにタスク(作業課題)を実行するように依頼する
  2. ユーザがタスクを実行する過程を観察、記録する

このエントリでは、アジャイル・ユーザビリティ ―ユーザエクスペリエンスのためのDIYテスティング―という書籍を参考にしつつ、僕の所感とともに、インタビューア(ユーザと対話して考えていること、思っていることを引き出す役割の人)がやるべきことにフォーカスしてまとめます。

実際にやってみたら、とても難しかったので!

このエントリの目次
  1. ユーザビリティテストの目的
  2. 関係者とその役割
  3. インタビューアがやること
  4. さいごに
1.ユーザビリティテストの目的
実際に製品やサービスを使ってもらうことで、ユーザのリアルな挙動(=事実)を観察することが目的です。

なぜリアルな挙動が必要か
アンケートなどは えてしてユーザ自身の不正確なバイアスがかかってしまいます。

端的な例でいうと、「このWebページのこの要素は目立たないから、背景色を目立つ色にした方がいい」とユーザが言ったとします。
これをそのまま受け取ってしまうと、安易に「背景色を赤くしよう」のような解決策を立ててしまいがちです。

そうすると、要素を目立たせる他の手段や、より根本的にナビゲーションの仕方を工夫する、のような検討案が漏れてしまいます。

これはイケてませんね!

つまり…
ユーザビリティテストの目的は、「ユーザからの分析結果」を得ることではありません。
正しい目的は、リアルな挙動を通して、ユーザの感情や思考といった「事実」を掘り起こしていくことです。

そうすることで より客観的な分析ができ、より本質的な改善策が検討できます。

ちなみに、ユーザビリティテスト専門のサービスもあります。
UIscopeなどです。

2.関係者とその役割
ユーザビリティテストの関係者は、下記の3つに分けられます。
  1. ユーザ
    観察の対象者。タスクを実行していく人です。
  2. インタビューア
    ユーザを観察、また対話することで、ユーザの感じたことや思ったことを引き出す人。
  3. 見学者
    テストを見学する人。テスト中は存在感を消し、ユーザの観察に徹する。

3.インタビューアがやること
やることとしては、ユーザの緊張をほぐす、テスト全体のファシリテートなど様々です。
が、最も大切なのはインタビュー時、対話によってユーザの感じたこと・思ったことをそのままの形で引き出していくことです。

ポイントは2つ!
  1. 質問には答えない
  2. ユーザの感じたこと・思ったことをそのままの形で引き出す

どういうことかと言うと…。

質問には答えない
ユーザが「前の画面に戻るにはどうすればよいんですか?」と質問してきても、答えを教えてはいけません。
前の画面に戻るのが分からないとき、どういう行動を取るのか、どうやってたどり着くのかを確認するのがテストです。

ユーザの感じたこと・思ったことをそのままの形で引き出す
ユーザが操作などに迷ったときは課題の発見のチャンスです。
ここで「何を考えていますか?」などの質問をして、ユーザの状況を説明してもらいます。

「もしかしてナビゲーションの色が分かりづらかったですか?」など相手の思考を推察して質問してはいけません。
おそらくユーザは「はい」と答えるでしょう。
しかしこれは誘導尋問になってしまっていて、本質的な課題を見つけられません。

インタビューをやってみると分かりますが、これが非常に難しいです!
普段の会話と同じ感覚で話していると、どうしても相手の思考を推察して言葉にしてしまいます。

4.さいごに
僕のように口下手でアドリブのきかない人にはけっこう敷居が高いインタビューア。

思っていたよりもはるかに難しいです。
特に、誘導尋問にならないように質問をするところが。

ですが、正しくテストを実施・分析できれば、製品・サービスのクオリティを確実に向上できるので、ぜひともものにしたいスキルです。

それでは。

参考書籍

分かりやすい文章で書かれていながら、ユーザビリティテストのエッセンスが詰まっています。
特にインタビューよりも前段にあって、より重要な作業の「タスクの設計」の解説は必読です!

2013年3月3日日曜日

Blogger に LinkWithin を導入してみた


LinkWithinとは
ブログの各エントリに、関連記事を表示してくれるサービスです。
写真付きで表示してくれます。
こんな感じの見た目になります。


数分で導入できますよ。

これでブログのフリクエンシを上げ、PV向上を目指します!

このエントリの目次
  1. LinkWithin にて必要な項目を入力する
  2. Bloggerでモジュールを作る
  3. さいごに

1.LinkWithin にて必要な項目を入力する
それでは早速 導入していきます。
まずはLinkWithinのサイトにいきます。
ページ右下に、設定を入力する部分があります。


Blog Linkは、ブログのURLを入力します。
当ブログなら「http://www-indblue.blogspot.jp/」となります。

Widthでは、表示する関連記事の数を選択できます。
3〜5つが選べます。
数によってレイアウトを中央寄せに調整してくれる、とかはなく、左寄せになります。

他は見たまんまですので説明は割愛します。

で、「Get Widget!」ボタンを押します。
あとはBlogger での作業に移りますよ。

2.Bloggerでモジュールを作る
「Get Widget!」」ボタンを押すとこんな画面になります。


あとは上の画面に書いてあるとおり、4ステップで完了です!

設置後 ブログを確認してみると、こんな感じになりました!


うーん、でもYou might also like:が気になりますね。
好きな文言に変えてみましょう。

Blogger のレイアウトから編集します。

で、
var linkwithin_text = 'オススメのエントリ';

のように追加します。
こんな感じ↓


すると、文言が変更されました。

3.さいごに
これでPV爆上げなるかな!
様子を見て、効果を確かめてみたいと思います。

2013年2月25日月曜日

iOSアプリ開発時に必要になりそうなTipsたち


いくつか調べたのでまとめます
アイコンの光沢の消し方、必要なアイコン画像たち、アプリの表示名の変更方法です。

このエントリの目次
  1. アイコンの光沢の消し方
  2. 必要なアイコン画像たち
  3. アプリの表示名の変更方法
  4. さいごに

1.アイコンの光沢の消し方
-info.plistを修正します。
やり方は、iOS5でアプリケーションアイコンの光沢を消す | 袖触れ合うも多少の縁に書いてある通り。
iOS5でアイコンの光沢を消すには、 Icon files(iOS5) > Primary Icon > Icon already includes gloss effect をYESにする。



実機で確認するとき、上記設定が反映されない場合があります。
その際は、一度アプリを実機から削除してからもう一度ビルドすれば反映されます。

2.必要なアイコン画像たち
Q: How are the icon files in my application bundle used on iPad and iPhone? | iOS Developer Libraryを参照のコト。

実機で確認するとき、上記設定が反映されない場合があります。
その際は、一度アプリを実機から削除してからもう一度ビルドすれば反映されます。

3.アプリの表示名の変更方法
iOSアプリ名の変更方法 | trunk/UIを参照のコト。

実機で確認するとき、上記設定が反映されない場合があります。
その際は(ry

4.さいごに
いろいろ調べる必要がありますね、大変だ。

2013年2月24日日曜日

iOSのカメラアプリに写真と動画を切り替える機能を実装する


1行加えるだけです
前回のエントリで、必要最低限の機能を持つカメラアプリを作りました。
そのときは写真を撮る機能だけでしたが、今回は動画を撮れるようにします。

このエントリの目次
  1. コード
  2. さいごに

1.コード
以下のようにmediaTypesを指定するだけです。
    UIImagePickerController *imagePickerController =[[UIImagePickerController alloc] init];
    
    (略)
    
    //カメラと動画を選択可能にする
    imagePickerController.mediaTypes = [UIImagePickerController availableMediaTypesForSourceType:UIImagePickerControllerSourceTypeCamera];

こうすると
写真を撮る機能だけだったのが、


画面右下に、動画切り替えのパーツが表示されます。
2.さいごに
UIImagePickerController 以外にもカメラ機能を呼び出す方法があるようなので、そちらも試してみます。

2013年2月22日金曜日

iOS アプリで カメラ写真撮影 + 画像保存 を実装してみた


10行くらいで実装できました
実装内容は大きく分けて2つ。
カメラの呼び出しと、撮影した画像の保存。
これだけでした。

逆に言うと、実装したのは基本的なコトだけです。
機能の拡張は後のエントリで行います。

また、カメラ機能は実機でしか試せないようです。
(本エントリの「6.シミュレータで試すとエラーが出ると思います」を参照)。

このエントリの目次
  1. アプリの概要
  2. GitHubにソースを置きました
  3. モーダルビューでカメラを起動する
  4. 撮った写真をカメラロールに保存する
  5. ヘッダファイルに記述するデリゲート
  6. シミュレータで試すとエラーが出ると思います
  7. 参考にさせて頂いたサイト
  8. さいごに

1.アプリの概要
アプリを起動すると、モーダルビューでカメラが起動し、写真を撮れます。
撮ったあとは、画面右下のボタン(「Use」ボタン)を押して画像を保存できます。
「保存完了」とアラートが出れば、カメラロールに画像が保存されています。

2.GitHubにソースを置きました
ソースはこちら

3.モーダルビューでカメラを起動する
UIImagePickerController を使います。
- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    
    //カメラを起動
    [self kickCamera];
}

//カメラを起動
- (void)kickCamera
{
    UIImagePickerController *imagePickerController =[[UIImagePickerController alloc] init];
    
    //カメラ機能を選択
    imagePickerController.sourceType = UIImagePickerControllerSourceTypeCamera;
    
    imagePickerController.delegate = self;
    
    //YESにしないと、UIImage(カメラで撮ったデータ) が取得できない
    imagePickerController.allowsEditing = YES;
    
    //モーダルビューでカメラ起動
    [self presentViewController:imagePickerController animated:YES completion:nil];
}

これだけで、下記のようにカメラが使えるようになります!
何もしなくても写真撮ったりキャンセルできたりします。


viewDidAppearからカメラを起動していますが、iOS6以降の場合 viewDidLoadから起動しようとすると、
whose view is not in the window hierarchy uiimagepicker
こんな感じのエラーが出て動かないようです。

ちなみに
imagePickerController.sourceType
でカメラを指定してますが、UIImagePickerControllerSourceTypePhotoLibraryでフォトライブラリーを開いたり、 UIImagePickerControllerSourceTypeSavedPhotosAlbumでカメラロールを開いたりもできます。

4.撮った写真をカメラロールに保存する
以下が、必要なコード全てになります。
読めば内容は分かると思います!
//カメラ撮影後のデリゲートメソッド
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    //撮ったデータをUIImageにセットする
    UIImage *image = [info objectForKey:UIImagePickerControllerEditedImage];
    
    //カメラロールに画像を保存
    UIImageWriteToSavedPhotosAlbum(image,
        self, 
        @selector(didFinishSavingImage:didFinishSavingWithError:contextInfo:),
        nil);
    
    //モーダルビューを消す
    [self dismissViewControllerAnimated:YES completion:nil];
}

//画像保存完了後。非同期で呼ばれる
- (void) didFinishSavingImage:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo
{
    
    //画像保存完了したよ、とアラートを出す
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:nil
                                                    message:@"保存完了"
                                                   delegate:nil
                                          cancelButtonTitle:@"OK"
                                          otherButtonTitles:nil];
    [alert show];
}

5.ヘッダファイルに記述するデリゲート
以下のようになります。
@interface CameraViewController : UIViewController
<UINavigationControllerDelegate, UIImagePickerControllerDelegate>

6.シミュレータで試すとエラーが出ると思います
こんなエラー。
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Source type 1 not available'
これは、
imagePickerController.sourceType = UIImagePickerControllerSourceTypeCamera;
で出るエラーで、カメラのソースタイプはシミュレータだと試せないようです。
なので、実機を使いましょう!

7.参考にさせて頂いたサイト
  1. イメージの取得と保存 | マルタケエビス
  2. Custom Camera App | Part 3: Assets Library | Developers' Realm
  3. [iPhone SDK] NSIvalidArgumentException: Source type 1 not available | Apple Support Communities

8.さいごに
思ったより簡単にカメラ機能などが使えて感動しました!
これからまだまだ改良しますので、また本ブログにまとめていこうと思います。

2013年2月11日月曜日

iOSアプリに「Facebook の Mobile App Install Ads によるログ計測機能」を組み込む


明けましておめでとうございます
2013年も10%ほど過ぎ、ようやく正月ボケがおさまってきました。
遅いな!

本年 一発目のエントリでは iOSアプリに「Facebook の Mobile App Install Ads によるログ計測機能」を組み込む方法を紹介します。
とても簡単です!

ちなみに、Facebook SDK の組み込み方は本ブログの iOSでFacebookアプリを作ってみる その1 にて紹介しています。

このエントリの目次
  1. Mobile App Install Ads とは
  2. このエントリのゴール
  3. アプリ情報入力時のTips
  4. Facebook SDK を組み込む
  5. コードを追加する
  6. アプリを起動して、実際にログを送ってみる
  7. 送られたログの確認方法
  8. さいごに

1.Mobile App Install Ads とは
Facebookが提供する機能で、
  1. Facebook のニュースフィードに アプリの広告(ターゲティング広告)とApp Store へのリンクを出せる
  2. 更に アプリがいつ何回インストールされたかを可視化できる
というサービスです。

Facebook、アプリストア直結のモバイル広告「Mobile App Install Ads」を一般公開 | ITメディア ニュースでは以下のように説明されています。
Mobile App Install Adsは、米AppleのiOS端末および米GoogleのAndroid端末上にアプリ広告を表示し、広告効果をモニタリングできるサービス。
広告主は、年齢や性別、「いいね!」などの(匿名化された)個人情報に基づいてターゲティングされたFacebookユーザーのモバイル端末上にアプリの広告を表示できる。

2.このエントリのゴール
ニュースフィードにアプリの広告とApp Storeへのリンクを出すのは、Facebookの開発者向けサイトでデータを入力すればできると思います。
(やったコトないです。が、広告の出し方がFacebookにリジェクトされる場合もあるようで、大変なようです)

ですが、アプリがいつ何回インストールされたかをモニタリングするためには、アプリにFacebook SDKと1、2行のコードを追加する必要があります。
そうすることで、アプリの起動時にFacebook にログが送られ、モニタリングできるようになるんです。
このエントリでは、そのやり方とログ確認のやり方を主に紹介します。

3.アプリ情報入力時のTips
さて、Facebookにアプリ情報を入力する必要があるわけですが、正直「この項目は何なんだろう」というのがあると思います。
少なくとも僕はそうでした。

特に「アプリをFacebookに結合する方法を選択」のところは、説明がなさすぎていちいち調べてましたが、そこは一つのフォームを埋めるだけで事足ります。

今回必要なのは1つ
iPhoneアプリストアID(or iPadアプリストアID)のみです。


iPhoneアプリストアIDは、iTunes App StoreのURLから分かります。
アプリのURLが例えば以下の場合、
https://itunes.apple.com/jp/app/some-app-name/id999999999?mt=8
999999999 を入力します。
URL中の「id<数字>」の部分ですね。

iPhoneアプリストアID以外の情報は、Facebook での OAuth や、複数のアプリをまとめて効果測定したいとき(例えば有料、無料のアプリをまとめたいとき、とか)に入力します。

ここら辺は Facebook の説明が言葉足らずで初心者には分かりにくいですね…。

次はいよいよ実装に入ります。

4.Facebook SDK を組み込む
本ブログの iOSでFacebookアプリを作ってみる その1 にて、組み込み方を紹介しています。

一点だけ。
上記エントリの「5.SDKをアプリに組み込む」の最後の方で、plist の 「URL Schemesfb<Facebook App ID> を設定します。」とありますが、今回の実装では不要です。
設定しても別にいいんですが、そうすると冗長なURLスキームを入れることになるので、その点に注意です。

5.コードを追加する
AppDelegate.m を2カ所、編集します。

まず、必要なヘッダファイルをインポート。
#import <FacebookSDK/FBSettings.h>

続いて、Facebook にログを送る部分です。
- (void)applicationDidBecomeActive:(UIApplication *)application
{
    NSString *facebookAppId = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"FacebookAppID"];
    [FBSettings publishInstall:facebookAppId];
}

FacebookAppID の値はiOSでFacebookアプリを作ってみる その1 でplist に設定しています。
で、ログ計測のおまじないメソッドを呼ぶときに、引数としてそれを参照しています。

これで実装完了です(はやっ!)

あとはログがちゃんと送られているか、確認するだけです!

6.アプリを起動して、実際にログを送ってみる
手順は簡単なのに、実はこれにけっこうハマりましたね!
  1. Facebook のアプリをインストール、サインインしておく
  2. ログ計測機能を組み込んだアプリを起動する

これだけなんですが。

ここで注意
テストなどでログ計測を複数回確認したい場合は、その都度 違うアカウントでサインインする必要がありそうです。

というのも、ある1つのFacebook アカウントから一度ログを送ると、それ以降はアプリの再インストールをしても、異なる端末にインストールしても、そのFacebook アカウントからはログが送られないみたいなので。
(少なくとも僕が実装したときはそうでした。間違っていたら教えて頂きたいです)

Android の場合は、ログ計測機能を組み込んだアプリを再インストールすれば、同じアカウントでも都度ログが送られると聞きましたが…。

7.送られたログの確認方法
まず、Facebook でログを確認する方法は 大きく分けて以下の2つがあります。
  1. ダッシュボードにてきちんとグラフ化されたものを見る
  2. 最後にログが送られた時間だけを見る

1つ目の方法:
時間が経たないと確認できません!
ログを送った次の日か数時間後か、それは分かりませんが、とにかくリアルタイムでの確認はできません。

2つ目の方法:
「最後にログが送られたのはhh:mm」という味気ない表示ですが、リアルタイムに確認できます。
遅くとも1分後には確認できるはずです。

なので
開発時のテストには2つ目の方法をとるとよいです。
Facebook開発者向けサイトのAppsページから確認できます。


確認できたら、「Facebook の Mobile App Install Ads によるログ計測機能」の組み込みは完了です。

お疲れ様でした!

8.さいごに
今回の話題に関する情報があまりネットになかったので、まとめてみました。

お役に立てれば幸いです。
それでは。

Related Posts Plugin for WordPress, Blogger...