Showing posts with label geek. Show all posts
Showing posts with label geek. Show all posts

2018-06-14

xkcd: お客様特典

xkcd: Customer Rewards

23ドル3セントになります。

ところで、あなたの本名を教えていただけるのならば24セントお支払いたします。家族構成を教えていただけるのであれば35セント、電話番号に79セント、あなたのスマフォをこの場で貸していただいてあなたのFacebookの投稿一覧を確認させてもらえるのであれば1ドル20セントお支払します。

ポイントカードと特典は、独立した取引として考えた場合、とても奇妙なものになる。

title="うちの製品をSNSに投稿していただけるのであれば1ドル47セント、グループチャットで毎回話題に持ち出すのであれば2ドル5セント、運転中にうちの広告を通過した場合乗員一人に付き11セントお支払します。"

そういえばレシートを1枚10円で買い取るサービスが流行っているようだ。

2016-09-24

xkcd: データセンターのスケール

xkcd: Datacenter Scale

「RAIDコントローラーは私どもの規模では無意味ですね。すべてはより上位で冗長性を確保しています。ディスクドライブが一つ故障したら、マシン1台を丸々破棄しています」

「マシン1台? うちではラックごと破棄しているぞ」
「そうよ。誰がサーバーを1台交換する作業をするっていうの?」

「うちのところは、部屋ごと交換しているよ。うちの規模では、ラック単位で何かをするのは経済的ではない」
「すげぇ」
「Googleみたいだ」

「うちなんかスプリンクラーとか消化剤噴出機なんてものは用意していないわ。データセンターで火災が発生したら、自然鎮火するまで待って、町ごと作り変えることにしてるわ」
「合理的だな」
「避難はしごとか設置する必要、本当にあるのかな」

titleテキスト:アシモフの宇宙ACは超空間中のデータセンターを接続したものだが、実際よく出来ている。エントロピーを逆転させることはない。寿命が来たら、単に宇宙を廃棄して、新しい宇宙を注文するだけだ。

titleテキストを翻訳するためだけにアシモフのThe Last Questionを読んだが、なかなか良く書けている。

The Last Question -- Isaac Asimov

2015-05-06

Jacob Kaplan-MossのPyCon 2015における基調講演: プログラミングの才能という都市伝説

Keynote - Jacob Kaplan-Moss - Pycon 2015 - YouTube

The programming talent myth [LWN.net]

PyCon 2015で、Djangoの貢献者であるJacob Kaplan-Mossが興味深い基調講演をしているので紹介する。LWM.netでほぼ全面書き起こしに近いまとめがあったので助かった。

自己紹介

Kaplan-MossはDjangoの貢献者であり、Herokuのセキュリテイ部門の部長である。PyCon参加者としては歴史が長く、その他のカンファレンスでもよく発表している。Pythonコミュニティは「自分にとってこの業界におけるとても重要なもの」であり、PyConの基調講演を行うということは、「自分のキャリア上の絶頂」である。

自分の最初のPyConの発表は2005年のことで、PythonとAppleScriptを結びつけるツールについてのものであった。ワシントン DCで開かれた当時のPyConで、Adrian HOlovatyは、自分の働くカンザス州Lawerenceの新聞社のWebサイトを構築するためのツールの技術デモを行った。このツールは、後にDjangoとなるものであった。今や、Djangoは10歳になり、世界中で使われている。PyCon参加者が300人から3000人に膨れ上がるまでを見てきた。コミュニティは新規参加者で膨れ上がり、別物になりつつある。そのため、「自分のキャリアにおける絶頂」というのは、文字通りの意味だ。

しかし、頭の中でふと思うに、自分はこの発表のステージに立つのにふさわしくないのではないか。この成功を受けるほどの価値ある人間ではないのではないか。脳内で、謙遜が起こる。

今までの業績は誇らしい物だ、実際、自分の過去の業績は、自分をこの場に立つ価値があるものにしている。しかし、自分は聴衆が考えているような人間ではない。

聴衆の多くは、自分がここで基調講演を行っているのは、「Djangoの発明者」であるからだと考えているだろう。しかし、それは違う。Djangoの由来を知っているものは、「Djangoの共同開発者」であると考えるだろう。しかし、これも過大評価である。実際には、自分はAdrian HolovatyとSimon WillisonがDjangoを発明して共同開発した一年後に、新聞社に雇われて開発に参加した者である。そんなわけで、自分は「すでに出来上がって1年以上たったものを開発するために雇われた人間」である。

皆、自分のことをDjangoの発明に関わりのある人物だと考えるのは、自分が「素晴らしいプログラマー」であると考えているからだろう。つまり、「ロックスター」とか「ニンジャ」とか、あるいは「転職エージェントが最近よく使う言葉」のプログラマーであると考えているからだろう。皆、自分はプログラミングの能力によって成功したと考えている。しかし、それは違うのだ。「私は、言うてありきたりなプログラマー」である。

ランニングについて

[ライドにウルトラマラソンランナーのAnn Trason] Ann Trasonはスポーツの歴史上素晴らしい成果を上げた者だ。ウルトラマラソンとは、26マイル以上走るマラソンのことだ。大抵は、山道を走ったり、川を横切ったりするもので、難しいものになると、何日も走り続けなければならないものだ。走る距離はたいてい50kmから160kmほどだ。Trasonは10年、20年後も破られない記録をいくつも作っている。彼女の記録に一時間以内に入れる人間はいない。Trasonはこの業界を独占していて、実にずば抜けて優秀な人物である。自分がこれを話すのは、自分もこの間、50kmのウルトラマラソンを走ったからだ。

しかし、自分はTrasonには遠く及ばない。同じブランドの靴を履いているだけだ。自分はどこにでもいるありきたりなランナーであり、1000人中535位であった。ランニングのパフォーマンスを評価する数値は多数ある。ペース配分、コースの距離や高度などだ。ランナーのスコアを計算して、そのランナーがどのくらい優勝者に近いかをはじき出すWebサイトがある。自分は68%であり、Trasonは98.58%だ。つまり、彼女はだいたい優勝するということだ。

この差は驚くに当たらない。レースのタイムのヒストグラムを描いてみると、よく見慣れた曲線が描かれる。ベル・カーブ、あるいは正規分布と呼ばれているものだ。ほとんどの人間は平均的で、ごく一部の例外的に優秀か、ダメな者が、極めて細い曲線の終わり付近にいる。我々が計測方法を知っているおよそすべての能力は、この曲線のような分布をする。

ありきたりということについて

さて、じぶんはありきたりなプログラマーであるが、聴衆の中には、信じない人もいるだろう。何故だ? ここにいる聴衆のほとんどは、Kaplan-Mossと共同作業をしたことがないはずなのだが、なぜ自分のコーディング能力が例外的に優秀であると言えるのか。評価すべきデータが存在しない状況では、曲線の中央辺りに位置すると考えるべきではないのか。そもそもの問題として、コーディング能力を評価する方法がないということがある。我々はソフトウェアを作成する能力を評価する方法を模索している赤子のようなものだ。評価基準としては何がある? コード行数か? 一体それは何を評価しているのだ? ストーリーポイントか?[訳注:スクラム用語、ストーリーを完了するために必要な作業時間の見積もり]。そもそも、ストーリーポイントって何なんだ?

プログラマーは論理的な解析的な現場で働いていると思いがちであるが、実際のところ、プログラミング能力を機械的に計測する方法などないのだ。人間は、データが与えられない時、逸話を作る。この逸話は、単純でステレオタイプになりがちである。そこで、我々は、「プログラミングのできないザコ」とか、「プログラミングのできる神」などと言ったりして、その中間を完全にすっ飛ばしてしまうのだ。人というのは誰でも、素晴らしいプログラマーか、あるいは、「椅子を浪費するだけの無能」のどちらかに分類される。

しかし、その場合、プログラミング能力というものは、U字型の曲線を描くことになる。ほとんどの人はその両端のどちらかに属している。これはいかにもありえないことだ。思うに、人間というものは経験を積むにつれて学んでいくものだろう。どうやって、何もできないザコからガチ勢まで、中間を経ずして能力の向上ができるのだろうか。両極端な2つの分類しかできないため、多くの者は自分を「素晴らしいプログラマー」に分類するのだ。あいつはDjangoの関係者である。するとクソなプログラマーの方に分類することはありえない。自然として、もうひとつの方を選ぶようになるのだ。

しかし、もし、何らかの方法でプログラミング能力を評価できるとしたならば、その曲線は正規分布するはずである。ほとんどのひとはほとんどのことにおいて平均である。Wobegon湖[架空の地名。過大評価する例えに用いられる]ではないのだから、大多数が平均より上であることはありえないのだ。

危険な都市伝説

この、プログラミング能力がバイモーダル分布(U字型)するという考えは、危険であり、都市伝説である。この都市伝説は、ロックスターかニンジャでなければプログラミングできないという雰囲気を作り出す。これは人々をプログラミングの学習から遠ざけるという害悪をなしており、将来のためによろしくない。

アメリカ労働省の統計によれば、2020年には150万人のプログラマー職の求人数にたいする労働者の供給不足が生じると予測されている。これは、多くの職場で人手不足ということになる。これは5年後のことだ。EUも似たような数字を出している。2018年に120万人。3年後だ。つまり、我々はなんとかしてもっと多くの人材をこの業界に呼び込まねばならない。しかし、この都市伝説はプログラミングを仕事に選択しようと考える人たちを躊躇させるものとなっている。この都市伝説は、プログラミングというものは生まれながらにして持つ先天的な才能であるという考え方からも支持されている。まだソフトウェアを書いたことがなく、都市伝説を信じるものは、用意にこの罠に引っかかる。年齢が30か、あるいは20か15になって、まだ一度もコードを書いたことがないので、一生コードを書けるようにはならないだろうと考えてしまう。

もし、選択肢が神かザコしかないのであれば、仕事に対してやりがいを感じなければやってられないと考えるようになるだろう。いつなんどきでも四六時中プログラミングのことを考えている奴、ほんの僅かでもよそ見をすれば、すぐに神からザコに落ちてしまうという考え。この考えは、人々をして長時間労働させ、プライベートな時間でも常にプログラミングについて学ぶようにさせていたりする。

しかし、他の業界については、我々はそのようには考えない。去年マラソンを走った50万人の参加者の全員が、先天的にランナーとしての才能を持っていたのであろうか。疑わしいものだ。私はそんな才能は持っていない。ほとんどの参加者は、かなり悪く走っていた。極めてひとにぎりの者達が、とてもよく走っていた。ランナーとなるためには、靴が一足あればいいだけのことだ。ランナーとなるために、走ることを好きになる必要はない。

自分がランニングで一番好きなことは、ゴールすることだ。マラソンを走るのは難しい。訓練と継続が必要だ。ソフトウェアを書くことは、Pythonを書くことは、マラソンを走るより難しいだろうか。なぜここには50万人の聴衆がいないのか。コーディングという能力に対してはそういうは話をしておきながら、ランニングという別の能力にはそういう話をしていないではないか。

自分は数年前、カンザス大学のGISデーで、カンザス川の反乱の予測に関する素晴らしい発表を聞いた。この学生が使ったツールは、このPyConでは使い慣れたものが多いであろう、Amazon Web ServiceとかLinuxとかPostgreSQLとかPytonとかDjangoとかGeoDjangoといったものだ。この学生はPythonで数千行のコードを書いたばかりだった。自分はうちの会社の採用面接を受けるつもりはないかと聞いてみた。学生は、「自分にはできない」という。なぜならば、「自分は本物のプログラマーではないから」と。この学生は自前で分散GISデータ処理パイプラインをたったいま実装した者であるが、本物のプログラマーではないという。これはプログラミングとは都市伝説の中の話で、自分に関係のあることではないという考えによるものだ。

実際のところ、プログラミングというのはやりがいとか才能によるものではない。プログラミングとは学ぶことができる能力を寄せ集めたものでしかない。そもそもプログラミングとはひとつではない。ここまで、プログラミングというひとつのものがあるかのように話してきたが、プログラミングには実に多くの能力が必要であり、コーディングはその能力のうちのひとつでしかない。設計、コミュニケーション、作文、デバッグも必要だ。そうそう、それからUnicodeについて理解している者が最低一人は必要だ。[聴衆の笑い声]

実に多くの独立した能力があるが、我々は人をスキルセットのうちの最も貧弱なもので評価しがちである。ほう、君はデザイナーとして優秀で、人前で話すこともできれば作文もできる。しかもプロジェクトマネージャーとして優秀である。結構なことだ。しかしリンクリストを理解していないだと? 「おうちに帰んな坊や」とね。他の能力と同じように、プロとしてプログラミングすることもできれば、たまにプログラミングすることもできるし、趣味としてプログラミングすることもできる。パートタイムかフルタイムかどちらでもよい。プログラムを下手に書くこともできるし、うまく書くこともできる。しかし、大半は平均的なプログラマーだ。

「そこそこの実力で十分だ」という考え、平均的な能力でよいという考えが広まれば、新参者がプログラミングに抱く恐れが少なくなる。もし、成功のハードルが、ずば抜けて優れているのではなく、そこそこで十分だとなれば、コミュニティに新たにやってきた人にも、やすやすと飛び越せるだろう。実際、コミュニティにやってきた人に、才能の都市伝説が与えた悪影響は一度限りではない。人々を技術から遠ざける結果となってしまう。

技術業界は、性差別、人種差別、同性愛差別などのあらゆる差別が渦巻いている。これは一つの問題ではないし、原因も一つではないのだが、才能の都市伝説も問題のひとつだ。我々の業界では、才能の都市伝説は、優秀なクソ野郎の都市伝説としても存在する。つまりこうだ。世の中には10倍以上の生産力を発揮するプログラマーがいて、仕事があまりにも素晴らしいので、その挙動が難ありだとしても、周りはなんとか協調してやらねばならないというものだ。現実には、正規分布を考えれば、その手の人間は、それほど例外的に優れているものでもない。しかし、もし仮にそういう10倍プログラマーがいて許容するとしても、そいつ一人を維持するために何人のプログラマーを拒否しなければならないというのか。

[スライド:優秀なクソ野郎というタイトルでLinusがnVidiaに対して中指を突き立てている画像を表示、聴衆は大笑い]

10倍プログラマーはどういう見た目をしているのか。

さて、現実には能力は正規分布するのに、プログラマーは神かザコのどちらかに分類されるという考えには、危険なバイアスが待ち構えている。さて、10倍プログラマーはどのような見た目をしているのかということを考えてもらいたい。

[スライド: 映画ソーシャルネットワークで、Mark Zuckerbergを演じたJesse Eisenbergの写真]

我々はこのような見た目を思い浮かべるであろう。これはMark Zuckerbergだ。若い白人の男だ。なぜならメディアで目にするのはそういう人間だからだ。ネタバレしないでもらいたい[聴衆から笑い声]。だがこれはMark Zuckerbergではない。先ほどから笑っている人もいるように、これはMark Zuckerbergを演じたJesse Eisenbergだ。大手映画会社で、その内容は・・・若い白人の男がIT起業するという話だ。

[スライド: Sutarday Night LiveというアメリカNBCのコメディバラエティ番組のキャストで、Mark Zuckerbergを演じたJesse Eisenbergを茶化して演じたAndy Sambergの画像 ]

これがMark Zuckerbergだ。[聴衆から笑い声]。いや、これはMark Zuckerbergではない。これはAndy Sambergで、Jesse Eisenbergを演じていて、その演じられたJesse EisenbergはMark Zuckerbergを演じている。

[スライド: Mark Zuckerbergの写真]

これが、たぶんMark Zuckerbergだ。

[スライド: 三者の顔]

とにかく、ここで言いたいことは、若い白人の男という典型例は極めて一般的で、3人とも同じ人物を演じているというわけだ。どれが本物だっけ? とにかく、この3人に似通わないような人間は本物のプログラマーには見えないので、本物のプログラマーとはみなされない。自分の知るこの業界の女性のほとんどは、プログラマーだとは思われなかったという話を持っている。このPyCon、今年のいまここで、複数の女が、どの男と来たかとたずねられたと聞いた。ここに来る理由は、配偶者の男がプログラマーだったからというわけだ。もし、男だったならば、そういう質問はされただろうか。

逆に、ステージに上がった自分は、そういう典型例に似ている。そこで、聴衆は自分を本物のプログラマーだと推定する。このような推定は、かなりの数の人間をこの業界から遠ざける。

National Center for Women & Information Technologyによれば、コンピューターサイエンス科の学位を得た女の半数は、雇用にその学位を使っていないとのことだ。40%の女は10年以内にこの業界を去る。男はたったの17%だ。女性の半数以上はキャリアの途中で業界から去るわけだ。

もちろん、性差別だけが原因ではないだろうが、何十年もの経験ある女が、ド素人だとみなされるのは極めて不快だろう。この差別を克服するには大変な努力が必要だ。我々がプログラマーというもの、プログラミング能力というものについて考えなおさなければ、解決は望めない。

ランナーには様々な人がいる。短距離走者、長距離走者、マラソン走者などなど。体格や性別や年齢や人種も様々だ。皆、成功の条件が違うし、その条件にあった成功を収めることができる。この業界にも、そのような考え方が必要だ。

何年も前に、Lynn RootとPyConで話した内容が、この発表の元ネタになっている。Rootはプログラマーで、PyLadiesのサンフランシスコ支社の創始者で、Python Software財団の委員で、このコミュニティに長くいるものだ。PyLadiesは、その当時はまだ新しいもので、その集団の能力や意欲には期待すべきものがあった。その時自分はRootに、「そういう強者の女プログラマーが出てきたのはよいことだ」などと言った。するとRootは、「まあ、そうだけど、本当に成功するためには、大量の平均的な女プログラマーが必要だ」と答えた。

我々の言う才能の都市伝説は、参入のハードルを不可能なほどに上げてしまう。この都市伝説を元に考えれば、今ここに我々がいるという事自体が驚きだ[訳注: ほとんど者はその資格がないはずのため]。この都市伝説は捨て去る必要がある。コミュニティは、「平均は実際とてもよいことだ」という考えを持つ必要がある。さて、私はありきたりのプログラマーで、皆にもそうなってほしいし、普通にやることをこなそうじゃないか。

人間のたいていの能力の評価値をグラフに描くと正規分布するのでベル曲線を描く。ザコと神しかいない、プログラミングには生まれながらの天性の才能が必要だという都市伝説に従えば、正規分布していない。すごくできない奴とすごくできる奴ばかりで中間がほとんどいないという、バイモーダル曲線を描く。とはいえ、前に紹介したふたこぶラクダの論文は、現実の評価結果がバイモーダル曲線だったと報告している。

本の虫: 60%の人間はプログラミングの素質がない

ドワンゴ広告

ドワンゴはベル曲線の良い方の端にいるC++プログラマーを募集しています。

採用情報|株式会社ドワンゴ

CC BY-ND 4.0: Creative Commons — Attribution-NoDerivatives 4.0 International — CC BY-ND 4.0

2015-04-09

500マイル以上離れた場所にメールが送れないのだが

http://web.mit.edu/jemorris/humor/500-miles

From: Trey Harris <[email protected]>

今から私が書く話は、起こりようのない問題についてだ。この話を広く一般に公開してしまうのは惜しい。というのも、いい酒の話のネタになるからだ。この物語は、退屈な詳細や問題を隠すために、多少事実を変えていて、物語を面白く脚色している。

数年前、私はキャンパスのメールシステムを保守する仕事をしていて、統計学部の学部長から電話を受けた。

「大学の外にメールを送るのに不具合が発生しているのだが」
「どんな問題でしょう?」と私はたずねた。
「500マイル以上メールを送れないのだよ」と学部長は説明した。

私はラテを吹き出した。「何だって?」

「ここから500マイル以上離れた場所にメールを送信できないのだよ」と学部長は繰り返した。「実際は、もう少しあるのだが。520マイルぐらいだろうか。とにかく、それ以上は無理なのだ」

「えっと・・・メールはそういう風には動かないのですが・・・普通」と、声の調子をできる限り抑える努力をしながら、私は言った。学部長と話すときは、興奮した声を出さないものだ。たとえそれが、統計学部であったとしてもだ。「なぜ500マイル以上メールを送れないと考えているのですか?」

「私の考えではないのだよ」と学部長は答えた。「つまり、この問題に気がついたのは、数日前のことだが・・・」

「数日も我慢したのですか?」と私は遮った。声が抑えられかった。「それで何日もメールが送れなかったのですか?」

「メールは送れたよ。ただその範囲が・・・」

「・・・500マイルというわけですね」と私は続けた。「わかりました。しかし、なぜもっと早く言ってくれなかったのです」

「うむ、さっきまで現状を把握するために十分なデータを収集できずにいたわけであるからして」。なるほど、彼は「統計」部門の学部長である。「とにかく、私は地球統計学者に問題を見てくれるよう頼んで・・・」

「地球統計学者・・・」

「そうだ。彼女は、我々がメールを送れる距離は500マイルをわずかに超える程度の半径であると地図上に図示してくれた。その半径内にも送れない場所はいくつかあり、あるいは散発的に送れるところもあるが、この半径の外には絶対に送れないのだ」

「なるほど」、と私は言った。そして頭を抱えた。「いつ問題が起こったのですか? 数日前とさっき言っていましたが、何かシステムに変更はありましたか?」

「そうだな。業者がやってきてサーバーにパッチをあててリブートした。業者に連絡してみたが、メールシステムには触っていないとのことだった」

「わかりました。見てみます。後ほどまた連絡します」と私は言った。自分でも会話について行けたのが信じられないくらいだ。今日はエイプリルフールではない。私は誰かにジョークの借りがあったかどうか思い出そうと試みた。

私は、その学部のサーバーにログインして、いくつかのテストメールを送ってみた。ここはノースカロライナにある研究室で、私のメールアカウント宛のメールは問題なく届いた。リッチモンドとアトランタとワシントンに送ったメールも同様だ。プリンストン(400マイル)に送ったメールも届いた。

だが、メンフィス(600マイル)にメールを送ろうとすると、失敗した。ボストン、失敗。デトロイト、失敗。私はアドレス帳を引っ張りだして、範囲を絞り込んでみた。ニューヨーク(420マイル)は届いた。プロビデンス(580マイル)は失敗だ。

果たして私は正気で物を見ているのだろうか。私はノースカロライナに住むが、ISPはシアトルにある友人にメールを送った。ありがたいことに、失敗した。もし、問題がメールサーバーではなく、人間の受け取り手の地理に左右されるのであれば、私は泣き出していたことだろう。

信じられないことに、報告された問題は事実であり、再現性があることが確認できた。私はsendmail.cfファイルを確認した。通常通りのように見える。実際、とても見覚えがある。

私はホームディレクトリにあるsendmail.cfとdiffを取ってみた。改変されていない。私が書いた通りのsendmail.cfだ。私は"FAIL_MAIL_OVER_500_MILES"のようなオプションを有効にしていないことは確かだ。わからなくなってしまったので、私はSMTPポートにtelnetしてみた。サーバーはSunOS sendmailバナーを返してきた。

ちょっとまてよ・・・SunOS sendmailバナーだと? その当時、SunはまだOSにSendmail 5をつけて出荷していた。すでにSendmail 8が安定しているというのにもかかわらずだ。良きシステム管理者である私は、Sendmail 8を使っていた。またもや良きシステム管理者である私は、sendmail 5の暗号のような記号文字ではなく、sendmail 8に追加されたわかりやすいオプションや変数名を使ってsendmail.cfを書いていた。

パズルはまさに解けた。そして、私は再び、もはや冷えてしまったラテを吹き出した。業者が「サーバーをパッチした」時、どうやらSunOSのバージョンをアップグレードしたようだ。そうするにあたって、sendmailがダウングレードされてしまったのだ。アップグレードはバージョン違いのsendmail.cfをそのまま残したのだろう。

たまたまだが、Sunの出荷したSendmail 5は、改変がなされていて、Sendmail 8のsendmail.cfに対応していて、ほとんどのルールはそのまま残った。しかし、新しい長い設定オプションは、ゴミとみなされて、無視された。そして、sendmailのバイナリはほとんどのオプションにデフォルト値を指定されていなかったつまり、sendmail.cfに該当な設定がみつからないために、ゼロに設定されていたのだ。

ゼロに設定されていたオプションの一つに、リモートSMTPサーバーに接続するタイムアウトがあった。ちょっと実験してみた結果、この環境と通常の負荷におけるゼロタイムアウトは、3ミリ秒を少し上回ると、切断されるようだ。

当時のキャンパスのネットワークの変わった機能として、100%スイッチされていたということがある。外向きのパケットはPOPを叩いて相手側のルーターに到達するまで、ルーターのディレイがなくなる。そこで、負荷の少ない近辺のネットワークのリモートホストへの接続は、ルーターのディレイよりも、光速の到達時間に左右される。

やや期待しながら、私はシェルを以下のように打ち込んだ。

$ units
1311 units, 63 prefixes

You have: 3 millilightseconds
You want: miles
        * 558.84719
        / 0.0017893979

「500マイル、実際はもう少しあるのだが」

Tery Harris

面白い話だ。ところで、unitsというコマンドを初めて知ったが、便利なものだ。

ドワンゴ広告

この記事はドワンゴ社内で書かれた。そろそろ次のC++標準化委員会の文書集が公開されても良さそうなものだが。

ドワンゴは本物のC++プログラマーを募集しています。

採用情報|株式会社ドワンゴ

CC BY-ND 4.0: Creative Commons — Attribution-NoDerivatives 4.0 International — CC BY-ND 4.0

2014-01-30

1/9998 = 0.0001 0002 0004 0008 0016 0032 0064 0128 0256...

\(\frac{1}{9998}\)は、4桁で2^13まで2の累乗のパターンが出現する。

\[\frac{1}{9998} = 0.0001\;0002\;0004\;0008\;0016\;0032\;0064\;0128\;0256\;0512\;1024\;2048\;4096\;8193\;6387\;\cdots\]

Hacker Newsによれば、これは以下のような理由による。

The pattern will break down once you get past 8192, which is 2^13. That means th\cdots | Hacker News

このパターンは8192を超えると破れる。つまり、このパターンはすごいことに52桁も継続するのだ(いや、正確には、52桁目で破れる。2の代わりに3となる)

これが動く理由は、\(9998 = 10^4 - 2\) だからだ。これを展開すると、

\[\frac{1}{10^n - 2} = \frac{1}{10^n} \times \frac{1}{1 - \frac{2}{10^n}} = \frac{1}{10^n} \times \left(1 + \frac{2}{10^n} + \frac{2^2}{10^{2n}} + \frac{2^3}{10^{3n}} + \cdots\right)\]

これにより、件のパターンが現れる。このパターンが破れるのは\(2^k\)がn桁を超える時だ。それが起こるのは、近似的に、

\[2^k > 10^n => k > \frac {n \log 10}{\log 2} \]

これにより、\(n = 4\) のとき、\(4 \times \frac{\log 10}{\log2} = 13.28\) となる。

---

他のパターンも階乗の展開で生成できる。

\[\frac{x}{(1 - x)^2} = x + 2x^2 + 3x^3 + 4x^4 + \cdots\]

\(x = \frac{1}{10^n}\) とすると、延々と続くのが、

\[\frac{1}{10^n} + \frac{2}{10^{2n}} + \frac{3}{10^{3n}} + \cdots\]

これはつまり、こうなる。

\[\frac{1}{998001} = 0.000\;001\;002\;003\;004\;005\;006\;007\cdots\]

---

他の分数の例では、

\[\frac{1000}{997002999} = 0.000\;001\;003\;006\;010\;015\;021\;\cdots\]

これは、展開結果が三角数[0]になる。あるいは、

\[\frac{1}{998999} = 0.000\;001\;001\;002\;003\;005\;008\;013\;021\;\cdots\]

これはFibonacci数[1]になる。

---

二乗列を得るのは難しいが、こうやれば、

\[\frac{1001000}{997002999} = 0.001\;004\;009\;016\;025\;036\;049\;\cdots\]

[0] : http://en.wikipedia.org/wiki/Triangle_number
[1] : http://en.wikipedia.org/wiki/Fibonacci_number

> The pattern will break down It doesn't actually: 4096 8193 6387 = \cdots | Hacker News

> パターンが破れるのは

実際には破綻しない。

      4096 8193 6387
    = 4096+8192
    +         1 6384
    +           …

返信: 俺もwolframの結果を見ていて気がついた。基本的に無限に続く数列が、オーバーフローしているというのは、変態的に美しい。

If you'd like to continue the pattern beyond 52 digits, just keep adding 9s to t\cdots | Hacker News

52桁以上のパターンを続けたいならば、元の分数に9を追加すれば良い。

\[\frac{1}{9999999999998} = 1.0000000000002\;0000000000004\;0000000000008\;0000000000016\;0000000000032\;0000000000064\;0000000000128\;0000000000256\;0000000000512\;0000000001024\;0000000002048\;0000000004096\;0000000008192\;0000000016384\;0000000032768\;0000000065536\;0000000131072\;00000002621440\cdots\;×\;10^-13\]

fibonacciの場合、分母の両側に9を付け加えればよい。

\[\frac{1}{998999} \frac{1}{99989999} \frac{1}{9999899999}\]

これによって、0が増え、オーバーフローを防げる。

これはかっこいい。

追記:

平田朋義さんが3乗列を作ってくれた。

\[\frac{333466670000}{3332000199986667} = 0.0001\;0008\;0027\;0064\;0125\;0216\;0343\;0512\;0729\;1000\;\cdots\]

平田さんによる証明は、こんな感じのものがホワイトボードに書かれていた。

\[\frac{1}{10000 - 2} = \frac{0.0001}{1 - 0.0002} = 0.0001 \times (1 + 0.002 + 0.002^2 + 0.002^3) + \cdots \]

なるほど、それで9998だったのか。それで9を足すと精度が増えるのか。