2017年7月15日土曜日

PHP カンファレンス関西 2017 に参加して #phpkansai

PHP を現在の主軸プログラムとして利用いますが、折り悪くこれまで PHP カンファレンスに参加したことがありませんでした。 サーバー環境も PHP7に移行できたし、そろそろPHP 関連コミュニティにも参加してみたいなぁと思って、PHP カンファレンス関西 2017に参加してみました!第7回目みたいですね!



相変わらずの方向音痴健在!


グランフロント大阪で開催されるのに、何故大阪駅の南側に出るんでしょうね、私。今度こそ変んなところにいかないように地上を歩いてグランフロントまでいきました。
WordCamp Kansai 2014で実行委員をしたときと同じ会場なのにねぇ。



受け付けは結構混雑していました。

プログラム


午前



初めての参加で雰囲気を味わいたいため、とりあえずは大部屋で PHPの基礎について聞きました。PHP 7.0にようやくサーバー環境をし、WordPress のプラグイン開発環境は PHP7.1 をベースにしているものの、PHP7.1 について詳しくないこともあり、そのあたりの知識を今回得たいなぁと思いました。
また、筆者の脳は PHP4, 5がベースになっており、あまり目新しい関数などは必要にせまられなければ使わないのでした。ここで筆者の PHP脳を刷新したいと思っています。

オープニング




立ち見が出るぐらい会場が埋まってますね!
ブースエリアで ゲリラ登壇イベント企画、アン・カンファレンスがあるとのこと。

さて以下は、筆者が感じた主観やノリがはいっていますが、スピーカーが話された内容を筆者なりに理解したメモを載せておきます。 # は筆者のつぶやきです。

PHP の現場から


マニュアル(http://php.net/manual/ja/)は有名だが、
というのがある。ちゃんと更新されているので便利だよ。
引数のnull指定は、下記ようになる。


PHP7.1 
function something (?int $i): ?Foo
{
}

PHP7.0 以下(#実際は PHP 7.0のみ)
fucntion something (int $i = null): Foo
{
}

##### 戻り値宣言 (Fooの部分)は、PHP7.0からの新機能 #####

Fooは実際には、array, int 等のreturn による戻り値の型を書く。
PHP7.0からの新機能をみてたら、宇宙船演算子(<=>)なんてのがあるのですね。
サーバー環境を PHP5.3→7.0系にしたばかりで、まだ頭は PHP5.3ベースのままです。のでこういったものは斬新に感じますね〜。
Null 合体演算子 ってなんだ。。。http://qiita.com/hnw/items/dff62cd02c780b613d03 とかをみると、
PHP 7.0より、

$hoge_foo = isset($hoge["foo"]) ? $hoge["foo"] : "none";


$hoge_foo = $hoge["foo"] ?? "none"; 

って出来るのか。ふむぅ。
ただ WordPress では PHP 5.2以降でうごくよーサポートしないけどねーとあり、まだ PHP5.3系を使っている人もいるので、どこで WordPress 用プラグインについて PHP 5系を捨てられるかが重要かなぁ。

##### ここまで #####

PHPの実行
  1. HTTP リクエスト来る
  2. PHPコードをコンパイル(opcode生成)
  3. 実行環境を初期化
  4. opecodeを実行
  5. HTTPレスポンスを返す
以上が、リクエストごとにされる。そのため、
PHP 5.5から実装されたOPCacheを PHPに実装すれば高速化するのは、同じリクエストなら「2」を省略できるから。

メリット
  • リクエストが必要なメモリしか使わないため、メモリリークやGCが起こりにくい
  • うっかりデータを共有しての事故がない
  スケーラブルなアプリを作成するための指針

PHP は歯ブラシのようなものです(ラスマス・ラドーフ)
  目的があるから PHPを使うのだという意味だそうだ。

最近の PHP がわからない人のたえの基本文法のおさらい講座

リリースされた日時
  • PHP 5 -- 2004.7.13
  • PHP 5.3 -- 2009.6.30
  • PHP 7 -- 2015.12.03
PHP5.6系の最後バージョンのサポートは 2018年12月まで。
#参考:http://qiita.com/bezeklik/items/72d1ff8393f66673e2bc
#PHP7.0も 2018年12月までですね。
#それまでには PHP7.1 の環境を構築せねば...

三項演算子の省略記号(PHP5.3以降)
  • $hoge_foo = $hoge["foo"] ?: "none";
$hoge["foo"]があれば、$hoge["foo"]を、なければ none を返す。
($hoge_foo = isset($hoge["foo"]) ? $hoge["foo"] : "none"; の意味)
# 使って無かった...

新しい機能が出たのは、それが必要な人が出たから。必ずしも使わなくてもいいが、必要とされている技術だという点を念頭において考えるとよいだろう。

ランチ!

グランフロント南館7F にいきましたが、まぁ混んでいること。とりあえず混んでいない店に入りました(とはいえ、食べ終わった時点ではその店も大行列でした...)。
ちょっと奮発してステーキを食べました。


フランスパンはオリーブオイルをつけて美味しく食べました。肉は肩ロースのステーキ。
かなり柔らかくて美味しかったのですが、量がすくなかったですぅ・・。

午後


ハッシュと暗号は違うぞ! #phpkansai_c05



基本的な部分は理解していますが、セキュリティを考える上で重要な本件について、おさらいをしながら知らない内容がないか探ってみたいと思いました。

暗号技術入門 第3版 が分かりやすいよ。

パスワードを暗号化してデータベースに保存したよ。。。それって本当に暗号化ですか。ハッシュだったりするよ〜。
  • ハッシュとは、任意のデータから固定長のハッシュ値を出力する。
  • ハッシュ値から元のデータを算出することはほぼできない。
  • 同じデータには同じハッシュ値になる
  • 別のデータからはだいたい違うハッシュ値が出力する
よく使われるのは、ダウンロードファイルのハッシュ値を提示しておき、ダウンロードファイルに対してダウンロード側がハッシュデータをチェックして提示されているハッシュ値と同じなら改ざんされていないものだ!とか判別つかうのによく使われている。

推測しにくい URLの生成に使われたりする。

ログインパスワードはハッシュ値でデータベースに保存する。
  パスワードがデータベースに入っていなくても、パスワードのハッシュ値をいれておけば、同じ文字が入力していることを判別すればいいので、同じデータは同じハッシュ値になることから、比較できるでしょうということ。

ハッシュ値の衝突問題

そう、先ほど別のデータからは「だいたい」違うハッシュ値が出力されるとかきました。
ハッシュ値は長さが有限のために、何らかのタイミングで違うデータでも同じハッシュ値になることがある。

パスワードは同じハッシュ値でも問題ないが、URLは問題。
ダウンロードファイルのハッシュ値も信頼できない場合もある。

じゃあどうするのか。ハッシュ値が衝突しないアルゴリズムを使うしかない。
だから Sha1から、Sha256への移行が騒がれていたのだ(Google等が 2017年2月に異なるPDFに同じハッシュ値の出力を成功 / Googleら、暗号学的ハッシュ関数SHA-1の衝突攻撃に成功 (PC Watch) )。コンピューターの性能によって、どの程度で耐えられるかはいたちごっこ。

元データに長い文字列(ソルト)を追加して、それからハッシュ値にすると推測しずらい。

# だから WordPressの wp-config.php にソフト(salt)が追加されたのか。
# WordPress では 2.7から追加された。

暗号との違いは

ハッシュは一方方向で戻せない。暗号は鍵をかけた上で、戻せることが前提。

下記は区別化が必要。

エンコード/デコードは?
鍵要素がないため、アルゴリズムを知っていればだれでも戻せるよ。

難読化
プログラムを読みにくくなるための変換。ファイルサイズが小さくなるので圧縮とよばれることも。でも読めないわけじゃない。

hashos攻撃
DoS攻撃ができるということだ。
# http://blog.tokumaru.org/2011/12/webdoshashdos.html あたりの話か
PHP の場合には数を1000に限定して対応しているらしい。

現代におけるプロダクト開発とPHPを選定するワケ


ついこの前まで高校生だったスピーカー。若い世代の考えを聞きたい!と思いました。
なのですが、この時、昼間のクイズ Q3(後述)がなんでそんな挙動になるのかが理解できず、これと次のセッション中に、いろいろ試していたのでスルーしてしまいましたゴメンナサイ。


ぼくの辿りついた最強の PHP開発環境、あえての Windows


普段は MacOSX を開発環境にしているため、Windows での開発環境についてしりたい。

Cloud9 がオススメだよ〜無料でも1スペース持てるよ!
# 参考:http://www.sejuku.net/blog/385


ブース



クイズあった。1つしか成功せず T_T;
あらためて

Q2 PHP7.1よりかけるようになったプログラム
fucntion something (?int $a): ?int {
}

のように ?を型の前におくと、その型かnullのいずれかが許されるというものですね。
PHP7.1からの新機能ということです。

Q3 php7系の foreach 内部ポインタの出力結果

$array = array(1,2,3);
foreach($array as $value){
  var_dump(current($array));

}

PHP7
int(1)
int(1)
int(1)

PHP5
int(2)
int(2)
int(2)

これ PHP7はわかりました。foreach内の $arrayは別扱いにあるので、ポインタは先頭を指し示したままです。これは下記のコードの方が直感的に分かるかなぁと思います。
ただ PHP5のほうの 全部 int(2)なのは何故だと思いました。

  • 各反復において現在の要素の値が $valueに代入され、内部配列ポインタが一つ前に 進められます
となり、foreach($array as $value) の時に$arrayのポイントが1つ前に進むことから、ループ内では、

ループ1: $array --> $array[1]  ($value) 
ループ2: $array --> $array[2]  ($value) 
ループ3: $array --> $array[3]  ($value)  

とならないのかということです。
つまり値としてh
int(2)
int(3)

bool(false)
になぜならずに、常に2つ目のポインタを指し示しているっのだってことです。

これは、
をみて理解できたかなと思います。
foreachの
  • 各反復において現在の要素の値が $valueに代入され、内部配列ポインタが一つ前に 進められます
にて currentを最初に呼び出したときには、 foreach内の $array[1]がセットされてしまうからってことかな。ちょっと難しいかったなぁと思いました。

なお、下記コードなら分かりやすいですね。

$array = array(1,2,3);
foreach($array as $value){
}
var_dump(current($array));

PHP7
int(1)

PHP5
bool(false)

PHP5では foreachの内部ポインタとして $arrayが使われるので、ループ終了後の $arrayへのポインタは最後に存在するポインタの次にセットされているはずで(そこで falseになってループ終わる)、したがって falseになりますよね。だって現在ポインタの要素がないですから。

ループ1: $array[0] --> $value
ループ2: $array[1] --> $value
ループ3: $array[2] --> $value
ループ4: $array[3] (存在しないからループ終わり)

というイメージでしょうか。
PHP5だとループ終了後に $arrayは、$array[3]を指し示していますね。
PHP7は、$array[0] のままってことです。

では $value に参照渡し(&)をつけるとどうでしょうか。
PHP7では $array は影響をうけません。しかし PHP5では、影響を受けてますね。
ループ1: &$value --> $array[1]
ループ2: &$value --> $array[2]
ループ3: &$value --> $array[3]
という感じでしょうか。 ループ1で、$array[0]でないのは、 foreach自体が $array を参照するときに
$array = array(1,2,3);
foreach($array as &$value){
  var_dump(current($array));

}


PHP7
int(1)
int(1)
int(1)

PHP5
int(2)
int(3)

bool(false)

ふぅ。。。

感想


今回、参加して一番よかったのは「浦島太郎」からの脱却できるきっかけになったかなぁとは思います。PHP 4の時代から PHPを触り始め、その時代の機能をベースにやってきました。そのため、新しい機能は WordPress 等インフラ上で動作する PHPを動作させるためにチェックしたりしていただけのため、新しい機能について触れる切っ掛けを得られたことはとても大きいと思います。


2017.07.15 @kimipooh

0 件のコメント: