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

  • GAE/SE PHP 7.2環境は実用性が高そうだという話 - hnwの日記

    筆者の周囲だけかもしれませんが、さいきんGoogle App Engine Standard Environment(以下GAE/SE)が再注目されつつあるように思います。今回筆者もgVisorベースのGAE/SE PHP 7.2環境に触ってみたので、その内容を紹介します。 GAE/SEとは GAE/SEは元祖PaaSとも言えるような、Googleが提供するフルマネージド環境です。以前からJavaPythonGoPHPの4言語の環境が提供されていましたが、Go以外の言語のバージョンアップは長いこと提供されておらず、Google気度に疑問を持っていた人も多かったように思います(私もその一人でした)。 ところが最近になってNode.js 8、Java 8、Python 3.7、PHP 7.2と立て続けに新バージョンを提供してきており、Googleが水面下でGAE/SEに開発リソースを

    GAE/SE PHP 7.2環境は実用性が高そうだという話 - hnwの日記
  • 日本語のパスワードジェネレータを作ってみた - hnwの日記

    Webサービスを使っていると、たまに「秘密の質問」の設定を求められることがあります。 こういう場合、個人的にはランダム文字列を登録したいと思うのですが、次のようにマルチバイト文字しか登録できないことが多い気がします。 普通のパスワードジェネレータではマルチバイト文字のパスワード生成ができないので、このような用途には使えません。そこで、ランダムなマルチバイト文字列を生成するサービス「 秘密の答えジェネレータ」を作ってみました。 自分でも実用しており、既に5サービスに設定しましたが、非常に便利だと感じます。 稿ではこのサービスの技術面の詳細について紹介します。 「秘密の答えジェネレータ」の構成要素 「秘密の答えジェネレータ」はHTML+JavaScriptだけで実現されており、GitHub Pagesでホストしています。また、独自ドメインのDNSおよびSSL化はCloudFlareで行ってい

    日本語のパスワードジェネレータを作ってみた - hnwの日記
  • セキュリティの話題に丸腰で踏み込んでくる人を見た - hnwの日記

    Qiita上で「ゲームでよくされるチート手法とその対策 〜アプリケーションハッキング編〜」という記事がいいね数を集めているようですが、全セクションにツッコミどころがあるような印象です。私はセキュリティ職というわけではありませんが、素人の私から見てもひどいと思ったところだけ個別にツッコミを入れてみます。 念のため補足しておくと、誰であろうと情報発信すること自体は大変良いことです。ただ、誤りを含んだ文章がウッカリ注目されてしまうとそれを信じてしまう人も出てくるので、大人げないと思いつつツッコミを入れる次第です。 デコンパイル(逆コンパイル) 2.の詳しい解説として、C/C++で記述されたコードをコンパイルすると機械語に変換されます。これを逆コンパイルしても、逆アセンブラまでにしかなりません。そのため、この状態ではソースコードの中身を解析するのは(人間では)非常に困難なため、ネイティブコードで

    セキュリティの話題に丸腰で踏み込んでくる人を見た - hnwの日記
  • MySQLのFLOAT型を使う理由が見つからない件 - hnwの日記

    MySQLのデータ型としてFLOAT型という型があるのですが、これを採用するのは混乱の元ではないか?と感じたので、その詳細を紹介します。 そもそもこの話のきっかけは「MySQLで6桁までの小数点を丸めずに扱うならFLOAT型を使うべき理由」という記事が目に止まったことです。それなりに人気を集めている記事のようですが、私の読んだ限りではFLOAT型を使うだけの根拠が文中から読み取れず、さらに類似する一次情報や英語記事が全く見つからなかったので、真偽が怪しい情報だと感じました。 その後、MySQL上で実験したりCソースコードを読んでみたりした結果、私の得た結論は真逆のものになりました。MySQL警察の方や浮動小数点数警察の方、追試や反論など頂けると助かります。 MySQLのFLOAT型とは MySQLのFLOAT型は原則としてIEEE754浮動小数点数単精度型(32bit)で実現されます*1。

    MySQLのFLOAT型を使う理由が見つからない件 - hnwの日記
  • BuffaloのUSB無線LANアダプタの返す製造元の文字列を解読する - hnwの日記

    私の手元に「Buffalo WLI-UC-AG300N」というUSB無線LANアダプタがあるのですが、Macの「システム情報」で見ると製造元が「敇瑭步挮浯䩟」となっていることに気づきました。 バッファローとかメルコとか書いてあるなら分かりますが、少なくとも日語ではありませんし、簡体字なり繁体字なりだとしても不自然に思えます。となると、一体何が表示されているのでしょうか?文字コード警察的な意味で興味を持ったので、調べてみました。 謎解き(1) 何が書いてあるのか この記事の執筆時点では「敇瑭步挮浯䩟」でGoogle検索しても同じ無線LANアダプタの情報が1件見つかるだけで、そんなメーカーは地球上に存在しなさそうなことがわかります。 ネット上にも情報が無いときに頼れるのは自分の直感だけです。そこで、私は謎の漢字列をUTF-16にしてみることにしました。 上記PHPファイルをUTF-8で保存し

    BuffaloのUSB無線LANアダプタの返す製造元の文字列を解読する - hnwの日記
  • PHPの連想配列は常にin_arrayより速いのか - hnwの日記

    プログラムを書いていると、入力値が辞書に含まれているかを調べたいようなことがあります。たとえば、ユーザーに都道府県名を入力させて、それが正しい都道府県名であるかどうかを調べたい、というようなことがあるかもしれません。 このような内容をPHPで書く際、キーに都道府県名を持つような連想配列を作る習慣がある人は多いはずです。これは典型的な連想配列の使い方といえるでしょう。 <?php $prefs = array( "北海道" => true, "青森" => true, // ... "沖縄" => true, ); if (isset($prefs[$input])) { // 都道府県名が正しい時の処理 } 一方で、in_array関数を使うやり方も考えられます。 <?php $prefs = array( "北海道", "青森", // ... "沖縄", ); if (in_array

    PHPの連想配列は常にin_arrayより速いのか - hnwの日記
  • ポートノッキングで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の日記
  • PHPの中身をgdbで観察できるようなDockerイメージを作りました - hnwの日記

    CLI版のPHPをgdb上で動かしつつ、内部的なデータ構造を覗き見ることができるようなDockerイメージを作ってDocker Hubにアップロードしました。Docker環境さえあればすぐに動かすことができます。 このイメージを動かせばCのコードを書かなくてもPHP内部のデータ構造を確認することができます。PHPの内部構造を詳しく知りたい、というような人は参考にしてみてください。 準備 Macの人はDocker for Macを用意しましょう。他のOS上でも同様にDockerをインストールしてください。また、イメージの圧縮時サイズが200MB程度ありますので、それなりのネットワーク環境で遊ぶことをオススメします。 起動 Docker 1.10以降ではseccompにより一部システムコールが制限されているため、コンテナ内でgdbによるデバッグができません。期待通りにgdbを動かすにはコンテナ

    PHPの中身をgdbで観察できるようなDockerイメージを作りました - hnwの日記
  • 第七回闇PHP勉強会でrealpathキャッシュとデプロイの話をしました - hnwの日記

    昨日12月11日に第七回闇PHP勉強会を開催いたしました。私を含め発表者6人ということで、とても盛り上がった勉強会になりました。発表者の皆さま、またご参加いただいた皆さま、当にありがとうございました。また会場提供いただいたピクシブ株式会社さまにも大変お世話になりました。 以下が私の発表資料です。 PHPアプリケーションをsymlink切り替えでデプロイしているとrealpathキャッシュ絡みで何かしらトラブルがありますよね、というくくりで複数のトピックを紹介するような内容でした。タイトルの通り、一番話したかったのはmod_phpphp-fpmとでOPcacheの挙動が変わる話だったんですが、かなり入り組んだ内容だったのでうまく伝わらなかったかもしれません。 質問タイムに、@edvakfさんから面白いエピソードを聞くことができました。Pixivではこの手の問題に一通りハマった結果、現在で

    第七回闇PHP勉強会でrealpathキャッシュとデプロイの話をしました - hnwの日記
  • PHPでは正規表現コンパイル結果のキャッシュが暗黙に行われている - hnwの日記

    筆者がPHPをさわり始めたころ、「PerlのコレはPHPではどうやるんだろう?」と思うことが頻繁にありました。一部の疑問については解説を見つけたり自分でソースコードを読んだりして解決したものの、考えるのをやめてしまったものもあります。その一つが正規表現コンパイル結果の保存に関するもので、最近まで完全に忘れていました。 正規表現のコンパイルというのは与えられた正規表現を解釈して実行しやすいデータ構造に変換する作業のことを指します。具体的にはDFA(決定性有限オートマトン)を構成するか、正規表現エンジン内部で用いられるVM命令列に変換するかといった処理になります。これらは複雑な処理ですので、性能の観点で言えば同じ正規表現に対するコンパイル処理はできるだけ繰り返したくありません。 Perlの場合、/foobar/ のようなスタティックな正規表現のコンパイルは1回しか行われません。一方で、正規表現

    PHPでは正規表現コンパイル結果のキャッシュが暗黙に行われている - hnwの日記
  • PHPプログラムを書いたらマイナス21億行目あたりでエラーが出た - hnwの日記

    (2016/10/5 20:40 追記)誤解を招いている部分がありそうなので文末に補足を追記しました。巨大なプログラムをわせただけでPHPが死ぬわけではありません。 毎度おなじみ、意図的に重箱の隅をつついてみたよって話です。あるPHPプログラムを実行したら次のようなエラーに遭遇しました。 $ php over-2g-lines.php int(0) PHP Fatal error: Uncaught Error: Call to undefined function var____dump() in /Users/hnw/over-2g-lines.php:2150000004 Stack trace: #0 {main} thrown in /Users/hnw/over-2g-lines.php on line -214496729221億5千万4行目で致命的エラーが発生したよ!とい

    PHPプログラムを書いたらマイナス21億行目あたりでエラーが出た - hnwの日記
  • PHPのround関数とは一体なんだったのか - hnwの日記

    (7/3 14:05追記)Javaに関する記述について誤認があったので盛大に書き換えました。Java 6、Java 7、Java 8それぞれで実装が変わっていたようです。 (7/13 23:55追記)記事中ではroundを四捨五入と言い切ってしまっています。これは筆者がC99のroundを基準に考えているためですが、言語によっては偶数丸めになっているround関数も珍しくありません。ご注意ください。 PHPのround関数について、ネット上で次のような記述を見つけました。 PHP 四捨五入の計算を間違える唯一の言語として畏れられていましたが、そのバグは治っているかもしれません(治ってないかもしれません) 主要なプログラミング言語8種をぐったり解説 - 鍋あり谷あり 各言語を面白おかしく紹介する内容とはいえ、ずいぶん雑な理解だなーという印象です。ゆるふわな話だけでPHPがdisられ続けるの

    PHPのround関数とは一体なんだったのか - hnwの日記
  • PHPのインターン化文字列とは何か - hnwの日記

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

    PHPのインターン化文字列とは何か - hnwの日記
  • PHP7から文字列の無駄なコピーが減った話 - hnwの日記

    このエントリは闇PHP Advent Calendar 2015の14日目です。 稿では、PHP7のzend_string構造体導入によるメリットの話をします。 PHP5とPHP7の文字列型の扱い PHP5では、文字列型の変数は次のようにメモリに割り当てられます(横幅いっぱいが8バイト)。 文字列の体以外はzval構造体で管理し、文字列の体は別途メモリ確保するという形になっています。一方、PHP7では次のようになります。 1つの文字列変数が、zval構造体とzend_string構造体の組み合わせで実現されています。 これだけ見ると、PHP7では文字列長と参照カウンタrefconuntがzvalから追い出されてzend_stringに移動したくらいで、PHP5とPHP7のメモリ消費量に大きな違いは無いように思えるかもしれません(あるいはPHP7の方が不利に見えるかもしれません)。しか

    PHP7から文字列の無駄なコピーが減った話 - hnwの日記
  • 第六回闇PHP勉強会の発表資料まとめ - hnwの日記

    昨日11/22(日)に第六回闇PHP勉強会が開催されました。PHPの勉強会なのにPHPのコードが全部で10行も登場しないという毎度おなじみの展開でしたが、たくさんの方にご参加頂きました。当にありがとうございました。 では、発表を順に紹介します。 @hnw 「OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみた」 まずは僕の発表からでした。PHP7からの新機能であるOPcacheのファイルベースキャッシュについてソースコードを交えて仕組みを紹介しました。機能について、個人的には若干ネガティブに見ていますが、今後「こういう状況では確かに便利だ」という事例が出てくれば判断も変わると思います。 @noldorinfoさん「SQLite2と3のエスケープ関数の違いとその対策」 SQLite3のエスケープ関数がSQLite2のものと実装が変わっており、バイナリアンセーフになっていて

    第六回闇PHP勉強会の発表資料まとめ - hnwの日記
  • PHP勉強会10年の歴史をふりかえる - hnwの日記

    PHP勉強会@東京が今月で10周年の節目ということで、大変めでたいですね。僕にとっては初めて参加・発表した社外勉強会だったこともあり、不思議な感慨があったりします。 そこで、ふと思いついてPHP勉強会の10年を表形式でまとめてみました。古参の人が懐古する以外の用途はほぼ無いと思いますが、現在の参加者の方や他の勉強会の運営をしている方の参考になる部分が1%くらいはあるかもしれません。 (企業名などは全て当時の名前です) 2005年 開催日 募集ページ 募集人数 会場提供 幹事 2005-06-18 (土) 第1回PHP勉強会 in Tokyo 24 株式会社HDE ELF 2005-07-23 (土) 第2回PHP勉強会 in Tokyo ? 株式会社HDE ELF 2005-08-28 (日) 第3回PHP勉強会 in Tokyo ? 株式会社ぷらっとホーム ELF 2005-09-18

    PHP勉強会10年の歴史をふりかえる - hnwの日記
  • PHPのJSONライセンス問題が一応決着 - hnwの日記

    2012年頃に、PHPのJSONエクステンションのソースコード中に次のようなライセンス文言が含まれていると話題になりました。 The Software shall be used for Good, not Evil. これはJSONライセンスと呼ばれるライセンスの一文です。「このソフトウェアを良いことに使うのはいいけど、悪いことには使っちゃダメ」といったところでしょうか。 これはフリーソフトウェアの定義に反しており*1、各種LinuxディストリビューションでJSONエクステンションを配布できないことになるため、ちょっとした騒動になったというわけです。 稿ではこのJSONライセンスへの対応が現在どうなっているかを紹介します。 各種Linuxディストリビューションの対応 PHPのJSONエクステンションはjson_encode()やjson_decode()などの重要な関数を提供するエクス

    PHPのJSONライセンス問題が一応決着 - hnwの日記
  • PHPPHPがド変態であることに今さら気づいた - hnwの日記

    Anthony Ferraraさん(@ircmaxell)が2012年12月に公開したPHPで記述されたPHP実装「PHPPHP」について、今さらですが調べてみました。 @ircmaxellさんはPHPの内部構造についての解説サイト「PHP Internals Book」の筆者の一人であり、PHP 5.5で導入された新しいパスワードハッシュ関数の提案・実装者でもあります(参照:https://wiki.php.net/rfc/password_hash)。最近発表した「Recki-CT」も興味深いプロダクトです。 そんなわけでジョークレベルではないだろうとは思ってましたが、今回中身を見てみたらガチすぎて恐怖しました。どういうモチベーションでこんなもん作る気になるんだ…。 PHPPHPの挙動はおおよそ次のようなものです。 PHPソースコードを受け取って構文解析して抽象構文木(AST)を作る

    PHPPHPがド変態であることに今さら気づいた - hnwの日記
  • 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の日記
  • PHPでHTTPの並行ダウンロードを実現する(Guzzle編) - hnwの日記

    PHPで最近注目のHTTPクライアントライブラリにGuzzleがあります。日での知名度はまだまだという印象ですが、かなり高機能かつ真面目にメンテナンスされている印象で、今後のデファクトスタンダードになりうるライブラリと言えるでしょう。 稿ではこのGuzzleを使ってWebサーバから並行にダウンロードする方法を紹介します。Webブラウザのように同時に複数コネクションを管理しながらKeep-Aliveでコネクションを使い回しますので、下手なコードで実現するより接続先Webサーバにも優しいはずです。 Guzzleの特徴 まずは、Guzzleについて僕が特徴的だと思う点を紹介します。 パッと見でわかりやすいインターフェース cURLは必須ではないがデフォルトでcURLを使う cURLの無い環境がありうるので、cURL無しでも動くのは嬉しい cURLのわかりにくいインターフェースを隠してくれるの

    PHPでHTTPの並行ダウンロードを実現する(Guzzle編) - hnwの日記