2013年8月22日木曜日

pebbleの 発送準備完了メールがキター!

pebbleから、発送準備完了メールが来ました!
待ってました! 嬉しいっ!!

【メール原文】
We held your spot in line. But we can't hold it for long.
kokoro, you displayed impeccable taste reserving a Pebble, the original smartwatch. It's been a long wait and we're thrilled to announce a fresh cache of Pebbles newly arrived from our watchery.
There are only 5000 Pebbles left in reserve, but you get first dibs! Pebbles do come to those who know a good thing when they see it.
Click the button below to claim your Pebble — bragging rights are on us.

【かなり意訳】
pebbleができたよ~ん! でもね、早く注文しないと、すぐなくなっちゃうよ。
その数 5000 !
今回も、pebbleは、すんごい いい出来だよ。
早く買って、友達に自慢なんかしちゃってよ!


・・・そういうわけで、すぐに注文しちゃいました。
予約したのが 6月上旬で、発送準備完了が 8月下旬。
2か月半かかった計算ですね。
本当に待ちました。

早速クレジットカードで決済。
早く届かないかなぁ。。

DB2でGRANTするときの注意事項

DB2で、テーブルに対するselect権限を付与しようとして、以下のSQLを発行
GRANT SELECT ON view_dept_201 TO mgr200;

でも、エラー・・↓

DB21034E  コマンドが、有効なコマンド行プロセッサー・コマ
ンドでないため、 SQL
ステートメントとして処理されました。 SQL
処理中に、次のエラーが返されました。
SQL0104N  "grant to " に続いて予期しないトークン "view_dept_201"
が見つかりました。 予期されたトークンに "<space>"
が含まれている可能性があります。  SQLSTATE=42601

1時間以上調べ、ようやくたどり着いた答えがコレ。


GRANT SELECT ON view_dept_201 TO USER mgr200;

ハイ、USER のキーワードが抜けていました。

Oracleでは要らないオプションなのに・・。
これだからDB2はキライです。

でも、お仕事なので頑張りましょう。

2013年8月4日日曜日

Google Play Game Servicesに自分のアプリを対応する

今年に入って、Googleが、ゲームのランキングや達成(アチーブメント)などを管理するAPIを公開してくださったようです。

Google Play Game Services - Take your games to the next level
https://developers.google.com/games/services/

嬉しいっ!

過去にも(今でも)こんなサービスやってる会社がいくつかありましたが、どっかに統合されたり、広告が出たりいろいろ問題ありました。

天下のGoogleが無料でこれを公開してくれれば鬼に金棒です。


そういうわけで、早速組み込みを行いました。



「論よりRUN(プログラムを実行)」といいます。(・・と最近は言いませんが)
まずはサンプルの実行です。
https://developers.google.com/games/services/android/quickstart

これは、それほど問題もなくできました。
基本的に英語力だけはそれなりに求められますが、最近は日本語の情報もあちこちあるので、そちらに譲るとします。

でも、、、

これを自分のアプリケーションに組み込むとなると、話は別でした。
Google Play Game Servicesに、自分のアプリケーションを対応させるのは、私はそれなりに苦労しました。


基本的なやりかたは、以下の通りなんです。

組み込み手順(英語)
Initializing Your Games Client in Android
https://developers.google.com/games/services/android/init


で、この通りやったのですが、なかなかうまくいきません。

自分のアプリの MainActivity.java の継承元クラスをActivity から BaseGameActivityクラスに変更するだけで、アプリの起動ができなくなってしまいます。

私は少しずつ修正して問題ないのを確認しながら進めていくタイプなので、ここで止まっていたのですが、他の設定を行わなければ起動できないという状況は改善されないことが、あとになってわかりました。

私の場合は、Google Play Game Services をEclipseにインストールした際、各種ライブラリがアップグレードされ、既存アプリのライブラリのバージョンの不一致による問題と、xmlファイルの設定不足が足かせだったみたいです。


私と同じようにうまくいかない方は、以下を参考に、ひとつずつ確認してみることをオススメします。
ほとんど自分用のメモですが、参考になれば幸いです。


■ビルドパスの調整
Eclipse パッケージエクスプローラで、自分のアプリのプロジェクトを
右クリック - プロパティ - Android
画面下部の「ライブラリ」に google-play-services、 BaseGameUtils  を追加
(Is Libraryにチェックをつけない)


■MainActivity.java に importを追加

import com.google.example.games.basegameutils.BaseGameActivity;


■MainActivity に、参照するクラスを追加

// 継承クラスを変更
before : public class MainActivity extends Activity
after  : public class MainActivity extends BaseGameActivity {


■必須メソッドの自動生成

  1. @Override
  2. public void onSignInFailed() {
  3. // TODO Auto-generated method stub
  4. }
  5. @Override
  6. public void onSignInSucceeded() {
  7. // TODO Auto-generated method stub
  8. }


■以下メソッドも追加
  1. // サインインチェック処理
  2. protected boolean isSignedIn() {
  3. return mHelper.isSignedIn();
  4. }
  5. // googleサインインボタン押下時
  6. @Override
  7. public void onSignInButtonClicked() {
  8. // start the sign-in flow
  9. beginUserInitiatedSignIn(); // サイン・イン
  10. }
  11. // googleサインアウトボタン押下時
  12. @Override
  13. public void onSignOutButtonClicked() {
  14. signOut(); // サインアウト
  15. }
  16. // ゲームクライアント取得
  17. protected GamesClient getGamesClient() {
  18. return mHelper.getGamesClient();
  19. }
  20. // 順位表示ボタン押下時処理
  21. @Override
  22. public void onShowLeaderboardsRequested() {
  23. if (isSignedIn()) {
  24. startActivityForResult(getGamesClient().getAllLeaderboardsIntent(), RC_UNUSED);
  25. } else {
  26. showAlert(getString(R.string.leaderboards_not_available));
  27. }
  28. }
  29. // 達成度表示ボタン押下時処理
  30. @Override
  31. public void onShowAchievementsRequested() {
  32. if (isSignedIn()) {
  33. startActivityForResult(getGamesClient().getAchievementsIntent(), RC_UNUSED);
  34. } else {
  35. showAlert(getString(R.string.achievements_not_available));
  36. }
  37. }

■AndroidManifest.xml の修正

 application セクション内
        <meta-data android:name="com.google.android.gms.games.APP_ID"
            android:value="@string/app_id" />


■ids.xml を記載(そういえば、私はこのファイルを今回初めて作りました)

app_id(Developer Consoleで確認) を、ids.xml に記載します。
その他、必要な値を設定します。
TypeANumberをコピーしてきて修正するのがオススメです。

 values\ids.xml を準備
    <string name="app_id">789779522XXX</string>


■android-support-v4.jar の最新化
既存のアプリに Google Play Game Services を組み込む場合、ライブラリのバージョンが上がっている場合があります。
その場合、ライブラリを新しくする必要があります。
私の場合、android-support-v4.jar が新しくなっていたので上書きコピー。

■レイアウトにログイン・ログアウトボタンを追加
これも TypeANumberを参考にするのがオススメです。
<!-- sign-in button -->
<com.google.android.gms.common.SignInButton
    android:id="@+id/sign_in_button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />
<!-- sign-out button -->
<Button
    android:id="@+id/sign_out_button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Sign Out"
    android:visibility="gone" />   

■■■
ここまでで、ビルド・実行して、今までの処理が問題なく動くことを確認します。
動いたら、Developer Console の ゲームサービスから、自分のアプリを登録します。
登録の手順は、やっぱり TypeANumberを参考に。

そして、ようやくメインの処理の追記に入ります。

■スコア送信処理の追加
myLeaderBoard_ID : Developer Console の ゲームサービスで登録したときに取得したリーダーボードのID
myScore : 送信したい点数

  1. if (isSignedIn()) {
  2. getGamesClient().submitScore(myLeaderBoard_ID), myScore);
  3. }

■リーダーズボードの表示処理
  1. if (isSignedIn()) {
  2. startActivityForResult(getGamesClient().getAllLeaderboardsIntent(), RC_UNUSED);
  3. }

健闘を祈ります!


蛇足ですが、

私の場合は、project.propertiesも調整しました。手動編集しちゃいけないっぽかったですが、TypeANumberが動いたときの設定と比較した結果、差異があったので、直しちゃいました。

【修正前】
android.library.reference.1=../google-play-services_lib
android.library.reference.2=../BaseGameUtils

【修正後】
android.library.reference.1=../google-play-services_lib
android.library.reference.2=..\\BaseGameUtils


2013年7月24日水曜日

WebSphereのLaunchClient.shを使ったアプリでID/Passを聞かれてしまう

【Problem】
WebSphereのLaunchClient.shを使ったアプリでUserID / Passwordを聞かれてしまいます。
具体的には、こんな感じの現象。


WSCL0014I: アプリケーション・クライアント class jp.co.myapp を起動しています。
レルム / セル名: defaultWIMFileBasedRealm
ユーザー ID: (入力待ちになってしまう)


これをスキップさせたい。
ミナサマあまり悩まないのか、IBM様がササッと設定してしまうからなのかわかりませんが、情報が少なかったので、悩みました。

【Resolve】
sas.client.props を編集。

Before:com.ibm.CORBA.loginSource=prompt
After :com.ibm.CORBA.loginSource=none


これだけでした。
情報リソース(Resource):
http://pic.dhe.ibm.com/infocenter/wasinfo/v6r0/index.jsp?topic=%2Fcom.ibm.websphere.zseries.doc%2Finfo%2Fzseries%2Fae%2Frcli_javacmd.html


類似情報では、soap.client.propsに、UserID/Passwordを書き込むとかいろいろありましたが、今回は該当しませんでした。
シンプルです。
あーよかった。

2013年7月21日日曜日

Android開発環境を更新したら、既存のアプリが動かなくなった

ある日、過去のAndroidプロジェクトが全て動かなくなった。

最近やったことを思い返してみる・・
Androidシステム開発環境を更新したんでした。

なぜかというと、Developer Console に新しく現れた「ゲームサービス」を使ってみたいから!
テストプログラムを動かして、これまで作ったアプリに組み込みをせこせこ行おう!と思ったのです。

そのためには、開発環境をあれこれ更新しなければなりませんでした。
・・・と言っても、ほとんどEclipse任せ。
画面表示されるメッセージに言われるままに、更新を繰り返しました。
随分いろいろなライブラリやらツールが入れ替わったようです。。

ゲームサービスのサンプルは何とか動くようになったのですが、
代わりにそれまでのアプリがうごかなくなった。。

現象はこんな感じ。。

07-21 11:18:21.656: E/AndroidRuntime(23900): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.domain.app/com.kdomain.app.MainActivity}: android.view.InflateException: Binary XML file line #101: Error inflating class com.google.ads.AdView
07-21 11:18:21.656: E/AndroidRuntime(23900):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1658)
07-21 11:18:21.656: E/AndroidRuntime(23900):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1674)
07-21 11:18:21.656: E/AndroidRuntime(23900):  at android.app.ActivityThread.access$1500(ActivityThread.java:117)


ぐぐってみると、すぐに見つかりました。
http://stackoverflow.com/questions/10523703/error-inflating-class-com-google-ads-adview

この人と同じ現象!
でも、この人の場合は、libフォルダを新たに作って、そこにライブラリを置きましょうというのが解決策だったみたいですが、私の場合は既にあります。
・・とにかくライブラリ周りの問題と思い、あれこれ再チェック。
すると、Javaのビルドパスの設定から、GoogleAdMobAdsSdk-6.3.0.jar のチェックが外れているではありませんか!
他の動かなくなったアプリも同じでした。

チェックをつけてビルド・実行しなおしたら、動きました。


あーよかった。
どんなことでも、主原因ってたいしたことがない場合が本当に多いものですね。


2013年6月25日火曜日

JSFでDBから取得した日付が一日前になってしまう問題について

JSFのバージョンアップ対応で、なぜかDBから取得した日付情報が一日前になってしまうという不思議な現象が発生。

仕様ですか?と聞いてみると、そんなわけないだろうという回答。
うん、そりゃあそうだ。

そういうわけで早速調査。
でも、ステップ実行して調べてみるも、正しく日付を処理しているように見える。。

なぜだろう・・と思って調べてみたら、タイムゾーンの設定による問題らしい。


対処方法は2通り。
1:コンバータで日付を設定している箇所にすべてタイムゾーンの記載を追加。
(たくさんあるととても大変。。)

なので、今回は
2:Web.xml にタイムゾーンとしてシステムのタイムゾーンを使う一筆を追加。
(こっちは、一か所修正するだけで、すべてに反映可能!)

こっちを採用。
それにしても、どうしてこのパラメータ、デフォルトでオンじゃないのでしょうね。


web.xml

<context-param>
  <param-name>javax.faces.DATETIMECONVERTER_DEFAULT_TIMEZONE_IS_SYSTEM_TIMEZONE</param-name>
  <param-value>true</param-value>
</context-param>

2013年6月21日金曜日

findの結果をtarでアーカイブしたい(Redhat Linux bash)


findの結果をtarでアーカイブしたいと思って、ググったら、以下ページに到達。
思わぬ注意点があることを知る。感謝。
http://fei-yen.jp/maya/wordpress/2013/01/15/find%E3%81%AE%E7%B5%90%E6%9E%9C%E3%82%92tar%E3%81%A7%E3%82%A2%E3%83%BC%E3%82%AB%E3%82%A4%E3%83%96%E3%81%97%E3%81%9F%E3%81%84/


で、感謝しながら使ってみるも、エラー。

ちなみに、ページのオーナーさん推奨の方法がコレ。
find -name "hoge*" -print0 | tar -cvz -T - --null -f hoges.tar.gz

でも、きっと、ディストリビューションとか微妙な違いがあるのでしょうね。
調整した結果、これで動きました。
(私は圧縮とかしなくてよかったので)

find /opt/IBM/WebSphere/ \( -name "*.xml" -o -name "*prop*" \) -print0 | tar cvf wasxmlprop.tar -T - --null


ちなみに、これをやりたかった理由は、IBMさんのWebSphereの設定を保存するためです。
IBMさんのWebSphereの管理コンソールで、ちょっと間違った設定をすると、いきなりWASが動かなくなるです。

そんなとき、

find /opt/IBM/ -mmin -30
↑これで、30分以内に修正があったファイルを洗い出し、
めぼしいxmlファイルとかpropertyファイルを元に戻すと回復するんです。


勉強になりました。