純粋であるだとか、参照透過性を満たしているだとかよく話題になる。参照透過性を満たしているということは、同じ関数に同じ引数を渡せば、いつ、誰が簡約しても結果が変わらないということを意味している。いつ簡約しても結果が変わらないということは、並列に簡約しても良いわけだし、逆順に簡約してもいいわけだし、コンパイル時に簡約したっていいわけだ。モナドってのは特別なんだ」とかそういう理解であっても、とりあえずモノを作るにはそんなに困らない。だいたいそう動くし、そういうもんだと思っていれば十分である。そんな人のために、ちょっと大変だけど、このプログラムを手で簡約してみたいと思う。出力できれば、ある程度の納得を得られるはずだ。出題される巨大パズルの準備をしている。POWERということで、MATHな問題でなければいけない。MATHというと、すぐに計算を考えるかもしれないが、いわゆる計算とは違う分野があり、そのようなパズルもある。いうことで、制約充足問題にした。いう説明では分かり難いな。パズルの多くは、制約充足問題なのだ。ルールという制約があり、問題が与えられ、全ての空欄を、ルール違反せず埋めるのが制約充足問題である。パズルで、今回は巨大なパズルになった。選択したパズルは、ナンプレである。Placeという名称で出題された。(詳細は、ウィキペディアを参照のこと)同じパズルが、とくに日本では多数の名称で呼ばれていて混乱もしているが、ここでは日本国内で最も一般的な「ナンプレ」という呼び方をする。ナンプレのルールどの縦列にも、1から9の数字が1つ入る。どの横列にも、1から9の数字が1つ入る。どの3×3のブロックにも、1から9の数字がはいる。数字の入っていない空白マス全てに、上記のルールに従って数字を記入せよ。単純な、もろに排他性を利用したパズルである。構わないのだが、非常にやり難いだろう。9×9のサイズの問題では、とても巨大とはいえない。この問題をたくさん出題しても、巨大ではなく、たくさんでしかない。したら巨大になるだろうか。9×9ではなく、16x16、25×25、36×36、、、、、81×81、100×100くらいまでいけば巨大かもしれないが、そもそも、そういう問題は作り難い上に、楽しく解いてくれる人がいないのだ。それで、こんな風にして巨大なパズルにすることにした。LF(0D,0A)であり、Unix/LinuxなどではLF(0A)となっており、改行が異なった実装になっている。line)のことである。この改行コードの違いが、色々な問題を引き起こす。ある例は、Unixのサーバで作られたテキストデータファイルを受け取って、Windowsのアプリに読みこもうとすると読み込んでくれない。テキストを見る限り、正しいはずなのだが。悩んだりすることが多々ある。いうとき、テキストの16進数ダンプを利用しないといけない。テキストエディタで簡単なテキストファイルをつくり、ダンプしてみた。Windows側では正しく改行を処理できない可能性があり、改行コードを変換しないといけない。いうとき様々な方法が可能なのだが、わかりやすい方法だけを紹介しよう。Unix上での改行変換だが、unixタイプの改行をwindowsタイプにする簡単な方法がある。HelloCRLF.txtほとんどコロンブスの卵みたいな方法(トリック)である。Windows上で、Unixタイプの改行コードにする単純な方法は知らないのだが、そのような改行変換はUnix側でやったほうが楽なので、無くてもよいかもしれない。なるビルドツールが現れてからはその点が一気に解消されて大変便利になった。書いている自分でも驚くほど正しく動くし、変更にも強い。言語の選択はもちろん適材適所なので一概には言えないが、堅牢なプログラムを素早く書くという観点ではお勧めできる言語だ。書かれたプログラムにはパフォーマンスバグ(時間、空間、あるいはその両方)が含まれていることも多い。ビルドさえできればたいてい「正しく動く」が、意図したパフォーマンスが得られなかったり、余計なメモリを消費し続けたりといったことでは片手落ちである。今回は、そんななかでも並列プログラミングを行う場合に遅延評価が問題となる例とその解決法を紹介する。数学というと、まずは微積分に線形代数と思っている人も多いし、実際大学の初年度で教える数学がそうなっていることが多い。それはあくまでも近代数学の考えで、現代数学の考えではないと思う。勉強をしなければならない。情報科学の基礎として、代数学、もうちょっと限定した分野として『群・環・体』あたりを知っておきたいものである。情報工学科では、このあたりはそれほどやっていないかも知れないが、情報科学科ではかなり勉強しているのではないかと思う。情報も、プログラミングだけでなく、その基礎となる数学部分をしっかりやっておこうと思うと必要なはずだ。代数学を勉強しようとして挫折した人は非常に多いと思う。線形代数や微積分と違って、ひじょうに抽象的な世界になってしまうのがその原因だろう。『群・環・体』あたりを、入門者向きに書いたと主張している本は何冊かあるようだ。ページ数の制限や、どのレベルまで書くか、どのくらい丁寧に書くかがあるが、全部を満足することは不可能で、多くの本は内容が薄いか、読んでも分からない場合が多い。いうことで、群だけを説明した初心者向けの本を読んでみた。副題が「トランプで学ぶ群」となっており、置換をトランプを例に説明していた。群といえば、なんといってもガロア群が有名であるが、そんなところは対象にしていない。内容は、以下のようになっている。いろいろな群とあるのだが、これでは第3章、第4章に何が書かれているか分からないだろう。ありSylowの定理に至る。第3章までと、第4章のペースが全然違って、第4章はハイペースになっていて、きちんと理解できた自信がない。代数学になると、特殊な記号を定義して使うことがよくあるのだが、それをきちんと記憶しておくことは難しい。用語の定義もチョコチョコと出てくるが忘れるので、索引などで定義ページ、解説ページを探すことが多い。本書の索引には、用語はのっているのだが、記号が入っていないので、記号については、自分で索引に書き加えるなどしていかないと、とても困ることになってしまった。数学をやるためには、記号くらいはちゃんと記憶しないといけないのだろうか。これはとてもハードルが高い。六本木のイベント会場ニコファーレで開催される。今回、このイベントで延々と解く問題を提供することになった。去年は円周率を1日半かけて手計算で延々と計算してどこまで解けるかをやったのであるが、19桁目で間違えてしまった。ラマヌジャンの円周率の公式はいくつかあるのだが、以下を使ったようだ。左辺を見ると、都合が悪いことに、円周率が分母に存在するので、Σを計算した後で逆数計算が必要になるので、一般的な円周率の公式よりも手計算はやり難いかもしれない。いうこともあってか、19桁目で間違ってしまったらしい。報告レポートが詳しくかつ雰囲気が伝わると思うので、参照して欲しい。POWERのページも2017年版が用意され、イベントに関する情報が徐々に追加されている状態だ。公式なニコニコ生放送として、ぶっ通し(昨年は34時間25分)でイベントの状況は流され、視聴者からのコメントが流れ、さらに会場からコメントにも対応(反応)することになる。ネットを利用した数学の双方向イベントなのだ。2016さて、今回は、複数人で30時間たっぷりかかるような巨大なパズルを提供したいということで相談を受けて、つい引き受けてしまった。巨大な問題に対応するためには、今まで使っていたパズル問題作成システムそのままでは無理なので、いろいろ手を入れた。プログラムの修正は難しくなく、ただの作業だ。した確認でも非常に時間がかかるようになる。巨大さと、難易度、面倒臭さ、さらには驚き、仕掛け、早合点などもあり、これらをどう問題に反映させるかが悩ましい。要するに、どれだけ楽しんでもられるか、苦しみながら喜んでもらえるか、それに尽きる。言うのをちょっと前に書いた。今回は、その物理版を書こうと思う。物理と数学ではプログラミングとの関係はあまりにも違う。プログラミングで数学能力はとても重要で、数学的能力の方が大切になることさえある。それに比較すると、物理は知らなくても、ほとんどの場合は困らない。最近は物理エンジンというものも普及していて、物体の運動などは適当に計算してくれるので、計算結果の利用のしかたを知っているだけで困らないことが多い。・・・なんてことを書くと、物理など勉強しないでも大丈夫ということになるし、実際に物理など高校までで終っているというプログラマも多いだろう。なると、書くことがなくなるのだが、実際にコンピュータを使って物体を動かす、制御するなどの場合は、物理の原則を知らないダメである。物理をうまく利用すれば、ちいさなモータでちゃんと動かせたりするし、走行ルートを上手に取ったりできるわけである。ロボットなどの制御には知っていた方が良い。コンピュータでシミュレーションをやるときにはとても物理は重要になる。実際に物、装置を作る前に、コンピュータ上で入念にシミュレーションをしてから設計制作に入ることも多い。いうときには、物理も数式レベルまで分かっていないといけない。何をやるかによって違うが、力学、電磁気学と数学、それも行列、微積分、フーリエ解析などを必要とすることが多い。大学レベルでも、物理をきっちり勉強しようとすると、かなり大変になる。理工系の2年までに習う物理の基礎部分くらいはプログラマなら習得していても損はない。いうことで、自習用としてお手ごろな本を紹介しよう。数学のときと同じ、マセマのキャンパス・ゼミである。全6巻であり、各巻の関係は右図のようになっている。実は、それぞれの分野で必要になる数学があり、数学的に詳しいことはマセマの数学の本を見るようにとの指示で説明が終っていることも多い。マセマなので、説明、計算はかなり丁寧に書かれており、計算しながら読んでいけば、ほぼ理解できるのではないかと思う。このあたりは、数学シリーズとまったく同じ感覚だと思えばよいだろう。基礎を丁寧に書いてはいるが、そんなに分厚くなく、範囲はかなり限定されている。量子力学が、たった1冊で終っているのだが、1次元の簡単な場合の説明に限っているからである。このマセマの物理に限ったことではないのだが、最近の物理学のテキストは、実験のこと、実際の物質、物体を具体的に示したり、写真を使ったりしての説明がものすごく減っている気がする。個人的には「これで物理の本?」と思うのが多い。物理を理解するというより、なんだか試験対策みたいな気がするのだ。マセマのシリーズには、常に「単位なんて楽に取れる!」と書いているのだから、まあ偽りはない。WEBで動くアプリなどを作っている限りは、物理学は不要かも知れない。数学と物理がプログラミングでいっぱい必要になるのは、物理シミュレーションであろう。あるのだが、そこまでやる人は少ないか。今年の春、FORTRANで書かれた電磁波工学のシミュレーションプログラムに手を入れた。それは、狭い領域のシミュレーションだったのだが、もう1本、広域でのシミュレーションが残っている。誰か代わりにやってくれる人はいないものだろうか。Tweetちょっと前、調布の電通大キャンパス内のセブンイレブンで、電子パーツなどを24時間販売していることを書いた。ネットでは、この程度で話題になっているが、その先があるのだ。セブンイレブンは甲州街道に沿ったビルの1階にある。ビルの名称はUECアライアンスセンター。入り口には管理人室があるのだが、その前を通りぬけて2階に上がってみると、marutsuの看板が廊下に出ているのだ。中に入ると、部品が入っている小さな箱がずらっと並んでいて、まるで秋葉原の部品屋なのだ。マルツの西東京営業所が、大学(UECとは電通大のこと)の中にあったのだ。電子工学というか、無線工学で有名な大学ならではである。電子部品だけでなく、入門者向けのキットなども置いてあるのだ。ビニール袋に必要な部品を入れたお安いキットも色々置いてあった。多種多様は電子部品はもちろんだが、ケーブル、工具、ケース、測定器なども置いてあった。手を出してしまうとはまってしまいそうだ。入り口の近くには、最近はやっているチビ・コンピュータの類が色々置いてあった。あると思ってみていたら、ちょっと違った。ここに売っているものだけではなく、頼めば色々なものも作ってくれるとのこと。うーーーむ、つい電子工作に走ってしまいそうだ。TweetUbuntuを使ったり、Windowsを使ったり、あるいは同時に使いたくなることがある。それも離れた場所にある異なるOSのマシンを使いたくなる、あるいは操作しなければいけないことがある。Windowsの場合、リモートデスクトップがあり、使う人は使っていると思う。これを使えば、オフィスのマシンを外出先や家から操作することができるし、その逆もできる。いうことで、こんなことをしてみた。全体の背景、左のアイコンはUbuntuである。いう将棋ソフトを動かしてみた。これだけであるが、マウスやキーボードによる入力も不自由なくできるので、遊びでも仕事でも何でもできる。Windows上でのリモートデスクトップについては、いまさら紹介するまでもないと思うのと、書くのが面倒なので省略する。同様のことができるのが、Ubuntuにもある。いう名称を知っている必要さえない。プログラム検索をするときに、「リモート」と入力すると、たったこれだけで、Remminaが呼び出せるので、あとは指示にしたがって、つなぐ相手のマシンのIPアドレスを教えれば繋いでくれる。調布のオフィスのUbuntuから、新宿の方にあるWindowsマシンを動かしている。画像転送がやたらに多い場合はカクカクするが、通常の操作なら全然問題ない。行くのが良いが、実はそこはほとんど見ていない。実際簡単だし、日本語での説明も色々ネット上にあるようなので、存在することだけをお知らせして終えることにする。Tweetキーボードは、プログラマなら、相当の使い込んでいるはずだ。手に十分なじんだものでないと、使うのが嫌になるはずだ。巷にあふれている日本独特のJIS規格に従ったのを使いたくない人も多いだろう。世界的には、やはりASCII配列が普通であり、JISキーボードは結局ガラパゴスキーボードなのだ。キーボードの値段は、下は数百円から上は数万円まで、かなり幅がある。キーボードの値段をケチって指を壊したほうが治療費がかかる上に、とても不便になりかねない。キーボードはプログラマにとっては身体の一部のようなものなので、しっかり手入れをしよう。私は、諸般の事情、大人の事情などから、JISキーボードとASCIIキーボードの両方を使っている。JISキーボードに関しては、あまりプログラムを作ったり、延々と記事を書くときなどには使わないので、購入したときについてきたもの、あるいは余っているキーボードを使うことが多い。何年も使い続けることは珍しいのだが、そもそもそういうキーボードのキートップの文字はシールが張ってあるだけだったりして、まともに使い続けるとシールが剥がれたり、色々問題が起こってくる。Linux(Ubuntu)で使うキーボードは、通常ASCIIキーボードを使っている。数字キーをそんなに押すこともないので、メインのキー以外の右のほうにある余分なキーがあるよりも、右側を切り捨てたコンパクトバージョンの方が良い。キーボードがコンパクトになれば、その分机を広く使える、つまり机の上にいっぱい物が置ける。いうことで、ASCIIキーボードは延々と使っていることが多いが、諸般の事情で取り外して本棚の隅に保管していたキーボードを取り出したのだが、きちんと掃除しないまましまっていたら、汚れが酷く、少々こすったくらいでは落ちなくなっていた。それで、キートップを外して、誰もが行うように、洗濯することにした。これが洗濯前のキートップで、すでに外したものを並べてみた。キートップの側面にかなり汚れたこびりついているのが分かるだろう。Tweetプログラミングするのに数学の知識はあるに越したことはない。どのくらいあったら良いかの判断は難しい。プログラミング言語の知識や、用意されているツール・ライブラリ等を使って、まあ少し勉強すれば出来ることをやるだけだったら、高等学校の数学すら不要と思う。それでは、理屈は理解しないままプログラムをしているプログラマ程度で終ってしまう。AIに関するプログラムを書こうと思ってディープラーニングの本を開いたとたん、訳のわからないことだらけになる筈だ。理工系大学や高専で普通に教わる数学の共通部分程度の話にはついていけないと、非常に困る。いうことで、大学生向けに数学全般を扱ったシリーズ本を紹介しよう。この分野、昔からピンからキリまで色々出ているのだが、あまりにも本格的になると大変だ。数学専攻ならともかく、そうでない数学を道具として使いたい立場だと、やや軽めで、広く浅く、でもきちんとマスターすべきだ。それで、今回は、このマセマシリーズを紹介しよう。理工系大学の生協書籍部や大手書店の数学コーナーに行くと平積みされていることが多い本である。説明の仕方は、従来の大学の教科書とは大幅に違い、高校数学の受験参考書といった感じだ。丁寧に書いていることは間違いない。このシリーズで読むのが困難と言われたら困るのだが、文系の人でも大丈夫なように「大学基礎数学」があり、さらに高校数学レベルのシリーズもあるので、そのあたりからやれば誰でも大丈夫かな。いくつかの問題がある。これは、あくまで入門参考書なので、レベルの高い部分はバサバサと切り捨てられている。初めからもっと高度な本を読んでもよいし、これで基礎を固めてから、本来読むべき本格的な本に行っても良い。他のシリーズでもだいたい同様なのだが、マセマでは右図のような順番で勉強することを推奨しているようだ。この「偏微分方程式」まで分かれば、ディープラーニングの原理もすっと分かるのではないかと思う。AIをやるのだったら、確率・統計関係はもっとしっかり勉強しないとダメだろう。1つ大きな問題は、本シリーズは大学理系共通で従来教えていた数学の範囲になっていて、情報系で必要とされている数学分野の多くが抜けていることだ。あるし、さらに目指す分野によって違ってくる。大学の情報系のシラバスを見ていると、これらはアルゴリズムの中に含まれていることが多いというか、アルゴリズムの中にあまりにも色々な分野が突っ込まれている感じがする。この分野は、対象者が理工学全般に比べるとずっと少ないためか、シリーズというようなものはあまりないようだ。(あるのかな?)ただの使い捨てプログラマなら数学は不要かも知れないが、エンジニアになるには数学は必須、知ってて当然だし、そうでないと深い理解が出来ず、効率的なプログラムなど書けない。大学教養程度(1、2年)の数学は、参考書も多数あるし、ネットに転がっている無料コンテンツで勉強することも容易だ。大学、先生によっては、講義ビデオが全部公開されていることも多いので、大いに利用しよう。いや、それだけでなく、意欲ある高校生が高校の数学に嫌気がさして、大学の数学をかじってみるのもよい。Tweet日本では、JISキーボードというとてもガラパゴスなキーボードが一般的だが、世界標準であるASCIIキーボードとはキー配列が異なる。AからZまでは同じなのだが、記号が色々異なっている。プログラミングしたり、システムをいじっていると、どうしても記号を入力することが多いのだが、場所が違うと非常に困るのだ。次第にコンピュータを買うとついてくる無駄に幅の広いJISキーボードが席巻するようになり、やむなくJISを使うように飼いならされてしまった。エンジニアとして敗北である。HHKBは、本箱の隅の方に追いやられていた。HHKBを使うことにしたのだ。HHKBでも、これは安いタイプだ。今まで、JISキーボードをつなげてUbuntuも動かしていたのだがHHKBを使うにはちょっと変更が必要になる。