Canvas

Canvas

CanvasとはHTML5の新機能で、描画ができる機能です。

Cannot redeclare class phpmailerException

PHP

Cannot redeclare class phpmailerException

PHPでHTMLメールを送信する サンプルコードあり
でご紹介しました、PHPでメールを送信する便利なライブラリPHPMailer。

別にPHPMailerが悪いわけでもなんでもないんですが、上記のエラーが出る時は

 require("PHPMailer/class.phpmailer.php");

を複数回実行していないか確認してみてください。

Can’t create handler inside thread that has not called Looper.prepare()

Android

Can’t create handler inside thread that has not called Looper.prepare()

表題のエラーでAndroidアプリが落ちてしまうことがあります。
UIスレッド以外から、Toastを使ったダイアログを表示していたためです。
そういう場合は、Handlerを使おうね!!という意味のエラーです。

私がやっていたのはこうでした。

 public class GetRoadTask extends AsyncTask<ArrayList<GeoPoint>, Void, Road> {
  //中略
 protected Road doInBackground(ArrayList<GeoPoint>... params) {
 
        // インターネット接続があるかどうか確認
        ConnectivityManager cm = (ConnectivityManager) localContext
                .getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo nInfo = cm.getActiveNetworkInfo();
 
        Road road = null;
        
        if (nInfo == null) {
            
            Toast.makeText(localContext, localContext.getString(R.string.no_network), Toast.LENGTH_LONG)
                    .show(); //これがダメ!
            
        }else{
 
         //この先ネットワークがあればする処理 …
 	}
 
 	return road;
  } 
 }

気を利かせて、ネットワークがない場合は、その旨を表示しようと思っていたのですが、ダメ!!ですね。

この場合は、メインスレッドでコールバックを実装してonPostExecuteを実装していたので、そちらでroadがnullだったらメッセージを表示するように変更しました。

   //RootDisplayActivity内
   @Override
    public void postGetRoadExecute(Road road) {
        
        // プログレスダイアログを閉じる
        if (m_ProgressDialog != null){
             if(m_ProgressDialog.isShowing()) {        
                 m_ProgressDialog.dismiss();
             }
        }
        
        if(road != null){            
 
           //roadがあった時の処理
 
        }else{
            Toast.makeText(this, getString(R.string.cannot_get_root), Toast.LENGTH_LONG)
            .show();
        
        }
        
 
    }

Call connect() and wait for onConnected() to be called.

Ajax

Call connect() and wait for onConnected() to be called.

Google Playのサービスに接続しようとすると、上記のエラーが出て、落ちてしまう…。

エラーの通り、connectを待て、ということですね。

たとえば、私は現在位置情報を取得するmLocationClientを下記のように書いていたのですが、これではダメで

 //失敗例
 @Override
  public void onResume() {		
 	super.onResume();
        mLocationClient.connect();	 	
 	mCurrentLocation = mLocationClient.getLastLocation();
   }
 //成功例
 @Override
 public void onResume() {		
 	super.onResume();
        mLocationClient.connect();	
  } 
 
 // mLocationClient.getLastLocation(); はonConnectedに移す
 @Override
 public void onConnected(Bundle dataBundle) {
        
 	mCurrentLocation = mLocationClient.getLastLocation();
   
    }

CakePHP データのサニタイズ

PHP

CakePHPでデータをサニタイズする

CakePHPの「Sanitize」クラスは、ユーザから送られた悪意のあるデータや、その他の不適切なデータを無毒化します。

http://book.cakephp.org/ja/view/1183/%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E3%82%B5%E3%83%8B%E3%82%BF%E3%82%A4%E3%82%BA-Data-Sanitization

通常のCakePHPでデータを保存する、Saveなどを利用する場合はいちいちサニタイズする必要はありませんが、独自でSQL文を書くときなどは、これを利用してサニタイズしたほうがよいでしょう。

ここでは、具体的にデータをSanitize::cleanを使ってサニタイズする方法を書いておきます。
http://book.cakephp.org/ja/view/1187/clean

Studentモデル student.php ファイルに次のように記載

 //サニタイズクラスインポート
 App::import('Sanitize');
 	
 class Student extends AppModel {
 	var $name = 'Student';
 …以下モデルのコードが続く

Studentコントローラー students_controller.phpに次のように記載

 //受け取ったデータをサニタイズする例
 function add() {
   Sanitize::clean($this->data['Student']);
  • $this->data[‘Student’] = Sanitize::clean($this->data[‘Student’]);か、$this->Student->save(Sanitize::clean($this->data)); — ゆうちゃ {2011-10-31 (月) 10:50:34}