タグ

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

  • 自宅のPC環境を改善したら四十肩が治った話 - hnwの日記

    コロナの影響もあり、この3年ほどで在宅勤務の会社さんが多くなった印象があります。 それに伴い、自宅のPC環境を改善した人って多いんじゃないでしょうか。 ご多分に漏れず私もPC環境改善を行いまして、下記のような環境が普段使いの環境になりました。 筆者のメインPC環境 一見ありふれた環境に見えるかもしれませんが、私はこの環境を手に入れてから、それまで悩んでいた四十肩の症状が大きく改善しました。 稿では、この環境に至った経緯と購入した製品を紹介していきます。同じ悩みを持つ方はもちろん、四十肩・五十肩予備軍の方も参考にして頂ければと思います。 キーボード環境の紹介 上記の写真だとわかる人にしかわからないと思うので、実際の使い方を紹介します。 通常ポジション コンパクトキーボード(HHKB)2台を1つのPCに接続し、左右分割キーボードのように利用しています。 トラックボール使用時ポジション マウス

    自宅のPC環境を改善したら四十肩が治った話 - hnwの日記
  • 日本語のパスワードジェネレータを作ってみた - hnwの日記

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

    日本語のパスワードジェネレータを作ってみた - hnwの日記
  • PHPとPythonとRubyの連想配列のデータ構造が同時期に同じ方針で性能改善されてた話 - hnwの日記

    PHPPythonRubyの連想配列のデータ構造がそれぞれ4〜5年ほど前に見直され、ベンチマークテストによっては倍以上速くなったということがありました。具体的には以下のバージョンで実装の大変更がありました。 PHP 7.0.0 HashTable高速化 (2015/11) Python 3.6.0 dictobject高速化 (2016/12) Ruby 2.4.0 st_table高速化 (2016/12) これらのデータ構造はユーザーの利用する連想配列だけでなく言語のコアでも利用されているので、言語全体の性能改善に貢献しています1。 スクリプト言語3つが同時期に同じデータ構造の改善に取り組んだだけでも面白い現象ですが、さらに面白いことに各実装の方針は非常に似ています。独立に改善に取り組んだのに同じ結論に至ったとすれば興味深い偶然と言えるでしょう2。 稿では3言語の連想配列の従来実

    PHPとPythonとRubyの連想配列のデータ構造が同時期に同じ方針で性能改善されてた話 - hnwの日記
  • 自宅のネットワーク図をメンテし続ける工夫 - hnwの日記

    みなさん、自宅のネットワーク図って何のツールで書いてますか?私は過去に次のようなツイートをしたところ案外バズったことがありました。 「自宅のネットワーク図って何のツールで書いてます?」 「それ自宅で必要?」 終 制作・著作 ━━━━━ ⓃⒽⓀ— hnw (@hnw) 2019年9月29日 これがバズるのは自宅にヤバいネットワークを組んでいる人が一定数いる証拠と言えるかもしれません。リプライ欄を見ても、みなさんそれぞれ工夫されていることがわかりました。 私個人はネットワーク図を書くのに色々なツールを試してきたのですが、イマイチ定着しないのが悩みでした。最初は頑張って書くのですが、いつの間にかメンテをサボってしまい、いざネットワーク構成をいじる段になると情報が古くて役に立たないことが複数回ありました。悲しいですね。 プロなら仕事で使う定番ツールがあるのかもしれませんが、私のようなアマチュアの立

    自宅のネットワーク図をメンテし続ける工夫 - hnwの日記
    fumikony
    fumikony 2020/09/23
  • 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の日記
    fumikony
    fumikony 2020/08/13
  • ECMAScriptの浮動小数点数の丸め仕様がスゴい - hnwの日記

    ECMAScriptの浮動小数点数の丸め関数である Number.prototype.toFixed() について調べてみたところ、浮動小数点数をわかっている人が作った硬派な仕様だと感じたので、解説してみます。 浮動小数点数の丸めの善し悪しについて 私はプログラミング言語の浮動小数点数の丸め処理に興味があり、過去に関連記事を30以上書いています。こうした活動から得られた知見として、良い丸め関数には次のような性質があると考えています。 仕様がシンプルで直感的であること 仕様が抜け漏れなく文書化されていること バグを作り込みにくい仕様であること どれも良い関数の一般論のような話ですが、丸め処理に限って言えば簡単な話ではありません。そもそも浮動小数点数の性質が人の直感に反するため利用者にとっても実装者にとっても罠が多く、結果として上の条件を満たせないことが多いのです(私が面白いと感じるポイント

    ECMAScriptの浮動小数点数の丸め仕様がスゴい - hnwの日記
  • 第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の日記
    fumikony
    fumikony 2017/08/16
  • php-timecopをPECLに登録しました - hnwの日記

    かれこれ5年ほどメンテしている拙作のPHP拡張「php-timecop」ですが、このたびPECLに登録しました(PECL :: Package :: timecop)。 PECLというのはPHP体に含まれないPHP拡張を提供する公式のリポジトリです。PECLのアカウントは承認制になっており、誰でも登録できるわけではありません。イタズラやお試しでの登録は減るでしょうが、代わりに登録への精神的ハードルが上がってしまうような仕組みだと言えるでしょう。実際、PECLに登録されているパッケージ総数は365個(2017/7/8時点)と多くはありません。また、日人と思われるPECLアカウントは筆者以外では5人でした。 稿では、PHP拡張をPECLに登録するまでのプロセスや、実際に登録してみてわかったことなどを紹介します。 PECLに登録するメリット さて、そのPECLですが、PEAR*1の衰退とと

    php-timecopをPECLに登録しました - 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の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-timecopをPHP 7対応させてみた - hnwの日記

    自作のPHP拡張であるphp-timecopをPHP 7に対応させてみました。この機会に改めてphp-timecopの紹介をしてみます。 php-timecopとは php-timecopというのは筆者が4年ほど前に作ったPHP拡張で、現在時刻に紐付いた値を返すPHP関数について、基準となる現在時刻を過去や未来の任意の時刻に設定することができるというものです。 以下に簡単な例を紹介します。 <?php var_dump(date("Y-m-d")); // 今日の日付 timecop_freeze(0); var_dump(gmdate("Y-m-d H:i:s")); // string(19) "1970-01-01 00:00:00" var_dump(strtotime("+100000 sec")); // int(100000) 上記プログラム中2行目のtimecop_free

    php-timecopをPHP 7対応させてみた - hnwの日記
  • 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の日記
  • GoでPHP拡張モジュールを書いた話 - hnwの日記

    12/6のGo Conference 2015 WinterでGoPHP拡張モジュールを書いたよ、という内容のLTをしてきました。 ざっくり言うと、Goって言ってもCのレベルに落ちてくれば連携なんて簡単でしょって思ってたけど、GoPHP拡張もビルドプロセスが隠蔽されてるので、落としどころが見つからなくて苦労したよって話でした。もっと綺麗に連携できる方法を編み出した方は教えてください。 PHP拡張モジュール側のビルドについて補足 拡張モジュールを共有ライブラリじゃなく静的ライブラリとして作ればいいじゃん、って発想で作り始めましたが、実は拡張モジュールを静的ライブラリとして作るのは結構ダルいという事情があります。というのも、拡張モジュールをphpizeするとconfigureオプションで何を指定しても静的ライブラリが作られないようにm4マクロが展開されてしまうのです。 そこで、できあがった

    GoでPHP拡張モジュールを書いた話 - hnwの日記
  • GitHubユーザーのSSH鍵6万個を調べてみた - hnwの日記

    (2015/1/30 追記)時期は不明ですが、現時点のgithub.comはEd25519鍵にも対応しています。 (2016/5/31 追記)「GitHubにバグ報告して賞金$500を頂いた話」で紹介した通り、既に弱い鍵はGitHubから削除され、新規登録もできなくなっています。 GitHub APIを利用して、GitHubの31661アカウントに登録されているSSH公開鍵64404個を取得してみました。抽出方法*1が適当すぎて偏りがあるような気もしますが、面白い結果が得られたと思うのでまとめてみます。 SSH鍵の種類 鍵の種類 個数 割合 RSA鍵 61749 (95.88%) DSA鍵 2647 (4.11%) ECDSA鍵 8 (0.01%) 約6万個の鍵のうち、8個だけECDSA(楕円DSA)鍵が見つかりました!常用しているのか試しに登録してみただけなのかはわかりませんが、何にせよ

    GitHubユーザーのSSH鍵6万個を調べてみた - 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の日記
    fumikony
    fumikony 2015/04/19
    しらなかった
  • PHP 5.5.0でイースターエッグが廃止されていた - hnwの日記

    PHPユーザーの皆様に悲しい(?)お知らせです。PHPのオシャレ機能として有名なイースターエッグがPHP 5.5.0で廃止されていました。 そもそもPHPのイースターエッグって何よ?という方のために説明しておくと、PHP 5.4までは任意のPHPページのURL末尾に特定の文字列をつけると下記の象の画像や作者クレジットが表示されるような謎機能がありました*1。 詳しくは「PHP Easter Egg」をご覧ください。 ところが、PHP 5.5.0からこれが廃止されています。ChangeLogにはこれをほのめかすような内容が見つかりますが、下記の一文だけでピンとくる人も少ないでしょうから、ひっそり廃止されたという印象です。 Removed legacy features: Remove php_logo_guid(), php_egg_logo_guid(), php_real_logo_gu

    PHP 5.5.0でイースターエッグが廃止されていた - hnwの日記
    fumikony
    fumikony 2014/11/22