goo blog サービス終了のお知らせ 

ウィリアムのいたずらの、まちあるき、たべあるき

ウィリアムのいたずらが、街歩き、食べ物、音楽等の個人的見解を主に書くブログです(たま~にコンピューター関係も)

PHPUnitの作り方とComposerが「依存解決」のためにSATソルバー使っている話を聞いてきた

2025-06-30 07:02:51 | PHP
6月28日のPHPカンファレンスの話。
 ほかにも、PHPUnitの作り方の話を会場で、
 Composerの「依存解決」の話を家で(YouTubeで)
聴いたので、その内容をメモメモ

-----------------------------------------------------

■ちいさくPHPUnitを作り、仕組みと拡張ポイントを

・自己紹介

・PHP Unitとは
 単体テスト用
 多様なアサーション
 読みやすいテストコードは適切なアサーション
 AssertSame,assertEqualsが中心→つくれるのでは

・物語
 1.樽を知る
 2.大は小を兼ねる

1.ちいさくつくる
 どのようぬつくるか
  アサーションを作る
 テスト実行スクリプトを作る

 AssertSame,AssertEquals作成でも

2.拡張ポイントを探る
 拡張性=設計パターン
 デザインパターンに注目

 拡張ポイント
 いろんなアサーション
 テストの前後処理
 . Fなどの結果出力

 PHPUnitのつくり
  assertThatに渡している。
   ここで、evaluateしている

 Strategyパターンを使っている

・テストの前後処理
 runBareの中で読んでる
 テンプレートメソッドパターン

・Fの出力
  runBareのnaka
  Observerパターンを使っている

-----------------------------------------------

■Composerが「依存解決」のためにどんな工夫をしているか

・組み合わせ(依存解決)は爆発的に
 →SATソルバー
 「いくつかのルールを全部守れるか?」を調べるロボット

 問題を扱いやすい形に変換
   幅指定を列挙に変換 
   間接パッケージの情報を追加

 A→(X1|X2|X3)の形へ
   ↓
 CNF連言標準形
   ↓
 節、クローズ=PHPではルールの世界に変換(リテラル)
   ↓
 ネットワーク上に整理
   ↓
 任意のノードを借り決めしてスタート
   ↓
 矛盾したら出直し
   レベルという概念
   若いところから見ていく
   コンフリクトクローズラーニング
   ↓
 最終的な組み合わせを決める

・超ミニLT
 Two Watched Literal 2つのリテラルを監視
 Pool Optimizer かき集めたパッケージを管理しておく:pool
 マップのキー最適化
 Spl double Linked List
 gc_disable

----------------------------------------------------------------------


  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

「PHPの今とこれから2025」を聞いてきた!

2025-06-28 12:39:37 | PHP
今日(6月28日)の午前中、
PHPカンファレンスに行ってきた。
で、表題の基調講演について聞いてきたので、
内容をメモメモ↓



■PHPの今とこれから2025

・今日の話題
 11月りリース8.5 など

・自己紹介

・PHPとは
 主にWebアプリケーションに使用されるスクリプト言語
 75%くらい
 Wordpress CMSで6割くらい
 →主流を占めている

・Webの初期
  1993年 4月30日 CERNがWWWを無償公開
  1993年12月15日 Netscape Navigator 1.0
  1995年12月 1日 Apache Web Server
  1995年 5月23日 MySWL
  1995年 6月 8日 PHO1.0リリース

・PHPの開発体制
 ボランティアベース

・PHP財団について
 ニキータさんが作り始めた矢尻氏開発の離脱を宣言(2021)
 →PHP開発者を支援する団体
    PHPファンデーション設立(2021年11月)
 PHP開発者のサポートを開始
 コミット全体の3割、レビュー6割

・PHPの歩み
 爆発的に増えたのが5
 現代的な言語 5.3,5.4
 大幅高速化 7
 JIT導入 8 →主な機能は枯れている
 11月 8.5 パイプ演算子

・PHPアンケート
 会場にいる人に、使っているバージョンアンケート
  8.0、以前 2,3割
  8.3まで、 マジョリティ
  8.4    2割弱


・PHPリリースサイクル
 少しサポート伸びた
 バグ修正2年、セキュリティ修正2年年末まで
 8.1がそろそろEOLになる。
 7系、8.0は期限切れで危険→GIT HUBでサポートしてるものも

・セキュリティ(CVE)
  Use-After-Free(CVE-2024-11235)
  libxml CVE-2025-1219
  stream(CVE-2025-1736など)

 8.4.0のリリースキャンセル

・8.5リリース計画
 体制決まった3人
 アルファ版  7月3日,17日,31日
 機能フリーズ 8月12日
 ベータ版   8月14日、28日 9月11日
 RC      9月25日10月9日,23日,11月6日
 正式版    11月20日

・ベンチマーク
 PHP8バージョン間の実行速度の差は小さい
 マイクロベンチは、8.5JITが7.1%高速化

・8.5の主な改良点
 パイプ演算子
 RFC3986 WHATWG URL対応 URIの規格に基づいた
 非対称staticプロパティ可視化
 プロパティプロモーションでfinalが利用可能に
 クローン実行時のプロパティ設定
 NoDiscardアトリビュート
 定数へのアトリビュート
 array_first,array_last関数追加 

 エラーのバックトレースとかは時間ないので省略

・そのほか
 PHPバースト
 FRANKENPHP アプリケーションが早く動く、発展途上
 PHPユーザー会
 「PHPの今とこれから」のタイトル2003年から20回
  IS PHP still relevant in 2025?
  PHPは歯ブラシのようなもの

P.S 行かなくても、トラック1,2は↓から見えることを今知った!!

  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Webアプリケーション設計に入門してきた

2020-12-17 08:14:47 | PHP
火曜日の続き。12月12日のPHPカンファレンスから。
「10年先を見据えて作るPHP Webアプリケーション設計入門」を聴いてきたので
メモメモ




■10年先を見据えて作るPHP Webアプリケーション設計入門
・今年はGMOグループで協賛
・10年続くことってそうそうなくない?
 GMOだと
  お名前.com(1999)、
  まるごとserver
 お名前.comレンタルサーバー
  BB.plus
  GMOアプリクラウド
  とくとくBB
  このは
  Z.com

・コードは変わっていく
 お名前。COMレンタルサーバー
  SD
  RD

・10年の月日がもたらすもの
PHP
フレームワーク
 2003 phrameから
 直近10年 Laravelない
 →フレームワーク変化激しすぎる

・フレームワークなどの特定技術から一定の距離を保つ必要がある
 →このサービス10年続ける予定ないし
  →よくできたプログラムは想定より広く長く使われる
 プログラムは分身する
 どうせ心血注ぐなら10年続くと考えるほうが楽しい


・フレームワーク選定
 必要な機能を列挙する
  ルーティング
  すきゃフォールディング
  ORM
  IoCコンテナ
  ミドルウェア

 チームの士気が上がるか、10年後に残るかの観点で選ぶ
 →楽しくできるもの
 →10年のこるから運しだい

 今回の題材はLalabel

・レイヤードアーキテクチャ
 アーキテクチャは重要→選ぶの難しい
 レイヤードアーキテクチャ
 上から下の依存OK,下から上はNG
  ユーザーインターフェース MVC
  アプリケーション
  Domain
  インフラストラクチャ

・ディレクトリ構造とコードのながれ
 フレームワークへの宣戦布告:pakages
 コントローラ
  アプリケーションを呼び出す
 アプリケーション
  トランザクション:整合性が保たれる
  ドメインのオブジェクトを操作
 ドメイン
  インフラを呼び出す

・テスタビリティの確保
  祈る→正しくない
  祈りに熱中させないために
  テスタビリティを確保する
 →DIP

・インフラストラクチャ層の取り扱い
 ORマッパーに依存:DBないと動かない
 何をどうやって
  IoCコンテナ(DIコンテナ)→スタブを作る
  →インターフェースによる抽象化
 DIP(依存関係逆転の原則)
  上位レベルのモジュールは下位レベルのモジュールに依存しては
  ならない。どちらのモジュールも抽象に依存すべきである
  抽象は実装の詳細に依存してはならない
  実装の詳細が抽象に依存すべきである
 →インターフェース使いましょうっていうこと
 主導権をビジネスロジックに
 プロダクションとデバッグで環境変えられる

・データモデルとドメインオブジェクト
 10年たてば、インフラも変わる
  政治的理由
  インフラがドメインに依存すると、変えられない
  だから分けとく
 アプリケーションドメインあざーずパターン(ADOPえーどっぷ)
  アプリケーションとドメイン以外はすげ替え可能
  ヘキサゴナルアーキテクチャとコンセプトは同じ

・セッション情報などの取り扱い
 OAuthが依存してしまう→インターフェースを切るでDI
 トランザクション→インターフェースを切る
 AOP

・バリデーション層はだれの役目
 枠の中は信頼する、枠の外は信頼しない
 :すげかえる必要があるから
  UIのほうがバリデーション厳密

・エラー設計
 10年とはあんまり関係ない話
 エラー設計こそが品質
 エラーは2種類 
  システムエラー:サーバーダウン 500系エラー
  ユーザーエラー:入力変えればOK 400系エラー
 ユーザーエラーでは例外を発生させない
  →コントローラーでtry-catchを使わない

・横断的関心事(おうだんてきかんしんごと)
 必要な機能
  ミドルウェア
   ミドルウェアでnot found(404)
   →例外

・まとめ
 ADOP:10年戦える
   UI  インフラ
   アプリケーション
   ドメイン

 初期段階:そんな作りしていない
 実際にはこんなに立派に作らなくても10年続く?
 なるべく血も汗も涙も流さない
 →10年先を見据えて作る

・おまけ
 大事なもの
  セキュリティ:徳丸先生見ましょう
 認証:自作は最後の手段。フレームワークを使いましょう
  ユーザー情報、認証がすでに自前で用意されている
  →ライブラリに乗っかる
 そのほか注意:安全なウェブサイトの作り方を見ましょう

 2020年今年のPHP漢

  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

WebサイトでAI(機械学習)を使うためのPHP_MLなどが、PHP8にJITが入ってやりやすくなる

2020-12-15 08:08:30 | PHP
かも?という話を、12月12日、PHPカンファレンスの「PHPの今とこれから2020」
で聴いてきたので、その内容をメモメモ
※ごめん、表題の件は話してたんだけど、メモでは最後のほうにちょこっとだけ出てくる



■あいさつ
・2000年から始めたので20年
・今回リボーン

■PHPの今とこれから2020
・自己紹介

・PHPとは
 主にWebで使われるスクリプト言語
 1995年誕生
 現場の課題を解決してくれる便利なツール
 サーバーサイド言語、PHPが7~8割
 CMSはWordPressが6割強

・開発体制
 世界中の人が開発

・PHPの歩み
 パーソナルツールがもと。
 拡大。
 WebDB、つながる→プラットフォームへ
 大衆的→5.3、5.4でいろいろ実装→高性能
 高速化を続け、5で並び、7で最速
 セキュリティ:コベリティスキャン
 20年(PHP4→8)で速度50倍(同じスクリプト動く)
 5.3、5.4で機能揃う。5.5でキャッシュ入れる
 7では大幅改良
 8.0:11月26日リリース

・PHPバージョン分布
  PHPアンケート:よく使うバージョンは?7.3-7.4多い
  7は58%、7.2(EOL)のユーザーが73%
  WordPress はPHP7.4、(MySQL5.6)

・リリースサイクル
  ライフサイクル3年
  1か月おきにマイナー上がる。CVEは速やかな更新必要
  一番多い攻撃はDOS→初期に見られた言語としての脆弱性は枯れている

・PHP8
 JITなし
  5から7で倍くらい早くなり、7の間でも2,3割、
  8で10%くらい早い
 JITあり
  キャッシュを有効にすれば、早くなる
  さらにJITを有効にすれば、早くなる
  ただ、アプリケーションだと、
    例えばWordPressだとあんまり変わらない
  →他の部分が速度に関係。

・JIT導入
 JITジャストインタイムコンパイラ
 HHVMでJIT導入
 7でLLVM導入見送り
 DynAsm(ダイナミックアセンブラ)導入
 X86系をサポート

 JITにすれば単純に早くなるというわけでもない
 →動的プロファイリング
  処理頻度が高いところを見つける:トレーシングJIT(デフォルト)

・たくさんの改良
 Union:複数の型が指定できる
 属性:#[]
 staticのバインディング
 弱いマッピング
 変数::class構文 オブジェクトでも
 文字列部分一致確認用関数
 ヌルセーフ演算子(nullチェックを簡便に)
 match式:switch文を簡単に書ける
 mixed型:汎用の型 リスコフ置換原理
 名前付き引数
 コンストラクタでプロパティ指定可能
 下位互換性ない変更
   数値の定義明確化:前後の空白を許容
   負の添字の明確化
   結合合演算子の優先順位明確化
 ほかにもたくさん

・PHPの将来
 キャッシュ:プリローディング
 エクステンション:PHPで書かれるほうへ
 重たい処理:機械学習、AIなど(PHP-ML,PHP-MLX)
  →JITで環境整った

・日本PHPユーザー会の紹介

  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

PHP7.3について、ちょっと聞いてきた!

2018-12-16 13:38:58 | PHP
12月15日にPHPカンファレンス2018に行ってきた!
ので、オープニングとはじめの「PHPの今とこれから2018」をメモメモ




■オープニング
・第19回目 テーマGrowth
・昨年チャレンジがテーマ→学生支援
 今年は若手、学生支援(サポーターと連携)
・7トラックで同時進行、YouTubeライブある。
・1階 スポンサーブース、スタンプラリーも
・フリーWiFi使えるよ
 気づきをブログやSNSで
・スポンサー、協力企業、スピーカー、スタッフ、みんなに感謝
 2000名を超える事前登録
・1日よろしく

■PHPの今とこれから2018
 講師:廣川さん
・7.3の話、これからどうなるのを合わせて

・自己紹介

・PHPとは
 Webに主に使われている
 1995年から
 8割くらいのシェア:ほぼ一定 Rubyがちょっと伸びている
 CMS Wordpressが8割→PHP

・開発体制
 らすますさん:カナダ
 イスラエルの2人 Zend→エンジン強化
 2000人で開発、コア(どこでもいじれる権限)150人、PHPグループ(ステアリング)10名

・PHPの歩み
 2004 PHP5
 2009 PHP5.3 普通のプログラミング言語に(クロージャ―など)
 2015 PHP7.0 大幅高速化
 (6はキャンセル→5.3に入った)

 このあと大きな変更はなく、
 2018 PHP7.3 12月に出た

・PHPバージョン分布
 PHP7ユーザー 23~24%
・EOL(今年)となるPHP5のユーザー 75.8
 7.0もサポート切れになる

・リリースサイクル
 3年でライフタイム終える
  5.6系は今年の末、7.0も今年の終わり
 EOLになるとセキュリティ修正されない

・PHPリリース情報
 大きなセキュリティ上の問題は発生せず。ただし更新推奨
  (問題は指摘されている)

・PHP7 より早く、快適に
 パフォーマンスが上がっている。メモリ消費量改善
 7.3は若干の改善(7.2から5%、10%の改善)

・7.3の改善
 ひあどっく、なうどっく:EOSのインデント
 Mbstring(オリジナルはJStringだったが、JavaとかぶっているのでMbstring)
  完全な大文字・小文字変換のサポート
  タイトルケースの変換
  正規表現 おにぐるま最新版
 セキュリティ 6265 くっきー
  CSRF対策:SameSite=Laxとか

 細かい変更
   関数追加 iscountable、最初のキー、最後のキーの取得

   listにおけるリファレンス再入
   関数の引数末尾の,もOK

 そのた
   PCRE PCRE2
   廃止 大文字小文字に依存しない

・HHVM・Hackの進化
 Facebookが開発
 PHPサポート終了3.30で
  来年1月 4.0
  2019・11・19 サポート終了
  Hack言語を改善   

・PHPのこれから
 7.4開発
 1年に1回の周期
 2つ機能:プリロード:応答速度50%改善
 Typed Properties 2.0

・成功とみらい
 Rasmus語録 Wikipediaにのっている
 PHPは歯ブラシみたいなもの。
 PHPは問題を解くためのシンプルなツール
 学習が容易、言語シンプル、ドキュメント豊富、
 進化を継続

・PHPユーザー会の紹介
 緑のTシャツを着てる人たち

■質疑応答
・7.4のスコープの話
 提案自体は通っていて、テストベンチもある
 議論は収束、なくなることはない

  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

PHP7.2って、何が変わるの?

2017-09-15 14:48:26 | PHP
(1)スクリプト実行速度の高速化
(2)高度な暗号機能の標準サポート
(3)レガシー機能の廃止

・・・ときめかない。

【引用元】
PHP業界の重鎮 廣川類氏のコラム「次のPHPはどうなる? バージョン7.2でここが変わる」を公開しました。
https://column.prime-strategy.co.jp/archives/column_1276

  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

ZendFramework3のサンプルに良さげなもの

2017-08-08 12:01:19 | PHP
ZendSkeletonApplication
https://github.com/zendframework/ZendSkeletonApplication


だと、表紙のページしかないので、controllerを追加するとき、
modules.config.phpとか、いまいちわからない・・・

・・・そんなときは・・・

olegkrivtsov/using-zf3-book-samples
https://github.com/olegkrivtsov/using-zf3-book-samples


がいいかも!こんなかんじ

入れる手順
(0)前提:apache2.4,php7は入っている。Windows7

(1)エクステンション php_intlのコメントを外す
 php.iniファイル中、php_intlのextensionがコメント
 になっていたら、外す
  →これやらないと、初期画面表示でエラー

(2)apache立ち上げ時に、msvcp140.dllがないと言われたら、
 Visual Studio C++ 2015 再配布可能パッケージを入れる
 詳しくは、下記参照

コンピュータに msvcp140.dll/msvcr140.dll が無い時の解決方法
http://loumo.jp/wp/archive/20151106120018/

(3)ソースをgit cloneする
git clone https://github.com/olegkrivtsov/using-zf3-book-samples.git

(4)helloworldフォルダにいって、
composer install
 を行う。

(5)(4)のhelloworldフォルダをルートディレクトリにして
 バーチャルホストを立ちあげるようhttpd.confを記述

こんな感じ?


  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

デジタルシフトするか、クビか-PHPの場合

2017-07-16 19:37:14 | PHP
Zendネタでもう一つ。

デジタルシフトするか、クビか。デジタル時代にレガシー人材のまま生きるか死ぬか。
http://www.mediologic.com/entry/2017/07/13/151801


ZendにおいてのデジタルシフトはVer2.5から。
 これ以前のバージョンは、ダウンロードしてきて、手作業でライブラリをバージョンアップ
 これ以降は、composerで作成し、全自動で作成する
      (composerつかって、スケルトン作ると最新verになっちゃう)
作業や開発の流れ、ノウハウなどは、違っている。

ZendのEOL

https://framework.zend.com/long-term-support
1.X系はもう終わっているけど、
2.4でも、2018年3月までなのね・・・

来年の3月までで、composerを使わない人はお払い箱になる。
まあ、今の人はみんな使っているけど(zendフレームワーク以外を使っているけど)
それについていけない人は、クビなんでしょうねえ~

  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

安全なPHPアプリケーションの作り方

2016-11-05 02:41:16 | PHP
11月3日、「PHPカンファレンス2016に行ってきた!」つづき

安全なPHPアプリケーションの作り方2016
講師:徳丸先生

をメモメモ




・自己紹介

・最近のPHP関連の脆弱性の話題
 Joomla(じゅーむら)のけんげん昇格の脆弱性
 CVE-2016-8869等はどういう問題か
  ユーザー登録できてしまう
  管理者権限作れてしまう
 →攻撃コードは公開されている
 デモ(すこしふるめ)
  フォーム1枚
   your token nameにトークン設定
   ユーザーできている
   管理者としてはいれる

 何が原因
  チェック入っていないものがあった

 教訓
  使わないコードは削除しましょう

 類似の脆弱性
 Joomla2.5.2
   わざとバリデーションでエラーを起こす
  →セッション汚染

・セッション汚染脆弱性
 phpMyAdmin CVS2011-2505
 セッション変数を外部から変更

・セッション汚染でセッション変数にオブジェクトを突っ込む
  parse_strではオブジェクトはできないが
   出来る場合がある

・CVE-2016-7125による、オブジェクト・インジェクション脆弱性
 デモ
  オブジェクトを作る
  いつかはデストラクタが実行される
  そのデストラクタに悪いコードを書く
 PHPスクリプトを書き出す

 ディレクトリトラバーサル
  →できるかもしれないとおもってやられてしまう

 PHPの最新版では直っている(Redhat5,6,7ではアプリで)

・ケータイキットfor Movable type
 ゼロデイ脆弱性
 日本テレビ個人情報不正アクセスに関する調査報告書
  perlからphpスクリプトを生成する
  エスケープで対処

・OSコマンドインジェクション対策の決定版はない
  PHPの場合 シェルのエスケープ関数 2種類
 対策
  そもそも使わない
  パラメータを直接わたさない
  もっとよいほうほう→環境変数けいゆ
  ラッパーを作る→引数に攻撃文字列が入ったら? ドゥルーパゲドン→サニタイズする

・正規表現インジェクション
 phpMyAdmin CVE 2015-3238
  from プリフィックスにNULL文字を入れる
 →問題:エスケープしてなかった
 バックスラッシュのエスケープが漏れている→手作り危ない

・SQLインジェクション
 ZendFramework:1,2,3まで
  1はEOLその1の話題
  ZendDB 式も書ける→左括弧と右括弧があれば式(^^;)
    修正される→仕様の問題
 括弧のネスト許容
   →再帰的な無限ネスト
 最終バージョンでEOLになった

 例
  PPAPテーブルに
   I HAVE A PEN
   I HAVE AN APPLE
  a を付けて攻撃 20ではエラー

  あるもじれつ  実行できる
  ZendFramework2には、この問題はない

・XSS
 Javascriptの文字列リテラル
  イベントハンドらとスクリプト要素でやりかたちがう
 対策
  過剰エスケープ
  HTMLノード
  インラインJSONP
    関数呼び出しの後にJSON
 →動的生成をさげるべき

・安全なWebアプリケーションの作り方
 総論は役に立たない
  分かりやすく囲う
  局所的に解消
  防御的プログラミング
   引数が想定ない

  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

(PHPUnitではなく)PHPで表明プログラミング、契約による設計

2016-11-04 21:36:02 | PHP
11月3日に「PHPカンファレンス2016に行ってきた」
のつづき。

PHPで堅牢なコードを書く
例外処理、表明プログラミング、契約による設計

をメモメモ




・自己紹介

・今日の講演:コードたくさん
 例:SQLアンチパターンのひどいコード例をアレンジして
  バグトラッキングシステムの検索
  正常に動いているときはいい

・例野中でエラーになるのは・・
 グローバル変数、データベース接続エラー
 テーブル名が変わった場合
 パラメーターがNULL、暗黙のキャスト失敗、データベース接続失敗
 Bug暮らす未設定、データベース接続エラー
 6行中、5行で

・失敗された中で、一番きつい
 $paramsのキー
 裏でこっそりワーニング:正常系と見分けがつかない
 →不具合の発見が遅れるほど、傷は深くなる

・賢明なソフトウェア技術者になるための第一歩は、
 動くプログラムを書くことと正しいプログラムを適切に作成することの
 違いを認識すること まいけるじゃくそん
→50%がエラーハンドリング

・上手く動かなかったコードたち
 データベース接続失敗→どんないいコードかいても
 テーブル名やカラム名がだれかに変更された
 使い方が間違えている

・予防的プログラミング 対処 <<< 予防
 防御的プログラミング
  そうなるはずだと決め付けないこと
 誤解:入力をチェックする
    ドキュメントを書く→よいことといわれるが、問題解決しているか
 防御的プログラミングとは
  悪いことにばんそこうを貼ることではない
 →問題発生を事前に防ごうというコーディングスタイル

 よいインターフェース
  正しく使用するほうが操作ミスをするより簡単
  謝った使い方をするほうが困難

 型宣言
 できていいことだけを出来るようにする

 値の制限→Enum
 関数のサイズを小さくする
 問題領域の知識を活用して、固有の型を作る
 列挙型をPHPで使える
 知りすぎている→間違い発生しやすくなる
  知り過ぎない、やり過ぎない


・第一部まとめ 予防に勝る防御なし

・攻撃的プログラミング
 fail first
 おかしいことが起こったら、速やかに停止させる
  障害を抱えて中途半端に動いているプログラムより
 →そんなに気楽にシステムを落としていいの?
 
・正当性と堅牢性
  両立難しい
  →個々のプログラムは正当性:エラーをみつけて、
   アーキテクチャで堅牢せい:穏当な方向へ

・暗黙の前提を明示し、バグをあぶりだす表明プログラミング
  起こるはずがないと思っていることがあれば、
  チェックする→表明する

・PHP7のassert
 評価式が真かどうか→じゃなかったら・・・、
    PHP5では、アサーション警告→7も警告
    php.iniでassert.exception =1に→落ちる

 表明のメリット
  書き手は、前提を書いている

 例外と表明の使い分け
 ・本来のエラー処理に表明を使ってhがいけない
 ・発生してはならない状況にアサーション

・遅くならない?
 そこでPHP7 assertは言語構造:実行段階でassertion off
  zend.assertionsで制御できる
 表明で引き渡す条件には副作用があってはいけない

・かもしれない例外的状況に対処する
 エラーを無視するな
  PDO:falseをチェック
   戻り値の弱点
    コードが肥大化しがち
    無視されやすい
    戻り値だけでは伝わりにくい
  PDOを例外モードにしよう
 →暗黙の前提:assertに落とす

・例外の利点
  握りつぶしているのは書き手の姿勢に問題があることがすぐに分かる

第二部まとめ:fail first

・契約プログラミング
 誰の責務かはっきりさせる契約による設計
 バートランドメイヤー
 要求された以上のことも以下のことも行わない
  {P}A{Q}
 事前条件を満たした条件で呼ぶなら
 事後条件を満たす状態を実現する

  処理
   成功
   失敗
    バグ:必ず落ちる
    例外:失敗することもある

 実行時の表明違反やバグを示すための例外は、そのソフトウェアに
 バグがある証拠である

 Throwable
   Error:エラー 処理系→バグ
   Exception:ロジックエクセプション→バグ:必ず落ちるので直すこと
   RuntimeException:例外

・コンストラクタの契約
 アサーションで書く

・findallの契約
 自分で例外とバグを切り分けて書く
  ロジックエクセプション、第三引数でeを投げる

・まとめ
 第一部:予防に勝る防御なし
 第二部:fail first
 第三部:バグと例外を区別、見分けられるように


テストコード
 外から調べる:はさみうちになる


  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

PHP7.1の改良点とか、5.5がEOLとかの話を聞いていた。

2016-11-03 22:46:33 | PHP
11月3日、PHPカンファレンスに行ってきた!
まずは基調講演をメモメモ




■挨拶

■基調講演 PHPの今とこれから2016
・何年か前から全館に=ふえてきた
・去年のテーマ 7
 PHP 7 去年12月 7スタート
・次を考える
・PHPとは?
 Webアプリケーションに主に使われる言語
  というよりプラットフォームに近い
 1995年の誕生 Webとともに成長、進化
   基本的なコンセプトが正しかった
   進化している
・ネットの統計では 8割がPHP
 CMSのシェア WordPress
 Facebookの大きなサイトでも使われている
・主に使っているPHP
  マジョリティ 5.6
  5.3が12%減、5.4 6%増、5.5 7%増 7%は1%ちょっと
  EOLが5.5 81%のユーザー
・PHPリリースサイクル
  リリーフサイクル1年、ライフサイクル3年
・PHPの歩み
  5.0 2004年
  5.3,5.4 大きな変化:多言語においつく
  5.5:小粒、キャッシュ
  5.6
  7.0:大幅スピードアップ
  7.1:細かいアップデート
・この1年間のバージョン(マイナーなバージョンアップはつき1回くらい)
  CVE:セキュリティフィックス→この番号がついている場合は注意
   名前がついている不具合:今年1年はなかった
・PHP7.1
 今リリース候補版5 11月10日、最後のリリース候補版
  タイプひんティングをかんたんに
  複数の例外を同時にキャッチ
  リスト構文の改善
  mcrypt(暗号ライブラリ削除へ


・より速く快適に
  ボトルネックが他にある場合も
  HHVM 3.15とほぼ同じパフォーマンス?
  Wordpressのベンチ 倍くらいの性能

・複数例外のキャッチ
  | をたてて、例外1、例外2を同時にかける

・リスト構文の改善
  括弧でくくって、代入できる
  連想配列でも一気に代入
・クラス定数のアクセサ指定
  いままで、アクセス制限なし(public)
・Nullable型
 タイプヒンティング 7から
 文字列が入っているか、またはNULL→はねられるとやりにくい
 ?マークがつくと、NULLも型チェックOK

・互換性9に関する変更
 エクステンション削除
   mcrypt():わーリングがでる、7.2移行削除?
   mbstringのeval→コールバック

・HHVM/Hackの進化

・PHPのこれから
 PHP7.2開発が開始される
  PCO:暗号の抽象化
   OpenSSLなど
   PDO(データベースの抽象化レイヤ)

・PHP8用に、
  JIT Zendが公開
  OpCasheを拡張、性能はあまり変わらない

・PHPの未来
  ちょっとずつバージョンアップ
  性能を上げる
 Hack/HHVMリリースの持つ意味
  DBなどの性能が上がらないと・・・
 高性能かつ現実的な解を継続的に提供する
  言語として優れているとかいうよりも
  ユーザーのニーズ変化:すぐに答えを
 →ラーニングカーブが高い

・日本PHPユーザー会の紹介
  2000年4月誕生
   ユーザーが勝手に集まっているゆるい集まり

・PHP Confarence2016のみどころ

質疑応答
 JITが入ったら、2倍くらいはやくなる?
  わかりません・・・
  HHVMもJITだけで速いわけではない

  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

SJIS-winとかcp51932とか、PHPでの機種依存文字変換をまとめてみる

2015-11-05 08:09:47 | PHP
①(まる1)とか(はしごだか)とか、SJIS、EUCでは
サポートされていない、機種依存、環境依存文字を、PHPで
mb_convert_encodingで単純に"SJIS","EUC-JP"で変換すると、
文字化けする(UTF-8はOK)

そこで、SJIS-winとかcp51932とか、送るんだけど、
それについてまとめる。




■お題

以下の文字をUTF-8(BOMなし)で保存する
(ファイル名utf8n.txt)

これを表示する




■SJIS編
【内容】
以下のPHPファイルをSJISで保存する
(ファイル名sjis.php)
<?php
$str = file_get_contents("utf8n.txt");

echo mb_convert_encoding($str, "sjis-win","utf-8");
echo mb_convert_encoding($str, "cp932","utf-8");
echo mb_convert_encoding($str, "sjis","utf-8");

?>


【結果】





■EUC編
【内容】
以下のPHPファイルをEUCで保存する
(ファイル名euc.php)

<?php
$str = file_get_contents("utf8n.txt");

echo mb_convert_encoding($str, "eucJP-win","utf-8");
echo mb_convert_encoding($str, "CP51932","utf-8");
echo mb_convert_encoding($str, "EUC-JP","utf-8");

?>


【結果】




■参考までに

どのようなエンコードがサポートされているかは、

サポートされる文字エンコーディング
http://php.net/manual/ja/mbstring.supported-encodings.php

に書かれている。

また、上記のCPの番号とコードの関係は

Microsoftコードページ932
https://ja.wikipedia.org/wiki/Microsoft%E3%82%B3%E3%83%BC%E3%83%89%E3%83%9A%E3%83%BC%E3%82%B8932

の下のほうに書かれている。

また、Excelで、CSVファイルを読み込むとき、

  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

複数ファイルをドラッグ&ドロップでアップロードするプログラム全体(PHP版)

2015-10-29 12:30:49 | PHP
ここ

HTML5のFile APIを使用して、ドラッグ&ドロップでファイルをアップロード
http://soraxism.com/soraxism/blog/html5%E3%81%AEfile-api%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%E3%80%81%E3%83%89%E3%83%A9%E3%83%83%E3%82%B0%EF%BC%86%E3%83%89%E3%83%AD%E3%83%83%E3%83%97%E3%81%A7%E3%83%95%E3%82%A1%E3%82%A4

に、複数ファイルをドラッグ&ドロップでアップロードする方法について書いてある
・・・がJavascript(クライアント)だけ。

一方、ここ

JavaScript と PHP でドラッグドロップでファイルをアップロードする
http://vosegus.org/blog/2014/08/drop-file-upload.html

に、あるファイルをドラッグ&ドロップでアップロードする方法について書いてある

が、そもそも、どちらもポイントだけしか書いていない。
欲しいのは、

複数ファイルをドラッグ&ドロップでアップロードするプログラムの全体
だとおもうので、そのプログラム、HTML(ブラウザ表示部分)とPHP(アップロード部分)
について、ここにまとめてみる
(基本的に上記サイトをまとめただけ)




■お題

以下の表示

を行い、ドラッグアンドドロップ、またはファイルを選択ボタンから、
1つないしは複数のファイルを選択して、サーバーにアップロードする。
サーバー側のプログラムは、PHP,
ブラウザ表示するプログラムはHTML(HTML5 FileAPI+Javascript)




■ブラウザ表示するプログラム test.html
(基本的に上記サイト
 「HTML5のFile APIを使用して、ドラッグ&ドロップでファイルをアップロード」
 の内容を組み合わせたもの)
<HTML>
<head>
<script src="http://code.jquery.com/jquery-1.9.1.js"></script>
<script>
$(function(){
  /*================================================
    ファイルをドロップした時の処理
  =================================================*/
  $('#drag-area').bind('drop', function(e){
    // デフォルトの挙動を停止
    e.preventDefault();
 
    // ファイル情報を取得
    var files = e.originalEvent.dataTransfer.files;
 
    uploadFiles(files);
 
  }).bind('dragenter', function(){
    // デフォルトの挙動を停止
    return false;
  }).bind('dragover', function(){
    // デフォルトの挙動を停止
    return false;
  });
 
  /*================================================
    ダミーボタンを押した時の処理
  =================================================*/
  $('#btn').click(function() {
    // ダミーボタンとinput[type="file"]を連動
    $('input[type="file"]').click();
  });
 
  $('input[type="file"]').change(function(){
    // ファイル情報を取得
    var files = this.files;
 
    uploadFiles(files);
  });
 
});
 
/*================================================
  アップロード処理
=================================================*/
function uploadFiles(files) {
  // FormDataオブジェクトを用意
  var fd = new FormData();
 
  // ファイルの個数を取得
  var filesLength = files.length;
 
  // ファイル情報を追加
  for (var i = 0; i < filesLength; i++) {
    alert(files[i]["name"]);
    fd.append("files[]", files[i]);
  }
 
  // Ajaxでアップロード処理をするファイルへ内容渡す
  $.ajax({
    url: 'test.php',
    type: 'POST',
    data: fd,
    processData: false,
    contentType: false,
    success: function(data) {
      alert(data);
    }
  });
}
</script>
</head>
<body>
<div id="drag-area" style="border-style: dotted;background-color: #ffbbff;">
  <p>アップロードするファイルをドロップ</p>
  <p>または</p>
  <div class="btn-group">
    <input type="file" multiple="multiple" style="display:none;" name="files"/>
    <button id="btn">ファイルを選択</button>
  </div>
</div>
</body>
</html>





■サーバー側のプログラムtest.php

<?php
$count = count($_FILES['files']['tmp_name']);
for($i = 0 ; $i < $count ; $i ++ )
{
if (is_uploaded_file($_FILES["files"]["tmp_name"][$i]))
{
if (move_uploaded_file($_FILES["files"]["tmp_name"][$i], "sendfile" . $i . ".txt"))
{
echo "ok:" . $_FILES["files"]["name"][$i] . "\n";
}
else
{
echo "error:" . $_FILES["files"]["name"][$i] . "\n";
}

}
else
{
echo "no file" . $i . "\n";
}

}
?>


  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

PHPで、ある対象文字列中に複数あるキーワード(文字列)が1つでも含まれているかどうかを知りたい

2015-10-26 16:17:40 | PHP
トライ木、パトリシアツリーを作成するのは除く。
KMP(クヌース–モリス–プラット)法でごにょごにょすれば、というのも却下。

そうすると、方法は3つくらい?

1.foreachを使って、
    各キーワードが対象文字列中にあるかどうかをチェックする
  のを、全キーワード分行う


[PHP][疑問]ある文字列が、複数のキーワードのうち一つでもマッチするか判定する方法について
http://www.happyquality.com/2012/02/04/1959.htm

のはじめのほう


2.正規表現をつかう。キーワードを|(OR)でつなげて、 preg_match

上記サイトの下のほう、または(具体的には)

PHPでの文字列検索について教えてください
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1186431091

の解答


3.複数のキーワードを1つの配列とする。str_replaceでその配列を渡して、置き換えが起こるかチェック


ある複数の単語が文章中に含まれるかどうかを調べる方法
http://honey8823.hateblo.jp/entry/2015/08/05/173129



なんか、1が、早いという結果?
やっぱ、ソフトでがんばるより、ハードを早くしたほうが「勝利」だよね(^^;)

  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

「PHPあるあるパフォーマンス対決」を聞いてきた!

2015-10-06 13:06:11 | PHP
10月3日に、PHPカンファレンス2015に行ってきた!話の続き(これで最後)

PHPあるあるパフォーマンス対決

をメモメモ




・「PHPコアから読み解く定石の嘘ホント」の続編
・似たようなスクリプトに対して、どちらのほうがパフォーマンスが高いかを紹介する
・論理(オペコード解析)と数値(測定)

【クイズ1】メソッドチェーンと非メソッドチェーン

  $ca→testa()→testb()→testc() (メソッドチェーン)

    と

  $ca→testa();
  $ca→testb();
  $ca→testc(); (非メソッドチェーン)

 のどっちが早い?

*答え
 非メソッドチェーン

*理由
 メソッドチェーンは、戻り値を使う為、用いている一時変数の確保等が必要だから

【クイズ2】異次元配列の書き込み
  $i,$j,$kを100回づつまわして

  $list[$i][$j][$k] = 1; (高次元)

   と

  for文の入れ子にして、$i,$j,$kとまわしていく(低次元)

 とどっちがはやい?

*答え
  低次元

*理由
  低次元のとき、処理を分散させている
 ($iで行う処理は100回、$jで行う処理は100*100回、$kで行う処理だけ100*100*100回しているが、
  高次元は、100*100*100回、全ての処理を行っている)

【クイズ3】関数の引数、スカラーと配列、どっちが早い

*答え
  配列

*理由
  スカラーは、関数の引数の受け渡しに時間がかかる


・おわりに
 パフォーマンス高いスクリプト書くこと大切
 理解すること大切
 自分で考えてみること大切

  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする