タグ

ブックマーク / qiita.com/Hiraku (9)

  • PHPUnitとデータプロバイダとテストケース生成

    PHPUnitのデータプロバイダという機能について、自分なりにまとめます。 データプロバイダとは何か PHPUnitで、複数のテストパターンを書くことはよくあります。この時、似たようなアサーションを何度も書くことになります。 例えば… 足し算するだけの関数をテストするとして、

    PHPUnitとデータプロバイダとテストケース生成
  • curl_multiでHTTP並行リクエストを行うサンプル

    curl_multiはselectシステムコールを使って同時に複数のHTTPリクエストを行うことができます。マルチスレッドやらマルチプロセスを使っているわけではなく、原理はnode.jsなんかと近いI/O多重化で、一度に一つのことしかしていません。 PHPcurlはlibcurlAPIをほぼ踏襲しており、ちょっと取っつきにくいです。クラスでラッピングして、curl_close()などはデストラクタで呼ばれるように自動化すると、もう少しすっきりすると思います。 <?php /** * curl_multiでHTTP複数リクエストを並列実行するテンプレ * */ //タイムアウト時間を決めておく $TIMEOUT = 10; //10秒 /* * 1) 準備 * - curl_multiハンドラを用意 * - 各リクエストに対応するcurlハンドラを用意 * リクエスト分だけ必要 * *

    curl_multiでHTTP並行リクエストを行うサンプル
  • Dependency Injectionを特定のDIコンテナに頼らず実現する - Qiita

    Pimple風の名前ベースでインジェクション設定を書いていくやり方なら、ただのファクトリで再現できそうに思った。 Pimpleのコア機能はPimpleがなくても実現できる仮説 DIのサンプルはPHPメンターズのものを流用させていただく。 PHPメンターズ -> Pimpleでシンプルに正しくDIを理解する Pimpleの場合。 <?php $container = new \Pimple(); // オブジェクトコンストラクションのコンフィギュレーション $container['infrastructure.mailer'] = function($container) { $mailer = new \SendmailMailer(); return $mailer; }; $container['domain.transfer.newsletter'] = function($cont

    Dependency Injectionを特定のDIコンテナに頼らず実現する - Qiita
    ymm1x
    ymm1x 2018/05/24
  • 時刻かつURLごとのアクセス数(ヒストグラム形式)を一気に集計するSQL - Qiita

    これを時刻ごとに区切って、◯時台だと/fooに何回、/baaに何回、アクセスがあったよーみたいなのを計算したい。 どう書きますか? 私の回答 要件によるんだけど、pathのパターンが数種類だけで決まっているなら、すごく簡単な1個のSQLで作れる。 ここではBigQueryの関数を使っているけれど、時刻の関数はどのRDBMSにもついてるだろうし、たぶん似たような発想で作れると思う。 SELECT UTC_USEC_TO_HOUR(created) AS period , SUM(path = '/foo') AS foo , SUM(path = '/baa') AS baa , SUM(path = '/moo') AS moo FROM logs WHERE created BETWEEN '2017-01-01' AND '2017-01-02' GROUP BY period ORD

    時刻かつURLごとのアクセス数(ヒストグラム形式)を一気に集計するSQL - Qiita
    ymm1x
    ymm1x 2018/04/02
  • PHP7で宇宙船演算子を使いこなすぞ - Qiita

    まずはPHP7リリースおめでとうございます!!! PHP 7.0.0 Released なんだか記念すべき日にAdvent Calendarを入れてしまって恐縮です。その割にすごい小ネタで書いてしまった…。 ここからPHP7では宇宙船演算子<=>が導入されます。だいたいこういう意味の演算子ですね。 // <=>と同じ意味の関数 function compare($a, $b) { if ($a < $b) { return -1; } elseif ($a > $b) { return 1; } else { return 0; } } compare(1, 2); // -1; 1 <=> 2; // -1; ユースケース的にはusort(), uasort(), uksort()との組み合わせで用いられるので、この機会にPHPにおける配列の並び替えについてまとめてみることにします

    PHP7で宇宙船演算子を使いこなすぞ - Qiita
    ymm1x
    ymm1x 2017/12/19
    “1と-1はtruthy、0はfalsyなので、0のときだけ?:の後ろが評価され”
  • PHPで列挙型(enum)を作る - Qiita

    列挙型 - Wikipedia まず列挙型の定義は〜となるんだけど、ここでは「あらかじめ定義した値のいずれかしか取らない特殊な型」という感じを想定してます。 要はSplEnumみたいなのですが、拡張モジュールの力を借りなくても、PHPだけで作れます。リフレクションを使うだけ。 <?php abstract class Enum { private $scalar; public function __construct($value) { $ref = new ReflectionObject($this); $consts = $ref->getConstants(); if (! in_array($value, $consts, true)) { throw new InvalidArgumentException; } $this->scalar = $value; } final

    PHPで列挙型(enum)を作る - Qiita
    ymm1x
    ymm1x 2017/09/26
  • PHPの高速オシャレ危険配列ライブラリspindle/collectionを作っている話 - Qiita

    昔、こんな記事を書いたことがあるのですが、 PHPで高速オシャレな配列操作を求めて - Qiita やっぱりforeachを書きまくってて疲れてきたので、コレクションライブラリとして仕立てました。 spindle/spindle-collection: The fastest php collection library ※割とAPIに悩んでいるので、まだしばらくは0.X系にしておくつもり。0.0.2までは無かったことにして下さい。 使い方 <?php require 'vendor/autoload.php'; use Spindle\Collection\Collection; (new Collection(range(1, 100)) ->filter('$_ % 10 === 0') ->map('$_ * 2') ->assignTo($collection); echo $c

    PHPの高速オシャレ危険配列ライブラリspindle/collectionを作っている話 - Qiita
    ymm1x
    ymm1x 2017/06/27
  • プロパティの型を強制するオブジェクトを作る - Qiita

    Spindle\\Types\\TypedObject を継承してクラスを作る。 TypedObjectは2つのメソッドの実装を強制する。staticメソッドのschema() および checkErrors() である。 <?php namespace Acme; use Spindle\Types; class Klass extends Types\TypedObject { static function schema() { return [ //プロパティ名 => 型, デフォルト値(省略可), を繰り返して書く 'propInt' => self::INT, 'propStr' => self::STR, 'initial value', 'propBool' => self::BOOL, false, 'propDate' => 'DateTime', new DateTi

    プロパティの型を強制するオブジェクトを作る - Qiita
    ymm1x
    ymm1x 2016/10/28
  • PHPで高速オシャレな配列操作を求めて - Qiita

    PHPには大量の配列操作関数が用意されています。 これらの関数、イマイチ書き味が悪いということで、よくPHPがDISられるポイントになっています。 お題として、こんな感じのコードを書きたいとしましょう。(意味は特にないです) 0~10000のうち、偶数だけを抽出して自乗し、結果が20を超えるものを足しあわせよ array_xxx系の関数だけで入れ子にしながら書くとこんなことになります。 echo array_sum( array_filter( array_map( function ($v) { return $v ** 2; }, array_filter(range(0, 10000), function ($v) { return $v % 2 === 0; }) ), function ($v) { return $v > 20; } ) ); 読めたもんじゃないですね。 関数の

    PHPで高速オシャレな配列操作を求めて - Qiita
  • 1