タグ

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

  • 日本語のパスワードジェネレータを作ってみた - hnwの日記

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

    日本語のパスワードジェネレータを作ってみた - hnwの日記
    koyhoge
    koyhoge 2018/05/02
    秘密の質問が必須というサービスもそろそろ滅んで欲しいw
  • ポートノッキングで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の日記
    koyhoge
    koyhoge 2017/03/29
    おもしろい。カッコいい以外のメリットがないと書かれてるけど、クソのような攻撃ログが吐かれなくなるのは大きいメリットじゃないだろうかw
  • 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の日記
    koyhoge
    koyhoge 2015/06/24
    あー、ぷらっとやSGIでもやったなぁ、懐かしい。この頃は会場貸してくれそうなところにはどんどん話を持って行った覚えがあるw
  • 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の日記
    koyhoge
    koyhoge 2014/12/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の日記
    koyhoge
    koyhoge 2014/08/10
    PHPer のスキルを測るのに === を使う割合を聞くというのはありかもしれない。
  • Monoで巨大な浮動小数点数を丸めたら無限大になった - hnwの日記

    Monoのround関数にバグを見つけたよ、という毎度おなじみの話題です。 早速ですが、浮動小数点数で扱える一番大きい数を浮動小数点数以下第2位で丸めて第1位までにしてみましょう。 using System; class RoundingBigFloat { static void Main() { double d = Double.MaxValue; Console.WriteLine(d); // 1.79769313486232E+308 Console.WriteLine(Math.Round(d, 1)); // Infinity } } 上記コードのコメント部の通り、大きい数を丸めると無限大になることがあります。これは、小数点以下第n位までに丸める処理が、「10^n倍して整数に丸めて10^-n倍する」という処理になっているため、この計算の途中で無限大になってしまうことがあるの

    Monoで巨大な浮動小数点数を丸めたら無限大になった - hnwの日記
    koyhoge
    koyhoge 2014/01/30
    安定のfloatネタw
  • PHP extensionとZend extensionの違い - hnwの日記

    PHPのextensionにはPHP extensionとZend extensionという2種類があります。これらの違いが何なのか、PHPの実装レベルから調べてみました。 PHPのextensionについて PHPのextensionには2種類が存在します。これらは次のようにphp.iniでロード指定する構文が異なります。 extension=extension.so zend_extension=/path/to/extension.so 稿では「extension=」でロードされるものをPHP extension、「zend_extension=」でロードされるものをZend extensionと呼びます。これらはPHPのソースコード中ではそれぞれmoduleとextensionと呼ばれているので注意してください。 代表的なZend extensionとしてはXdebugとZend

    PHP extensionとZend extensionの違い - hnwの日記
    koyhoge
    koyhoge 2013/07/24
    「Zend extensionでないと出来ないことが何なのか、結局わかりませんでした。」w
  • 第70回PHP勉強会で浮動小数点数の話をしました - hnwの日記

    7月22日に開催された第70回PHP勉強会で発表してきました。以下が発表資料です。 浮動小数点数周りのトピックを3点紹介する内容でしたが、思ったより反応が良かったように思います。 ただ、面白おかしく話そうとして、聞いている方々に無駄に恐怖を与えてしまったかもしれません。冷静に読み返していただければ、怖いように見える内容もレアケースの話題が多いことがわかるかと思います。 また、PDOの挙動については誤解を与えてしまったかと思いますので、プレゼン資料の25ページ目を大幅に差し替えてアップロードしました。 この点についてもう少し説明します。PDOでプリペアードクエリを利用する際、プレースホルダに値を埋め込むのにPDOStatement::bindValueメソッドを利用することができます。この際、bindValueメソッドの第3引数で利用でPDO::PARAM_INT定数を指定しても、第2引数の

    第70回PHP勉強会で浮動小数点数の話をしました - hnwの日記
    koyhoge
    koyhoge 2013/07/24
    最新版float話。PDOはPARAM_INTが指定されたら勝手にキャストしてくれた方が便利だなーとは思ってました。たいていはORMが吸収しちゃうけど。
  • .gitignoreを作ってくれるgiboが便利すぎる - hnwの日記

    gitignore-boilerplates(長いので以後giboと呼びます)という便利なツールを紹介します。これは.gitignoreのひな形を作ってくれるものです。 https://github.com/simonwhitaker/gitignore-boilerplates もう少し詳しく説明すると、giboは様々なOS・エディタ・言語・フレームワークなどに特化したファイルの情報を利用して、複数環境を考慮した.gitignoreを作ってくれます。 .gitignoreに入れたいファイルは環境ごとに変わってくるわけですが、各人がcommitしたくないファイルの存在に気づくたびにチマチマ.gitignoreに追記していくのって当に無駄だと思うんですよね。giboはそれを自動化してくれるというわけです。 例えば、WindowsMacOSXの2環境、Emacsとvimの2エディタを使う人

    .gitignoreを作ってくれるgiboが便利すぎる - hnwの日記
  • 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の日記
  • PSR-0 を和訳してみた - hnwの日記

    先週の土日にPHPMatsuriに行ってきました。ナイスなイベントでしたね。その感想はまた改めて書きますが、Nate Abeleによるセッション「Practical PHP 5.3」で触れられていたPSR-0を適当に訳してみました。これはPHP5.3の名前空間とクラス名に関する標準化の試みで、少なくともZendFrameworkとsymfonyの中の人が関わっているようです。 うまく訳出できなくて苦し紛れのところもあるので、修正すべき箇所があれば教えてください。 元の文章は http://groups.google.com/group/php-standards/web/psr-0-final-proposal にあります。以下はその和訳です。 PSR-0 最終提案 以下で、オートローダーの相互利用性を確保するための必須要件について記述します。 必須要件: 名前空間とクラスの完全な名前とし

    PSR-0 を和訳してみた - hnwの日記
  • PHPのY10K問題 - hnwの日記

    PHPは他の言語と同様に、時刻を扱う際にunix epochからの経過秒数(いわゆるunix time)を利用しています。PHP5.2.6以降では、64bit環境であればunix timeも64bitに拡張されています。これで2038年問題も過去のものになるというわけです。 一方、unix timeが64bitに拡張されたことでカオスな結果になることがあるようです。64bit環境のPHP5.2.11で気づいた点を紹介します。 strtotimeが西暦10K年以降に対応していない <?php var_dump(strtotime("9999-12-31 23:59:59")); // int(253402268399) var_dump(strtotime("+10000-01-01 00:00:00")); //int(946648800) ISO8601的に+10000という書き方は正し

    PHPのY10K問題 - hnwの日記
    koyhoge
    koyhoge 2010/02/26
    date('r', x) は文字数で切ってるのか。
  • ワンライナーのためのPHPコマンドラインオプション - hnwの日記

    ワンライナー(1行スクリプト)の代名詞と言えばPerlでしょう*1。Perlにはワンライナー向けのコマンドラインオプションが多数用意されています。中でも-neオプションや-peオプションは強力で、入力行ごとの処理をループを使わずに簡潔に記述できます。Perlのワンライナー向けコマンドラインオプションの一部はRubyにも輸入されており、Rubyプログラマもワンライナーを書くことが多いように見えます。 それに比べるとPHPはワンライナーが書きにくい印象があるのではないでしょうか。僕もそう思っていましたが、実はPHP5.0.0からワンライナー向けのコマンドラインオプションが追加されています。それが今回紹介する-R、-F、-B、-Eです。 -Rオプション、-Fオプション -Rというのは、標準入力を1行ごとに順に処理するオプションです。例を見てみましょう。 $ ls bin/php-* bin/ph

    ワンライナーのためのPHPコマンドラインオプション - hnwの日記
  • 見直されるべきPHP5の組み込みイテレータ - hnwの日記

    PHPには5.0.0以降SPL (Standard PHP Libray)という枠組みが導入されています。これにより、Iteratorインターフェースを実装したクラスのインスタンスであれば、foreach文で配列と同じように取り扱えます。自分でクラスを作るときもIteratorを実装すれば使うのが楽ですし、コードも読みやすくなると思います。 また、PHPに標準で組み込まれているクラスにはIteratorを実装しているものが多数あります。たとえば僕の手元のPHP5.2.9には24個のイテレータがあり、そのうちいくつかは十分に実用的なクラスです。ただ、日語の資料が少ないせいか、かなり知名度は低いように思います。記事では4つの便利な組み込みイテレータを紹介します。 SPLのクラスにはデザインパターンの考えが多く含まれています。特に、イテレータを元にイテレータを作るような使い方は、保守性の高い

    見直されるべきPHP5の組み込みイテレータ - hnwの日記
    koyhoge
    koyhoge 2009/05/25
  • UTF-8→SJIS/EUC-JPの重複文字をまとめてみた - hnwの日記

    文字エンコーディングの変換を行うと、異なる2文字が同じ文字に変換されることがあります。このような文字を重複文字と呼ぶことにします。UTF-8→Shift_JISおよびUTF-8→EUC-JPについて、重複文字を自分用の資料としてまとめてみました。 MacOSX上のPHP5.2.9での実験結果ですが、プログラミング言語や環境によらず気をつけるべき文字一覧ということになると思います。 色のついている部分が重複している部分です。「-」となっているのは変換できなかった文字です。また、ヘッダのカッコ数字ごとに文字エンコーディング変換に利用した関数が異なります。詳細は下記の通りです。 (1) mb_convert_encoding($char, "Shift_JIS", "UTF-8") (2) mb_convert_encoding($char, "SJIS-win", "UTF-8") (3) i

    UTF-8→SJIS/EUC-JPの重複文字をまとめてみた - hnwの日記
    koyhoge
    koyhoge 2009/05/10
    やっぱりmbstringとiconvはずいぶん違うなぁ
  • PHPの==演算子をわかりやすくするパッチ - hnwの日記

    PHPの==がキモい件」でも書きましたが、PHPの==は数値っぽいものに対してアバウトな比較を行う演算子です。 一方で、他の言語の==演算子は正確な比較を行うものばかりだと思います。他の言語の経験者がPHPのソースコードを読み書きする場合に、PHPの==演算子の挙動を想像することは困難です。 つまり、PHPの==演算子の問題点は、他の言語と異なる意味にも関わらず同じ表記を採用していることにあります。見ただけで「アバウトな比較を行う」と想像できれば混乱は避けられるはずです。 そこで、PHPにパッチを当て、新たな演算子を導入してみました。 <?php if ("01" ≒ "0x1") { echo '"01" ≒ "0x1" is true',"\n"; } if ("01" ≈ "0x1") { echo '"01" ≈"0x1" is true',"\n"; } if ("01" ≉

    PHPの==演算子をわかりやすくするパッチ - hnwの日記
    koyhoge
    koyhoge 2009/04/01
    GJ!
  • PHPのsort関数は相当おかしい - hnwの日記

    追記(2009/02/28 15:35):ソートする配列の要素が数値または数値形式の文字列のみの場合は、<、==、>が推移律を満たすので、この記事のような矛盾は起こりません。念のため。 オヤジギャグがこらえられなくなったら立派なオヤジだと思います。それはさておき、今日はPHPのsort関数が不思議な挙動をする例を紹介します。 sort関数の紹介 sort ― 配列をソートする 説明 bool sort ( array &$array [, int $sort_flags= SORT_REGULAR ] ) この関数は配列をソートします。この関数が正常に終了すると、 各要素は低位から高位へ並べ替えられます。 PHP: sort - Manual マニュアルをみる限り普通のソート関数です。省略可能な2番目の引数の意味は次の通りです。 sort_flags オプションの 2 番目のパラメータ s

    PHPのsort関数は相当おかしい - hnwの日記
  • PHPでマルチバイト対応のtrim関数を作る - hnwの日記

    (2009/06/29)追記4:記事のmb_trim関数が動かない環境があったので、詳細を「PCREはUnicode文字プロパティをサポートするとは限らない」にまとめました。よりポータブルなmb_trim関数も紹介していますので、併せてご覧ください。 追記:「mb_ereg_match('^[\0[:space:]]+$', $str);」で、今回pregで作った正規表現'/^[\s\0\x0b\p{Zs}\p{Zl}\p{Zp}]+$/u'と同一になりました。mb_regex_encoding関数が使える分だけmb_ereg版の方が使い勝手も上です。ちょっとショック。 (2009/02/24 17:00)追記2:もっと簡潔に、「mb_ereg_match('^[\0\s]+$', $str);」でいいことがわかりました。POSIX正規表現風の表記がキモいな、と思っていたので、これは素晴

    PHPでマルチバイト対応のtrim関数を作る - hnwの日記
  • mb_check_encodingは何をチェックするのか(その1 SJIS編) - hnwの日記

    (2009/02/15 17:20)「個人的な感想」を追記しました。また、下記はPHP5.2.1以降の挙動です。PHP5.2.0以前のmb_check_encodingは更にカオスなので、あまり使い物にならないと思います。 (2009/02/16 12:30)追記2:バグっぽいと思った件は当にバグで、修正がhttp://news.php.net/php.cvs/56276の通り取り込まれました。PHP5.2.9から修正される予定です。 (2009/02/22 16:20)追記3:他のエンコーディングについても調査しました。「(その2 EUC-JP編)」と「(その3 UTF-8編)」も合わせてご覧下さい。 PHPのmb_check_encoding関数が一体何のチェックをしているのか、エンコーディングごとに一通り調べてみます。 まずはSJISとSJIS-win(CP932)について調べてみ

    mb_check_encodingは何をチェックするのか(その1 SJIS編) - hnwの日記
  • 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の日記
    koyhoge
    koyhoge 2009/02/03
    ヘソタイ