Note to Self

自分用のメモ置き場

PHPで生年月日から年齢を計算する

PHPで生年月日から年齢を計算する

(現在日付 - 誕生日) / 10000
※10000で除算することで、小数点以下を切り捨てる

<?php

$currentDate = date('Y/m/d');
$birthday = '1967/11/07';

$c = (int)date('Ymd', strtotime($currentDate));
$b = (int)date('Ymd', strtotime($birthday));
$age = (int)(($c - $b) / 10000);

/*
  結果
  var_dump($c);
  var_dump($b);
  var_dump($age);
  
  int 20170620
  int 19671107
  int 49
*/

PHPでカンマ区切りの文字列を整形する

PHPでカンマ区切りの文字列を整形する

SQLのINで複数の検索条件を使用する際に、文字列をカンマ区切りにしてパラメータに引き渡す必要がある際に使用

<?php

$hogeCode = ',,0, 100、200、300,     400, 500, 600,,,';

// 全角を半角に変換
$hogeCode = mb_convert_kana($hogeCode, 'kvrn');

// 記号を半角カンマに統一
$hogeCode = str_replace(['', '', ''], ',', $hogeCode);

// スペースを削除
$hogeCode = str_replace([' ', ' '], '', $hogeCode);

// 先頭や末尾のカンマを削除
$hogeCode = implode(',', array_filter(explode(',', $hogeCode), 'strlen'));

/*
  結果
  var_dump($hogeCode);
  string '0,100,200,300,400,500,600' (length=25)
*/

CentOS 7にPython 3.6をインストールする

1.IUS Community Project のリポジトリを追加する

yum install -y https://centos7.iuscommunity.org/ius-release.rpm

2.Python 3.6をインストー

yum install -y python36u python36u-libs python36u-devel python36u-pip

3.エイリアスを設定する

ln -s /bin/python3.6 /bin/python3
unlink /bin/python
ln -s /bin/python3 /bin/python
ln -s /bin/pip3.6 /bin/pip

ハッシュ関数とは

ハッシュ関数とは

Software Design 2017年6・7月号 ハッシュ関数を使いこなしていますか? の記事を読んで、 自分なりにまとめてみました

ハッシュ関数が持つべき特性

1. 同じデータを入力すると必ず同じハッシュ値を出力する  
2. どんなデータを入力しても決まった長さのハッシュ値を出力する  
3. 別のデータに対してはほぼ別のハッシュ値を出力する  
4. ハッシュ値から元のデータを算出することはほぼできない

ハッシュ関数の利用例

1. AとCの特性を活かしたファイルの同一性チェック
2. BとCの特性を活かした推測しにくいURLの生成
3. AとDの特性を活かしたログインパスワードの保存 

注意点

  • レインボーテーブルを使用すると簡単に割り出されてしまうため、ハッシュ関数を使用する際は、 必ず入力データにソルトを付加し、衝突の可能性を考慮に入れる(ストレッチングすることが望ましい)
- ソルト
ハッシュ値を計算する前にパスワードの前後に付け加える短い文字列 
 
- ストレッチング
ハッシュ値の計算を何回も繰り返すこと  
  • ソルトはユーザごとに異なる文字列を付与すべき
    例)userId + システム一意のランダム値

  • パスワードのハッシュ化などはできるだけ既存の仕組みを使うのが望ましい(巨人の肩の上に立つ)

  • ハッシュと似た概念として、暗号化、難読化、エンコードがあるがすべて別の概念である

- 暗号化
暗号化は復号して元のデータに戻すことを前提としている
元のデータが長くなれば、暗号文も長くなる  
「暗号化」に対する言葉は「復号化」ではなく、「復号」  
「復号」は動詞に対し、「暗号」は名詞なので「化」を付けて動詞化している

- 難読化  
プログラムのソースコードを人間が読みにくいように変換すること
難読化されたソースコードはそのまま実行される

- エンコード  
特定のアルゴリズムでデータを別の形に変換すること
特定の文字列しか通せない経路に任意のデータを通す目的で使われる
変換されたデータはデコードすることで元のデータに戻すことができる
元のデータが長くなれば、エンコードされたデータも長くなる
暗号化と同様に、元のデータに戻すことを前提としているが、アルゴリズムを
知っていればデコードすることが可能なため、暗号文のつもりで使用してはいけない