書いて、答えられる人はどのくらいいるだろうか。これは別に筆記試験というわけではない。実行環境があるなら様々な入力で試してみて欲しい。なんの変哲もない一行のコードだが、これはシステムをダウンさせかねない大きな問題を抱えている。読み進める前に、今、コードレビューやテストをしている段階だと考えて、ぜひそれを指摘してみてほしい。純粋であるだとか、参照透過性を満たしているだとかよく話題になる。参照透過性を満たしているということは、同じ関数に同じ引数を渡せば、いつ、誰が簡約しても結果が変わらないということを意味している。いつ簡約しても結果が変わらないということは、並列に簡約しても良いわけだし、逆順に簡約してもいいわけだし、コンパイル時に簡約したっていいわけだ。モナドってのは特別なんだ」とかそういう理解であっても、とりあえずモノを作るにはそんなに困らない。だいたいそう動くし、そういうもんだと思っていれば十分である。そんな人のために、ちょっと大変だけど、このプログラムを手で簡約してみたいと思う。出力できれば、ある程度の納得を得られるはずだ。なるビルドツールが現れてからはその点が一気に解消されて大変便利になった。書いている自分でも驚くほど正しく動くし、変更にも強い。言語の選択はもちろん適材適所なので一概には言えないが、堅牢なプログラムを素早く書くという観点ではお勧めできる言語だ。書かれたプログラムにはパフォーマンスバグ(時間、空間、あるいはその両方)が含まれていることも多い。ビルドさえできればたいてい「正しく動く」が、意図したパフォーマンスが得られなかったり、余計なメモリを消費し続けたりといったことでは片手落ちである。今回は、そんななかでも並列プログラミングを行う場合に遅延評価が問題となる例とその解決法を紹介する。需要そのものが減っている。あったとしても同じこと。パターンを実装したインターフェースが提供されているので、積極的に使っていきたいところだ。いったリソースがひとつだけなら、素直に書けばいいだけのことなのであまり考える必要はない。ここでファイルハンドルが解放されるところが、配列になっているものに対し、すべての要素を開き、同時に使いたいとなると意外と面倒なことに気付く。あったとき、意味的にはこういうことがしたい。endendが、配列の要素数がわからない以上、この方針でネストを続けていくわけにはいかない。Tweet巷では「ズンドコキヨシ」というプログラミング課題が流行っているらしい。そりゃなんぞや、というところだが、要点としては《「ズン」「ドコ」のいずれかをランダムで出力し続け、「ズン」「ズン」「ズン」「ズン」「ドコ」の配列が出たら「キ・ヨ・シ!」と出力して終了するプログラムを作成せよ》ということになるだろうか。多くの方が挑戦しているようで、以下にまとめられている。ズンドコキヨシまとめすっかり波には乗り遅れている感じではあるが、それはともかくとしてもプログラミング課題としてとてもセンスが良い。返し、およびその中断あたりだろうか。ツボを押さえたとても良い課題である。いうわけで、是非やってみたい。Tweetと、こんな表題で書くからには当然、「等価ではないこともある」と言いたいわけだが、その前に一般的な話をおさらいしておこう。基本的に等価だとされる。"3"]どちらの書き方が良いのか、というのは人やプロジェクトなどによりけりではあるが、後者のメリットのひとつとして「ブロック内の変数を命名しなくて良い」というものがある。我々ソフトウェアエンジニアにとって命名とは一般的に重労働であり、その労働力はできればもっと重要な箇所で使いたい。そんなわけで我々としてはできれば後者の記法を利用していきたいわけである。ところが表題の通り、この二つは必ずしも同じ挙動になるとは限らない。実際に二つほど発見したので紹介しよう。Tweet早速だが、コードを見てほしい。ネットワークデータを一旦ローカルの一時ファイルに受け取り、後でゆっくり読み書きしよう、という意図のコードだ。呼び出し元はファイルハンドルを受けとり、シークを含めた読み書きができる、というか、したい。endendところが、このコードには問題がある。このエラーは環境や時間、扱うデータによって発生したりしなかったりするし、スタックトレースはなにやら所謂ライブラリ類の奥深く。stream"」である。なんでも、「リモートから任意のコードを実行できる可能性がある」らしいではないか。様々なプログラムで利用されているライブラリ部分の問題とあって、影響範囲がとても広い。話を聞くに、たかが数バイトの情報を範囲外のメモリに書き込める可能性があるだけだという。実際それだけのことでサーバーの乗っ取りなどできるものなのだろうか。解説されている実際の攻撃方法を若干端折って紹介してみようと思う。http://www.openwall.com/lists/oss-security/2015/01/27/9なお、本記事はこの脆弱性そのものに対する緊急度などについて言及するものではないし、実際に攻撃を行うことを推奨するものでもない。攻撃に用いたりしないようご注意願いたい。脆弱性そのものに対する適切な対応などについては、専門機関や専門家の指示や勧告に従って欲しい。