¥の挙動

PHPでファイルパスを指定するとき¥を使うけど、

¥を二回¥¥とやっても¥が一回しかないよー的な動作をしたり2つある的な動作もする。

もしD:\\とか場合だと正規表現できちんと認識させるためには\\\\\\\\としないといけない

$dir=”D:\\test”

if(preg_match(‘{^(?:[a-zA-Z]\:(\\\\\\\\|\/\/\/\/))([^\\\/\:\*\?\<\>\”\|]+(\\\\\\\\|\/\/\/\/){0,1})+$}’, $dir, $m))

はOK

if(preg_match(‘{^(?:[a-zA-Z]\:(\\\\|\/\/))([^\\\/\:\*\?\<\>\”\|]+(\\\\|\/\/){0,1})+$}’, $dir, $m))

はNG

特定フォルダ以降のファイルパスを正規表現で取得

スゴイシンプルそうなのにめっちゃくちゃ時間かかった。

/files*(?!.*files)(.*)/

これで

入力:D:\\files\aaa\files\bbb\dddddddddd

結果:一致しました。
preg_match(‘/files(?!.*files)(.*)/’, ‘D:\\files\files\aaa\dddddddddd’, $m);
の結果は以下の通りです。

$m[0] = files\bbb\dddddddddd
$m[1] = \bbb\dddddddddd

 

となる。

file_get_contentsとかでエラーメッセージを出したくないとき

file_get_contentsとか404リクエストだとエラーメッセージが出る。

それはいらない場合

@file_get_contents

でエラーメッセージを表示しなくなる

@を付けるとそんな効果があるとはしらなかった。

和暦から西暦へ

 

和暦のぐちゃぐちゃなStringからSQL様の日付フォーマットに変換するやつでまあまあな出来なのが出来た。

ほんとはstrftimeてきなのでやりたかったけどWindowsには対応してないから自作

正規表現は偉大だった。

public static function convNumStringtoDate($src) {
    	$outputArray=array();
    	//昭和とかを西暦にだけ変換 複数はアレイに
    	$src=mb_convert_kana($src, "ah", "UTF-8");//	「全角」英数字を「半角」に変換します。
 
    	//注意!JavaScriptでやる場合は最後のUをとる! UTF8のUです
    	$RegularExpressionM='/(^[mMmM明])\D*(0[1-9]|[123][0-9]|4[012345]|[1-9])\D*(0[1-9]|1[0-2]|[1-9])?\D*(0[1-9]|[12][0-9]|3[01]|[1-9])?.*$/u';//
    	$RegularExpressionT='/(^[tTtT大])\D*(0[1-9]|1[012345]|[1-9])\D*(0[1-9]|1[0-2]|[1-9])?\D*(0[1-9]|[12][0-9]|3[01]|[1-9])?.*$/u';
    	$RegularExpressionS='/(^[sSsS昭])\D*(0[1-9]|[12345][0-9]|6[01234]|[1-9])\D*(0[1-9]|1[0-2]|[1-9])?\D*(0[1-9]|[12][0-9]|3[01]|[1-9])?.*$/u';
    	$RegularExpressionH='/(^[hHhH平])\D*(0[1-9]|[12345][0-9]|6[01234]|[1-9])\D*(0[1-9]|1[0-2]|[1-9])?\D*(0[1-9]|[12][0-9]|3[01]|[1-9])?.*$/u';//heisei64まで
    	if(preg_match($RegularExpressionM,$src,$match)){
    		//echo $match[1];
    		$y=null;
    		$m=null;
    		$d=null;
    		$y = 1868+$match[2];
    		if(isset($match[3]))$m = $match[3];
    		if(isset($match[4]))$d = $match[4];
    		$outputArray[]=DatetimeUtility::GArraytoString($y,$m,$d);
    	}else if(preg_match($RegularExpressionT,$src,$match)){
    		$y=null;
    		$m=null;
    		$d=null;
    		$y = 1911+$match[2];
    		if(isset($match[3]))$m = $match[3];
    		if(isset($match[4]))$d = $match[4];
    		$outputArray[]=DatetimeUtility::GArraytoString($y,$m,$d);
 
    	}else if(preg_match($RegularExpressionS,$src,$match)){
    		$y=null;
    		$m=null;
    		$d=null;
    		$y = 1925+$match[2];
    		if(isset($match[3]))$m = $match[3];
    		if(isset($match[4]))$d = $match[4];
    		$outputArray[]= DatetimeUtility::GArraytoString($y,$m,$d);
 
    	}else if(preg_match($RegularExpressionH,$src,$match)){
    		$y=null;
    		$m=null;
    		$d=null;
    		$y = 1988+$match[2];
    		if(isset($match[3]))$m = $match[3];
    		if(isset($match[4]))$d = $match[4];
    		$outputArray[]=DatetimeUtility::GArraytoString($y,$m,$d);
 
    	}
 
    	$RegularExpressionS4_2_2='/^()(19[0-9][0-9]|20[0-9][0-9])\D*(0[1-9]|1[0-2]|[1-9])?\D*(0[1-9]|[12][0-9]|3[01]|[1-9])?.*$/';//
    	if(preg_match($RegularExpressionS4_2_2,$src,$match)){
    		$y=null;
    		$m=null;
    		$d=null;
    		$y = $match[2];
    		if(isset($match[3]))$m = $match[3];
    		if(isset($match[4]))$d = $match[4];
    		$outputArray[]=DatetimeUtility::GArraytoString($y,$m,$d);
 
    	}
 
 
    	$RegularExpressionM2_2_2='/^()(0[1-9]|[123][0-9]|4[012345]|[1-9])\D*(0[1-9]|1[0-2]|[1-9])?\D*(0[1-9]|[12][0-9]|3[01]|[1-9])?$/';//
    	if(preg_match($RegularExpressionM2_2_2,$src,$match)){
    		$y=null;
    		$m=null;
    		$d=null;
    		$y = 1868+$match[2];
    		if(isset($match[3]))$m = $match[3];
    		if(isset($match[4]))$d = $match[4];
    		$outputArray[]=DatetimeUtility::GArraytoString($y,$m,$d);
 
    	}
    	$RegularExpressionT2_2_2='/^()(0[1-9]|1[012345]|[1-9])\D*(0[1-9]|1[0-2]|[1-9])?\D*(0[1-9]|[12][0-9]|3[01]|[1-9])?$/';//
    	if(preg_match($RegularExpressionT2_2_2,$src,$match)){
    		$y=null;
    		$m=null;
    		$d=null;
    		$y = 1911+$match[2];
    		if(isset($match[3]))$m = $match[3];
    		if(isset($match[4]))$d = $match[4];
    		$outputArray[]=DatetimeUtility::GArraytoString($y,$m,$d);
 
    	}
    	$RegularExpressionS2_2_2='/^()(0[1-9]|[12345][0-9]|6[01234]|[1-9])\D*(0[1-9]|1[0-2]|[1-9])?\D*(0[1-9]|[12][0-9]|3[01]|[1-9])?$/';//
    	if(preg_match($RegularExpressionS2_2_2,$src,$match)){
    		$y=null;
    		$m=null;
    		$d=null;
    		$y = 1925+$match[2];
    		if(isset($match[3]))$m = $match[3];
    		if(isset($match[4]))$d = $match[4];
    		$outputArray[]=DatetimeUtility::GArraytoString($y,$m,$d);
 
    	}
    	$RegularExpressionH2_2_2='/^()(0[1-9]|[12345][0-9]|6[01234]|[1-9])\D*(0[1-9]|1[0-2]|[1-9])?\D*(0[1-9]|[12][0-9]|3[01]|[1-9])?$/';//
    	if(preg_match($RegularExpressionH2_2_2,$src,$match)){
    		$y=null;
    		$m=null;
    		$d=null;
    		$y = 1988+$match[2];
    		if(isset($match[3]))$m = $match[3];
    		if(isset($match[4]))$d = $match[4];
    		$outputArray[]=DatetimeUtility::GArraytoString($y,$m,$d);
 
    	}
    	return $outputArray;
 
    }
    private static function GArraytoString($y,$m,$d) {
 
    	if(isset($m)){
    		$m=str_pad($m, 2, 0, STR_PAD_LEFT); // 01
    		if(isset($d)){
    			$d=str_pad($d, 2, 0, STR_PAD_LEFT); // 01
    			return $y."-".$m."-".$d;
    		}
    		return $y."-".$m;
    	}
    	return $y;
    }

これで綺麗にSQLとばせるはず。

よかったよかった

Jqueryのdatatableについて

今回MySQLでServer-SideのSQL飛ばしてなんかJSON受け取ってっていう処理をしたかったからGitHubから落としていろいろ試してみた。

https://github.com/DataTables/DataTables

さて、なんか最初に試したパターンがなんかJSON全部受け取ってユーザーサイドで処理をする雰囲気でメモリが5万件のデータで100MBも食ってる。

さすがにこれはだめだろうという事でServerSideを試した(でも5万件でもわりかしすんなり動くということにちょっとびっくり)

さて日本語のSQLが飛ばないぞと、

なんか文字コードが良くなさそうでとりあえず全部をUTF8にする。

それでもなんかカラムが存在していませんとエラーが出る。

結論はPDOの文字コード指定してないのが原因でした。

$db = @new PDO(
“mysql:host={$sql_details[‘host’]};dbname={$sql_details[‘db’]};charset=utf8”,
$sql_details[‘user’],
$sql_details[‘pass’],
array( PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION )
);

charset=utf8″を追加したら動いた。

良かった。

Cards Libraryが便利

この度マテリアルデザインに一新しようと思って、SDKとかCompilerとかいろいろ最新にした。

AppCompatにするのは結構大変だったけど、まぁ先人のコードをまねて作った。

そのときほとんどのUIをCardViewとrecycleViewでやろうと思っててAndroid design support だけで作ろうかなーって思ってたんだけどCards Libraryが便利!

Gradleで簡単に追加できるからこーゆーライブラリはどんどん使うべきなんだなと思った。

あとちょっと悩んだのがAndroid が自動的にxmlnsを追加するんだけど、それだとThumbnailの画像がどうやっても表示されなかった。

原因は↓だった

xmlns:card="http://schemas.android.com/apk/res/android"
xmlns:card="http://schemas.android.com/apk/res-auto"

を追加するのが正解!

usb-serial-for-android

https://github.com/mik3y/usb-serial-for-android

でのgradleの追加の仕方がよくわからなかった。

usb-serial-for-android-v010.jar

をlibsに追加してやろうとしたけどなんかUsbSerialPortが足りなさそうなので最新版にしようとした。

結論:

gradleに

allprojects {
    repositories {
        maven { url "https://oss.sonatype.org/content/repositories/snapshots/" }
        mavenCentral()
    }
}

dependency:

compile 'com.hoho.android:usb-serial-for-android:0.2.0-SNAPSHOT@aar'

でいけた。

謎なカメラのorientation

今までintentで内部のカメラアプリを起動さしてjpgをgetしてたけど、今回シャッターの制御が必要になったので自作カメラアプリを作った。

なぜか一番悩んだのが画像の向きだ。

横にしたり縦にしたりしても、Exif情報がなんか1に固定されている。

仕方ないので

protected void configureCameraParameters(Camera.Parameters cameraParams, boolean portrait) {
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.FROYO) { // for 2.1 and before
        if (portrait) {
            cameraParams.set(CAMERA_PARAM_ORIENTATION, CAMERA_PARAM_PORTRAIT);
        } else {
            cameraParams.set(CAMERA_PARAM_ORIENTATION, CAMERA_PARAM_LANDSCAPE);
        }
    } else { // for 2.2 and later
        int angle;
        int angle2;
        Display display = mActivity.getWindowManager().getDefaultDisplay();
        switch (display.getRotation()) {
            case Surface.ROTATION_0: // This is display orientation
                angle = 90; // This is camera orientation
                angle2=0;
                break;
            case Surface.ROTATION_90:
                angle = 0;
                angle2=270;
                break;
            case Surface.ROTATION_180:
                angle = 270;
                angle2=180;
                break;
            case Surface.ROTATION_270:
                angle = 180;
                angle2=0;
                break;
            default:
                angle = 90;
                angle2=90;
                break;
        }
        Log.v(LOG_TAG, "angle: " + angle);
        onOrientationChanged(angle2);
        mCamera.setDisplayOrientation(angle);
    }

 

public void onOrientationChanged(int orientation) {
    //if (orientation == ORIENTATION_UNKNOWN) return;
    android.hardware.Camera.CameraInfo info =
            new android.hardware.Camera.CameraInfo();
    android.hardware.Camera.getCameraInfo(mCameraId, info);
    orientation = (orientation + 45) / 90 * 90;
    int rotation = 0;
    if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
        rotation = (info.orientation - orientation + 360) % 360;
    } else {  // back-facing camera
        rotation = (info.orientation + orientation) % 360;
    }
    Camera.Parameters cameraParams = mCamera.getParameters();
    cameraParams.setRotation(rotation);
    mCamera.setParameters(cameraParams);
}

で対応さした。

謎なのがDisplayのangleとカメラのangleが違うところだ。

よくわからない処理が行われているのだろうきっと。

これで動いたからよしとする。

DialogFragmentでViewPager使って回転時に落ちる問題

回転時にまつわる問題。

DialogFragmentでViewPager使ってるやつだと回転時に

java.lang.IllegalStateException: Activity has been destroyed

で落ちることがある。てかメモリが弱い機種だとすぐ落ちる。

もう

@Override
 public int show(FragmentTransaction transaction, String tag) {
    try {
        return super.show(transaction, tag);
    } catch (IllegalStateException e) {
        // ignore
    }
    return -1;
}

@Override
public void show(FragmentManager manager, String tag) {
    try {
        super.show(manager, tag);
    } catch (IllegalStateException e) {
        // ignore
    }
}

で対応しようとしたけどなんか無理っぽい。

わけわからんなーと思いつつどこで落ちるんだろうと思ってfragmentのサイクルをLOGしてみた

/***
 * Activityに関連付けされた際に一度だけ呼び出される
 */
static final String TAG = "FragmentTest";
@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    Log.d(TAG, "onAttach");
}

/***
 * Fragmentの初期化処理を行う
 */

/***
 * Activityの「onResume」に基づき開始される
 */
@Override
public void onResume() {
    super.onResume();
    Log.d(TAG, "onResume");
}

/***
 * Activityが「onPause」になった場合や、Fragmentが変更更新されて操作を受け付けなくなった場合に呼び出される
 */

/***
 * フォアグラウンドでなくなった場合に呼び出される
 */
@Override
public void onStop() {
    super.onStop();
    Log.d(TAG, "onStop");
}

/***
 * Fragmentの内部のViewリソースの整理を行う
 */
@Override
public void onDestroyView() {
    super.onDestroyView();
    Log.d(TAG, "onDestroyView");
}

/***
 * Fragmentが破棄される時、最後に呼び出される
 */
@Override
public void onDestroy() {
    super.onDestroy();
    Log.d(TAG, "onDestroy");
}

なぜか落ちなくなった。

↑の分を足すだけで解決した。

わけわからない・・・・

 

追記:ダメでした