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

  • 自宅のネットワーク図をメンテし続ける工夫 - hnwの日記

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

    自宅のネットワーク図をメンテし続ける工夫 - hnwの日記
    zu2
    zu2 2022/11/10
  • 自宅のPC環境を改善したら四十肩が治った話 - hnwの日記

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

    自宅のPC環境を改善したら四十肩が治った話 - hnwの日記
    zu2
    zu2 2022/08/10
  • 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の日記
    zu2
    zu2 2021/01/10
    “古いプログラマ(私を含む)の常識として、連想配列は原則として格納順を保持しないというのがあると思います” 俺だ
  • ユニットバスの天井裏に備え付けのL2スイッチを発見した話 - hnwの日記

    (2021/06/23追記: この記事を書いてしばらくして引っ越しました。原状復帰済みです。念のため。) 私は同じ賃貸住宅に10年ほど済んでいるのですが、ごく最近になって自宅内に備え付けのL2スイッチが存在することに気づきました。ソイツはなんとユニットバスの天井裏にいたのです。 このスイッチをGbEスイッチにリプレースしたところ、自宅のコンピューティング環境を改善することができました。稿ではその顛末を紹介します。皆様のお風呂場探検の参考になれば幸いです。 謎の情報コンセント 読者の皆さんは情報コンセントというものをご存じでしょうか。下の写真のようにイーサネットケーブルを差すコンセントのことを言うそうです。 我が家の情報コンセント これがない家もあると思いますが、私が今住んでいるマンションには情報コンセントが部屋ごとについています。 この説明は入居時に一切受けていないのですが、試しにイーサ

    ユニットバスの天井裏に備え付けのL2スイッチを発見した話 - hnwの日記
    zu2
    zu2 2020/09/20
  • Mac mini 2018を買っての感想 - hnwの日記

    新年明けましておめでとうございます。いきなり去年の話をします。 2018年12月に自宅にMac mini 2018を買いました。シルバーグレイのちょっとオシャレな奴です。 Apple Mac mini MRTR2J/A 同じ機種を買おうと思っている人の参考になれば、ということで感想文を書いてみます。 何をいくらで買ったか 下記のものを12月初旬にビックカメラで買いました。 Mac mini 2018 (第8世代 Core i3 3.6GHz、8GBメモリ、128GB SSD)96973円 16GBメモリ(DDR4 SO-DIMM 2666MHz) 20898円 x2 計138769円。安くない買い物ですし、それでいてスペックは微妙に見えるかもしれません。 これはPayPayの「100億円あげちゃうキャンペーン」で衝動買いした結果です。今すぐビックカメラで買える一番おトクなものは何か?と考え

    Mac mini 2018を買っての感想 - hnwの日記
    zu2
    zu2 2019/01/08
    “先ほども重く感じたのでChromeを殺してみたところ、メモリが20GBほど空きました。以前のメモリ16GBのマシンではタブを100個も開くと重くて耐えられなくなっていたのが、今は200個ほどまで耐えられるようになったという”
  • 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の日記
    zu2
    zu2 2018/05/18
  • PHPのis_numeric関数は使うべきでないという話 - hnwの日記

    稿は私が前職の技術ブログで執筆した記事「そのis_numeric()は適切ですか?」を改題・再編集して掲載するものです。前職には許可を取ってあります*1。 稿ではPHPの関数is_numeric()の使いどころについて問題提起をしてみます。 is_numeric関数とは さて、まずはis_numeric()のリファレンスマニュアルを見てみましょう。 bool is_numeric ( mixed $var ) 指定した変数が数値であるかどうかを調べます。数値形式の文字列は以下の要素から なります。(オプションの)符号、任意の数の数字、(オプションの)小数部、 そして(オプションの)指数部。つまり、+0123.45e6 は数値として有効な値です。十六進表記(0xf4c3b00c など) や二進表記 (0b10100111001 など) は認められません。 http://php.net/m

    PHPのis_numeric関数は使うべきでないという話 - hnwの日記
    zu2
    zu2 2018/04/17
  • PHP 7.2.0からDateTimeでミリ秒表示するときの丸め処理が変わった話 - hnwの日記

    エイプリルフールなので(?)、PHPの日付処理の細かい挙動がひっそり変わった話の解説をします。 ちなみに稿はSlackグループ「PHPユーザーズ」の#randomチャンネルでの議論をまとめ直したものです。議論のきっかけを下さったmsngさん、tadsanさん、do_akiさんはじめとする皆様ありがとうございました。 PHP 7.0から日付のフォーマット文字列にミリ秒を意味する「v」が追加された PHP 7.0.0から、DateTime::format()でミリ秒指定ができるようになっています。 v ミリ秒 (PHP 7.0.0 で追加) Same note applies as for u. 例: 654 http://php.net/manual/ja/function.date.php date関数と違ってDateTimeオブジェクトはマイクロ秒の処理を行うので、これをミリ秒単位に丸

    PHP 7.2.0からDateTimeでミリ秒表示するときの丸め処理が変わった話 - hnwの日記
    zu2
    zu2 2018/04/04
  • PHPのsleep関数とusleep関数の挙動を調べてみた - hnwの日記

    筆者はPHPの現在時刻を上書きするPHP拡張モジュールphp-timecopを開発しているため、PHPの時間がらみのテストを世間一般の人より多く書いていると思います。テストケース中でusleep関数を多用しているのは世界中でも筆者くらいかもしれません。 ところで、先日php-timecopのテストをWindows上で動かしたところ、 usleep(100000) が99.8msくらいで帰ってきてテストに失敗するということがありました。 筆者はsleep関数やusleep関数は指定した時間と同じかそれより長い時間スリープすると考えていたのですが、当にそのような性質があるのでしょうか?また、sleep関数やusleep関数はどの程度の誤差があるのでしょうか? 稿ではこうしたsleepやusleepの挙動について深掘りしてみます。 sleep関数の挙動 まずはsleep関数の挙動から調べてみ

    PHPのsleep関数とusleep関数の挙動を調べてみた - hnwの日記
    zu2
    zu2 2017/08/15
  • 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の日記
    zu2
    zu2 2016/10/07
  • 続・世界最小のRSA鍵ペアは何bitか - hnwの日記

    前回の記事「世界最小のRSA鍵ペアは何bitか」でp=3, q=5(つまりn=15)の場合のRSA鍵ペアを紹介しましたが、kazuhookuさんからこんなブックマークコメントを頂きました。 面白い。n=4(あるいは2)はダメなのかな もっと小さいnを採用できないのか?という指摘かと思います。前回記事では普段のRSA暗号のノリで「p,qは異なる奇素数」という前提を置いていましたが、既に非常識なくらい短い鍵長の話をしている中で常識にとらわれるのは無意味というものでしょう。 稿では15未満のnでRSA暗号らしきものが構成できるのかどうかを探ります。 n=1の場合 RSA暗号の平文mに対して m^(e*d) = m (mod n)が成り立つ最小のnを考えると、n=p=q=e=d=1が見つかります。これは1bit RSA鍵ということになりますので、もし認められるなら世界最小なのは間違いありません。

    続・世界最小のRSA鍵ペアは何bitか - hnwの日記
    zu2
    zu2 2016/09/18
  • 世界最小のRSA鍵ペアは何bitか - hnwの日記

    「理論上最短のRSA鍵の鍵長は何ビットなのか?」という疑問が湧いてきたので、RSA鍵の長さに関する制約について調べてみました。とにかく小さいRSA鍵ペアを作ろうと思ったらp=3,q=5の4bit RSA鍵というのが作れそうですが、当にそんな鍵が作れるのでしょうか? 稿ではRSA暗号およびRSA署名のパディングに関する仕組みを紹介し、最短の鍵長となるRSA鍵について検討します。 RSAES-PKCS1-v1_5 におけるパディング 鍵長最短となるRSA鍵ペアを作る上で障害になるのが、RSA暗号のパディングと呼ばれる仕組みです。 RSA暗号における暗号化および復号処理は整数の累乗演算ですから、仮に平文mが1だった場合、暗号文も1ということになってしまい暗号として機能しなくなってしまいます。このような問題への対策として、受け取った平文をそのまま使うのではなく、パディング文字列を付加して暗号化

    世界最小のRSA鍵ペアは何bitか - hnwの日記
    zu2
    zu2 2016/09/18
  • 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の日記
    zu2
    zu2 2016/07/03
  • Raspberry PiのGPIOは起動直後から内部プルダウンされている - hnwの日記

    Raspberry Piで電子工作をするときの話題です。 Raspberry PiにはGPIOと呼ばれる電子工作に使う端子が出ています。これらのGPIO端子は「プルアップ抵抗」「プルダウン抵抗」の2つを内蔵しており、ソフトウェアから有効・無効を切り替えることができます。 ちなみに、プルアップ・プルダウンというのは端子に何も接続されていない状態で電気的に安定させるためのテクニックで、端子と電源の間に抵抗を入れて接続したり(プルアップ)、端子とグランドの間に抵抗を入れて接続したり(プルダウン)することを言います。 ところで、起動直後にこれらの設定がどうなっているかの資料が見つからなかったので、手元のRaspberry Pi 2で実験してみました。結論としては全端子が初期状態でプルアップまたはプルダウンされており、電気的に不安定なハイインピーダンス状態の端子は一つもないようでした。 一方で、一部

    Raspberry PiのGPIOは起動直後から内部プルダウンされている - hnwの日記
    zu2
    zu2 2015/06/26
    “電源との間に100KΩ抵抗を入れても端子の入力はLOWのままになってしまって誌面の記述通りには動かない状態でした”
  • 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の日記
    zu2
    zu2 2014/08/10
  • 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の日記
    zu2
    zu2 2014/01/30
  • ぼくのかんがえたさいきょうのround関数 - hnwの日記

    浮動小数点数の丸めにおいて丸め桁数を指定でき、それでいて精度を失わないようなround関数をCで実装してみました。 https://github.com/hnw/precise-round 実装としては、受け取った浮動小数点数から最短になる10進表記に変換し、浮動小数点をズラすことなく10進表記のまま四捨五入を行うものです。これを元に偶数丸めを実装するのも容易でしょう。 実際、前回記事「RubyPythonとC#のround関数のバグっぽい挙動について」で指摘した5.015の例についても期待通りに丸めることができます。 #include <stdio.h> extern double precise_round(double x, int digits); int main() { printf("%f\n", precise_round(5.015, 2)); // 5.02 prin

    ぼくのかんがえたさいきょうのround関数 - hnwの日記
    zu2
    zu2 2014/01/02
  • hardlink.pyを使ったらディスクの空き容量が劇的に増えた - hnwの日記

    ノートPCを使っているとディスクの空き容量が不足してくることがありますよね。僕の場合、$HOME/src/php以下にPHP 5.0.0から5.5.5まで88バージョンのPHPのソースコードを展開しているのですが、このサイズが約8.9GiB、約110万ファイルと恐ろしい量であることがわかりました。 そこで、この全ファイルに対してhardlink.pyを適用してみたところ、7.7GiBほど空き容量が増えました。稿ではこのhardlink.pyについて紹介します。 hardlink.pyとは hardlink.pyは、同じファイルを見つけてhardlinkにしてくれるPythonスクリプトです。同じファイルが多ければ多いほどディスクの空き容量を節約できるというわけです。 同じファイルと見なす条件はオプション指定で変更できますが、僕は「ファイルの中身とオーナーとパーミッションが完全一致、ただし

    hardlink.pyを使ったらディスクの空き容量が劇的に増えた - hnwの日記
    zu2
    zu2 2013/11/18
  • round関数その7:偶数丸め - hnwの日記

    いい加減まとめるか他の記事書けよって感じですが、まだまだround関数の続きです。実際のところ僕も結構飽きていたりします。 この一連のround関数の件について言及している記事を見ると、かなり怪しい知識レベルの人もいるように思います。そんな記事をいちいち斬っていてもキリが無いかなと思ったのですが、下記の内容を信じていそうな人を見かけました*1。なので渋々ツッコミを入れます。 なお、round関数は、四捨五入じゃないのはシステム業界では有名なお話。 「偶数丸め」は IEEE 754 で定められており、JIS や ISO にも同じ規定があります。 多くの Round() 関数の挙動もこの IEEE 754 に則った「偶数丸め」です。 「偶数丸め」は四捨五入とほぼ同一ですが、次の1点が違います。 「丸め単位の丁度まんなかで、どっちつかずの場合は、偶数側を採用する」 したがって、1.25 を 0.

    round関数その7:偶数丸め - hnwの日記
    zu2
    zu2 2013/10/28
    『知恵を身につけることを怠ってコピペだけの記事を乱発したり、あまつさえ劣化コピーをバラ巻くような人物は、僕の価値判断基準で言えば負の価値を生んでいます』
  • ctype_digit関数の罠 - hnwの日記

    PHPにはctype_digitやctype_lowerなど、ctype_XXXXという関数が多数あります。記事の話題はこれらctype関数の挙動と注意点についてです。 ctype関数のマニュアルには下記のような記述があります。 これは、256 より小さな整数が指定された場合、指定した範囲 (数値は 0x30-0x39) に収まっているかどうかを調べるために、そのアスキー値を使用することを意味します。数値が -128 および -1 (境界を含む) の間の場合、256 が追加され、その数字に関してチェックが行われます。 文字列引数を指定してコールした場合、これらの関数は、その文字列の全ての文字を調べ、その文字列の全ての文字が要求された基準に一致する場合にのみ TRUE を返します。空の文字列でコールした場合は、 PHP 5.1 より前のバージョンでは常に結果は TRUE となり、一方 5.

    ctype_digit関数の罠 - hnwの日記
    zu2
    zu2 2010/03/14
    うーん。なんでこういう仕様なんだろうってのはphpには多すぎる。