大規模なサイトやWebサービスなどで使われるPHPですが、

開発する際にはフレームワークの活用は必須です。


今までのPHPの開発の現場では、CakePHPやSymphony、

Zend Framworkなどのフレームワークなどがあり、

使われてきました。


しかし、ここ最近伸びてきているのがCodeIgniter(コードイグナイター)

というフレームワークです。

CodeIgniterは2007年から右肩上がりで上昇し、アジアの国々で

人気となっており、 今ではCakePHPを抜いて1番のトレンドとなっています。


CakePHPとの大きな違いは、


 ・モデル・ビューが不要
 ・データベースも不要
 ・記述が簡素


になります。


CodeIgniterは一般的に必要な機能は、ライブラリとして提供しており、

容易にそれらの機能を利用できます。

また、Ruby on Rails のように、ユーザは Active Recordを用いて

データベースに接続でき、 モデル・ビュー・コントローラアーキテクチャパターンの

利用が推奨される。


【機能】

・PHP 4 で動作する
・極めて軽量
・複数のデータベースプラットフォームをサポート
・Formとデータの検証(Validation)
・セキュリティと XSSフィルタリング
・セッション管理
・Eメール送信クラス。添付・HTML/テキストEメール・複数プロトコル

 (sendmail・SMTPおよび Mail)のサポートなど
・画像操作ライブラリ(切り抜き・リサイズ・回転など)。

  GD・ImageMagick および Netpbm に対応。
・ファイルアップロードクラス
・FTPクラス
・ローカライゼーション
・ページ付け
・データ暗号化
・ベンチマーク
・完全ページキャッシュ
・エラーロギング
・アプリケーションの プロファイリング
・スカッフォールディング (Scaffolding)
・カレンダークラス
・ユーザーエージェントクラス
・Zip圧縮クラス
・テンプレートエンジンクラス
・トラックバッククラス
・XML-RPCライブラリ
・単体テストクラス
・検索エンジンフレンドリURL
・柔軟なURIルーティング
・フック・クラス拡張およびプラグインへの対応
・多数の「ヘルパ」関数ライブラリ


今後より伸びていきそうな予感がしますね。


■参考サイト

日本CodeIgniterユーザ会

CodeIgniter PHP コーディングスタイル

CodeIgniter 入門



中国国内でのAndroidの状況 を見つけました。




■Androidのバージョンごとの利用状況


 Android 1.xバージョンの利用者が減っているのと、
 2.2が急増し58%以上の利用者が存在する。

 最近発売されている端末は2.2搭載のものが大半のためと思われる。



■端末の価格


 2010年11月の時点では1,500(18,738円)~2,000(24,984円)元という

 価格帯が半数近くと大半を占めていたのと、

 2,000(24,984円)~2,500(31,230円)元の価格帯を合わせると

 7割前後まで占めている。



■端末の画面解像度


 WVGAの480×800の比率が上がってきている。
 減少傾向ではあるが、HVGA(320×480)、FWVGA(480×854)の比率も
 それぞれ22,23%前後です。

 "Mini XX"などの製品でよく採用されているQVGA(240×320)が15%弱を
 占めているのも1つの特徴かもしれません。



■搭載CPUの周波数


 1024MHzのCPUを搭載する端末が40%超を占め、528MHz、600MHzが
 それぞれ20%を占める



■アプリケーションをどこから入手するか


 中国国内のAndroidアプリマーケットが53%から58%に増えた。
 逆にGoogle本家のAndroid Marketは25%から21%に減少している。



■アプリケーションの利用時間帯


 夜間(22-23時)がよく使われています。



■各アプリケーションの起動回数別データ


 1回と10回以上の比率が高い。
 これは一回しか使わないのと、使い続けるアプリの差になっている。


■音声入力で入力された文字列を取得


ACTION_RECOGNIZE_SPEECHを発行していた場合、認識された

音声を文字列(リスト)として取得することができ、ACTION_WEB_SEARCHを

発行していた場合、認識された音声を使用してウェブ検索した結果が、画面表示されます。


<サンプルソース>

import java.util.ArrayList;
import android.app.Activity;
import android.content.ActivityNotFoundException;
import android.content.Intent;
import android.os.Bundle;
import android.speech.RecognizerIntent;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import com.adakoda.voicerecognitiontest.R.id;

public class VoiceRecognitionTestActivity extends Activity {
// = 0 の部分は、適当な値に変更してください(とりあえず試すには問題ないですが)
private static final int REQUEST_CODE = 0;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView
(R.layout.main);
Button button = (Button) findViewById(id.button);
button
.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
// インテント作成
Intent intent = new Intent(
RecognizerIntent.ACTION_RECOGNIZE_SPEECH); // ACTION_WEB_SEARCH
intent
.putExtra(
RecognizerIntent.EXTRA_LANGUAGE_MODEL,
RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
intent
.putExtra(
RecognizerIntent.EXTRA_PROMPT,
"VoiceRecognitionTest"); // お好きな文字に変更できます

// インテント発行
startActivityForResult
(intent, REQUEST_CODE);
} catch (ActivityNotFoundException e) {
// このインテントに応答できるアクティビティがインストールされていない場合
Toast.makeText(VoiceRecognitionTestActivity.this,
"ActivityNotFoundException", Toast.LENGTH_LONG).show();
}
}
});
}
// アクティビティ終了時に呼び出される
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// 自分が投げたインテントであれば応答する
if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) {
String resultsString = "";
// 結果文字列リスト
ArrayList<String> results = data.getStringArrayListExtra(
RecognizerIntent.EXTRA_RESULTS);

for (int i = 0; i< results.size(); i++) {
// ここでは、文字列が複数あった場合に結合しています
resultsString
+= results.get(i);
}
// トーストを使って結果を表示
Toast.makeText(this, resultsString, Toast.LENGTH_LONG).show();
}
super.onActivityResult(requestCode, resultCode, data);
}
}


<リソース>

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

<Button
android:id="@+id/button"
android:text="Click to start"
android:layout_width="fill_parent"
android:layout_height="wrap_content"/>

</LinearLayout>



■電話帳からメールアドレスを取得する方法

下記方法は、Android2.1の推奨された方法になります。


//
// メールアドレスが登録されている連絡先だけを一覧表示する
//

// DATA表からメールアドレスを全て取得
ContentResolver cr = getContentResolver();
Cursor dataAddressTable = cr.query(
  Data.CONTENT_URI,
  null,
  Data.MIMETYPE + " = ?",
  new String[]{Email.CONTENT_ITEM_TYPE},
  null);

// ハッシュ変数にアドレスを格納(id, address)
HashMap<String, String> mailHash = new HashMap<String, String>();
while(dataAddressTable.moveToNext()) {
  mailHash.put(
    dataAddressTable.getString(
      dataAddressTable.getColumnIndex(Data.CONTACT_ID)), // ID
    dataAddressTable.getString(
      dataAddressTable.getColumnIndex(Data.DATA1))); // メールアドレス
}

// カーソルを閉じる
dataAddressTable.close();

// ソート文字を格納(連絡先一覧を "ふりがな" 順でソート)
String order_str =
  " CASE" +
  " WHEN IFNULL(" + Data.DATA9 + ", '') = ''" + // Data.DATA9がNULLの場合は空文字を代入
  " THEN 1 ELSE 0" + // Data.DATA9が空文字のレコードを最後にする
  " END, " + Data.DATA9 + " ," +
  " CASE" +
  " WHEN IFNULL(" + Data.DATA7 + ", '') = ''" +
  " THEN 1 ELSE 0" +
  " END, " + Data.DATA7;

// DATA表から連絡先名を全て取得
Cursor dataNameTable = cr.query(
  Data.CONTENT_URI,
  null,
  Data.MIMETYPE + " = ?",
  new String[]{StructuredName.CONTENT_ITEM_TYPE},
  order_str);

// メールアドレスが存在する連絡先だけを名前格納用リストに格納
ArrayList<String> listItems = new ArrayList<String>(); // 名前格納用リスト
while(dataNameTable.moveToNext()) {
  String id = dataNameTable.getString(
    dataNameTable.getColumnIndex(Data.CONTACT_ID));
  if(mailHash.containsKey(id)) {
    listItems.add(dataNameTable.getString(
      dataNameTable.getColumnIndex(Data.DISPLAY_NAME)));
  }
}

// カーソルを閉じる
dataNameTable.close();

// 連絡先一覧をリストビューで表示
ArrayAdapter<String> adapter = new ArrayAdapter<String>(
  this, android.R.layout.simple_list_item_1, listItems);
lv.setAdapter(adapter);


■電話をかける方法


インテントアクション「CALL」は、電話をかけるための

インテントアクションであり、android.contentパッケージ、

Intentクラスの定数 Intent.ACTION_CALL として定義されています。

インテントを利用するには、インテントのインスタンスを作成する必要が

ありますが、ここでは、インテントのコンストラクタの第1引数に、

インテントアクションとして、Intent.ACTION_CALL、第2引数のUriに、

Uri.parse("tel:0123456789")など、tel:で始まる電話番号を指定します。



<ソースコード(*.java)>

Intent intent = new Intent(
Intent.ACTION_CALL,
Uri.parse("tel:0123456789"));

startActivity
(intent);


また、このインテントアクションを利用するためには、マニフェスト(Manifest)ファイルに

CALL_PHONEのパーミッションを追加する必要です。



<マニフェストファイル(AndroidManifest.xml)>

<uses-permission android:name="android.permission.CALL_PHONE"/>



■カメラで画像を保存


MediaStoreを使って保存します。

詳しくは、ここ に載っています。



■画像を編集


画像編集に関するリンク集は下記の通りです。


画像イメージにラインをオーバーレイ

Androidアプリで高速描画チューニングをするコツ

画像にモザイク
画像の拡大、縮小描画
画像をぼかす

Androidでアプリを開発する上で、最低限知っておくべきことをまとめました。


これらのことを理解して、設計、実装していくようにしましょう!!



■はじめに


Androidを開発する上で、下記のことを理解することが大切です。


 ・アプリケーションが動作するコンテキスト
 ・Androidフレームワークの特性

  (アプリケーションへどんな影響を与えるか)


これらのことを考慮して設計、実装していきましょう!


では、実際にどんなことを気をつければということですが、

それが下記の内容になります。



■Android開発者が知るべき10のこと


1、ユーザデータを守る


電話、他のアプリケーションなど、別のActivityがいつでも割り込んできます

そのとき、onSaveInstanceState() と onPause() メソッドが呼ばれ、

アプリケーションは終了させられます。


いつ終了しても、次に起動させたときに終了させられた状態で

データを復帰させるためにも、onSaveInstanceStateイベントで

データを保存するようにしましょう。


※onSaveInstanceStateは、インスタンスの状態を保存すべき

 タイミングで呼び出されます。
 このイベントでインスタンスを一時的に保存します。



2、生データでやりとりしない


データを利用するなら、標準規格の生データやデータベース経由で行うよりも、
Intentを使ってデータのやり取りしましょう。

データの保存は、Content Providerを利用します。


※intentという形式でActivity間の連携を取ります。
 具体的には送り先とパラメータを詰めたIntentクラスを作成し、
 それをstartActivityメソッドで送りつけます。



3、ユーザ操作を妨げない


ユーザ操作で問題になるのが、他のアクティブなアプリケーションを無視して、
自分のダイアログを表示してしまう場合です。
(バックグラウンドで動作するプロセス(サービス、ブロードキャストレシーバー)
によって表示されるケース)


これは、エミュレータ上でテストする際には、他のアプリケーションは
入っていない状態であるため、実機でテストしている際に発生します。


動作自体は無害かもしれませんが、場合によっては「表示されたダイアログが
消えない」などのことも発生することもありえます。


解決策として、「Notification」を使うことです。


Notificationを使うことにより、アプリケーションは、(バックグラウンドで
検知したイベントのため)現在のユーザー操作を遮ることなくステータスバーに
アイコンを表示して通知できます。



4、スレッドを使う


アプリケーションで長く時間がかかる処理を行い、長期間Activityが

応答を返さない際には”Application Not Responding”

(ANR)ダイアログが表示され、ユーザーに強制終了を確認します。
そのため、時間のかかる処理は別スレッドで実行することで、回避できます。



5、ひとつのActivityで何でもしようとしない


Activityとは、“Androidアプリの画面”に相当します。

そのため、Activityに処理や画面遷移を詰め込みすぎると、複雑になります。
できる限りシンプルにするため、Activityは分けるようにしましょう。


そうすることにより、扱いやすく、”backstack”モデルで履歴としてActivityを
管理しやすくなります。



6、テーマを活用する


UIをデザインする際には、テーマを使うようにしましょう。


テーマとは、スタイルをAndroidアプリ全体の初期値として使用する方法です。
Androidアプリには、スタイルというものを定義する事ができ、文字列などに

設定する色んな属性を一つのIDで使用できるものです。



7、多解像度に対応したUI


キャリアや環境により、サイズや解像度が異なります。

様々なサイズに対応するために、相対的にレイアウトを作成するようにしましょう。


多解像度対応には、drawableに9-patchなど適応する必要があります。

システムが自動的に最適なレイアウト、drawableを使い、どんなデバイス上でも

表示できるようにします。



8、ネットワークは遅い


3G接続のように高速なものもあれば、GSM、GPRSに代表される非3G接続もあります。
現実には、非3G接続のような遅いネットワークで使われることがほとんどです
そのため、ネットワークは遅いことを前提に設計しましょう。


※エミュレータには、より遅いネットワーク速度をシミュレートする設定があります。
 Eclipseの構成の「エミュレータ設定」タブ
 またはエミュレータを始動するときのコマンドラインのオプションで調整して、
 通信速度が遅い場合の挙動を確認してみてください。



9、特定のハードウェアに依存しない


キャリアによって、キーボードなどが異なります。


 ・キーボードが完全なqwerty配列を持つのか
 ・12キーしかないのか
 ・タッチスクリーンの有無


など、それぞれデバイスによって異なります。
アプリケーションを作る際はハードウェア上の仮定を無くし、
十分留意しましょう。
(例:特定のキーボード配列に依存するなど)




10、モバイル端末のバッテリーは有限


携帯端末であるため、バッテリーは限られています。
そのため、できるだけ消費を抑えることを考慮する必要があります。
特に消費するのが、下記のものになります。


 ・CPU使用率の高い重い処理
 ・ネットワークの通信


これらの使用を最小限に押さえることが、バッテリー消費削減の鍵に

なります。


たとえば、ネットワーク接続に失敗した場合、何度も接続を試みるよりも、
ユーザ操作によって再試行を促してください。
自動で行うと電力の著しい消費を招きます。



■参考サイト

 ・Android開発者が知るべき10のこと



JAVAはオラクルに買収されちゃいました。


今後、オラクルはJAVAに対して、力を入れていくのでしょうか?


結論だけ先に述べておきますと、今後も力を入れていきます


今後のJAVAは、Java Mobile.Nextでモバイル(組み込み系)に
力を入れていきます。
JAVAのAPIだけではなく、WEB技術である


 ・XHTML
 ・SVG
 ・JavaScript
 ・CSS


をWEB UIを容易に取り入れることができるような技術を
取り入れるようにする予定である。

他に、


 ・WEBサービス
 ・電話機能を活用するAPI
 ・ワイヤスレスのAPI


などが追加される。
現在、スマートフォンが流行しているということもあり、
このようにモバイルに力を入れていっているのだろう。


上記機能が追加されることにより、今後、Androidが
プラットフォームや環境がより充実していくことが予想される。


JAVA7の追加機能は、下記の通りである。


プロジェクト「Coin」
  言語仕様に関する(個別のJSRにするまでもない)
  小さな変更をまとめたもの


  【追加機能】
  ●switch構文における文字列の使用
   ・switchによる比較に文字列を使えるようになる


  ●新しい数値表現形式の追加
   ・16進表記のように、2進数値を表記する方法が追加される
   ・数値表現中にアンダースコア("_")を混ぜることができるようになる

    (「1_234_567」など)


  ●例外ハンドリングの改良
   ・複数の例外を同じブロックでキャッチ可能になる(マルチキャッチ)
   ・tryブロック中で発生した例外の際throwが容易になる


  ●Genericsインスタンス生成における型推論の改善
  ●「Map<String, String> map = new HashMap<>();」のような記述が可能になる
  ●リソースを含むtry文
  ●java.lang.AutoCloseableインターフェイスの追加
  ●AutoCloseableの実装クラスをtry中で使った場合、close処理を

   記述しなくても自動でclose()を実施してくれる


NIO.2
  ファイル関連機能のパフォーマンスの大幅な改善がされている。


  【追加機能】
  ・New I/Oの拡張
  ・新しいファイルシステムAPI
  ・新しいディレクトリ/ファイル表現の方法
  ・ファイル属性や権限の取得/設定用API
  ・ディレクトリ操作用API
  ・ディレクトリ中の変更通知機能を提供するAPI
  ・非同期I/OのためのAPI


Fork/Joinフレームワーク
  Java SE 5より使えるようになった並列処理のための
  ユーティリティ「Java Concurrency Utilities」に、
  追加される新しいフレームワーク。
  マルチコアやマルチプロセッサ環境でのパフォーマンス
  改善される。


InvokeDynamic
  Java VM(JVM)上で動作する他の言語開発者を対象に

  追加される新しいJava VM命令である
  リフレクションを利用する際に、この命令を明示的に使う

  メソッドハンドラを利用できる。



これらの機能が使えるJava SE 7の正式なリリース日は、2011年7月7日になります。

楽しみですね。



■参考サイト

 ・オラクル買収後のJava 7と8、JavaFXはどうなるのか