2012年10月29日月曜日

SQL小ネタ

本当に小ネタ

SQLiteで
データベースからデータを取り出す際ランダムに並べ替えて取り出す


SELECT * FROM table ORDER BY random()

これだけ.
これでわざわざ取り出してから並べ替えるなんて手間がかからない!

ちなみにMySQLでは


SELECT * FROM table ORDER BY rand()

らしい(未確認).


だってMySQL使わないし…(・ω・`)

なので
「ORDER BY句にrandom()とか放りこんどきゃいいのかー」
なんていって別のSQLで動かないとか言われても困る
って言う逃げ口上

Androidで設定を参照, 操作するあれこれ -画面の輝度編-

忙しかった…余計な仕事は背負い込むもんじゃないね('A`)


だいぶ間が開いてしまったけど
久々にAndroidさんに怒られたので書いてみる.


画面の輝度の操作


簡単に言ってしまえば「画面の明るさ変えるよ(゚∀゚)」ってだけなこと.
一昔前にこれ利用したライトアプリなんかあったとか無かったとか.

いつもどおりAndroidさんの設定に手を加えるべく.お邪魔するのは

import android.provider.Settings.System;

Androidの設定は基本ここにお願いなことはいい加減わかってきた.

1. 設定の変更


値が入っているのは

System.SCREEN_BRIGHTNESS

今回はここ.
ここの値をputしてやれば良いのだが値に注意.

まず値は
0 ~ 255
であり, また機種によっては
0 = ブラックアウト
と認識して何も見えなくなってしまうらしい点.
なので値は
1 ~ 255
にしておくといろいろ安心.

また0% ~ 100% で表記したいなら自分で計算してやるよろし.
というわけで


System.putInt(ContentResolver, System.SCREEN_BRIGHTNESS, "値");

当然値はint型でok.

2. 画面の明るさの変更


お前1. でやったじゃん と言う無かれ.
1. はあくまで 設定の変更 だけで, すぐにその設定が反映されるかといえば答えはNO.
なのですぐに反映してやりたいとき, また1. を利用する際, デモンストレーション的に明るさを変えたいときにはこちら.

ただしここで怒られた.
実は1. も2. もAsyncTask使ってUIスレッドの裏で処理をさせようとしたところ

おまUIスレッド以外からUIイジってんじゃねーよ ゴルァ!!щ(・Д・´#щ) =3

と怒られましてorz
1. はともかくこれからいじる2. に関してはUIスレッド上でやりましょう, ってお話.

ひとまずソース

LayoutParams layoutParams = getWindow().getAttributes();
layoutParams.screenBrightness = "値";
getWindow().setAttributes(layoutParams);

やってることは割りと単純.
1行目で現在の画面の情報を取得.
2行目でその情報のうち 画面の輝度 に好きな値を投入(ただしfloat型かつ0.0 ~ 1.0の間という統一感の無さ)
3行目で反映…のはずなんだけど…なぜか無くても変わる!不思議!

…なんでだろ(・ω・`)

まぁとりあえずそのActivityくらいしか明るさは保たないので一時的なしのぎにでも.
最初に述べたライトアプリなんかにはむしろ都合が良いとか何とか.



まただらだらと書いてしまった…('A`)



2012年10月15日月曜日

Androidで設定を参照, 操作するあれこれ -バッテリーwithService編-

以前のバッテリー情報取得のその後.
Activityの内部クラスにしとけばいいや, 参照しやすいし.
などと考えていたら

Serviceに乗せなさい



orz

通達が来ましたとさ.


Serviceを用いてBattery情報を得る

当初は
「ServiceからActivityを書き換えるってどうやるんだ…?Binder?ServiceConnection?Messengerを使えば値を渡せるのか!」
などと迷走を続けていたところ

sendBroadcastでえぇやん(意訳
でないと汎用性下がるし

と2度目のorz
ほぼ一日かけてたどり着いたMessengerは無に返り, 晴れてsendBroadcastによる実装が残りましたとさorz

という愚痴を書きたかっただけ.

1. Service側

まずはService側. いたって単純で, Intent.ACTION_BATTERY_CHANGEDを受け取ったらオリジナルのIntentに必要な情報を載せて発信するだけのもの.


public class BatteryService extends Service {


    public static final String ORIGN_ACTION = "orignbatteryaction";

    private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(final Context context, final Intent intent) {
            if (intent.getAction().equals(Intent.ACTION_BATTERY_CHANGED)) {
                int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0);
                // オリジナルのActionでintentを作成
                Intent sendIntent = new Intent(BatteryService.ORIGN_ACTION);
                // levelを載せる
                sendIntent.putExtra("level", level);
                sendBroadcast(sendIntent);
            }        }
    };

    @Override
    public void onCreate() {
        super.onCreate();
        IntentFilter filter = new IntentFilter();
        filter.addAction(Intent.ACTION_BATTERY_CHANGED);
        registerReceiver(mReceiver, filter);
    }

    @Override
    public void onStart(final Intent intent, final int startId) {
        super.onStart(intent, startId);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        unregisterReceiver(mReceiver);
        Log.i("hogeBatteryService", "unregisterReceiver");
    }

    @Override
    public IBinder onBind(final Intent arg0) {
        return null;
    }
}

たまにはまるっと載せてみる.mReceiverの中, コメントにある通りACTIONの部分を自作してやるだけ. 名前はユニークになるように. 万一被ると大変なことになる…かも?('A`)
後はintentを送る際,

startActivity(sendIntent)

ではなく
sendBroadcast(sendIntent)

を用いれば, 行き先を指定しないIntentの出来上がり.

2. Activity側


こちらもほぼ同様.


public class ResidureBatteryCheckerActivity extends Activity {

    private static TextView textView;

    @Override
    public void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_residure_battery_checker);
        textView = ((TextView) findViewById(R.id.hoge_battery_check));
    }

    @Override
    public void onResume() {
        super.onResume();
        // バッテリー情報更新のサービスを開始する
        Intent batteryIntent = new Intent(this, BatteryService.class);
        if (startService(batteryIntent) == null) {
            Log.e("hogeMakeFirstSetting", "cannot Start Service");
        } else {
            Log.i("hogeMakeFirstSetting", "Service is Start!");

            // ServiceからのBroadcastを受け取るReceiverを立てる
            IntentFilter filter = new IntentFilter();
            filter.addAction(BatteryService.ORIGN_ACTION);
            registerReceiver(orignReceiver, filter);
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(orignReceiver);
        stopService(new Intent(this, BatteryService.class));
    }

    public static void changeText(final String message) {
        if (textView != null) {
            textView.setText(message);
        }
    }

    // オリジナルのIntentを受け取るReceiver
    private final BroadcastReceiver orignReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(final Context context, final Intent intent) {
            if (intent.getAction().equals(BatteryService.ORIGN_ACTION)) {
                int level = intent.getIntExtra("level", 0);
                String message = "level is " + level;
                changeText(message);
            }
        }
    };
}

なんてことは無く, ただReceiverを立て, ただオリジナルIntentを拾い, 情報を取り出して好きに使うだけ.
なおReceiverはonDestroyなどできちんとunregisterReceiverしましょう. でないとちゃんと休ませろって警告が来ます. 主にLogに.Serviceはお好みで. ただ止める手段がないと走り続けてバッテリーがマッハ.ヽ(;´Д`)ノ








…Messengerを使ったものはこの倍はコードがあったわけで, 結果としては良かった…のかな.
Handlerとか良くわかんなかったしorz

2012年10月14日日曜日

Androidで設定を参照, 操作するあれこれ -Wi-fiの小ネタ編-

DeveloperのSettings.Systemのあたりを漁っていたら見つけたので


Wi-fiのスリープ設定

正直こんなことも無ければ知らなかったであろう機能.
簡単に言ってしまえば「本体がスリープしたときWi-fiもスリープする?」という設定ができる機能が本体の設定の中にあったわけで…


一生懸命画面のOffのIntentとってなんとかしようとか考えてたのは一体…orz


ちなみに設定までの行き方は
「Wi-fi設定」でメニューを開き「詳細設定」へ…

メニューて…('A`)

とまぁなかなかエキセントリック遠い所に設定があるのでボタン一発で書き換えてやろう, と考えた次第.


とりあえずコード.まずは設定の取得から.


android.provider.Settings.System.getInt(contentresolver,android.provider.Settings.System.WIFI_SLEEP_POLICY,-1);

長い…
画面の設定編でもやった通り,

import android.provider.Settings.System;
しておくと楽かと
parmissionも WRITE_SETTINGS だけでOK(なはず).
内容もいたって簡単.WIFI_SLEEP_POLICYの今の設定をintで返すだけ.
設定は3種類.


0 = WIFI_SLEEP_POLICY_DEFAULT : 画面のスリープと一緒にスリープする
2 = WIFI_SLEEP_POLICY_NEVER : スリープしない
1 = WIFI_SLEEP_POLICY_NEVER_WHILE_PLUGGED : 電源につながっていればスリープしない

の3つ.

設定の書き換えも
android.provider.Settings.System.putInt(contentresolver,android.provider.Settings.System.WIFI_SLEEP_POLICY,values)

のvaluesに0から2の好きな値を入れてやればOK.
boolean型が返ってくるので, ifで囲って書き込み成功/失敗をとってやればより安全にできるかと.



…parmissionあってるかな…(・ω・`)

2012年10月10日水曜日

Androidで設定を参照, 操作するあれこれ -画面の設定編-

今回はいったいいつ使うのかわからないネタ


android端末の画面の設定を操作


うん…普通に設定開けば良いじゃんとか言わない.アーアー<'(;´Д`)>キコエナイー
見つけて使ってみたから書く…うん


0. 下準備

まず始めに準備するのが.ManifestのUse-Parmission.
ここに

android.permission.WRITE_SETTINGS

これを許可してやる.
許可しないと基本設定を書き込めません.
一部読むだけなら要らないのもあるけれど…

そして


import android.provider.Settings.System;

をimportしておくことをお勧めする.
でないとSystemと一口に言っても, System.out.printlnでおなじみのjava.langや, android.osなどにもSystemがある.
そのため, 以降別のSystemを眺めながら「そんなメソッド見つからない!」とかIDEさんに理不尽に怒られる可能性があります.('A`)コレハヒドイ

1. 画面の点灯時間の設定

いわゆるオートスリープまでの時間の設定.
まずは, 今の設定を呼び出すメソッド.

System.getInt(getContentResolver(),System.SCREEN_OFF_TIMEOUT)

これだけ.
もしくは,
System.getInt(getContentResolver(),System.SCREEN_OFF_TIMEOUT, -1)

これだけ.
最初の引数はContentRe
最後の引数の-1は今回は特に関係ないようです.getIntによくあるデフォルト値?
ちなみに-1は「消灯しない」の設定みたい
第一引数のContentResolverはともかく
第二引数のSystem.SCREEN_OFF_TIMEOUT, これでどの情報にアクセスするかを設定しているみたい.

これで現在の設定が取得可能. 取得はミリ秒単位.

取得したら今度は設定.


System.putInt(getContentResolver(), System.SCREEN_OFF_TIMEOUT, 設定したい時間(ミリ秒));

これだけ.
設定したい時間に好きな値を放り込めばOK.
本体の設定アプリにない値も設定できます.



だれか一年とか設定してみた人いないのかな|・ω・`)チラッ


2. 画面の回転の設定

Notification Barを引っ張れば良いとか言わない.
Widget出せば良いとか言わない.

System.getInt(getContentResolver(),System.ACCELEROMETER_ROTATION)

まずは設定の取得. 既視感?少し上を見れば解決するかと.
基本Settings.Systemはこのメソッドで何とかなりそう.
返ってくる値は0(ロック状態), 1(ロック解除状態)の2種類.
表示するなら一工夫必要.

そして設定.

System.putInt(getContentResolver(),System.ACCELEROMETER_ROTATION, 0 or 1);

大方の予想通りでございます. はい.
0 or 1 でロック or アンロック を指定できます.

非常にシンプルなのでボタン一個で設定できるのもうなずけます.

とりあえずはこのあたり.











コード少ないなぁ…(・ω・`)

2012年10月9日火曜日

Androidで設定を参照, 操作するあれこれ -バッテリー編-

久々のAndroidキター
ただいまjava!私は帰ってきた!+(・ω・0)*




まあメモるのは初めてなんですがね(;´Д`)


内容は

androidの設定を操作するアプリの作成

ということでそのパーツ毎にちらほらとメモしていく予定


まずはバッテリー編からφ(・ω・`)

android端末のバッテリー情報を取得


端末のバッテリー情報を取るならIntent.ACTION_BATTERY_CHANGEDのお世話になるのが楽.
…他にも方法あるのかな

このIntentは, システムが「バッテリーの残量や状態が変更された時」, その情報を載せてIntentを発行していてくれている(らしい)

なのでこれを受信する受信機を用意してやればいい, とのこと

そこで登場するのがBroadcastReceiverクラス
ブロードキャスト化されたIntentを拾えるこのクラスを継承して, BatteryReceiverなるクラスを作ります

1. Receiverの作成


public static final class BatteryReceiver extends BroadcastReceiver {

  @Override
  public void onReceive(final Context context, final Intent intent) {
                        // actionの取得
   String action = intent.getAction();
                        // actionの確認. Intent.ACTION_BATTERY_CHANGED以外のintentは排除する
   if (!action.equals(Intent.ACTION_BATTERY_CHANGED)) {
    Log.d("BatteryReceiver ", "action is " + action);
    return;
   }

   // 状態, 「充電中」等の状態がintで取れる
   int status = intent.getIntExtra("status", 0);
   // 電池残量, デフォルトは0.
   int level = intent.getIntExtra("level", 0);

   Log.d("level", level + "%");
  }
 }

とりあえずシンプルにバッテリーの状態と残量(%)だけを取得するクラス.
このレシーバーを立てておく. 立て方は後々
Intent.ACTION_BATTERY_CHANGEDを受け取るとonReceiveが呼ばれて処理スタート.
まずはコメントにあるとおり, 余計なIntentはreturnで排除.
・・・余計なIntentって入ってくるのかな.
その後はもうお好きに.
Intentからお好みの情報を引き出して操作するだけ.
Intentに含まれる値に関しては参考を参照.

参考:http://www.adakoda.com/android/000140.html

また, このonReceiveはオーバーライドメソッドなので, ココ以外に値を持ち出すときは一工夫必要.
上記をまるっと内部クラスにしてやるのが一番扱いやすい・・・?

ほかにもServiceクラスに乗せるなどの使い方も.
ここで得られる値もWidget向きだったりするのでServiceで使うのもアリ・・・?

疑問系ばかりであるorz

2. Filterの登録


BatteryReceiver receiver = new BatteryReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_BATTERY_CHANGED);
registerReceiver(receiver, filter);

Receiverが出来たら, 今度はIntentFilterをかけてやる. こちらはActivityならonCreateやonResumeなどで宣言してやるといい.
1,2行目で作ったReceiverとIntentFilterをインスタンス化.
3行目の addAction メソッドで件の Intent.ACTION_BATTERY_CHANGED をfilterが受け取ることを宣言.
4行目でそのfilterとreceiverを関連付けて宣言は終了.
あとはこのメソッドを通るように起動させればReceiver起動.


IntentがくるたびにReceiverが動いてくれる.

3. Receiverの破棄

unregisterReceiver(receiver);
これだけ.
これをonDestoryなど, もう要らないと判断される時に呼べばいい.
ただonPauseがいいのかonDestoryがいいのかは微妙….
もっと他にいいとこあるかも…?

これで必要なパーツはそろい踏み.

Widgetなんかにしてバッテリー残量によってアクションが変わるアプリなんかが作りやすいかも.








…アプリ自体がバッテリー食うのは内緒( ´д)ヒソ(´д`)ヒソ(д` )

AWS CDKで立てたEC2インスタンスのTimeZoneとかいじりたかった話

EC2を立てることはできたけど、立てたインスタンスは UTCのままだし設定ファイルとかいちいちscpしてくるのはダルい。 当初UserDataでなんとかしようとしたものの、「書く量がヤバいしメンテしにくい」と悩んでいたところ見かけたのが  AWS::CloudFormation:...