サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
Nintendo Direct
blog.tojiru.net
この記事はPHP Advent Calendar 2017の2日目です。 ここ最近、本業のほうが死ぬほど忙しく、すっかりブログを書いていなかった@Hirakuです。 だいぶ前のことですが、今年のPHPカンファレンス福岡で例外の話をしてきました。 この時の発表では例外に関する概要が主だったので、例外クラスそのものの設計について補足を書いてみることにします。 例外のある世界観 PHP7ではいくつかのエラーが例外と同じ挙動を示すようになり、エラーではなく例外機構を使う言語に様変わりしました。 例外というのは、かなり侵略性の高い概念であり、例外のある世界では以下の前提に立つことが暗黙のうちに強要されます。 どこでも例外が発生する可能性がある 例外によって中断されても、ソフトウェアが不適切な状態にならないように保証するのは各プログラマの責任(例外安全) たとえば、以下の関数で例外が発生する可能性があ
PHPアドベントカレンダー2016の2日目です。この記事に合わせてライブラリでも作ろうと思ってたのですが、全然間に合わなかったので夢という体でポエムを書こうと思います。 祝7.1リリース ちょうど記事を書いていたらPHP7.1がリリースされていました。おめでとうございます!みんな今すぐビルドするんだ! http://php.net/archive/2016.php#id2016-12-01-3 去年も12月1日に7.0がリリースされてたので、毎年JSTだと12月2日に新しいPHPが手に入るような感じですね。 今回はマイナーバージョンアップなのでそんなに劇的な機能はありませんが、個人的にはiterable型が超欲しかったやつです。 Nullable types Void return type Iterable pseudo-type Class constant visiblity mod
Composerやmonologの作者である@seldaekが来日するということで、2016年7月22日にPHP勉強会の番外編が開催されました。 PHP勉強会@東京〜番外編〜 みなさまお疲れ様でした! #composer #php #phpstudy #eventdots pic.twitter.com/wvKHgpDNGp — しめじ (@TAKA_0411) 2016年7月22日 動画 @seldaek の発表 発表資料はこちら: Composer in 2016 #phpstudy #eventdots pic.twitter.com/h4UeksQGvJ — Hiraku (@Hiraku) 2016年7月22日 Composerを使い込んでないとわからない内容もあったと思うので、勝手に補足解説しようと思います。 composerのエコシステムについて Composerの中央リポジ
ここでぼやいても誰にも伝わらない気がするけど、一旦吐き出しておきます。 事の経緯 私は https://packagist.org のミラーサイト packagist.jp を運営しています。 スクレイピングのプログラムがバグっていて、1ヶ月に一度ぐらい古くなったファイルを掃除して回る定期作業があるのですが、その中で妙にlaravel関連のパッケージ情報が巨大であることに気づきました。 例えば、私のMacのローカルキャッシュに残っているパッケージ情報をファイルサイズでsortすると、上位は全てlaravel関連のものになります。これらはpackagist.jpの中にミラーリングされているファイルと全く同じものです。 1971473 p-provider-2016-01.json 2058474 p-provider-2016-04.json 3687200 provider-illumin
composerを高速化するプラグイン prestissimo をメンテしていく中でハマった問題の中には、curlの挙動によるものがいくつかありました。 細かすぎて伝わらないやつです。もう消えてしまったソースコードもあるけど、なにかの役に立つかもしれないしメモを残しておきます。 PHP5.5以降とそれ以前でCURLOPT_PROGRESSFUNCTIONのプロトタイプが違う Missing argument 5 for Hirak\Prestissimo\CurlRemoteFilesystem::progress() · Issue #18 · hirak/prestissimo ダウンロードの進捗を取ってプログレスバーを表示するのに使う、CURLOPT_PROGRESSFUNCTIONというオプションがあります。ここで設定した関数に渡される引数がPHP5.5で変わっていて、そのままだと
composerが遅くてお嘆きの日本のPHPerの皆さんこんにちは。 表題の通り、追加インストールするだけでcomposerが速くなるプラグインを作りました。 # インストール $ composer global require hirak/prestissimo # アンインストール $ composer global remove hirak/prestissimo インストールした状態でlaravel/laravelをcreate-projectすると、26秒とかでダウンロード完了しました。Laravelは50個ぐらい依存パッケージがあり、同じ環境で普通にインストールすると5分ぐらいは最低かかるので、10倍以上速くなってます。 2016/1/13(水)にPHPBLT#2というイベントがあり、その中で同じデモをしてきました。 Composer並列化プラグイン #phpblt from
私が個人的に運営している packagist.JP というサイトがある。PHPの実質的なパッケージリポジトリである https://packagist.org のミラーサイトであり、日本付近でのcomposerコマンドの速度向上を目的としたものだ。 2015年12月に、@yudsuzukさんにこのミラーサイトを取り上げていただき、その影響か以前より少しアクセスが増えた。ありがたいことです。 【PHP】たった1行コマンドを入力するだけでComposerを劇的に速くする方法【アジア圏限定】 - $yuzu->log(); ただ、個人運営のサイトということで、使ってよいのか、信頼して良いのか不安に思う人も多いと思う。というわけで現状のステータスをなるべく率直に書いておく。 packagist.jpの概要 去年のアドベントカレンダーにまとめたのでそちらを参照のこと。 packagist.orgのミ
いいのか悪いのか分からないけれど、いつからか私は「無能者の発想」みたいなものが染み付いていて、その姿勢で仕事をしていることが多いです。 私はプログラマなのでその文脈で書きますが、たぶん普遍的な話。 エンジニア体力 エンジニアの能力を数値化するとしたら、その一つに体力があると思います。肉体的な体力もそうですが、特に精神的な体力。ガッツや根性と言い換えてもいいかも。 例えば稼働中のシステムが上手く動かないとき。システムが複雑で、どこが原因なのかよく分からない。実は最近開発に加わったばかりで、全貌も知らない。でも問題は現実に起きていてアラートメールは止まらないし、先輩エンジニアは捕まらない。どうしよう? 体力のあるエンジニアは、こういうとき自分のスキルを駆使して、丹念に原因を調べていきます。もちろん持っているスキルによって効率の良し悪しはありますが、体力はそれとは違うものです。printデバッグ
C言語を久しぶりに触ってやっと理解できたのが、配列は第一級オブジェクト(ファーストクラスオブジェクト) ではない 、ということです。 第一級オブジェクト - Wikipedia 第一級オブジェクト Wikipediaによると、第一級オブジェクトと呼ばれるものは以下の様な特徴を持つそうな。 無名のリテラルとして表現可能である。 変数に格納可能である。 データ構造に格納可能である。 それ自体が独自に存在できる(名前とは独立している)。 他のものとの等値性の比較が可能である。 プロシージャや関数のパラメータとして渡すことができる。 プロシージャや関数の戻り値として返すことができる。 ... C言語だと、int(1, 2)やchar('a', 'b')、floatやboolなどがこれに相当します。また、任意の型へのポインタも、同じ性質を持っています。 私はC言語を真面目に勉強する前にJavaScr
C言語は宣言文が非常に読みにくいことで有名で、後発のGo言語はこれを批判して宣言の構文を変えています。私もずっと読むのが苦手だったのですが、私の頭が悪いのではなく、C言語の仕様がヘン、ということらしい。 今まで飽きるほどこの手の解説は書かれてきてるわけですが、自分なりにまとめないと覚えた気がしないので、あえてまとめておきます。ここに書いてある内容は、「C言語ポインタ完全制覇」に詳しく書いてあります。 型の派生 C言語では、int, char, floatなどの基本型から、配列やポインタを派生していくことができます。対象を並べたものが配列で、対象を指し示すのがポインタです。 配列やポインタからも配列やポインタを派生できるので、派生パターンは無限に存在します。 int int の配列 int の配列 の配列 ... int へのポインタ int へのポインタ へのポインタ ... int への
C言語の本を久しぶりに読み返しているのですが、インターポジショニング(interpose, interposition)なる言葉を初めて知ったのでメモです。 「C標準ライブラリ関数などをローカル定義の関数で上書きできてしまう」というお話です。うっかりやらかすとバグの温床になるのですが、うまく使えばユニットテストのスタブとして便利そう。 time関数についておさらい 例として思いついたので、time(3)を上書きしてみます。 time(3)は現在時刻をUNIX time(time_t型)で取得するC標準ライブラリ付属の関数です。詳細はman 3 timeで。この関数、実行時間によって結果が常に異なるわけで、ユニットテストの時は困り者です。 /* time_ex.c */ #include <stdio.h> #include <time.h> int main(void) { printf(
最近、オライリーの「アンダースタンディングコンピュテーション」を読みました。コンピューターサイエンスの素養がない人にも分かりやすく計算について教えるという内容で、細々と写経しながら読み進めていました。 hirak/memo-understanding-computation ・ GitHub この本、8章と9章がとにかく面白くて、特にライスの定理は初めて知ったので、自分なりに理解をまとめておこうと思います。 ※形式的な証明は私もちゃんと理解していないので、直感的な解説になります。 不可能なプログラムは存在する 我々プログラマーは日々コードを書いているわけですが、プログラムで解けない問題は存在するか考えたことはあるでしょうか? ライスの定理は不可能なプログラムがあることを示した定理です。 ライスの定理 - Wikipedia 計算機科学における計算可能関数の理論に関する定理で、 定められた性
PHP7では無名クラスが導入されます。 PHP7調査(26)無名クラスの導入 - Qiita これ、単に構文だけの話にせず、「クラスの第3の能力が単独で切り出された」と捉えると面白いのかなと思いました。 クラスが持つ3つの役割 クラスが持つ3つの役割 - 西尾泰和のはてなダイアリー 「コーディングを支える技術」の西尾泰和氏によると、クラスには ユーザー定義型 実装の再利用の単位 インスタンス生成器 の3つの役割があるといいます。 クラスが扱いづらい概念だとすれば、それはこの3つの能力をまとめて持っているからです。 PHPのユーザー定義型、インターフェース PHPの場合、タイプヒントがありますし、定義したクラスは後から拡張することができません(オープンクラスではない)。 if ($obj instanceof FooClass) { //... } この「$objがFooClassのインスタ
おはようございます。Ingressは緑陣営の@Hirakuです。 表題の通り、世界最大のPerlの祭典(最終的な入場者数から、そうなったらしい) YAPC::Asia Tokyo 2014に行ってきました。2014年8月28日(木)に前夜祭で、29日、30日が本番ですが、一通り全部見てきました。 といっても体は一つなので、3トラックを全部見切れるはずなく、適当に見て回った感じです。 私のスペック 私はプログラミングはPerlから入門して、挫折して、PHPerになった感じの経歴です。 YAPCに行くのは今回が初めてです。 例年、気づいたら既にチケットが売り切れていて、「あー、もういいか」ってなるのを何度か繰り返して学習し、今年は早めにチケットをおさえました。 目的とかあんまり考えず、「最近はrebuild.fmもよく聴くし、Perlコミュニティも面白そうだなー」という感じのゆるい動機で参加し
LT枠の「forやめろ」なんですが、「1から100までの整数を出力してください。ただし5つの異なる方法を用いて」というお題が出てきます。 これが今になって気になってきたのでPHPで解いてみようと思います。 たぶん趣旨的に、最適解とかじゃなくて、いろんな書き方をした方が得点高そう。 1. forとインクリメント forやめろって言われてるのですが、とりあえずforです。 Duff's Deviceとかで展開しない限りは、これが最速解になると思われます。(100個ぐらいなら違いはないだろうけど。) <?php for ($i=1; $i<=100; ++$i) { echo $i, PHP_EOL; } やってることが出力だけなので、もう少し縮められますね。 <?php for ($i=1; $i<=100; print $i++ . PHP_EOL); echoはforの()の中に書けません
昔Qiitaで書いた内容なんですが、PHPのswitch文は悪名高い「==」演算子で比較を行います。 <?php switch (true) { case 0: echo '数字の0'; break; case '0': echo '文字列の0'; break; case '0.0': echo '文字列の0.0'; break; case true: echo '真偽値のtrue'; break; } このコードは「文字列の0.0」を出力します。大変分かりにくいですね。 この点はif ... elseif ...を使えば解決するんですが、switchで書きたくなるようなコードをelseifにするとおそらく読みにくくなるでしょう。 ではどうするか。 正解はオブジェクトのポリモーフィズム(多態性)機能を使うことです。 といっても、多態性で調べて出てくる記事とか書籍に関しては抽象的な説明が多い
これで何人目か知りませんが、PHP用のライセンスクリーンなオブジェクト指向ベースcURLライブラリが欲しくて車輪の再発明をしました。(結構昔に作ったんですが、書き溜めたスクリプト集を整理しようと思って名前を変えていっています) spindle/httpclient - Packagist spindle/spindle-httpclient - GitHub HTTPのクライアントライブラリなので、ユニットテストするにはHTTP Serverを用意して、実際にリクエストを投げる必要があります。phpunitコマンドを実行すると、その場で適当なテスト用HTTPサーバーを立てて、そこへ向かってテストを実行して、終わったらHTTPサーバーを破棄する。そんな感じにしたいと思いました。 curl_multiによる多重リクエストも試したかったので、PHP5.4以降に組み込まれているビルトインウェブサー
PHPは5.3から名前空間が導入され、名前の衝突を避けるため長いクラス名をつけることから解放されました。しかしながら、名前空間を使ったコードは、名前空間を使っていないものに比べて本当に読みやすくなっているのでしょうか? ここで例を挙げます。PHPの良質なソースコードと言えば、私はZend Framework(ZF)やSymfonyを思い浮かべるのですが、ZFのとあるクラスの冒頭を見てみましょう。 https://github.com/zendframework/zf2/blob/master/library/Zend/Mvc/View/Console/RouteNotFoundStrategy.php <?php /** * Zend Framework (http://framework.zend.com/) * * @link http://github.com/zendframewo
というタイトルで発表してきました。Engine Yardさま、いつも会場提供ありがとうございます。 ( 第72回 PHP勉強会@東京 : ATND ) JSON Schemaというものがあって、すげー応用範囲が広くて、バリデーションなら大体これだけで出来ますよーという内容でした。 スライドはちょっとネタに走ってますが、書いてあることは割と本気です。「JSON SchemaはJSONのバリデーションを行うためのもの」と一般には定義されていますが、JSON互換のデータ構造を持っている動的型付き言語においては、JSON Schemaで言語ネイティブのデータ構造が全てバリデーションできてしまうのです。 JSON Schemaはいまひとつ流行ってない気もしますが、構造そのもののバリデーションに主眼を置いていたり、言語を超えてバリデーションルールを共有できたり、結構おもしろいことができるので、使ってみ
釣りっぽいタイトル。「RDBのトランザクションが絡むとアプリケーション側のプログラムが書きにくくなる」という話です。 もちろんですが、RDBのトランザクション機能は偉大であり、Webアプリケーションでも意識して使わなければならず、「トランザクションなんて使うな」と言いたいわけではありません。 合成できない関数 PHPで素のPDOから考えます。たとえば、以下の関数に問題はあるでしょうか? <?php /* * 古いデータをアーカイブテーブルに移す関数のイメージ */ function moveDataToArchive(PDO $db) { $db->beginTransaction(); try { $db->exec(' INSERT INTO archives SELECT * FROM data WHERE published < CURRENT_DATE '); $db->exec
久しぶりの更新です。最近、修行だと思って色々な本を読み漁っているのですが、やっとこさPHPのinterfaceが分かるようになってきた感じがあるので、まとめてみます。 インターフェースは、クラスから"ユーザー定義型"の能力のみを分離した言語機構です。PHPのそれはJavaのinterfaceのパクリです。 "ユーザー定義型"という単語を使いました。動的型付き言語のことを「型のない言語」と言う人がたまにいるんですが、とんでもねー間違いです。PHPにだって型はあります。変数が型を持たず、値が型を持っているというだけの話です。 interfaceを宣言する文法はクラスとよく似ていますが、キーワードclassの代わりにキーワードinterfaceを使います。中身は定義のないメソッドの宣言を書きます。なお、定数も含めることが可能です。 <?php interface FooInterface { c
主観入りまくりですが、技術というか知識とかノウハウには経験由来のものと理論由来のものがあって、この違いは意識した方がいいのではないか、と最近思っています。 私の主観に基づく分類 プラクティス、バッドノウハウ、アンチパターン デザインパターン アーキテクチャパターン オブジェクト指向 フレームワーク アジャイル・開発手法系 MVC 帰納的発想 人間らしい直感を重視する ふわふわ・もやもや ふわふわ・もやもやしているものを扱う 人間を扱う たまに精神論が混じる アルゴリズムとデータ構造 暗号、圧縮、人工知能、etc 関数型 SQL(リレーショナルデータベース) プログラミング言語そのもの コンピューターサイエンス 演繹的発想 直感より真理を重視する 対象範囲が明確に限定されている要素技術が多い 経験由来 理論由来 まあ実際はスッパリ別れるものではなく、「どちらかと言うと経験由来かな」「どちらか
先日、PHP5.5.0がリリースされましたね。さっそくビルドしてニヨニヨしているところです。 5.5の新機能と言えばGeneratorやfinallyなどですが、個人的に注目しているのがcURLの機能強化です。詳しい内容がまだ公式ドキュメントに書かれていないのですが、結構おもしろいので紹介してみます。 cURLとは何か かーると発音する人が多いようです。C言語で書かれたHTTPのclientライブラリであり、WebAPIやスクレイピング、クローラなどを扱うときに非常に便利です。PHP版のバインディングは標準でPHP本体にバンドルされているため、大抵のレンタルサーバーでも使えるようになっています。 ただ、オリジナルのlibcurlそのままの関数風インターフェースを踏襲しており、オブジェクト指向型のラッパーなどは用意されていないため、あまり使いやすくはありません。が、並列リクエストが可能であっ
PSR-3自体の内容と言うよりは、ロガーは重要だとかロガーのインターフェースが標準化されることによってどんなうれしいことがあるかとか、主にその辺をまとめています。 今のところPSR-3対応のライブラリは数えるほどしかなく、PHP-FIGの理想は達成できるのかどうか、、というところですが、日本語圏で紹介している人が皆無という印象だったのであえて題材に選びました。 会場提供をしてくださったEngine Yardさんありがとうございます。
composer searchが非常に遅い件 - 泥のように って記事を以前書きましたが、最近Composerをアップデートしたところ、数秒程度でパッケージを検索でき、メモリもあまり消費しないようになっていました。 composerの遅さにうんざりしている人は、composer self-updateで最新版までアップデートすればいいと思います。バージョンが何故か番号でないので、「バージョンが○.○.○なら速いバージョンです!」と言えないのがつらいですが、とにかく最新版は速くなってます。 なぜ速くなったのか 昔のバージョンではpackagist.orgのリポジトリ定義jsonファイルを全部ダウンロードし、それをarrayに復元してメモリ上に全展開(array_merge)して、検索クエリで一つ一つのパッケージ属性をstrpos()で検索するという、非っ常~~~に効率の悪いことをやっていまし
PHP界で流行っているパッケージ依存管理ツールComposerですが、使っているでしょうか。似たようなツールはだんだん淘汰されてComposerに一本化され、PEARより盛り上がっている感じです。 がしかし。個人的に使った感触では、表題の通り、検索が遅くてたまらんです。(前からそうだったと思うんですが、一向に改善されないばかりか悪化しているのでは?) 実行するマシンのスペックに依存しますが、手元にあるVMPlayer上で動かしているしょぼいFreeBSDだと、composer search phpunitするだけで2分ほど動きが止まります。PackagistのWeb UI上で検索すると一瞬で結果が返ってくるのに。。 Composerにはcomposer initという、composer.jsonを対話的に作るコマンドがありますが、使いたいライブラリを一つ検索するたびに数分待たされるので、非
DCI(Data, Context and Interactions)というキーワードがRuby界で流行っているとか。 DCIアーキテクチャ - Trygve Reenskaug and James O. Coplien - Digital Romanticism DCIアーキテクチャについて語ってみるよ - uehaj's blog まだよく消化できていないのですが(そもそもMVCだって理解できた気がしない)、PHPではどう実装すればいいかを考えてみました。 DCI概略 斜め読みしたところ、MVCのModelが肥大化しがちなところなので、じゃあModelをData、Context、Interactionに3層分割して実装すればすっきりしますよ、という概念だと読めました。実装によってはContextではなくUseCase、InteractionではなくRoleと書いていることもあるみたい。
Dependency InjectionがPHPでも流行っているそうです。が、未だによくわからないので、わからないところを自分なりに考察してみます。 ※DIコンテナではなくデザインパターンとしてのDIを考えます。 Dependency Injectionとは Dependency Injectionはデザインパターンの一種です。日本語なら依存性の注入と訳されます。「Inversion of Control コンテナと Dependency Injection パターン」が原典でしょうか。 ざっくり要約すると「クラスの中でnewしてはいけない。必要なインスタンスは外から突っ込むべし」というところかな。 class Y { private $x; function __construct() { $this->x = new X; } //...$xを使ったコード色々... } 上記のYクラス
PHPではprivateと宣言したプロパティ、メソッドは、同じクラスのインスタンスであれば相互にアクセスできます。あまり意識することはないですが、たまにぎょっとすることになります。 <?php class Klass { private $data; function __construct($init) { $this->data = $init; } function get(self $o) { return $o->data; } } $a = new Klass('a instance'); $b = new Klass('b instance'); //echo $a->data; //これはエラーになる echo $b->get($a); //a instance //$bが$aのprivateメンバを読めた これはprotectedの場合でも同様であり、しかも継承したクラス
次のページ
このページを最初にブックマークしてみませんか?
『Architect Note』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く