hnwの日記

既存のCommonJSモジュールを継承して自分好みのモジュールを作る

私は最近Node.jsで趣味のスクリプトを書いています。Node.jsであれば最新のECMAScriptの文法が使えるので、その意味で勉強になって良いですね。 また、何をするにしてもnpmで複数の選択肢が見つかること、それらのモジュールを簡単に試せること、といった点…

date-holidays という祝日ライブラリが良い意味で狂っていた

世界には色々なマニアがいるなーという話を紹介します。 先日Node.jsで使える祝日ライブラリを探していたところ、複数の国や地域の祝日に対応しているライブラリ date-holidays を見つけました。 commenthol/date-holidays: worldwide holidays このライブラ…

ECMAScriptの浮動小数点数の丸め仕様がスゴい

ECMAScriptの浮動小数点数の丸め関数である Number.prototype.toFixed() について調べてみたところ、浮動小数点数をわかっている人が作った硬派な仕様だと感じたので、解説してみます。 浮動小数点数の丸めの善し悪しについて 私はプログラミング言語の浮動…

Karabiner-Elements で日本語キーボードを英語キーボードとして使う設定

直前の記事「Mac mini 2018を買っての感想」の通りですが、私は約3年ぶりにmacOSのマシンを買い換えまして、macOSのバージョンがEl CapitanからMojaveまで一気に3バージョン上がりました。 そこで悩んだのがキーボード配置変更ソフトです。それまでは Karabi…

Mac mini 2018を買っての感想

新年明けましておめでとうございます。いきなり去年の話をします。 2018年12月に自宅にMac mini 2018を買いました。シルバーグレイのちょっとオシャレな奴です。 Apple Mac mini MRTR2J/A 同じ機種を買おうと思っている人の参考になれば、ということで感想文…

GAE/SE PHP 7.2環境は実用性が高そうだという話

PHP

筆者の周囲だけかもしれませんが、さいきんGoogle App Engine Standard Environment(以下GAE/SE)が再注目されつつあるように思います。今回筆者もgVisorベースのGAE/SE PHP 7.2環境に触ってみたので、その内容を紹介します。 GAE/SEとは GAE/SEは元祖PaaS…

Travis CIのcron jobsを使ってGitHubに定期的にcommitする方法

みなさん、Travis CI使ってますか?Trais CIはクラウドCIサービスの1つで、GitHub上で公開しているOSSを自動テストする目的であれば定番中の定番といっていいサービスです。ところで、さいきん私の公開しているプロジェクト「hnw/wsoui」で以下のことを実現…

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

Webサービスを使っていると、たまに「秘密の質問」の設定を求められることがあります。こういう場合、個人的にはランダム文字列を登録したいと思うのですが、次のようにマルチバイト文字しか登録できないことが多い気がします。普通のパスワードジェネレータ…

PHPのis_numeric関数は使うべきでないという話

PHP

本稿は私が前職の技術ブログで執筆した記事「そのis_numeric()は適切ですか?」を改題・再編集して掲載するものです。前職には許可を取ってあります*1。 本稿ではPHPの関数is_numeric()の使いどころについて問題提起をしてみます。 is_numeric関数とは さて…

PHP 7.2.0からDateTimeでミリ秒表示するときの丸め処理が変わった話

PHP

エイプリルフールなので(?)、PHPの日付処理の細かい挙動がひっそり変わった話の解説をします。ちなみに本稿はSlackグループ「PHPユーザーズ」の#randomチャンネルでの議論をまとめ直したものです。議論のきっかけを下さったmsngさん、tadsanさん、do_akiさん…

セキュリティの話題に丸腰で踏み込んでくる人を見た

Qiita上で「ゲームでよくされるチート手法とその対策 〜アプリケーションハッキング編〜」という記事がいいね数を集めているようですが、全セクションにツッコミどころがあるような印象です。私はセキュリティ本職というわけではありませんが、素人の私から…

PHPメソッドのprototypeとは何か

PHP

なんとなくPHPマニュアルを眺めていたところ、リフレクション機能に下記のようなメソッドを見つけました。 ReflectionMethod::getPrototype — メソッドのプロトタイプを (存在すれば) 取得する http://php.net/manual/ja/reflectionmethod.getprototype.php …

2017年をふりかえる

年末恒例の振り返り記事です。過去記事はこちら。 2016年をふりかえる 2015年をふりかえる 2014年をふりかえる 書いた 2017年ははてなダイアリーに本記事を含め18本の記事を書きました。人気があったのは下記の記事です。 ポートノッキングで10秒間だけsshd…

PHP 7のforeachを&つきで回すと配列の消費メモリが倍増する話

PHP

2015年12月にPHP 7.0.0がリリースされてから2年と少し経ってしまいました。今月頭には無事PHP 7.2.0がリリースされたわけですが、皆様の参加プロジェクトのPHP 7導入は進んでいるでしょうか?まだPHP 5系なんだよね、という方もPHP 7が高速だという噂くらい…

Mackerelで家庭内ネットストーカーシステムを作ってみた

本エントリはMackerel Advent Calendar 2017の23日目の記事です。 自宅の無線LANの利用状況をMackerelで監視するようにしたところ、予想以上にキモい仕組みができました。たとえば、家族の誰か(正確には誰かのスマートフォン)が外出するとSlackに通知を飛…

MySQLのFLOAT型を使う理由が見つからない件

MySQLのデータ型としてFLOAT型という型があるのですが、これを採用するのは混乱の元ではないか?と感じたので、その詳細を紹介します。 そもそもこの話のきっかけは「MySQLで6桁までの小数点を丸めずに扱うならFLOAT型を使うべき理由」という記事が目に止ま…

とあるPHP拡張のCI事情

PHP

PHP Advent Calendar 2017の3日目です。公開が遅くなってしまいました、ごめんなさい。 筆者はphp-timecopというPHP拡張を5年間ほどメンテナンスしています。このPHP拡張はCで書かれているのですが、Travis CIやAppVeyorなど複数のクラウドCIサービスを組み…

PHPカンファレンス2017でphp-timecopをPECLに登録した話をしました

PHP

10月8日に開催されたPHPカンファレンス2017でLT発表をしました。以下が発表資料です。 PECLは登録までの敷居が高そうな印象があったので、以前は自作のPHP拡張を登録するなんて考えもしなかったのですが、やってみたら案外あっさり登録できた、という内容を…

PHPのmysqlndの圧縮プロトコルについてのメモ

PHP+PDO+MySQLの環境では、PHP-MySQL間の通信についてzlibを使った圧縮プロトコルを利用することができます。この機能は、DBサーバのCPU利用率に十分余裕があり、かつPHP-MySQL間のネットワーク帯域が逼迫している状況で有用です。 MySQLの圧縮プロトコルと…

PHPのsleep関数とusleep関数の挙動を調べてみた

PHP

筆者はPHPの現在時刻を上書きするPHP拡張モジュールphp-timecopを開発しているため、PHPの時間がらみのテストを世間一般の人より多く書いていると思います。テストケース中でusleep関数を多用しているのは世界中でも筆者くらいかもしれません。ところで、先…

php-timecopをPECLに登録しました

PHP

かれこれ5年ほどメンテしている拙作のPHP拡張「php-timecop」ですが、このたびPECLに登録しました(PECL :: Package :: timecop)。 PECLというのはPHP本体に含まれないPHP拡張を提供する公式のリポジトリです。PECLのアカウントは承認制になっており、誰で…

古いPHPでDateTime::modify(’+0 days’) すると時間がずれるバグ

PHP

表題の通りですが、PHPの特定のバージョンにおいて、生成したDateTimeオブジェクトに対して時刻の操作を行うと期待と1時間ずれてしまうことがあります。 format('c')); // string(25) "1970-01-01T00:00:00+00:00" $dt->modify('+0 days'); var_dump($dt->fo…

BuffaloのUSB無線LANアダプタの返す製造元の文字列を解読する

私の手元に「Buffalo WLI-UC-AG300N」というUSB無線LANアダプタがあるのですが、Macの「システム情報」で見ると製造元が「敇瑭步挮浯䩟」となっていることに気づきました。バッファローとかメルコとか書いてあるなら分かりますが、少なくとも日本語ではあり…

PHPの連想配列は常にin_arrayより速いのか

PHP

プログラムを書いていると、入力値が辞書に含まれているかを調べたいようなことがあります。たとえば、ユーザーに都道府県名を入力させて、それが正しい都道府県名であるかどうかを調べたい、というようなことがあるかもしれません。 このような内容をPHPで…

PHPのシンボルテーブルを覗いてみる

PHP

PHPのシンボルテーブルというのはC実装のレベルの用語で、その時点で有効な変数テーブルのことを指します。つまり、グローバルスコープならグローバル変数を管理する変数テーブル、関数スコープならローカル変数を管理する変数テーブルの意味になります。 今…

Windows Subsystem for Linux上でphp-fpmを動かしてみた

PHP

最近のWindows 10にはLinuxバイナリをそのまま動かすような仕組みが導入されています。これは Windows Subsystem for Linux (WSL) とか Bash on Ubuntu on Windows (BoW) などと呼ばれているもので、VM実行でなくWindowsネイティブでLinuxを動かすという意欲…

アメリカで何年の4月1日がサマータイムだったか調べてみた

日付関連のテストケースを書いていたら、ロサンゼルスの1970年4月1日0時はサマータイムではないけれど、2012年4月1日0時はサマータイムであることに気づきました。何かの間違いじゃないかと思って改めて調べてみたところ、ロサンゼルスで4月1日がサマータイ…

PHP 7.1.3で時刻の差を取ると時々1マイクロ秒ズレる

PHP

本日はエイプリルフールなので、ウソでも本当でも誰も困らないPHPのバグの話をします。 PHP 7.1.0からPHPのDateTimeクラスでマイクロ秒の扱いを強化しているようで、挙動やコードの変更がチラホラ見受けられます。(参考:「PHP 7.1からDateTimeが現在時刻の…

ポートノッキングで10秒間だけsshdを公開する設定

先日Twitterに次のような書き込みをしたところ思ったより反応が良かったので、詳細の設定を紹介します。UDP53番、TCP443番、UDP123番とポートノッキングをするとTCP443番に10秒だけsshdが現れる、という中二病全開の設定をした。皆様にもお勧めしたい。— hnw…

PHPの中身をgdbで観察できるようなDockerイメージを作りました

PHP

CLI版のPHPをgdb上で動かしつつ、内部的なデータ構造を覗き見ることができるようなDockerイメージを作ってDocker Hubにアップロードしました。Docker環境さえあればすぐに動かすことができます。 このイメージを動かせばCのコードを書かなくてもPHP内部のデ…