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

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

/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

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

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

OpenSSLでPHPとコマンドでの挙動

なんていうかPHPでopensslコマンドと相互運用できる暗号を作成したいんだけど、成功しない

http://y-stream.blogspot.jp/2015/05/php-openssl.html

このブログで紹介してるけど成功しなった。

紹介されているcreate_key_iv($password, $salt)で塩がNullでしか返ってこなかった。

でも将来成功させたいからちょっと引用して保存

暗号化を構成する要素の関係性を理解する

まずは簡単に暗号化の手順や内部のロジックを図解してくれているサイトがあったので、そちらでサラっと概要を確認します。 → 図説:PKCS#5秘密鍵をパスワード保護する共通鍵とIVの作り方(記事修正)

相互運用できるAES-256-CBC形式暗号の作成

色々やってみた結果、思ったのは、opensslの暗号は脆い、という事です。
どの部分が脆いかと言うと、コード内にもコメントを残しておりますが、「key、iv」のセットを作成する際のハッシュ化を1回しか回していない部分ですね。
なので、実際の運用においては、コマンドラインからも暗号化、復号化できるツールも合わせて作成した方が暗号強度も上がるし、自由度も上がるかと思います。

今回使った暗号形式は「AES-256-CBC」という今現在強度的にも問題ないだろうと言われている形式「AES-256」とCBCというモードで暗号化するやり方です。

最終的な暗号化を行う部分は、openssl_encrypt関数で問題ないですが、php.netにはろくな情報が載っていないので、正直困りました。

キモになるのは、「key、iv」のセットを作成する部分をopensslコマンド相当の実装で用意する部分になります。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/**
 * @param string $password 任意の文字列
 * @param string $salt 16進数に変換可能な文字列(暗号形式によって長さは異なる)
 */
function create_key_iv($password, $salt){
 $salt_bin = hex2bin($salt);
 $hash_str = $hash = '';
 // opensslはハッシュを1回しかしないが、セキュリティの事を考えると複数回ハッシュ化させた方がよい
 for ($i=0; $i<1; $i++){
  $hash = md5($hash. $password. $salt_bin, true);
  $hash_str .= $hash;
 }
 // 取り急ぎ AES-256-CBCに寄せておく
 $key = substr($hash_str, 0, 32);
 $iv = substr($hash_str, 32, 16);
  
 return array($key, $iv);
}
 
list($key, $iv) = create_key_iv("hogehoge", "12345678");

md5でハッシュ生成している辺りが気になりますが、openssl標準のやり方はこのようになっているみたいです。

チューニングのポイントはハッシュ回数とハッシュ形式でしょうか。
回数は数千回回しても不安が残る人たちからすると、1回なんてありえないでしょうね。
ハッシュ形式も、今はsha256なども選べますし、ミックスする事もできますね。

頑張って理解しようー

SQLでAがBの条件の時を優先してもしなかったら違うAを出力するYJコード一覧のクエリ

タイトル長くなった。

すげー時間かかったけどこれでできた。

オーダーでBを優先して表示させているのがいい感じ

最初はSelectのMAXとかでやってた。

でもMAXとかの方が処理は早い

まぁUNIONするよりこれでやる方が100倍ぐらい早いのでこれでいこう

 

SELECT *
FROM `iyaku_code` AS m
WHERE `JANコード` = (
SELECT `JANコード`
FROM `iyaku_code`
AS s
WHERE m.`個別医薬品コード` = s.`個別医薬品コード`
order by
case when s.`A` =”B” then 1 else 2 end,
s.`A`
limit 1

和暦から西暦へ

 

和暦のぐちゃぐちゃな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″を追加したら動いた。

良かった。

Error establishing a database connectionが出た問題

http://www.onamae.com/

のお名前.comが落ちてる問題はこっちは悪くないけど、うちの会社のHPが落ちてるのはこっちが悪い。

今まではサーバーの再起動で治ってたんだけど、どうも今回はそれでも治らない。

MySQLがError establishing a database connectionを吐くだけ。しかも信じられないほど重くなる。

sudo service mysqld stop

したらようやく作業ができる程度に軽くなった。

最初はMySQLの設定が悪いのかなーとか思ってログがなんかずっと削除されずに残ってるのが悪いのかなとおもって

vi /etc/my.cnf

でmysqldに

expire_logs_days = 5

を追加したけど治らず。

まぁHDDの空き容量はいっぱいあったからなんか違うかなとも思ってたけど

しかし、起動して数秒は動くからこれ、もしかして攻撃受けてるんじゃないかなと思ったらビンゴ!

xmlrpc.phpに信じられないアクセスが合った。

.htaccessに

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^xmlrpc\.php$ “http\:\/\/0\.0\.0\.0\/” [R=301,L]
RewriteRule ^index\.php$ – [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

入れて無事解決!

JavaScriptはじめました

Webプログラマーにとっては必須と言われているJavaScript。

いまだにほとんど触ったことなかったけど、今回勉強する機会があったのでいろいろやってみた。

なんか思ってたよりいろいろできそうだと思った。

だけど今いち理解しずらい場面もあった。

JSONの処理の簡単さにはちょっとびっくりしたが、変数を直接代入するのはどうするんだろうともったら

hoge=”asdf”;

json.asdfはjson[“”+hoge]とかで解決できた。

いろいろ奥が深そうだ。

Vaio Pro 11のHDMIから音が出ない問題

VJP1111について、

解決するまで長かった。

なんかintelのHD graphic がHDMIの音声出力に基本的に関係してるんだけど、これをWindowsUpdateでドライバーを最新のにするとどうもHDMIから音が出ないっぽい。

しかも中途半端なことにコントロールパネルのサウンドをみるとHDMIケーブルをさしたらHDMI audioとか増えるものの、それを選択することができない。

接続されていませんとか出てくる。

最新ドライバーにしたりいろいろしたけど、何とか治った。

解決方法!

1:デバイスマネージャーからDisplay AdapersのIntel(R) HD graphics Familyのドライバーを削除→再起動

2:デバイスがBaseDriverの状態でVaioUpdate起動さして、Graphics DriverをUpdateさせる。

3:Sony純正のドライバーが入ったらコントロールパネルのサウンドからHDMIを選択できるようになって音が出る

疲れた。