2014年5月10日土曜日

♪programming 数え歌

♪programming 数え歌
ひとつ 人より バグがある
ふたつ 再び バグがある
みっつ 見つけた バグがある
よっつ よっぽど バグがある
いつつ いつもの バグがある
むっつ ムカツク バグがある
ななつ なつかしい バグがある
やっつ やっぱり バグがある
ここのつ ここにも バグがある
とうで とうとう 動かない
「とう」で、ようやく動かなくなるのであるから、堅牢で頑丈なのであろう。

2014年5月5日月曜日

Google Mobile Ads SDK

Google Mobile Ads SDK

開発環境:Eclipse

これまではAdMobについては、GoogleMobileAdsSdkAndroid.zip 6.4.1を使ってきましたが、もはや時代遅れとなってしまいました。Androidアプリは、August 1, 2014以降は、新規リリース版やアップデート版ではAdMob SDKを使えなくなってしまいます。

日本語による概要は次のとおり。
従来の「AdMob SDK」にいくつかの大幅な改良を加えた最新のバージョンを、「Google Mobile Ads SDK」と名称を変え、Google Play 開発者サービス 4.0 の一部としてご利用いただけます。
Google Mobile Ads SDK Downloadsの「Android (Google Play)」のタブを読みましょう。
すると、「Google Mobile Adsを読みなさい」とのことです。
これを読むと、「Set Up Google Play Services SDKを読め」と書いてあります。
すると、「Eclipseで、Window > Android SDK Managerをクリックして、Google Play servicesをインストールしなさい」と書いてあります。ので、そうしましょう。

また、Google Mobile Adsでは、「端末の次のフォルダーに、サンプルがあるので、使ってみなさい」とのことです。
<android-sdk>/extras/google-play-services/samples/ads
でも、実際に存在するのは、次の名前のフォルダーです。
\sdk\extras\google\google_play_services\samples\admob
むむむ!フォルダー名の付け方について、ドキュメントと実装とが異なりますが、正確性を要求するのは今は遠慮しておきましょう。
とにかく、このフォルダーをimportしましょう。とりあえず、この時点では、importするだけに留めておきます。そして、このimportしたサンプルを、この文書では「自分がこれから開発するアプリ」としておきます。

スタート ガイドを読みます。すると、「Set Up Google Play Services SDKを読め」と書いてあります。
そこには、次のように書いてあります。
If you are using Eclipse, import the library project into your workspace. Click File > Import, select Android > Existing Android Code into Workspace, and browse to the copy of the library project to import it.
この英語をメッチャ意訳すると、次のような感じです。
EclipseのPackage Explorerを使って、\sdk\extras\google\google_play_services\libproject\google-play-services_lib\フォルダーをimportしなさい。import先は、当然ながら、自分がこれから開発するアプリのプロジェクトが存在するworkspaceです。
そして、重要なのが、Package Explorerで、(このimportした)google-play-services_libプロジェクトを開いた状態にしておくということです。「Close Project」をしてはならないのです。物好きな人はClose Projectをしてみてください。そうすると、私が陥った罠に出会えます。
当然ながら、自分が開発するアプリのプロジェクトも開いた状態にしておきます。
(かつての)AdMob SDKであれば、自分のアプリのlibsフォルダーに.jarファイルをimportする方式だったのですが、Google Mobile Ads SDKの場合はlibsフォルダーを参照するのでは無く、google-play-services_libプロジェクトを参照する、という方式です。そういう意味で、libsフォルダーの中身は空っぽです。
なお、/libs/フォルダーにGoogleAdMobAdsSdk-6.4.1.jarファイルが存在する場合、それを削除してください。削除しない場合、エラーが発生します。
(このimportした)google-play-services_libプロジェクトを参照する手順は、スタート ガイドの「SDK の導入」の「1. Eclipse ワークスペースに Google Play 開発者サービス ライブラリ プロジェクトを追加、参照する」に書かれています。
これで、エラーを発生させることなくプロジェクトを再構築できるようになります。って、サンプルプロジェクトなので、当たり前じゃ!。
「当たり前じゃ!」と思うのは甘い。次のエラーが発生します。むむむ!
E/GooglePlayServicesUtil(11153): The Google Play services resources were not found. Check your project configuration to ensure that the resources are included.
「なんでや?サンプルやろが?」という疑問を持つのは、今は遠慮しておきましょう。
解決策はGoogle Mobile Ads SDK に関するよくある質問に書かれています。ただし、このページの最下端右端にある言語設定をEnglishに設定してください。日本語では解決策は書かれていません。むむむ!
解決策は次のとおりです。
I keep getting the error 'The Google Play services resources were not found. Check your project configuration to ensure that the resources are included.'
You can safely ignore this message. Your app will still fetch and serve banner ads.
とにかく、「無視すれば良い」ってことですね。って、「どこが解決策やねん」というツッコミを入れるのは、今は遠慮しておきましょう。
そして「なんで日本語版ではこの解決策は掲示されて無いねん」という疑問を持つのも、今は遠慮しておきましょう。


/GoogleAdsSampleActivity/res/values/strings.xml内に次の1行があります。
<string name="ad_unit_id">INSERT_YOUR_AD_UNIT_ID_HERE</string>
このINSERT_YOUR_AD_UNIT_ID_HEREの部分にユニット ID(AdMob パブリッシャー ID)を指定します。ユニット IDの形式は、ca-app-pub-XXXXXXXXXXXXXXXX/NNNNNNNNNN のような形式になります。


確認はしてませんが、google-play-services_libプロジェクトと、自分がこれから開発するアプリのプロジェクトにおけるandroid:minSdkVersionやandroid:targetSdkVersionは一致させておいた方が良いのかもしれません(知らんけど)。


提案的改良点
/GoogleAdsSampleActivity/res/layout/activity_banner_xml.xml内の
        ads:adSize="BANNER"を
        ads:adSize="SMART_BANNER"に変えた方が良いでしょう。


後は、サンプルプログラムを調べて、プログラムの仕方を学習していけばよろしゅうございます。


所感
Google Mobile Ads SDKの実装は、まるでパズルを解いているようだ。皆さん、楽しんでいますか?

2014年4月29日火曜日

♪僕らはみんな バグってる

僕らはみんな バグってる
バグっているから 動かない

僕らはみんな 無知ってる
無知っているから 止まるんだ

LogCatで アプリを 動かして見れば
真っ赤に 流れる エラーリスト

Official YouTube Application だって
YouTube Android Player API だって
自分のアプリだって

みんな みんな バグっているんだ
友達 なんだ


暖かい励ましのメッセージを頂きましたので紹介します。
「友達呼ばわりされて、困ります」(YouTubeアプリ開発者一同様)
「バグってるのは、あんただけや!」(同業他社様)
「★☆☆☆☆」(アプリの利用者様)

2014年3月2日日曜日

Locale.getDisplayCountry()

Locale.getDisplayCountry()

Locale.getDisplayCountry()には、引数の無いメソッドと、有るメソッドがありますが、その振る舞いについては、下記のとおりです。

Javaのコード
Locale l1 = Locale.KOREAN;//言語情報のみ。国情報を含まない。
Log.d(TAG, "l1.getCountry()==" + l1.getCountry());
Log.d(TAG, "l1.getDisplayCountry()==" + l1.getDisplayCountry());
Log.d(TAG, "l1.getDisplayCountry(l1)==" + l1.getDisplayCountry(l1));
Locale l2 = Locale.KOREA;//言語情報と国情報を含む
Log.d(TAG, "l2.getCountry()==" + l2.getCountry());
Log.d(TAG, "l2.getDisplayCountry()==" + l2.getDisplayCountry());
Log.d(TAG, "l2.getDisplayCountry(l2)==" + l2.getDisplayCountry(l2));

日本語を表示するように設定された端末で、上記コードを実行したログは次のとおりです。
l1.getCountry()==
l1.getDisplayCountry()==
l1.getDisplayCountry(l1)==
l2.getCountry()==KR
l2.getDisplayCountry()==大韓民国
l2.getDisplayCountry(l2)==대한민국

getDisplayCountry()の引数の無いメソッドを使うと、端末に設定された言語で表示されます。有るメソッドを使うと、引数に指定した言語で表示されます。

2014年1月11日土曜日

アプリ神社2014

アプリ神社2014

副題:アプリの信頼性を高めるイノベーショナルテクノロジー

プログラミングをしていると様々な不思議な出会いがあります。
非効率な設計やら、訳の分からん振る舞いやら、実装と異なる名前の付け方やら、意味不明な書き方のドキュメントやら、何の為に設けたのかわからんclassやら、無くても何の問題も生じない定数やfieldやら、不親切な情報開示やら、に出会うかもしれません(推測)。

相手がそう来るなら、こっちも真摯な態度で、非論理的に振る舞えば良いのではないでしょうか?
そうです!。プログラマーには「神仏に頼る」というチカラ強い武器があるのです。

私は拙作アプリ「夢チューブ」の参拝代行をアプリマーケティング研究所様に依頼しました。この参拝代行のイベント名は「アプリ神社2014」です。

私は、この参拝代行でバグ退散のお願いをすることとなっています。
「開発者にはバグを無くしたいという意思がある」という印象を関係者に与える、という尊い効能があります。数多くのバグを作成なさってこられた開発者様には特に有意義です。

当然ながら、参拝は第三者のために行うものでは無いので、周囲の目を気にせず、自己満足に浸るということも、あり、なのです。

反面、リスクもあります。「神様に頼るような依存心の強い奴だ」、「思考停止を選択したのか」、「バグがあった場合、神様の責任に転嫁しようとしている」と、本音を見透かされてしまうのです。

でも、ご安心下さい。知性と教養のある御仁からは、「こいつは暇な奴だ」と暖かく見守って頂けるハズです。そして、参拝に行って頂けるのは、暇な女子大生なのだそうです。暇な者同士で(中略)。

論理で構成されるプログラミングに対して、参拝という技法で対応することは、その開発者の資質に疑問を生じさせますが、その評価の判断材料は、開発者様の普段の振る舞いに依存しているのです。(この段落だけがまともなスタンス)

「アプリ神社2014」による霊験あらたかな効能により、そこそこ、まずまず、ボチボチなアプリに発展することが期待されます。そして、結局、それ相応の評価が定着する、ということです。つまり、やってもやらんでも、どっちでも良(中略)

推測ですが、アプリマーケティング研究所は、参拝代行という名目で、開発者の願い(ニーズ)に関する情報を収集し、市場調査をしているのかもしれません。たぶん。知らんけど。もしそうだったとしたら、この研究所は偉大であるかもしれないし偉大でないかもしれないスゴい研究所なのかもしれません。わからんけど。英知を結集しても解決しない、神仏に頼らざるを得ない願いとは何なんでしょうかね。

上述のように多くの効能が期待されますので、「アプリ神社2014」に気が向いたら申請してみてはどうでしょうか。

キーワード:イノベーション、革新、信頼性の向上、論理的思考、最善の改善策

2014年1月3日金曜日

keytoolを使う

 keytoolを使う

詳細はAndroidアプリの署名<KeyStore Keytool AndroidDebugKey>に詳しく書かれている。
実際に難しいのは、Windowsにおけるコマンドの入力である。ので、その部分だけ書いておく。

引用
フィンガープリントを確認するには、「Windows」キーを押しながら「R」キーを押して「ファイル名を指定して実行」画面を開き、名前欄に「cmd」と入力し、「OK」をクリックして「コマンドプロンプト」画面を開き、「keytool -list」コマンドを入力します。「keytool」とだけ入力すると、「keytoolの使い方」が表示されます。 「keytool」コマンドを入力して「'keytool' は、内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチ ファイルとして認識されていません。」と表示が出る場合は、JDKがインストールされていないか、keytoolまでのパスがとおっていないことが考えられます。keytoolはJDKインストールフォルダのbinフォルダ配下にあります。JREにはありません。(参考サイト:Java環境に手動でグローバルサインのルート証明書をインストールする方法)
Windowsの「コマンドプロンプト」画面のタイトルバーの左端のアイコンをクリックすれば、コマンド一覧が表示される。ここの「編集」コマンドを使いこなすようにすれば便利である。
以下は、Windowsの「コマンドプロンプト」画面における手作業によるコマンド入力である。長い文字列の入力には「編集」>「貼り付け」コマンドを活用すればよい。keystoreファイルが存在するディレクトリ名は、事前にエクスプローラで確認&取得しておけば良い。

Microsoft Windows [Version 6.3.9600]
(c) 2013 Microsoft Corporation. All rights reserved.

C:\Users\****>keytool
'keytool' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。

C:\Users\****>cd \

C:\>dir

C:\>cd program files

C:\Program Files>dir

C:\Program Files>cd java

C:\Program Files\Java>dir

C:\Program Files\Java>cd jre7

C:\Program Files\Java\jre7>dir

C:\Program Files\Java\jre7>cd bin

C:\Program Files\Java\jre7\bin>dir

C:\Program Files\Java\jre7\bin>keytool

C:\Program Files\Java\jre7\bin>keytool -list -v -keystore C:\Users\****\Document
s\Android\****\****\keystore
キーストアのパスワードを入力してください:[Enter]

*****************  WARNING WARNING WARNING  *****************
*キーストアに保存された情報の整合性は*
*検証されていません。整合性を検証するには*
*キーストアのパスワードを入力する必要があります。*
*****************  WARNING WARNING WARNING  *****************

キーストアのタイプ: ****
キーストア・プロバイダ: ****

キーストアには1エントリが含まれます

別名: ****
作成日: ****
エントリ・タイプ: ****
証明書チェーンの長さ: ****
有効期間の開始日: ****
証明書のフィンガプリント:****
         署名アルゴリズム名: ****
         バージョン: ****

C:\Program Files\Java\jre7\bin>

おしまい。

2014年1月1日水曜日

YouTubeScopes

YouTubeScopes内に定義されている、実際の値は次の通りです。

YouTubeScopes.YOUTUBE          == https://www.googleapis.com/auth/youtube
// This OAuth 2.0 access scope allows for full read/write access to the
// authenticated user's account.

YouTubeScopes.YOUTUBE_READONLY == https://www.googleapis.com/auth/youtube.readonly

YouTubeScopes.YOUTUBE_UPLOAD   == https://www.googleapis.com/auth/youtube.upload

YouTubeScopes.YOUTUBEPARTNER   == https://www.googleapis.com/auth/youtubepartner

YouTubeScopes.YOUTUBEPARTNER_CHANNEL_AUDITは私の環境では存在しませんでした。