かめのはこ

とあるエンジニアのメモ帳です

キーボードが閉じられるのを検知したい

以前作ったアプリでは
レイアウトのDisplayサイズとViewサイズの差から
ソフトウェアキーボードの表示有無を取得してたんですが

今回SufaceView上で入力操作をしたくて
Dialog上に配置したコントロールを経由して入力を取ろうとしたとき
先のようなキーボード有無の検知がどうもできなくてどうしたものかと

やれるとしたら入力で配置したEditTextのコントロールくらいだろう、と
いろいろしてみた

◆閉じられる契機
・キーボードの完了おしたとき
・バックキーおしたとき
・キーボード以外の領域をおしたとき(4系のみ)

◆2系と4系のバックキーの挙動の違い
(AlertDialogの上にEditTextのっけてる場合)
4系ではバックキーのイベントがAlertDialogまで飛んでくる
2系では飛んでこない


さて

●こうした
EditText extendしたクラスを用意してonKeyPreImeも書き換えて
そんなかにキーボードが閉じられた時の処理書いた。。。もぉこれでいっかぁ


●あとがき
いいのか、これで
閉じられる契機が心配
BluetoothとかのHWキーボードの場合とか考慮してね
IMEのアプリによって挙動かわらんよな。。。たぶん

<検証結果>
●4系
・▽のとき(バックキーなのか?)
EditText.onKeyPreIme
AlertDialog.OnKeyListener:KEYCODE_BACK
・Doneのとき
EditText.OnEditorActionListener:IME_ACTION_DONE
・ダイアログ範囲外
かってに閉じる

●2系
・バックキー
EditText.onKeyPreIme
・完了のとき
EditText.OnEditorActionListener:IME_ACTION_DONE
・ダイアログ範囲外
反応しない

レイアウトのXMLでエラーした

こんなエラー

No orientation specified, and the default is horizontal. This is a common source of bugs when children are added dynamically.

対象のレイアウトはこれ

<LinearLayout
	android:id="@+id/LinearLayout01"
	android:background="#00000000"
	android:layout_height="wrap_content"
	android:layout_width="fill_parent"
	android:orientation="horizontal"
	android:gravity="center"
	>

	<LinearLayout
	    android:id="@+id/LinearLayout02"
	    android:layout_width="wrap_content"
	    android:layout_height="wrap_content"
	    android:layout_gravity="bottom|center" />

</LinearLayout>

メッセージの通りLinearLayout02の方にもorientationしてみる

<LinearLayout
	android:id="@+id/LinearLayout01"
	android:background="#00000000"
	android:layout_height="wrap_content"
	android:layout_width="fill_parent"
	android:orientation="horizontal"
	android:gravity="center"
	>

	<LinearLayout
	    android:id="@+id/LinearLayout02"
	    android:layout_width="wrap_content"
	    android:layout_height="wrap_content"
	    android:layout_gravity="bottom|center"
	    android:orientation="horizontal"
	    />

</LinearLayout>

で直った

# refs http://memo755.blog.fc2.com/blog-entry-101.html

Android4.4のSDKいれたら出たエラー

4.4のSDK入れたらEclipseのコンソールに変なエラーが

[2013-11-18 10:31:55 - Framework Resource Parser] Collect preferences failed, class java/lang/AutoCloseable not found in C:¥Android¥android-sdk¥platforms¥android-19¥android.jar

eclipse上の新規ソフトウェアのインストールで
更新かかってるやつを全部インストールしたらなおった

# refs http://d.hatena.ne.jp/paraches/20131114

VirtualBoxのゲストOSのディスクを拡張する

vboxのゲストOSのディスクが足りなくなったので

リサイズしようと思ったんだけど

結構めんどくさかったのでメモ

 

■構成

host : windows7

guest: ubuntu13.04

でguestのdisksizeを20G -> 40Gに変更 にしてみる

 

①まずゲストOS停止

sudo halt

 

②VDIのサイズ変更

VBoxManage modifyhd "C:¥Users¥XXXXX¥VirtualBox VMs¥ubuntu13.04¥ubuntu13.04.vdi" --resize 40960

※VDIのファイル名だけでいけるかと思いましたが違うパスを参照しようとする為

 フルパスで記述しています

 

>0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%

な感じに100%と出力されればOK

 

③ゲストOSのディスク操作

virtualboxの設定いじっただけではゲストOS上認識されないので

gparted-live-0.16.1-1-amd64.iso ってやつを使いました

 

下記URLからGPartedのLiveをダウンロード

http://gparted.sourceforge.net/

 

④CD/DVDにダウンロードしたISOをマウントして起動

>Don't touch keymap

>15: Japan

>0: X起動

 

⑤Gpartedの操作(GUI)

 

<状態>

/dev/sda1 ext4

/dev/sda2 extended

/dev/sda5 linux-swap

未割り当て

 

>/dev/sda5 を選択してDELETE

>/dev/sda2 を選択してリサイズ/移動で一番後方に移動させる

 

/dev/sda1 ext4

未割り当て

/dev/sda2 extended

未割り当て

 

>/dev/sda1 を選択してリサイズ/移動で大きくする(20->40G)

>/dev/sda2配下の未割り当てを選択して パーティション作成(linux-swap)

>適用(しばらく待つ)

 

<状態>

/dev/sda1 ext4

未割り当て (1Mくらいあまった)

/dev/sda2 extended

新規パーティション linux-swap

未割り当て (1Mくらいあまった)

 

ここで終わりとみせかけて

 

⑥fstabの修正

※swap移動させたのでUUIDが変わってる

Gparted内のTerminal起動して

>sudo mount /dev/sda1 /mnt

>sudo vi /mnt/etc/fstab

 ※「UUID=XXXX  none  swap sw 0 0」となってる部分をコメントアウトして

 ※「/dev/sda5  none swap sw 0 0」にする

 

⑦Gparted終了

※左上に電源落とすアイコンがあるのでダブルクリック

 

⑧で普通にゲスト起動

>swapon -s

 ※「/dev/sda5 」が認識されてればOK

>df -k

 ※ディスクサイズも確認!!

 

でfstabをUUIDの形式に戻す

UUID確認

>sudo blkid

 ※「/dev/sda5: UUID=XXX」

 

fstab修正

>sudo vi /mnt/etc/fstab

 ※「UUID=XXXX  none  swap sw 0 0」でXXXを変更して有効化

 ※「/dev/sda5  none swap sw 0 0」は無効化

 

再起動して

>swapon -s

 ※で認識されてれば終了!!

 

で終わりとみせかけて

 

⑩dfうつとエラーが

「df: `/run/user/lightdm/gvfs': Permission denied」>こんなんが出るようになったので

GuestAdditionを再度インストール

で、なおった

 

終わり

1年前のCakePHP2系で作ったプロジェクト

cakephp2系を使った失敗構成

@shareにこだわったわりに似たようなメソッドが微妙に名前を変えて実装される

 shareが実装後半で肥大化する恐怖

@const用意しすぎてカオス

 

まぁ思い出ということで・・・

 

構成的には

・フロント向けアプリケーション

・バックエンド向けアプリケーション

・API向けアプリケーション

・バッチ向けアプリケーション

・コアモジュール

環境変数

・共通モジュール

ってな感じにわけた

 

ディレクトリで見ると

・アプリケーション

app_batch

app_front

app_admin

app_api

┣Config

┃┣bootstrap.php # env/bootstrap.php をrequire

┃┣const.php # 普通に定義(Configure使って)

┃┣core.php # 空ファイル

┃┣database.php # 空ファイル

┃┗…

┣Console

┣Controller

┣Error

┣Locale

┣Test

┣View

┣tmp

┗webroot

 

・コア

core

 

環境変数

┣bootstrap.php

┣const.php

┣environment.php # 環境名だけ定義(=ディレクトリ名) ex.)local

┗local or test or prod

 ┣const.php

 ┣core.php

 ┗database.php

 

・共通モジュール

share

┣Controller

┣Datas

┣Lib

┣Model

┣Plugin

┣Vendor

┗View

 

★const3つもある(読み込み中に列挙)

env/const.php # 共通

[APP]/Config/const.php # プロジェクト依存

env/[ENV]/const.php # 環境に依存

TimeMachineで「sparsebundle”はすでに使用中です。」になる

TimeMachineのバックアップでエラーしていた。

メッセージは「sparsebundle"はすでに使用中です。」。

端末再起動しても直らなかったので、

TimeMachineの方を再起動かけたら直りました。

再起動AirMacユーティリティから

TimeCapsuleを選択してメニューから ベースステーション再起動

でやりました。(少し時間かかりました)

原因不明

<環境>

MacBook Air

OS X 10.8.2

TimeCapsule Version 7.6.1

ubuntu12.04(x64)にplv8入れてみる

Postgresでjavascriptが書けるってやつを試してみました
 
まずは環境作りから
 
※postgresql9.1インストール済

V8 Engineインストール

sudo apt-get install python scons gcc g++ svn
cd /usr/local/src
svn checkout http://v8.googlecode.com/svn/trunk/ v8
cd v8
scons mode=release library=shared snapshot=on arch=x64
sudo cp libv8.so /lib/

 
PL/V8インストール

sudo apt-get install mercurial
sudo apt-get install postgresql-server-dev-9.1
cd /usr/local/src
wget https://plv8js.googlecode.com/files/plv8js-20120719.tar.gz
tar zxvf plv8js-20120719.tar.gz
cd plv8js
make
sudo make install
sudo cp -pR /usr/local/src/plv8js/sql /usr/share/postgresql/9.1/contrib/plv8js

 
インストールしたモジュールPostgresに追加

cp -p /etc/postgresql/9.1/main/postgresql.conf /etc/postgresql/9.1/main/postgresql.conf.org
sudo /etc/init.d/postgresql stop
vi /etc/postgresql/9.1/main/postgresql.conf
 >> custom_variable_classes = 'plv8'
sudo /etc/init.d/postgresql start

 
んじゃDBにも関数とか反映

sudo su - postgres
psql -c 'CREATE EXTENSION plv8' -d データベース名
psql -f /usr/share/postgresql/9.1/contrib/plv8js/plv8.sql -d データベース名

 
これで一通り準備は完了したのでJSしてみる
 
READMEにあったやつ

CREATE OR REPLACE FUNCTION plv8_test(keys text[], vals text[])
RETURNS text AS $$
 var o = {};
 for(var i=0; i<keys.length; i++){
  o[keys[i]] = vals[i];
 }
 return JSON.stringify(o);
$$ LANGUAGE plv8 IMMUTABLE STRICT;

SELECT plv8_test(ARRAY['name', 'age'], ARRAY['Tom', '29']);
plv8_test
---------------------------
{"name":"Tom","age":"29"}
(1 row)

 
とりあえずループ文

CREATE OR REPLACE FUNCTION plv8_test(startval integer, endval integer)
RETURNS integer AS $$
 var o = 0;
 for(var i=startval; i<=endval; i++){
  o += i;
 }
 return o;
$$ LANGUAGE plv8 IMMUTABLE STRICT;

SELECT plv8_test(1,10);
plv8_test
-----------
55
(1 row)

 
とりあえずJS関数

CREATE OR REPLACE FUNCTION plv8_test()
RETURNS text AS $$
 var dd = new Date();
 return dd.toLocaleString();
$$ LANGUAGE plv8 IMMUTABLE STRICT;

SELECT plv8_test();
plv8_test
-----------------------------------------
Tue Sep 18 2012 11:39:24 GMT+0900 (JST)
(1 row)

 
とりあえず自前関数

CREATE OR REPLACE FUNCTION plv8_test()
RETURNS text AS $$
  var aa = "first";
  sage();
  hoge();
  return aa;
  function hoge(){
    aa = "hoge";
  }
  function sage(){
    aa = "sage"
  }
$$ LANGUAGE plv8 IMMUTABLE STRICT;

SELECT plv8_test();
plv8_test
-----------
hoge
(1 row)

変数のスコープ回りを試してみる

CREATE OR REPLACE FUNCTION plv8_test()
RETURNS text AS $$
  var aa = "first";
  sage();
  hoge();
  return aa;
  function hoge(){
    var aa = "hoge";
  }
  function sage(){
    var aa = "sage"
  }
$$ LANGUAGE plv8 IMMUTABLE STRICT;

SELECT plv8_test();
plv8_test
-----------
first
(1 row)


生成結果

\df plv8_test
List of functions
Schema | Name | Result data type | Argument data types | Type
--------+-----------+------------------+----------------------------------+--------
public | plv8_test | text | | normal
public | plv8_test | text | keys text[], vals text[] | normal
public | plv8_test | integer | startval integer, endval integer | normal
(3 rows)

 
 
個人的には配列周りが描きやすくなるかもねって感想です

※参考サイト(ここのWiki)
https://code.google.com/p/plv8js/