2011年7月25日月曜日

あえてProgressDialogを使いまわす

間違っている気がしないでもない、ProgressDialog使い回し方法
たぶんProgressDialog以外でも使えるけど、その場合どうなるかは未検証

というよりも基本は

  • ProgressDialog生成
  • show
  • dismiss
を必要に応じて繰り返すでいいと思うんですが…

なんかこう毎度毎度ProgressDialogを生成するのがねぇ…

そして不思議とググッても(日本語では)この方法しかTOPに出てこないし。


ちなみに以下のようにすると、処理中を示すあのグルグル回るアニメーションが二回目以降動かないです。

/**
 * ところどころ脳内補完必須
 */
public class TestActivity extends Activity {

 private ProgressDialog   mProgressDialog    = null;
 
 public void onCreate( Bundle savedInstanceState) {

  mProgressDialog = new ProgressDialog( this);
  mProgressDialog.setProgressStyle( ProgressDialog.STYLE_SPINNER);
  mProgressDialog.setMessage( "Now processing...");
  mProgressDialog.setCancelable( false);
 }
 
 
 /**
  * ボタン押した時とかの処理
  */
 public void onClickTest( View view){
  
  Thread th = new Thread() {

   @Override
   public void run() {

    // TODO 適当に時間のかかる処理
    
    mProgressDialog.dismiss();
    
    return;
   }

  };

  th.start();
  
  mProgressDialog.show(); //2回目以降はグルグルアニメーションがされない!
  
 }

これを以下のようにすると二回目以降もグルグル回る

 /**
  * ボタン押した時とかの処理
  */
 public void onClickTest( View view){
  
  Thread th = new Thread() {

   @Override
   public void run() {

    // TODO 適当に時間のかかる処理
    
    mProgressDialog.hide();
    
    return;
   }

  };

  th.start();
  
  mProgressDialog.show();
  
 }

ただし developersの dismisshide をみると(恐らく)こう書いてあります。

  • dismiss:スクリーンから削除するよ。(たぶん)終了時の処理をなんか足したい場合にオーバーライドするならdismissじゃなくてonStop()側でやってね☆(ゝω・)vキャピ
  • hide:表示は消えるけど、これdismissじゃねーから

とまあ、恐らくProgressDialog側(Progress以外のダイアログもたぶん)はThreadっぽい実装を確実にしているっぽい。
いや、ソース見てない(追いかけるのメンドイ)から知らんけど。
でもOnStartとかOnStopとかそれっぽいし、恐らくdismissは内部のThread終了処理も含んでいるんでしょう。
一方でhideはホント表面上消しているだけっぽい。てか説明がそれだけだし…。

まあ、何が言いたいかというと上のソースもそういう意味で間違い。
きっと正しく修正するとこんな感じ

/**
 * ところどころ脳内補完必須
 */
public class TestActivity extends Activity {

 private ProgressDialog   mProgressDialog    = null;
 
 public void onResume() {

  mProgressDialog = new ProgressDialog( this);
  mProgressDialog.setProgressStyle( ProgressDialog.STYLE_SPINNER);
  mProgressDialog.setMessage( "Now processing...");
  mProgressDialog.setCancelable( false);
  
  super.onResume();
 }
 
 public void onPause() {

  mProgressDialog.dismiss();
  mProgressDialog = null;
  super.onPause();
 }
 
 /**
  * ボタン押した時とかの処理
  */
 public void onClickTest( View view){
  
   Thread th = new Thread() {

   @Override
   public void run() {

    // TODO 適当に時間のかかる処理
    
    mProgressDialog.hide();
    
    return;
   }

  };

  th.start();
  
  mProgressDialog.show();
  
 }
}

何れにしてもdismiss呼んでおけば終了処理は行われるんだろうと脳内解釈するとこれで正しいと思います

まあこういう書き方をするメリットは…?と聞かれると「さぁ…」としか答えられませんが…

でもhideが非推奨メソッドでも無く、呼び出せるようになっているという以上、間違いではないはず。

インスタンスを再生成しないぶん、もしかしたらメモリ的に有利かもしれないけど…
ダイアログ一個でそんなに変わるとは思えないです…(計測すればイイんだけど)
むしろ背面でもグルグル処理やっていたらCPU食っているかもしれない(それもたかが知れているはずですが)

あとは、

  • 時間のかかる処理
  • 一旦ユーザーに何か処理を行わせるためにhide
  • 時間のかかる処理再開
  • 一旦ユーザーに何か処…
とかの場合でしょうか??なんか良い使い方が思いつかん。

で、本当の所どうなんだろう。サンプルでhideを見かけない(ような気がする)理由は。
教えて偉い人♪

2011年7月22日金曜日

久々にセンサーを使ってみた

台風一過って普通すごい夏日になる気がするんですけど… てな今日でしたが、中身は全くもって台風とは関係ありません

先週久しぶりにセンサーを使うことがありましたがちょっと困ったことがあったので備忘録
というか誰か解決法教えてください。

  • 知らない間に傾きセンサーが非推奨になってた
  • 端末によって常に「SENSOR_STATUS_UNRELIABLE」を返すお方が居る…


前者に関しては、非推奨になっている以上仕方ないので修正します。
参考はこちら

SDTECHさん
TechBoosterさん

非推奨になっているので、<user-feature>にもありません。

http://developer.android.com/guide/topics/manifest/uses-feature-element.html

でもまぁなんでセンサーのあるものをワザワザ演算としたのでしょうね…
併用じゃ駄目だったのかしら…
こんな私にも分かるように誰か事細かく説明して欲しいです


次は問題の常にUNRELIABLEなんですが…

上記のサイトのサンプルソースを見ても、UNRELIABLEな値は無視していいと思うというか無視するべきかと思っています。

Developerにもこうかいてあります。

The values returned by this sensor cannot be trusted, calibration is needed or the environment doesn't allow readings

俺の拙い英語力でも「信頼出来ないか、キャリブレーションが必要か、その環境で(値を)読み出すのは許可できねー」
とかそんなんだと思います。

つまり以下のサンプルソース的なので正しいはず。

public void onSensorChanged( SensorEvent event) {
 if (event.accuracy == SensorManager.SENSOR_STATUS_UNRELIABLE){
  return;
 }
 
 // 略

まあ、大体の端末は別にこれで問題なく動くと思います。

が、IS06は違った…

でーん



単に onAccuracyChanged にだけ焦点を当てたアプリを作りました。
待てど暮らせど加速度と近接はUNRELIABLEなまま。

磁気と傾き(非推奨)はこの後MEDIUMとLOWを行ったり来たり…

ちなみにたまたま2台IS06があったので、2台試しましたが、結果は同じ。

で、これ結局どうすればいいの?
とりあえずUNRELIABLEのままで値を読むようにしましたが、いいのかそれで…


おまけ。
desireで動作させた。
キャプチャ取ったあと、傾き(非推奨w)もちゃんとHIGHになりました。
センサーによっては準備時間的なものが必要なんだろと勝手に解釈

あと、IS03も大丈夫だったような…。



2011年7月14日木曜日

Go 節電プロジェクトに乗っかってみた

なんかAPIが公開とかなので、これに乗っかってみた。

いきなりですが、節電には興味ありません(キリッ

本当に節電させたければ、強制的にやらないと無理だと思うんですけどねぇ…


というわけでAndroid で取得してみた



 private final static String mInstanceUri = "http://api.gosetsuden.jp/usage/tokyo/instant/latest";
 private static String  elecConsumption = null;

 
 private boolean getInstanceConsumption() {

  String jsonStr = getJsonData( mInstanceUri);
  if( jsonStr == null){
   return false;
  }

  try{
   JSONTokener token = new JSONTokener( jsonStr);
   JSONArray arr = new JSONArray( token);

   if( arr.length() != 1){
    return false;
   }

   // 良くうん千万KWと聞くので、上から4桁でいいやという適当実装
   elecConsumption = arr.getJSONObject( 0).getString( "usage").substring( 0, 4);

  }catch( JSONException e){
   return false;
  }

  return true;

 }


 private String getJsonData( String uri) {

  String ret = null;
  try{
   HttpClient httpClient = new DefaultHttpClient();
   HttpGet httpGet = new HttpGet( uri);

   HttpResponse response = httpClient.execute( httpGet);

   // 失敗時の処理
   if( response.getStatusLine().getStatusCode() != HttpStatus.SC_OK){
    return null;
   }

   // 解析と出力
   // サーバーからのデータを取得
   InputStream is = response.getEntity().getContent();
   InputStreamReader isr = new InputStreamReader( is);
   StringWriter strin = new StringWriter();
   BufferedReader buf = new BufferedReader( isr);
   for ( String line; ( line = buf.readLine()) != null;){
    strin.write( line);
   }

   is.close();
   isr.close();
   buf.close();

   ret = strin.toString();

   strin.close();


  }catch( ClientProtocolException e){
   return null;
  }catch( IOException e){
   return null;
  }

  return ret;

 }

これで直近の消費電力量が取れました。合っていると思いますw
詳細なAPI仕様はこっちを見てください。

なお、恐らくドキュメント側がまだ整理されていないようで、2011/07/14 現在

  • ミリ秒と書いてあるけど秒単位のやつがある
  • 日本基準時間と書いてあるけどGMTで返ってくるやつがいる
とかありましたので、時間データを使う際は微妙に注意してください。
ドキュメントが正しいのか、データが正しいのか早めに決めて欲しいですね~


この手のアプリは既に腐るほど世の中に出回っていますので、それこそ時間を掛けてじっくり作るより、
即座に飛びついて速攻公開のほうが注目されるかと思いますw


とは言うものの、見せ方だよなぁ…
ぱっと思いつくなら、今頃もっといろんなモノ作れているっつーの。



おまけ
会社の人に頼んで、絵を作ってもらってちゃちゃっと作ったwidget
やっぱり絵が作れるっていうのは凄い… その才能が欲しいです…
しかも絵の作成も早いしww


Google App Script で GUI Editerをちょっと使ってみた

5月にGoogleI/O 報告会にも行ってきました。
その際、Google App Script(GAS)のGUI Editer なるものに興味を持ち、ちょこっと触ったのですが…

TextAreaなどから入力文字列とかがAPI一発で受け取る!ってのが出来ないということに気が付き、
「ま~、いっか」ということで放置してました。


時は流れ、先日Google Apps API Japan Groupの第一回イベントに行ってきました。
この際恐れ多くもa2cさんに「どーすればよろしおわすか?」と聞いた結果、
「イベントとってやりなされ」と有り難いお言葉を頂きましたので、試してみました。


というか、今日調べたら余裕で解説されている人居た。
http://libro.tuyano.com/index2?id=638001
http://libro.tuyano.com/index3?id=644006&page=6


投稿日時を見ると、報告会の2週間後位ですね。気がつかないわけです。
上記に書かれているように、

  • (文字列を)取得したいコンポーネントのonChangeイベントを見張る
  • イベントが来たらそのイベントから文字列を取り出し、テキトーな所(上記ならプロパティ)に保管
  • 任意のタイミングで、保管場所から文字列を取り出し
ということで実装されています。
私も試しましたが、きちんと取得できました。メデタシメデタシ。
ただ、記事にも書かれていますし、そもそもGUI Editer自体試験運用中のため、いつ仕様が変わるかわかりません。

きっと「getText」的なものは実装されるんじゃないかなー、てかして下さい。お願いいたします。と思っています。


ちょっと畑違いかもしれませんが、同じくスプレッドシートから作れるアンケートフォームに

  • 重複回答を許可しない
  • 送信・確定前に確認画面を出す
てきなものも出来ないかなぁ…
って首を長ーーーーーーーくして待ってます。


ついでにいうと、Excelにあるマクロ機能的なものと、そのマクロをスクリプトエディタに展開する機能とかも…
さ、流石に我侭すぎるかしら…



先日のイベントの感想

  • Google Apps は美味しそうだった
  • やっぱりOAuth真面目に勉強するかと思った
  • shin1ogawaさんの資料はこちら
  • チュートリアルやればTwitterクライアントも実装までも直ぐできるヨ
  • ガジェットはiframe内で動くミニアプリケーションっていわれてなんかすっきりして興味を持った
  • (We are) Google dogs が頭から離れない…


2011年7月13日水曜日

新潟行って蛍狩ってきた

もちろん今日じゃなくて土日です。

紅葉狩りって言うんだから、蛍狩りでいいんでしょうか?


で、生まれてはじめて蛍見てきました~

場所は新潟の中里?だったっけ?

いっぱいいて感激!


さあ、とくと見るが良い。 これが蛍だ!!




















え、タダの黒い画面だと??

いや、いるって…ほら






拡大してみた






結論
撮影班(俺)の腕が足りませんでした。
本当にありがとうございました。

でもいっぱい居たんですよ~
晴れていたらもっといっぱいいるそうですが~

そう、全ては天候のせいだ、そういう事にしておこう!

ちなみにお世話になった宿はこちら
田植え、稲刈りといったイベントでもお世話になっております。


なお、冬はスキー客でごった返すそうです。
てか冬は行ったことないな…

下は夕飯の様子。




なお、本人たちの許可無く画像UPしてます。
ご飯は大変おいしゅうございました。


2011年7月8日金曜日

引っ越したし、SyntaxHighlighter3をBloggerに導入してみた。

てか今まで存在知りませんでした。はい。
こんな感じのソースをかっこ良く貼り付けているやつです。

 public void hogehoge(){
  // コメント
  hoge();
 }

なにこれカコ(・∀・)イイ!!
と思って、いつか調べよう調べよう…と思っていたら今になりました。
多分1年くらい思っていただけだと思います。

まあjsとcss取り込むだけですが。

だったのだが、なんかバージョン1.5/2系からバージョン3系でずいぶんと違うようでした。

特にbloggerに取り込むには
ここ(FaziBear's Blogger Widgets)」に行って取り込むだけ!!
という記述が多いのですが…

既にこのサイトはなんか放置っぽく駄目でした…残念。


結局本家サイトに行ってドキュメント読んで解決。

というわけで先ずはSyntaxHighlighterを公開されているこちらにGO!
http://alexgorbatchev.com/SyntaxHighlighter/
んでintergrationに行きましょう
http://alexgorbatchev.com/SyntaxHighlighter/integration.html

Bの項目にいっぱいBlogger Easy InstallationやらBlogger Install Guideやらのリンクが貼られています。

全部読んでないけどとりあえず言えることは以下をコピって<head>内に突っ込んどけって事のようです。
まあ、Bloggerに限らずブログじゃjsとかcssとか置く場所ないもんね。…ないよね?

 <link href='http://alexgorbatchev.com/pub/sh/current/styles/shCore.css' rel='stylesheet' type='text/css'/>
 <link href='http://alexgorbatchev.com/pub/sh/current/styles/表示したいテーマ.css' rel='stylesheet' type='text/css'/>
 
 
 

ちなみにバージョンを限定したければ、currentの部分をこちらに従って変えましょう。
http://alexgorbatchev.com/SyntaxHighlighter/hosting.html

テーマはthemesから気に入ったものを
http://alexgorbatchev.com/SyntaxHighlighter/manual/themes/

ソース形式はこちらを見て好きなだけ
http://alexgorbatchev.com/SyntaxHighlighter/manual/brushes/

あと、流石に自分のHP用の場合は、ソースごと落としたほうがいいと思います。多分。

その他 SyntaxHighlighter.config.bloggerMode = true;は「If you are hosting on blogger.com, you must turn this on.」と言っていますので、 Bloggerで使用するならいれておかないと駄目らしいです。

さてこれで準備は完了。
後はこちらで効果を見て、その時々で自分にあったものを書けばいいと思います。
http://alexgorbatchev.com/SyntaxHighlighter/manual/configuration/

で、よく使うものはデフォルトで設定しておくと幸せかもしれませんね。

つってもそこまで深く考える必要が無かったら

 

  hogehoge
 

だけで十分かと。


ちなみに

 

  <> ← これとかをエスケープとかに直す必要なし!
  もしくは html-script: true を指定してもOK!
 

で非常に便利です。 素晴らしい!

2011年7月7日木曜日

FC2からBloggerへお引越し

深い理由はない…

もうね、色々とGoogleアカウント一本化したいのと
なんかFC2が気に入らなかったのでww

うん、ほんと理由ないな。

まだBlogger側のデザイン修正や、CSS整備
そもそもの画像の移動なども必要なので…まだ時間が必要ですけどね。


とりあえずFC2からBloggerに移行するのに参考にさせていただいたサイト(ブログ)
http://furaibous.blogspot.com/2009/07/fc2blogger_1002.html

こちらの方は置換え用にVB組まれたようですが、
私はそこまで記事が無かったので、正規表現でテキトーに置き換えて終了しました。

コメントが少なかったのが幸いしましたねw

2011年7月5日火曜日

android:onClickに関するmemo

完全に私的メモです。
元ネタはこちら
http://groups.google.com/group/android-group-japan/browse_thread/thread/1aa53a356930e039
読んでて良かった、グループのメール(ダイジェスト)w
まあ、真面目に読みだしたの最近ですけど…
でも結構困ったときに、まずAndroid関連のグループのメールに検索かけると何とかなりますよね。

私も同じことを疑問に持ったことがありましたが、「まあそういうもんだろ」で終わってました。
質問者と回答者に感謝♪


以下memo

 <Button
  android:id="@+id/button1"
  android:onClick="hoge" />
ってリーソスに書くと、ソース側で
 public void hoge(View v) {
  // クリック時の処理
 }
と書けるのは知ってた。

んじゃー、2個ボタンあったらどーするの?
 <Button
  android:id="@+id/button1"
  android:onClick="hoge1" />

 <Button
  android:id="@+id/button2"
  android:onClick="hoge2" />
 public void hoge1(View v) {
  // クリック時の処理
 }
 public void hoge2(View v) {
  // クリック時の処理
 }
もちろんこれでも動く。

でもこう書けるよね。
 <Button
  android:id="@+id/button1"
  android:onClick="hoge" />

 <Button
  android:id="@+id/button2"
  android:onClick="hoge" />
 public void hoge1(View v) {
  // クリック時の処理
  switch( v.getId()){
  case R.id.button1:
   // button1の処理
   break;
  case R.id.button2:
   // button2の処理
   break;
  }
 }

改めてソース読めば、そりゃそうだって内容ですよね。
id割り振ってんだからそれで分けられるだろと。
でも見るまで気がつかなかった…。

ID以外にもあえて分岐条件に使ったら何か面白いものが書けそうな気もしますね。

2011年7月4日月曜日

電飾をちょっと修正した

バイクの電飾をチョコット弄りました。

一人エレクトリカルパレードまでもう少し?



今回は点滅もします。
既製品(エーモン工業フラッシュサーキットTypeB)を使ってw


しかもリモコン操作出来るようにしました!
既製品(エーモン工業ワイヤレススイッチセット)を使ってwww


エーモン工業ヽ(´ー`)ノバンザーイw

てか今値段見たら、アキバで買わんでもよかったな…
ああ、でもLEDテープ(青)買い足しが目的だったから…うん…

動画でみるとこんな感じ。



あとはリモコン(というか単なるスイッチ)を後ろのケースの中に貼りつければ完璧じゃね?

とか思ったんですが…

ACC ON じゃないとつかないようにしたんですね。

まあしたというか、これまでの配線を引き継いだというか…

何が問題って…

  • ケースの鍵は、バイクの鍵と一緒のキーホルダーに付いている
  • ACC ON じゃないと付かない、つまりバイクの鍵は刺さっていないとならない
  • バイクの鍵とケースの鍵は同時に別の位置に存在できない(キーホルダー的に)
ケースの中にスイッチ入れたら、どうやってONにするんでしょうね…

考えてなかった…

まあケースの鍵を2個持ち歩く…?


あ、次こそはウインカーLED化…

それとオレンジと緑のLED除去…かな…