スゴイシンプルそうなのにめっちゃくちゃ時間かかった。
/files*(?!.*files)(.*)/
これで
入力:D:\\files\aaa\files\bbb\dddddddddd
結果:一致しました。
preg_match(‘/files(?!.*files)(.*)/’, ‘D:\\files\files\aaa\dddddddddd’, $m);
の結果は以下の通りです。
$m[1] = \bbb\dddddddddd
となる。
なんていうかPHPでopensslコマンドと相互運用できる暗号を作成したいんだけど、成功しない
http://y-stream.blogspot.jp/2015/05/php-openssl.html
このブログで紹介してるけど成功しなった。
紹介されているcreate_key_iv($password, $salt)で塩がNullでしか返ってこなかった。
でも将来成功させたいからちょっと引用して保存
「
まずは簡単に暗号化の手順や内部のロジックを図解してくれているサイトがあったので、そちらでサラっと概要を確認します。 → 図説:PKCS#5秘密鍵をパスワード保護する共通鍵とIVの作り方(記事修正)
色々やってみた結果、思ったのは、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なども選べますし、ミックスする事もできますね。
」
頑張って理解しようー
タイトル長くなった。
すげー時間かかったけどこれでできた。
オーダーで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とばせるはず。
よかったよかった
今回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″を追加したら動いた。
良かった。
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>
入れて無事解決!
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を選択できるようになって音が出る
疲れた。