タグ

ブックマーク / blog.tojiru.net (33)

  • 型宣言を利用した自動的プログラミング(という夢)

    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

    型宣言を利用した自動的プログラミング(という夢)
    escape_artist
    escape_artist 2016/12/02
    PHPアドベントカレンダー、何とか日付が変わる前に書けました
  • composerを速くするプラグイン・prestissimoを作った

    composerが遅くてお嘆きの日PHPerの皆さんこんにちは。 表題の通り、追加インストールするだけでcomposerが速くなるプラグインを作りました。 # インストール $ composer global require hirak/prestissimo # アンインストール $ composer global remove hirak/prestissimo インストールした状態でlaravel/laravelcreate-projectすると、26秒とかでダウンロード完了しました。Laravelは50個ぐらい依存パッケージがあり、同じ環境で普通にインストールすると5分ぐらいは最低かかるので、10倍以上速くなってます。 2016/1/13(水)にPHPBLT#2というイベントがあり、その中で同じデモをしてきました。 Composer並列化プラグイン #phpblt from

    composerを速くするプラグイン・prestissimoを作った
    escape_artist
    escape_artist 2016/01/24
    ブログ書きました。引き続きよろしくお願いいたします
  • やり直しC言語:複雑な宣言の読み方

    C言語は宣言文が非常に読みにくいことで有名で、後発のGo言語はこれを批判して宣言の構文を変えています。私もずっと読むのが苦手だったのですが、私の頭が悪いのではなく、C言語の仕様がヘン、ということらしい。 今まで飽きるほどこの手の解説は書かれてきてるわけですが、自分なりにまとめないと覚えた気がしないので、あえてまとめておきます。ここに書いてある内容は、「C言語ポインタ完全制覇」に詳しく書いてあります。 型の派生 C言語では、int, char, floatなどの基型から、配列やポインタを派生していくことができます。対象を並べたものが配列で、対象を指し示すのがポインタです。 配列やポインタからも配列やポインタを派生できるので、派生パターンは無限に存在します。 int int の配列 int の配列 の配列 ... int へのポインタ int へのポインタ へのポインタ ... int への

    やり直しC言語:複雑な宣言の読み方
    escape_artist
    escape_artist 2015/09/24
    id:kmaebashi あの本のおかげでC言語が怖くなくなりました。素敵な本を書いていただきありがとうございます!感激です
  • 「1から100の整数を出力してください。ただし5つの異なる方法を用いて」をPHPで

    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の()の中に書けません

    「1から100の整数を出力してください。ただし5つの異なる方法を用いて」をPHPで
    escape_artist
    escape_artist 2014/08/28
    GinqとUnderscore.php版を誰か
  • PHPの名前空間の効果的な使い方を考える

    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

    PHPの名前空間の効果的な使い方を考える
    escape_artist
    escape_artist 2014/01/27
    セルクマ
  • PHPのinterfaceとは何か

    久しぶりの更新です。最近、修行だと思って色々なを読み漁っているのですが、やっとこさPHPのinterfaceが分かるようになってきた感じがあるので、まとめてみます。 インターフェースは、クラスから"ユーザー定義型"の能力のみを分離した言語機構です。PHPのそれはJavaのinterfaceのパクリです。 "ユーザー定義型"という単語を使いました。動的型付き言語のことを「型のない言語」と言う人がたまにいるんですが、とんでもねー間違いです。PHPにだって型はあります。変数が型を持たず、値が型を持っているというだけの話です。 interfaceを宣言する文法はクラスとよく似ていますが、キーワードclassの代わりにキーワードinterfaceを使います。中身は定義のないメソッドの宣言を書きます。なお、定数も含めることが可能です。 <?php interface FooInterface { c

    PHPのinterfaceとは何か
    escape_artist
    escape_artist 2013/10/15
    久しぶりにブログ書きました
  • 経験由来の技術と理論由来の技術

    主観入りまくりですが、技術というか知識とかノウハウには経験由来のものと理論由来のものがあって、この違いは意識した方がいいのではないか、と最近思っています。 私の主観に基づく分類 プラクティス、バッドノウハウ、アンチパターン デザインパターン アーキテクチャパターン オブジェクト指向 フレームワーク アジャイル・開発手法系 MVC 帰納的発想 人間らしい直感を重視する ふわふわ・もやもや ふわふわ・もやもやしているものを扱う 人間を扱う たまに精神論が混じる アルゴリズムとデータ構造 暗号、圧縮、人工知能etc 関数型 SQL(リレーショナルデータベース) プログラミング言語そのもの コンピューターサイエンス 演繹的発想 直感より真理を重視する 対象範囲が明確に限定されている要素技術が多い 経験由来 理論由来 まあ実際はスッパリ別れるものではなく、「どちらかと言うと経験由来かな」「どちらか

    経験由来の技術と理論由来の技術
    escape_artist
    escape_artist 2013/07/10
    ちゃんと両方のアプローチで語れるようになりたい。
  • PHP5.5で強化されたcURL拡張でHTTP Pipeliningを試す

    先日、PHP5.5.0がリリースされましたね。さっそくビルドしてニヨニヨしているところです。 5.5の新機能と言えばGeneratorやfinallyなどですが、個人的に注目しているのがcURLの機能強化です。詳しい内容がまだ公式ドキュメントに書かれていないのですが、結構おもしろいので紹介してみます。 cURLとは何か かーると発音する人が多いようです。C言語で書かれたHTTPのclientライブラリであり、WebAPIスクレイピング、クローラなどを扱うときに非常に便利です。PHP版のバインディングは標準でPHP体にバンドルされているため、大抵のレンタルサーバーでも使えるようになっています。 ただ、オリジナルのlibcurlそのままの関数風インターフェースを踏襲しており、オブジェクト指向型のラッパーなどは用意されていないため、あまり使いやすくはありません。が、並列リクエストが可能であっ

    PHP5.5で強化されたcURL拡張でHTTP Pipeliningを試す
    escape_artist
    escape_artist 2013/06/23
    正直、やっとかよーという感じなんですが
  • PSR-3 Logger Interfaceの話

    PSR-3自体の内容と言うよりは、ロガーは重要だとかロガーのインターフェースが標準化されることによってどんなうれしいことがあるかとか、主にその辺をまとめています。 今のところPSR-3対応のライブラリは数えるほどしかなく、PHP-FIGの理想は達成できるのかどうか、、というところですが、日語圏で紹介している人が皆無という印象だったのであえて題材に選びました。 会場提供をしてくださったEngine Yardさんありがとうございます。

    PSR-3 Logger Interfaceの話
    escape_artist
    escape_artist 2013/04/24
    #phpstudy
  • composer searchが速くなってた

    composer searchが非常に遅い件 - 泥のように って記事を以前書きましたが、最近Composerをアップデートしたところ、数秒程度でパッケージを検索でき、メモリもあまり消費しないようになっていました。 composerの遅さにうんざりしている人は、composer self-updateで最新版までアップデートすればいいと思います。バージョンが何故か番号でないので、「バージョンが○.○.○なら速いバージョンです!」と言えないのがつらいですが、とにかく最新版は速くなってます。 なぜ速くなったのか 昔のバージョンではpackagist.orgのリポジトリ定義jsonファイルを全部ダウンロードし、それをarrayに復元してメモリ上に全展開(array_merge)して、検索クエリで一つ一つのパッケージ属性をstrpos()で検索するという、非っ常~~~に効率の悪いことをやっていまし

    composer searchが速くなってた
    escape_artist
    escape_artist 2013/03/28
    アップデートするといいと思います
  • composer searchが非常に遅い件

    PHP界で流行っているパッケージ依存管理ツールComposerですが、使っているでしょうか。似たようなツールはだんだん淘汰されてComposerに一化され、PEARより盛り上がっている感じです。 がしかし。個人的に使った感触では、表題の通り、検索が遅くてたまらんです。(前からそうだったと思うんですが、一向に改善されないばかりか悪化しているのでは?) 実行するマシンのスペックに依存しますが、手元にあるVMPlayer上で動かしているしょぼいFreeBSDだと、composer search phpunitするだけで2分ほど動きが止まります。PackagistのWeb UI上で検索すると一瞬で結果が返ってくるのに。。 Composerにはcomposer initという、composer.jsonを対話的に作るコマンドがありますが、使いたいライブラリを一つ検索するたびに数分待たされるので、非

    composer searchが非常に遅い件
    escape_artist
    escape_artist 2013/01/13
    ブログ書いた。
  • PHPのDIで動的にオブジェクトを確保する考察

    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のDIで動的にオブジェクトを確保する考察
    escape_artist
    escape_artist 2012/12/03
    標準ライブラリだと、クラス名だけinjectするパターンが多いかな。。悩み
  • PDOの真の力を開放する - PHPでデータベースを扱う(3)

    ちょっと遅れましたが、シリーズの第3回です。前回までに論じた内容をふまえて、簡単な実装を示します。↓前回までの内容はこちら。 DAOの悪夢 - PHPでデータベースを扱う(1) - 泥のように ドメイン駆動設計という救世主 - PHPでデータベースを扱う(2) - 泥のように 題材 「記事にタグを設定できるブログ」みたいなシステムを考えてみます。ブログ記事を示すEntryテーブル、タグを表すTagテーブルの二つを用意しました。MySQL WorkbenchによるER図(鳥足記法)は以下になります。 1つのEntryに対して複数のTagがある、1対多の関係です。同じTagが複数のEntryに関連するため、多対多の関係と見なすこともできそうですが、タグ程度だとあまり意味がないので、これ以上のテーブル分割はやめておきます。 Entryテーブルの主キーがentryIdと冗長な名前をしているのは、自

    PDOの真の力を開放する - PHPでデータベースを扱う(3)
    escape_artist
    escape_artist 2012/06/26
    SQLite依存のSQLを書きまくってしまった。。。でもこの辺は仕方ないよなあ。。
  • ドメイン駆動設計という救世主 - PHPでデータベースを扱う(2)

    Userテーブルに対してデータをinsertするメソッドを考えます。愚直なこんなインターフェースはどうでしょうか? class UserMapper { //... function insert( $nickname, $password, $firstname, $lastname, $birthday ) { //... } } …この引数を覚えていられる人はそう多くないと思います。もしプログラムを間違えて、nicknameとfirstnameを逆に指定してしまったら、名がnicknameとして登録されてしまいます。名が誤って表示されてしまうという致命的な事故につながります。危なっかしいプログラムですね。 では、順番を考慮しなくていいように連想配列にすればどうでしょうか? class UserMapper { //... function insert(array $data)

    ドメイン駆動設計という救世主 - PHPでデータベースを扱う(2)
    escape_artist
    escape_artist 2012/06/10
    ぶっちゃけDDDはよく理解してないのでツッコミ誰か
  • メソッドチェーンDSLでブロックを作るテクニック

    PHP勉強会でうまく説明できなかったので、ちゃんとした説明を。PHPが対象ですが、たぶんほかの言語でも応用できる話です。 メソッドチェーンで言語内DSLを作るとき、ブロック状の構文のようなものが必要になることがあります。XML_BuilderではXMLのツリー状の構文を再現するため、この構文を多用しています。 <?php XML_Builder::factory() ->root() ->child1() ->child2() ->child3_() ->_() ->_() ->_() ->_echo(); わかりやすいようインデントしましたが、単にthisを返し続けるメソッドチェーンならば意味的にブロックはないわけで、こんな構文を作るのはつらいものがあります。 XML_Builderでも悩みまして、いろいろ考えた結果、コンテキストをオブジェクトとして実装しました。詳しく説明していきます。

    メソッドチェーンDSLでブロックを作るテクニック
    escape_artist
    escape_artist 2012/05/28
    コンテキストと言うか「継続」って名乗ってもいいのかな…。 言語設計に詳しい人ならどう作るのか知りたい。
  • JavaScriptにRuby風のnewメソッドを加える

    JavaScriptのオブジェクト指向はクラスベースの皮をかぶったプロトタイプベースです。機能的には十分なのですが、すっきり書く方法が公式に用意されていないので苦労します。一年前に、newを封印してJavaScriptでオブジェクト指向するなんて記事を書いたこともありました。 Rubyではnewは演算子でなくメソッドです。これをインスパイヤしてJavaScriptもnewメソッドを加えてみると、プロトタイプ的継承もすっきり書けるのではないかと思い、試してみました。ECMAScript 5の機能を使っています。当然IE6なんかでは動かないです。 newメソッドその他の定義 Object.defineProperties(Object.prototype, { new: {value: function(){ var self = Object.create(this); self.initi

    JavaScriptにRuby風のnewメソッドを加える
    escape_artist
    escape_artist 2012/05/07
    id:teramako Object.createしてるのでチェーンはつながっています。Penguin.__proto__===Birdです
  • PHPでRSSを読むならXML_Builderにおまかせ!

    RSSPHPで読み込む、というよくある処理。PHP5ならSimpleXMLという超簡単にXMLが扱えるクラスがあるので、これを使うと楽です。 var_dump( simplexml_load_file( 'http://blog.tojiru.net/index.rdf' ) ); object(SimpleXMLElement)#1 (2) { ["channel"]=> object(SimpleXMLElement)#2 (4) { ["title"]=> string(15) "泥のように" ["link"]=> string(23) "http://blog.tojiru.net/" ["description"]=> string(57) "プログラミングのネタを思いつくままに。" ["items"]=> object(SimpleXMLElement)#18 (0) { }

    PHPでRSSを読むならXML_Builderにおまかせ!
  • PHPでXMLを生成するためのライブラリを公開しました

    XMLを生成するためのライブラリ「XML_Builder」をOpenpearにて公開しています。1月ごろにはもう公開していたのですが、ブログに書いていなかったので、簡単な紹介を書いてみたいと思います。(4/1ですがエイプリルフール関係ない記事です) github pagesに簡単なドキュメントも置いています。 php-XML_Builder document https://github.com/hirak/php-XML_Builder インストール PHP PEAR形式のライブラリです。OpenpearなのでPEARコマンドで簡単です。 % pear channel-discover openpear.org % pear install openpear/XML_Builder 肝心のXMLを出力するにはDOMやXMLWriterが必要ですが、arrayを生成するだけのモードもあるた

    PHPでXMLを生成するためのライブラリを公開しました
  • 規模別PHPUnitでのテストの書き方いろいろ - Architect Note

    最近になってPHPUnitをちゃんと使ってユニットテストを書くようになってきたのですが、まだまだTipsが足りないと感じます。個人的に実践している書き方をいくつか並べてみます。 追記:最初、シェバングと書いていましたが、オプションを渡せる数が決まっていたりOSによっては動かなかったりとあまり便利でないことがわかりました。。phpunit.xmlを書いた方がいいかも。 ちょっとしたテスト → シェルスクリプト化する PHPUnitは高機能なのですが、いかんせん最初の障壁が高いと思います。とにかく気軽に書きたいなら、シェルスクリプトを作って単独ファイルで実行できるようにするといいです。 #!/bin/sh phpunit --colors *Test.php # ↑オプションを書き並べておく <?php class SampleTest extends PHPUnit_Framework_Te

    規模別PHPUnitでのテストの書き方いろいろ - Architect Note
    escape_artist
    escape_artist 2012/02/20
    ブログ書いた / シェバングの記述がおかしかったのでちょっと修正しました
  • RecursiveTreeIteratorでtreeコマンドを実装する

    Qiitaに投稿した内容なんですが、もうちょい詳しく書いてみます。 treeコマンドというのは、ディレクトリの一覧をアスキーアートでわかりやすく表示してくれるコマンドです。 $ tree -d php-XML_Builder/ php-XML_Builder/ |-- lib | `-- XML | `-- Builder `-- test `-- coverage OSによっては標準で入っていないことがあるので、Iteratorの勉強がてら、これをPHPで実装する方法を考えてみました。 と言っても、treeコマンドのために生まれてきたようなRecursiveTreeIteratorというクラスが既にあり(PHP5.3以降)、これを使えばかなり簡単に実装できます。 ■処理の流れ RecursiveDirectoryIteratorで目的のディレクトリをイテレーターにする 必要に応じてRec

    RecursiveTreeIteratorでtreeコマンドを実装する
    escape_artist
    escape_artist 2012/01/20
    ブログ書いた