タグ

ブックマーク / hnw.hatenablog.com (21)

  • PHPerKaigi2022でPHPからGoogle Assistantを使う話をしました - hnwの日記

    かなり時間が空いてしまいましたが、先月行われたPHPerKaigi 2022にて、「PHPerだってPHPから「OKグーグル」したい!」というタイトルで発表しました。 発表の内容としてはPHPからgRPCを使ってGoogle Assistant APIを叩くというものでした。プレゼンの最後にPHPから「全部消して」という命令を投げて自分の部屋を真っ暗にするデモを実施したのですが、無事成功してウケたので満足です。 今回のコードは下記URLで公開しています。皆さんもOKグーグルしてみてください。 GitHub - hnw/google-assistant-cli-php: Google Assistant CLI written in PHP PHP+gRPC 仲間が少なすぎてしんどい問題 今回の発表内容は「やればできるでしょ」というレベルの話に見えると思うんですが、実は動かすまでにかなり苦労

    PHPerKaigi2022でPHPからGoogle Assistantを使う話をしました - hnwの日記
    uzulla
    uzulla 2022/05/24
    PHPからのgRPCむずかしくて面倒で、安易にProxyをはさみがち…(反省)
  • PHPのインターン化文字列とは何か - hnwの日記

    このエントリは闇PHP Advent Calendar 2015の3日目です。なぜか@do_akiさんによる4日目の記事「ZEND_TICKS と tick 関数」を読んだ後で書いています。 稿では、あまり日語での説明を見たことがないPHPのインターン化文字列(interned strings)について紹介します。 文字列のインターン化とは 文字列のインターン化というのは多くのプログラミング言語で採用されているテクニックで、同じ不変文字列がプログラム中に何度も登場するような場合に、毎回文字列をコピーするのではなく同じ文字列を共有することで実行時間やメモリ消費量などを有利にするようなものです。Wikipediaの「String interning」なども参照してください。 internというのは軍などで使われる単語で、抑留というのが日語で一番近い単語だと思いますが、どうもピンとこないの

    PHPのインターン化文字列とは何か - hnwの日記
    uzulla
    uzulla 2020/09/28
  • PHP7から定数配列がOPcacheに乗るので巨大配列が使い放題という話 - hnwの日記

    PHP 7.0のリリースから約5年が経過し、そろそろPHP 8.0のリリースも見えてきました。人によっては使い始めて5年目になるはずのPHP 7.xですが、いまだに新しい発見があったりして面白いですね。 稿ではPHP 7.0から入った定数配列に関する性能改善について紹介します。 PHP 5時代は配列の組み立てコストが大きかった プログラミング上のテクニックとして、辞書データを連想配列としてプログラム中に記述し、これを必要に応じて使うというものがあります。たとえば次のコード例を見てみましょう。このような連想配列を持っておけば、プログラム中で国名コードをを扱う際に実在するかをチェックしたり、国名の日語表記に変換したりといった処理ができるわけです。 <?php $country_name = [ 'jp' => '日', 'us' => 'アメリカ合衆国', 'ru' => 'ロシア連邦'

    PHP7から定数配列がOPcacheに乗るので巨大配列が使い放題という話 - hnwの日記
    uzulla
    uzulla 2020/08/13
    PHPにはvar_exportという関数がありますので、それでダンプしてちょっとだけ整形して保存して、includeするというテクとセットにすると良いとおもいました。
  • Windows Subsystem for Linux上でphp-fpmを動かしてみた - hnwの日記

    最近のWindows 10にはLinuxバイナリをそのまま動かすような仕組みが導入されています。これは Windows Subsystem for Linux (WSL) とか Bash on Ubuntu on Windows (BoW) などと呼ばれているもので、VM実行でなくWindowsネイティブでLinuxを動かすという意欲的な取り組みです。 この環境で最新版のPHPをソースコードからビルドし、アプリケーションサーバとして動作させてみました。 稿執筆時点(2017年5月)ではWSL自体がまだ不安定な印象ですが、nginx+php-fpmを動作させることができました。以下はWindowslocalhost 80番ポートでPHPが動作している証拠画像です。「System」欄のunameの表示にMicrosoftという文字列が入っているのがオシャレですね。 以下、WSL上でngin

    Windows Subsystem for Linux上でphp-fpmを動かしてみた - hnwの日記
    uzulla
    uzulla 2017/05/02
  • ポートノッキングで10秒間だけsshdを公開する設定 - hnwの日記

    先日Twitterに次のような書き込みをしたところ思ったより反応が良かったので、詳細の設定を紹介します。 UDP53番、TCP443番、UDP123番とポートノッキングをするとTCP443番に10秒だけsshdが現れる、という中二病全開の設定をした。皆様にもお勧めしたい。— hnw (@hnw) 2017年3月26日 といっても特殊なことをしたわけではなく、knockdでポートノッキングの設定を行い、iptablesと組み合わせて実現しました。 ポートノッキングとは ポートノッキングというのは、決められたポートを決められた順番で叩くことでファイアーウォールに穴を空けられるような仕組みのことです。ポートノッキングを使えば、TCPの7000番、8000番、9000番の3ポートにパケットを送りつけると22番ポート (SSH) へのアクセスが許可される、といった設定ができます。 ポートノッキングの

    ポートノッキングで10秒間だけsshdを公開する設定 - hnwの日記
    uzulla
    uzulla 2017/03/28
  • 勝手にMarkdownプレビューを開くVS Codeのエクステンションを書いた - hnwの日記

    Visual Studio Code(以下VS Code)、みなさん使ってますか?VS CodeはMicrosoftが開発しているオープンソースのエディタです。Electronベースという意味ではAtomと似た存在ですが、Atomより軽いという評判を聞いたりします。 私も最近VS Codeを使い始めました。いまのところMarkdown編集専用という状況ではありますが、便利に使っています。それだけでなく、「Auto-open Markdown Preview」というエクステンションを書いて自分好みの挙動になるようにしてみました。稿ではその顛末について紹介します。 ちなみに作業はすべてMacOSX上で行いましたが、WindowsでもLinuxでも同様だと思います。 作ったもの 今回、「Auto-Open Markdown Preview」というエクステンションを作りました。Markdown

    勝手にMarkdownプレビューを開くVS Codeのエクステンションを書いた - hnwの日記
    uzulla
    uzulla 2016/05/28
  • phpallコマンドでPHPの全バージョンの挙動を試す - hnwの日記

    追記:1/13頃まで、install-all-php.shにバグがありました。ごめんなさい。今は全バージョンを一気にコンパイルできるはずです。 第38回PHP勉強会でも紹介しましたが、私はPHP5.0.0〜PHP5.2.8までの全バージョンのPHPバイナリを持っています。これはPHPのバージョン間の差異やバグを確認したいときなどに便利です。(参考:「第38回PHP勉強会に参加してきました」) このような環境を作る方法について紹介します。基的には各バージョンのPHPをコンパイルするだけですが、コンパイルが通らない場合があるのでその回避方法と、かんたんインストールスクリプトを用意したのでそれを紹介します。また、全てのバージョンのPHPを順に実行するコマンドphpallについても紹介します。 PHP5をgcc4環境でコンパイルする 実は、PHP 5.0.0-5.0.3はgcc4 でコンパイルで

    phpallコマンドでPHPの全バージョンの挙動を試す - hnwの日記
    uzulla
    uzulla 2016/04/16
  • PHP7からstrlen関数に特化した高速化が採用された - hnwの日記

    (2016/01/01 02:20追記)mbstring.func_overloadの章を盛大に書き換えました。なぜか廃止されたと思い込んでたんですが、特に廃止もされてなくて、PHP 7でも動くことは動きます。ただ、仕組み上strlenだけ言うことを聞かなくなっていますので、使い道としては厳しいと思います。 (2017/5/14 追記)PHP 7でmbstring.func_overloadを有効にしてもstrlen()は期待通り動作しないと書いていましたが、期待通りmb_strlen()として動作していました。つまり、「2016/01/01 02:20追記」が一部嘘でしたので、記事を修正・追記しました。 みなさん、もうPHP 7は試してみましたか? PHP 7のセールスポイントと言えば高速化ですよね。その高速化ですが、個人的には「そこ速くする余地あったの?」と思えるような箇所が高速化され

    PHP7からstrlen関数に特化した高速化が採用された - hnwの日記
    uzulla
    uzulla 2016/01/01
  • MacOSX上のPHP 7.0.0RC5+OPcacheでエラーが出る件の対策 - hnwの日記

    MacOSX環境でPHP 7.0.0RC5をビルドしてphpコマンドを動かしたところ、下記のようなエラーが出ました。 dyld: lazy symbol binding failed: Symbol not found: _accel_move_code_to_huge_pages Referenced from: /Users/hnw/.phpenv/versions/7.0.0RC5/lib/php/extensions/no-debug-non-zts-20151012/opcache.so Expected in: flat namespace dyld: Symbol not found: _accel_move_code_to_huge_pages Referenced from: /Users/hnw/.phpenv/versions/7.0.0RC5/lib/php/ext

    MacOSX上のPHP 7.0.0RC5+OPcacheでエラーが出る件の対策 - hnwの日記
    uzulla
    uzulla 2015/10/16
    これかー!
  • PHP7で変わること - hnwの日記

    次の土曜日5/30のPHPカンファレンス関西2015で基調講演(10:30-11:15)をさせて頂くことになりました。タイトルは「PHP7で変わること——言語仕様とエンジンの改善ポイント」です。チケットは既に売り切れているそうですが、参加者の方は早起きして来て頂けると幸いです。 このところQiitaに「PHP7調査」というシリーズを連投していたのも発表を意識してのことです。PHP7の新機能を一つずつ実際に試してみて、その結果を簡単にまとめていました。 今回は発表前の区切りとして、私の書いたPHP7関連の記事・プレゼン資料を一覧形式でまとめなおしてみます。PHPカンファレンス関西2015ではこれらの内容を踏まえつつ、気になる点を重点的にお伝えしたいと考えています。 内部実装のリファクタリング PHP7の目玉と言える、速度改善に関わる内容がほとんどです。 PHP7はなぜ速いのか - Slide

    PHP7で変わること - hnwの日記
    uzulla
    uzulla 2015/05/25
  • Javaで書かれたPHP処理系のJPHPが高速だった - hnwの日記

    JPHPというJavaで書かれたPHP処理系があります。これは2013年10月にはじまった新しいプロジェクトで、大半をメイン開発者一人で開発しているようですが、既に一定以上の完成度です。また、内部的にはPHPファイルを解釈して直接Javaバイトコードにコンパイルしており、かなり高速なPHP処理系になっています。 他のPHP処理系と異なり、既存のPHPコードをWebサーバ上で動かすことを重視していないようにも見えますが、興味深いプロジェクトですので紹介します。 JPHPを動かしてみる さっそくJPHPを試してみましょう。現時点ではGitHubからソースコードを持ってきてビルドする必要があります。JDK7以上が必要ですので注意してください。JPHPのドキュメント「Getting Started」の通り、次のようにしてJPHPがビルドできます。 $ git clone https://githu

    Javaで書かれたPHP処理系のJPHPが高速だった - hnwの日記
    uzulla
    uzulla 2015/01/17
    あなたとjavaとphp
  • PHPのJava実装であるQuercusをCLIで動かしてみた - hnwの日記

    今日は有名PHP実装の一つであるQuercusを紹介します。これはJavaサーブレットコンテナResinを開発しているCaucho社が開発しているもので、当然のことながらJava環境で動作します。既存のPHPコードを動かすのにJava環境のノウハウや資産が生かせれば良いところ取りができるわけで、野心的なプロジェクトだと言えるでしょう。前回記事「MacOSX上で.NET環境向けPHPコンパイラPhalangerを動かしてみた」で紹介したPhalangerと似た発想ですね。 今回はコマンドラインからQuercus単体で使ってみました。いちいちアプリケーションサーバをセットアップしなくても気軽に試せるのは嬉しいところです。 QuercusをCLIから動かす Quercusには「com.caucho.quercus.CliQuercus」というコマンドラインインターフェース用のクラスが提供されてい

    PHPのJava実装であるQuercusをCLIで動かしてみた - hnwの日記
    uzulla
    uzulla 2015/01/08
    ジャバ
  • MacOSX上で.NET環境向けPHPコンパイラPhalangerを動かしてみた - hnwの日記

    (1/7 追記)ベンチマークテスト結果が不正確だったので、再測定して書き直しました。以前の記事よりもPHPの結果が良くなっています。 あけましておめでとうございます。このたび、gihyo.jpの新春特別企画として記事「PHP処理系の未来」を寄稿いたしました。HHVMとPHP7を絡めて最近のPHPの動向を紹介するような内容になっていますので、是非ご覧くださいませ。 この記事を書くにあたり、HHVM以外にも有望なPHP処理系があるかどうかを調べていました。その結果、HHVMほどではないにせよ実用レベルに近いPHP処理系が複数あることがわかりました。 そうした実装のうち、今回は.NET FrameworkおよびMono環境で動くPHPコンパイラPhalangerを紹介します。PhalangerはC#で書かれており、PHPソースコードから.NETアセンブリを出力します。Windows上では家PH

    MacOSX上で.NET環境向けPHPコンパイラPhalangerを動かしてみた - hnwの日記
    uzulla
    uzulla 2015/01/02
    イロモノだと先入観もってた、すごい実装されてるんだなー。
  • PHP7はなぜ速いのか(zval編) - hnwの日記

    この記事はPHP Advent Calendar 2014の7日目です。 僕は先日のPHPカンファレンス2014でPHP7に関するLTをしました(参照:「PHPNGの動向」)。ただ、時間が限られていたこともあり、あまり踏み込んだ内容には触れませんでした。 稿ではLTの内容から深掘りし、zvalという内部的な構造体がどう変わるのか、性能面のメリットにフォーカスして解説してみます。 PHPをとりまく状況 まず最近のPHPの話題をおさらいしておきましょう。 これまでPHPには実用レベルの別実装が存在しない状態が続いていましたが、HHVMの登場で状況が変わってきました。HHVMはFacebookが開発しているPHP実行環境で、PHPより高速で互換性も高いのが特徴です。Facebookで実際に利用されているだけでなく、他の企業でも商用サービスで利用する事例が増えてきています。 そんな中、2014年

    PHP7はなぜ速いのか(zval編) - hnwの日記
    uzulla
    uzulla 2014/12/08
  • PHP7で導入予定の新しいメモリマネージャをPHP5.6にバックポートした - hnwの日記

    現在、PHPの開発ブランチでは次期バージョンであるPHP7.0の開発が進められています。この新バージョンでは内部のリファクタリングと性能改善に重点が置かれるとみられており、言語仕様の観点ではメジャーバージョンアップの割に変化の小さいバージョンになりそうです。 ところで、このPHP7でメモリ管理まわりのコードが書き直されるのをご存じでしょうか。これはPHP7開発のキーマンの一人であるDmitry Stogovによるもので、アプリケーションによっては5%から10%の性能アップが期待できるようです。 しかし、PHP7は最速でも1年後のリリースと言われていますので、我々がこの恩恵を受ける日は随分先になってしまいます。そこで、この修正をPHP 5.6.2にバックポートしてみて、現行バージョンでも効果があるのかどうか実験してみました。 修正内容 PHP7で採用予定の新メモリマネージャは、最近の速いma

    PHP7で導入予定の新しいメモリマネージャをPHP5.6にバックポートした - hnwの日記
    uzulla
    uzulla 2014/11/08
  • PHP 5.4.4から==の挙動が一段と難しくなりました - hnwの日記

    PHPの==は両辺を適当に型キャストしてから比較するような演算子です。この型キャストの規則は難解すぎる上にドキュメントも不十分なため、PHPプログラマでも完璧に理解している人はほとんど居ないくらいの印象です。バグの原因になりかねないため、なるべく==を使わないようにしているPHPプログラマも多いはずです。 ところで、この==演算子の挙動がPHP 5.4.4から変更されていることはあまり知られていません。稿ではこの内容を紹介します。 Bug #54547 の騒動 まずはこの仕様変更の経緯を紹介します。 2年ほど昔、Hacker Newsで2^63付近の整数に対応する文字列をPHPで比較したときの挙動がおかしいというスレッドが盛り上がったことがありました。具体的には、PHPでは「'9223372036854775807' == '9223372036854775808'」がtrueになるとい

    PHP 5.4.4から==の挙動が一段と難しくなりました - hnwの日記
    uzulla
    uzulla 2014/08/10
    PHPerがこんなに大きい数字を扱うわけがないので大丈夫です!!!(マジレスするとGMPあたりをつかう)
  • WebスクレイピングライブラリGoutteで遊んでみる - hnwの日記

    新年あけましておめでとうございます。今年もボチボチやっていきます。 稿ではPHP製のWebスクレイピングライブラリGoutteを紹介します。 Goutte(グット)とは Goutteは必要十分な機能を持ったWebスクレイピングライブラリです。そもそもWebスクレイピングというのは、外部Webページから必要なデータを取ってくるくらいの意味です。つまり、GoutteはWebスクレイピングを簡単に行う道具だと考えればいいでしょう。 具体的には、GoutteはWebクローラとHTMLパーサを組み合わせたようなものです。Cookieやフォームの扱いなどWebブラウザとしての機能は一通り揃っていますし、CSS風の要素指定もできるなど、機能面では他のライブラリと遜色ないように感じます。 さらに僕個人がGoutteに期待している点は、安定性とロングサポートです。Goutteは主要機能をSymfony2お

    WebスクレイピングライブラリGoutteで遊んでみる - hnwの日記
  • PHPのジェネレータはイテレータより速い - hnwの日記

    先日の記事「PHPのジェネレータの実装を調べてみた」で僕は次のように書きました。 GeneratorクラスはIteratorインターフェースを実装しており、対応するPHPメソッドを持っています。また、Cで実装した場合のみ指定できるイテレータ関数も実装しています。このように両方が指定されている場合、foreachループではCの関数が呼ばれ、イテレータメソッドを明示的に指定した場合はPHPメソッドの方が呼ばれます。 ところで、イテレータに対応するPHPメソッドとC関数となぜ2つとも実装する必要があるのでしょうか。実は、PHPメソッドの方だけ実装すれば正常に動作します。C関数を実装する理由は速度面のメリットからだというのが僕の理解です。C関数は関数ポインタで単に呼び出せるのに対し、PHPメソッドの呼び出しは命令実行器の状態保存・復元の必要があるなど、呼び出しのコストがやや高いのです。 PHPのジ

    PHPのジェネレータはイテレータより速い - hnwの日記
    uzulla
    uzulla 2013/11/04
  • 第66回PHP勉強会でPHP-FPMの話をしました - hnwの日記

    3月27日に開催された第66回PHP勉強会でLT発表してきました。以下が発表資料です。 発表内容は、 PHP-FPMとuWSGI+PHP pluginを試してみた話と、PHP-FPMの面白機能紹介といった内容です。 個人的にPHP-FPMの記事は絶賛記事が多すぎて気持ち悪いと感じていたので、そこまで絶賛するほどかなあ?という主張をしてみました。 というのも、よくApache+mod_phpという1サーバ構成とnginx+PHP-FPMという2サーバ構成を比較していたりするんですが、静的コンテンツと動的コンテンツが入り乱れる状況なら後者の方が有利なのは当然で、公平に比較するならApacheの前段にnginxを入れるべきだと思います。 もちろん、ノウハウゼロの状態からならnginx+PHP-FPMの方が最適な設定に早くたどり着けそうですし、今後ますます期待できるソリューションだと思うので、普通

    第66回PHP勉強会でPHP-FPMの話をしました - hnwの日記
    uzulla
    uzulla 2013/04/01
  • PHPカンファレンス2012でphp-timecopについてLT発表しました - hnwの日記

    9月15日に開催されたPHPカンファレンス2012でLT発表してきました。以下が発表資料です。 発表資料:「php-timecopを実戦投入してみた」(slideshare版)(PDF版) ただ、利用シーンがイマイチわからないという声を何件か頂戴しましたので、稿で改めて補足します。僕が想定している利用シーンは次の3つです。 非エンジニアが、時刻に依存する手動テストを行う場合 この場合、ステージング環境で利用することになると思います 例:20時からセールが始まるのを、19時時点で動作確認したい エンジニアが、時刻に依存する手動テスト・自動テストを行う場合 例:絶妙なタイミングで日またぎや年またぎが起こる状況を再現させたい パラノイアなエンジニアが、date関数の第二引数が省略されたコードを見てブチ切れた場合 社内のニーズとしては1番目だったので伝えるには一番わかりやすいかと思ったんですが、

    PHPカンファレンス2012でphp-timecopについてLT発表しました - hnwの日記
    uzulla
    uzulla 2012/09/16
    phpで実行するスクリプトの時刻を(date()を)任意の時間設定できる拡張。