[HTML]タグにbgcolorなどの指定は非推奨

<body>タグにbgcolor、text、link、alink、vlinkの属性を指定することで、
背景色や文字色やリンク色の指定をすることができますが、
HTML 4.01では非推奨だったんですね。

属性効果
bgcolor文書の背景色
text文字の基本色
link未訪問のリンク文字の色
vlink訪問済みのリンク文字の色
alink選択中のリンク文字の色

CSSのbackground-color、colorを使用すれば事足りるので、
基本的にはCSSを使用しろということのようですね。


気を付けて使用しないとサポートしないブラウザが増えた時に
痛い目にあいそうですな。

ちなみに、webkitなどではまだサポートはされていそうです。

[Android] SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS は非推奨

SurfaceHolder の仕様を確認したところ、 setType() が「API level 11」から非推奨になっていた。。。

------------------------------------------------
public abstract void setType (int type)
Added in API level 1

This method was deprecated in API level 11.
this is ignored, this value is set automatically when needed.

Sets the surface's type.
------------------------------------------------

それとともに、
・SurfaceHolder.SURFACE_TYPE_NORMAL
・SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS
も非推奨だ。


でも、カメラプレビューを表示するとき、

setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

をしておかないと、以下の例外が発生してしまう。

「E/AndroidRuntime(8817): java.lang.RuntimeException: startPreview failed」


Android2.x系では、カメラプレビューを表示する際に SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS の指定が必要みたいなことが、
http://d.hatena.ne.jp/miyabihito/20111224/1324723526
に書かれてるし、どうすればいいんだろう。

非推奨なだけで、使うことはできるのだが、何か対策は立てておいたほうがよさそうだけど、ちょっと保留・・・



[Excel] 式の中に改行を入れる場合

Excelを使用していたら、複数のセルの内容を連結したい
という状況になることもしばしば。

以前、文字列の連結(CONCATENATE)で紹介した、
CONCATENATE関数なんてのがありますが、
&でつなぐほうが簡単なので、個人的にはほとんど、
&を使ってしまいます。


そんな、文字列連携をしているうちに改行を入力したいという
状況が発生しました。

式の中に改行を埋め込む必要があります。

方法としては、CHAR(10)を使用するだけでした。

"セルA"&CHAR(10)&"セルB"

といった式で、"セルA" と "セルB" の間に改行が入ります。


[PHP] 関数

関数は、print()のようなあらかじめ用意されているものもたくさんあるが、ユーザが定義をすることもできる。
今回は、ユーザが定義する関数について考えていく。

特徴として、JavaやC言語などでは関数を定義する際、戻り値や引数の型を意識する必要があるが、PHPでは方は意識しなくてよい。



■基本形

 function 関数名() {
   処理を実装
 }

関数を定義する場合、function を先頭につけてあげます。
function のキーワードをもとに、そのブロックは関数として認識されます。



■戻り値がある場合

 function 関数名() {
   return(戻り値);
 }

return 句をしようして、戻り値をしていしてあげます。



■引数を指定する場合(値渡し)

 function funcname($arg) {
   $arg = 100;
   return $arg;
 }

単純に呼び出し側から値をもらって、その値を引数の$argにコピーしています。

なので、呼び出し側で以下のような実装をした場合、渡している引数の値は変わりません。

 $val1 = 300;
 $val2 = functionname($val1);
 print($val1);

出力結果は "300" になり、$val1が関数の呼出し前後で変更されていない。



■引数を指定する場合(参照渡し)

 function funcname(&$arg) {
   $arg = 100;
   return $arg;
 }

引数に"&"をつけることで参照渡しとなります。
その名の通り、値ではなくて値の保存されている場所(参照先)を引数で渡します。

なので、関数内で参照先の値を変えると呼び出し元の値を直接変更することになります。

 $val1 = 300;
 $val2 = functionname($val1);
 print($val1);

出力結果は "100" になり、$val1が関数内で変更されました。



■引数を指定する場合(複数指定)

 function funcname($arg1, $arg2, $arg3, ・・・) {
   処理を実装
}

引数を","で区切って複数指定することができます。



■引数を指定する場合(デフォルト値を指定)

 function funcname($arg = 100) {
  処理を実装
 }

このように引数のデフォルト値を指定することができます。
呼び出し側で該当する引数が指定されていない場合、デフォルト値がしようされます。

ちなみに、デフォルト値指定の後にデフォルト値でない引数を定義することはできないようです。




[Android] タッチした位置(座標)を取得する

タッチパネルのデバイスが多いAndroid。
どこがタッチされたのかアプリ側で検出したい場合の座標値取得を試してみた。

今回は、dispatchTouchEventonTouchEvent で座標を取得した。


お試しで、タッチした位置の座標をTextViewに出力してみた。

@Override
public boolean dispatchTouchEvent(MotionEvent event) {
float x, y;

x = event.getX();
y = event.getY();

mTextView1.setText("dispatchTouchEvent: X座標=" + x + " Y座標=" + y);

return super.dispatchTouchEvent(event);
}

@Override
public boolean onTouchEvent(MotionEvent event) {
float x, y;

x = event.getX();
y = event.getY();

mTextView2.setText("onTouchEvent: X座標=" + x + " Y座標=" + y);

return super.onTouchEvent(event);
}


dispatchTouchEvent、onTouchEvent のどちらも同じ位置を検出した。
実際どちらで取得してもよさそうだけど、たしか onTouchEvent はたまに呼ばれないこともあるので、dispatchTouchEventのほうがいいのかな。



[Android] ImageViewのサイズをLayoutParamsで指定しようとしたら例外に。。。

ImageViewのサイズを変更したく、LayoutParamsを使ってサイズ変換かけたら例外が発生した・・・


LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(width / 2, height/2);
mImageView.setLayoutParams(lp);



06-15 10:01:14.830: E/AndroidRuntime(16833): FATAL EXCEPTION: main
06-15 10:01:14.830: E/AndroidRuntime(16833): java.lang.ClassCastException: android.view.ViewGroup$LayoutParams
06-15 10:01:14.830: E/AndroidRuntime(16833): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3123)
06-15 10:01:14.830: E/AndroidRuntime(16833): at android.widget.FrameLayout.onMeasure(FrameLayout.java:245)
06-15 10:01:14.830: E/AndroidRuntime(16833): at android.view.View.measure(View.java:8183)
06-15 10:01:14.830: E/AndroidRuntime(16833): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3132)
06-15 10:01:14.830: E/AndroidRuntime(16833): at android.widget.FrameLayout.onMeasure(FrameLayout.java:245)
06-15 10:01:14.830: E/AndroidRuntime(16833): at android.view.View.measure(View.java:8183)
06-15 10:01:14.830: E/AndroidRuntime(16833): at android.widget.LinearLayout.measureVertical(LinearLayout.java:526)
06-15 10:01:14.830: E/AndroidRuntime(16833): at android.widget.LinearLayout.onMeasure(LinearLayout.java:304)
06-15 10:01:14.830: E/AndroidRuntime(16833): at android.view.View.measure(View.java:8183)
06-15 10:01:14.830: E/AndroidRuntime(16833): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3132)
06-15 10:01:14.830: E/AndroidRuntime(16833): at android.widget.FrameLayout.onMeasure(FrameLayout.java:245)
06-15 10:01:14.830: E/AndroidRuntime(16833): at android.view.View.measure(View.java:8183)
06-15 10:01:14.830: E/AndroidRuntime(16833): at android.view.ViewRoot.performTraversals(ViewRoot.java:801)
06-15 10:01:14.830: E/AndroidRuntime(16833): at android.view.ViewRoot.handleMessage(ViewRoot.java:1727)
06-15 10:01:14.830: E/AndroidRuntime(16833): at android.os.Handler.dispatchMessage(Handler.java:99)
06-15 10:01:14.830: E/AndroidRuntime(16833): at android.os.Looper.loop(Looper.java:123)
06-15 10:01:14.830: E/AndroidRuntime(16833): at android.app.ActivityThread.main(ActivityThread.java:4627)
06-15 10:01:14.830: E/AndroidRuntime(16833): at java.lang.reflect.Method.invokeNative(Native Method)
06-15 10:01:14.830: E/AndroidRuntime(16833): at java.lang.reflect.Method.invoke(Method.java:521)
06-15 10:01:14.830: E/AndroidRuntime(16833): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:878)
06-15 10:01:14.830: E/AndroidRuntime(16833): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:636)
06-15 10:01:14.830: E/AndroidRuntime(16833): at dalvik.system.NativeStart.main(Native Method)




対応方法を探してたら、以下に「LinearLayout.LayoutParamsにしないと例外になるよ」という記事を発見。
ImageViewのLayoutParamsって…Add Star

さっそく修正。


LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(width / 2, height/2);
mImageView.setLayoutParams(lp);



06-15 10:10:52.920: E/AndroidRuntime(17671): FATAL EXCEPTION: main
06-15 10:10:52.920: E/AndroidRuntime(17671): java.lang.ClassCastException: android.widget.LinearLayout$LayoutParams
06-15 10:10:52.920: E/AndroidRuntime(17671): at android.widget.FrameLayout.onLayout(FrameLayout.java:288)
06-15 10:10:52.920: E/AndroidRuntime(17671): at android.view.View.layout(View.java:7047)
06-15 10:10:52.920: E/AndroidRuntime(17671): at android.widget.FrameLayout.onLayout(FrameLayout.java:333)
06-15 10:10:52.920: E/AndroidRuntime(17671): at android.view.View.layout(View.java:7047)
06-15 10:10:52.920: E/AndroidRuntime(17671): at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1249)
06-15 10:10:52.920: E/AndroidRuntime(17671): at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1125)
06-15 10:10:52.920: E/AndroidRuntime(17671): at android.widget.LinearLayout.onLayout(LinearLayout.java:1042)
06-15 10:10:52.920: E/AndroidRuntime(17671): at android.view.View.layout(View.java:7047)
06-15 10:10:52.920: E/AndroidRuntime(17671): at android.widget.FrameLayout.onLayout(FrameLayout.java:333)
06-15 10:10:52.920: E/AndroidRuntime(17671): at android.view.View.layout(View.java:7047)
06-15 10:10:52.920: E/AndroidRuntime(17671): at android.view.ViewRoot.performTraversals(ViewRoot.java:1045)
06-15 10:10:52.920: E/AndroidRuntime(17671): at android.view.ViewRoot.handleMessage(ViewRoot.java:1727)
06-15 10:10:52.920: E/AndroidRuntime(17671): at android.os.Handler.dispatchMessage(Handler.java:99)
06-15 10:10:52.920: E/AndroidRuntime(17671): at android.os.Looper.loop(Looper.java:123)
06-15 10:10:52.920: E/AndroidRuntime(17671): at android.app.ActivityThread.main(ActivityThread.java:4627)
06-15 10:10:52.920: E/AndroidRuntime(17671): at java.lang.reflect.Method.invokeNative(Native Method)
06-15 10:10:52.920: E/AndroidRuntime(17671): at java.lang.reflect.Method.invoke(Method.java:521)
06-15 10:10:52.920: E/AndroidRuntime(17671): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:878)
06-15 10:10:52.920: E/AndroidRuntime(17671): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:636)
06-15 10:10:52.920: E/AndroidRuntime(17671): at dalvik.system.NativeStart.main(Native Method)



直ってない。。。
で、結果として LinearLayout.LayoutParams から FrameLayout.LayoutParams に変更したところ問題なく動くようになりました。


FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(width / 2, height/2);
mImageView.setLayoutParams(lp);




[Android] カメラプレビューに画像を重ねてみた



上の画像は、カメラプレビュー上にアイコン画像を表示したもの。

カメラプレビューを表示する実装は前回の下記を参照。
[Android] カメラプレビューを表示してみる


画像を表示した際の実装を onCreate() を抜粋。

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

FrameLayout frameLayout = new FrameLayout(this);

ImageView iv = new ImageView(this);
iv.setImageResource(R.drawable.ic_launcher);

SurfaceView sv = new SurfaceView(this);
SurfaceHolder sh = sv.getHolder();
sh.addCallback(new SurfaceHolderCbk());
sh.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

frameLayout.addView(sv);
frameLayout.addView(iv);

setContentView(frameLayout);

}


フレームレイアウトを使用して、SurfaceView の上にImageViewを追加したことで、
プレビュー上にイメージを表示できました。
ImageViewの上にSurfaceViewはカメラプレビューでイメージが隠されてしまうのか、
期待する表示にはならなかった。。。


ちなみに、DDMSでスクリーンショットとると、
キレイにキャプチャできなかった。
# 画像に切れ目が。。。

端末の画面上はキレイに表示できてるのに・・・



[Android] アプリケーションSDU (Ver1.1.0)

公開中のアプリのデザインを変更してみました。



背景に画像を使用して雰囲気を明るくして、
ボタンの形をより丸くした。

あと、ボタンのラベルが「アンインストール」だけ文字数が
多くてバランスが悪かったので「削除」に変えて整えた。



アプリケーションSDU(アイコン画像)
アプリケーションSDU
(無料)

[Android] カメラプレビューを表示してみる

今回は、カメラプレビューを表示するお試し実装をしてみました。


カメラ機能を使用するために、AndroidManifest にパーミッションを
記載します。

<!-- カメラ機能を利用する権限 -->
<uses-permission android:name="android.permission.CAMERA" />
<!-- カメラ搭載デバイス限定 -->
<uses-feature android:name="android.hardware.camera" />


他にもカメラ関連だとオートフォーカスやフラッシュといった機能を使用するための
パーミッションもありますが、今回は使用しない機能なので使用しない。

<!-- オートフォーカス -->
<uses-feature android:name="android.hardware.camera.autofocus" />
<!-- フラッシュ -->
<uses-feature android:name="android.hardware.camera.flash" />



で、次にレイアウト。
カメラプレビューを表示するビューはというと、SurfaceView に表示ですな。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<SurfaceView
android:id="@+id/surfaceView1"
android:layout_width="match_parent"
android:layout_height="match_parent" />

</LinearLayout>



プログラムのほうは下記のようになります。
サーフェイスのコールバック処理(SurfaceHolder.Callback)に
カメラプレビューに関する処理を作成してサーフェイスホルダーに
addCallback() で追加してあげます。


package android.sample;

import java.io.IOException;

import android.app.Activity;
import android.hardware.Camera;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class SampleActivity007 extends Activity {

private SurfaceView mCameraView;
private SurfaceHolder mHolder;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.sample007_layout);

mCameraView = (SurfaceView)findViewById(R.id.surfaceView1);
mHolder = mCameraView.getHolder();
mHolder.addCallback(new SurfaceHolderCbk());
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}

public class SurfaceHolderCbk implements SurfaceHolder.Callback {
Camera camera;

/**
* サーフェイスが変更された時のコールバック。
*/
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// カメラプレビューを開始
camera.startPreview();
}

/**
* サーフェイスが生成された時のコールバック
*/
@Override
public void surfaceCreated(SurfaceHolder holder) {
// カメラオープン
camera = Camera.open();
try {
// プレビューを表示するサーフェイスホルダーを設定
camera.setPreviewDisplay(holder);
} catch (IOException e) {
e.printStackTrace();
}
}

/**
* サーフェイスが破棄された時のコールバック
*/
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// カメラプレビューを停止
camera.stopPreview();
camera.release();
camera = null;
}
}
}



こんな感じでカメラプレビューが表示されました。
android カメラプレビュー


[PHP] ループ処理

特定の条件を満たしている間だけ、同じ処理を繰り返したい場合に、ループ処理を使用します。
スープ処理にはいくつか表現の仕方があるので、以下に4種類を紹介。

■while文

条件式を満たしている間だけ、処理を繰り返すシンプルな構文。

 例)
  $cnt = 1;
  while ( $cnt <= 5 ) {
   print($cnt);
   $cnt++;
  }

  ※ 1~5までを順番に出力します


while文に特化したものではない(for文などでも使用可能)ですが、
途中でループを抜け出したい(break文)、ループ内の処理を止めて、
ループの判定条件を処理したい(continue文)といった方法もあります。

 例)
  $cnt = 1;
  while ( $cnt <= 5 ) {
   print($cnt);
   if ($cnt == 3) {
    break;
   }
   $cnt++;
  }

  ※ 1~3までを出力したら、breakでループを抜けます


 例)
  $cnt = 1;
  while ( $cnt <= 5 ) {
   if (($cnt % 2) == 0) {
    break;continue;
   }
   print($cnt);
   $cnt++;
  }

  ※ 偶数(2,4)はスキップして奇数(1,3,5)を表示します


■do-while文

while文は先に条件を満たすか判定がありますが、do-while文は処理をした後に、
繰り返し処理を行うか判定をします(少なくとも1度は処理が実行されます)。

 例)
  $cnt = 1;
  do {
   print($cnt);
   $cnt++;
  } while ($cnt <= 5));

  ※ 1~5までを順番に出力します


■for文

while文同様、条件を満たす間だけ処理を繰り返します。
ただ、条件式と一緒に、初期値と増減式を定義することができます。

 例)
  for ($cnt = 1; $cnt <= 5; $cnt++ ) {
   print($cnt);
   $cnt++;
  }

  ※ 1~5までを順番に出力します


■foreach文

配列の要素数分、繰り返し処理を実行します。

以下の2通りの方法がある。
・配列の値を取得してループする
・配列のキーと値を取得してループする

 例)
  $arr = array("a1","a2","a3");

  foreach($arr as $val) {
   print($val);
  }

  ※ 配列の値が出力される

 例)
  $arr = array("a1","a2","a3");

  foreach($arr as $key => $val) {
   print($key);
   print($val);
  }

  ※ 配列のキーと値が出力される

プロフィール

hiiro

Author:hiiro

最新記事
カテゴリ
月別アーカイブ
最新コメント
最新トラックバック
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR
Counter