Monday, March 13, 2017

コンビニ受け取り

宅配の再配達の負荷が重いという話を聞くので、ちょっと優しい気持ちを起こして、アマゾンで本を買った折、コンビニ受け取りにしてみたわけです。

今回はヤマト運輸で、ファミマでの受け取りでした。

そういえば前にもやったことがあるのですが、簡単なことをわざわざ面倒にしていますよね。


1. メールで「荷物の受け取り方」が連絡される。そこにはお問い合わせ番号と、認証番号が一緒に書いてある。

2. ファミマにゆき、ATMの隣のFamiポートという機械を見つける。荷物受け取りのメニューを探し、そこにお問い合わせ番号と、認証番号を入れる。(認証って何や?なんで番号が2つあるんだよ、と心の底で文句を言う) レシートのような長い紙が出てくるので、レジに持って行く。

3. レジ係は、その紙の上のバーコードを読み込んだ後、荷物を探して来て、荷物の上のシールにサインをするように言う。

4. サインしたシールを荷物からはぎ取ると、A4の紙がカウンターの後ろの方で印刷されて来る。レジ係の人はゴム印を取り出し、3箇所ほどスタンプを押し、紙の一部を受領確認書として荷物と一緒に私にくれる。ここに最初のお問い合わせ番号が書いてある。それはもう知ってるよ!


最初からバーコードの絵をメールで送ってくれれば1,2は省略できるだろうし、3のサインってそもそも何よ?と思いますよね。それに受領確認書って言うデカイ紙の意味がわからないんだけど。

Wednesday, March 08, 2017

クジラ構文

ああ、クジラ構文って実際に使うんだなあ。
"It is no more necessary to understand monad theory to perform Haskell I/O than it is to understand group theory to do simple arithmetic."

Tuesday, March 07, 2017

長い春休み

前の会社をやめたのが2013年の夏、今までいた会社に3年半いて、このほど退職しました。

二度めとなると、一回めとの違いはありますね。

少しの間、仕事はせず、静かにしている予定です。


Friday, March 03, 2017

Haskellのプログラミングで感心した話

プログラミングの演習みたいなものです。以下のような数字の山があると思ってください。一番上の3からスタートして、一個下の段の二つの数字(7,4)をたどり、さらに7からは(2,4)のいずれか、4からは(4,6)のいずれかを通り、一番下の段にたどり着いた時、その経路のうち数字の和が最大となるものを求めよ。


この図は4段のものですが、段数Nに対して、経路の選択は$2^N$あるので、総当たりするのは大変だね、ということで、以下のような作戦で解きましょうと教わります。


右の山は3段目までをやったところですが、2段目は(7+3, 4+3)が(10,7)と計算してあり、3段目にきたところで、真ん中で選択肢があって$4+10, 4+7$のうち、結果の$14, 11$の大きい方を選んで14と決めてしまう。両端の12,13に選択肢はないので足した結果を書くのみです。このようにして順々に計算してゆけば、各点の値を決めてゆくだけなのでオーダとしては$N^2$となって、$2^N$に比べて大きく改善、というわけです。

というのがこの話の前提なのですが、私が自分はダメだなあと思うのは、このことをこんな風に書いてしまうのですね。



sが結果が入るところで、xに数字の山が入っています。間違ってはいないのですが、何が格好悪いかと言って、配列脳なんですよね。インデックスk,jで山の数字の場所を指定してるところです。C言語のプログラムではないので、リストが使えるわけで、もっとリストを使おうよ。

改善の方法として、リストであることを利用して以下のように計算します。2段目から3段目に行くところで、2段目の(10,7)に仮の0を前後に加え(10,7,0)あるいは(0,10,7)と、3段目の(2,4,6)の和を計算します。

その結果が(12,11,6), (2,14,13)となり、項ごとの最大値を計算すると(12,14,13)となる。前の結果と同じです。

Pythonのままやってもいいのですが、この辺からHaskellでやってみましょう。数字の山は[[3],[7,4],[2,4,6],[8,5,9,3]]で与えられているとします。


これがプログラムの全体です。うん。一行。簡潔。

++はリストの連結で、zipWithは二つのリストを並べて頭から順々に関数に食わせる(この場合は+なので足し算)。\はラムダ式の開始で、この場合は引数a, bに対する処理。foldl1はリストの左から順にやって行くpythonでのreduce処理に相当するものです。結果は一番下の数字それぞれに相当する値が出てくるので、そのうち一番大きいものを選ベば答えになります。



これで終わり、と言いたいところですが、まだもうちょっとあります。上のやり方で、0を足したりしているところが格好悪かった。

そこで今度は数字の山を下から見てみようというわけです。

左の図のように、一番下の(8,5,9,3)の尻尾と頭をそれぞれ一個削った(8,5,9), (5,9,3)の項ごとの最大値を(8,9,9)と計算し、これを一段上の(2,4,6)に足す。その結果が(10,13,15)、同じことを繰り返して一番上までたどり着いたらおしまいです。

この方針で書いたのが以下です。



[0]を足すところがなくなり、さらにスッキリしたというわけです。initは尻尾を一個切るもの。tailは頭を一個切る処理です。foldr1はリストの右から(つまり山の下の方から)やるという意味です。

この簡潔さがすごいと思った次第。





Sunday, February 19, 2017

アナログでローテクなアレ

あの名前って何だろう、と時々気になる。アレ。

1. 気送管

Wikipedia

昔のオフィスで、別の階に書類を送るために考えられたもの。茶筒ほどの大きさの容器に書類を丸めて入れ、壁にあるパイプの蓋を開け、容器を投入すると、しかるべき場所に届く。

「未来世紀ブラジル」という映画では机の横にあるパイプから次々に仕事が送られてくる情景が登場する。

ちなみに私の世代の人でも仕事で使ったことがある人はほとんどいないと思う。しかし、うちの近所の「家具の大正堂」では今でも使っている。ということは今でも販売・メンテナンスが行われているということか。

こういうのをGoogle検索で見つけるのはなかなか根気が必要。

いうなれば、コンピュータの世界では「茶筒ほどの容器」がパケットであって、それがネットワークというパイプで送られているわけだが、PDFがパケットの内容であったものが、合理化され、肝心なデータだけで良いということで、JSONになり、などと進化しているというわけ。

英語ではPneumatic tubeというらしい。


2. 伝声管

Wikipedia

操縦室の船長がラッパに向かって司令を叫ぶと、管を通じて機関室で聞こえるアレ。実物は見たことがない。

英語ではSpeaking tubeっていうのか。いいなあ。ちょっと感激。




Saturday, January 07, 2017

「豊穣の海」の「昴」の黒子について

学生の頃、三島由紀夫の豊穣の海4部作を読んで、内容以前に気になったことがありました。この物語は主人公の松枝清顕の転生が主題になっていますが、転生した人物の脇腹にある「昴(スバル)のような3つの黒子(ホクロ)」がカギとなっています。

気になったのは「スバル」で、スバルってのはこれです。プレアデス星団です。


3つではないのです。ちょうど今の季節、夜中に天頂付近に見えていると思いますが、もやっとした塊に見えます。

3つの星、ということだと、オリオン座の三つ星のことじゃないかなあと思うのですね。オリオンのベルトの位置の3つの星です。


スバルの場所はオリオンの右斜め上あたり。

無粋なことのようですが、物語の中で「昴」は何度も出てくる大事なことで、学生時分の私はこのことが非常に気になっていました。

その後、もう25年も前のことですがアメリカにいた頃、地元の日本語誌に、日本文学を英語で紹介されている翻訳家の方が、日米の編集者のチェックの仕方の違いを書かれていました。アメリカの編集者の権限は大きく、誤りやわかりづらい点を作家に指摘してくる、翻訳についても例外でなく、翻訳のみならず原作にさかのぼる指摘があって翻訳者としては困ることがある、とのことでした。例として三島由紀夫の小説(どの本だったかは失念)が挙がっていました。一方、日本では大作家の作品に編集者が口を挟むことはないので、結果として全責任は作家にあることになる、という話です。

この記事を読んでこの翻訳家の方に、スバルについて御存知ですか、という内容の手紙を書いたところ丁寧な返事を貰いました。翻訳家の方から別の文学者の方に照会してくださり、その方の手紙のコピーが同封されていました。それによると「土屋氏が指摘の箇所は、私も前々から気になっていたところです。.... 編集者がチェックし、勇気をもって作家に注意を促すべき事柄だったのではないでしょうか」とのことでした。ということで私の気は済んだのです。

実家で片付けをしていたら、この手紙が出てきたので、ブログを書きました。

最近この翻訳家の方がJapan Timesに記事を書かれているのを見つけました。御健在なようですね。

Sunday, December 18, 2016

RaspberryPiの軽量分散処理

うちに2台のRPiがあり、FreeBSD11.0で動いています。これを両方同時に使ってみたい。

分散データ処理というと、Hadoopを思い浮かべることが多いのですが、RaspberryPiではどうでしょうか。うちの初代RPiでJavaがそもそも動くか疑わしいしいですね。また「Interface」誌の11月号のラズパイ特集にMPIを使った例があるのですが、ちょっと大変だなあという感じ。

つらつらと考えていて、SunのRPCというものがあったのを思い出します。Remote Procedure Callです。今でもNFSでは使っている。サーバ側で定義したサービスを、クライアントから呼び出せるものです。

もっと安直な方法があるんではないか。調べるとPython3ではXMLRPCというものがあるじゃないですか。何故にXMLかというと、関数名とパラメータをXMLでフォーマットするから。RPCが呼び出せます。(Python2ではモジュール名が少し違う)

多重化はどうするか。Pythonではmultiprocessing。プロセスで多重化します。クライアントで処理を多重化して、mapで複数のサーバを呼び出して、結果をreduceする感じになります。まあこれでなんちゃってMapReduceができる。

試しに、以前ここに書いた数独のソルバを使ってみました。クライアントで問題を半分に分割して、2台のRPiに投げます。まあ普通に動きますね。

課題はいくつもあります。

  • XMLPRCで渡せる型に制限がある。
  • multiprocessingやXMLRPCで渡す関数が固定的。RPCの方はサーバで定義した関数のみ。これは仕方ない。multiprocessingにラムダ式を渡そうとすると怒られるようだった。
  • クライアント側はプロセスで多重化するので、あまりスケーラブルではない。まあうちの場合は2台だし、困るほど大きな問題はやってないので問題ないが。
  • ノードの管理と、エラー処理。もちろん数独がこけても構わないですが。

数独はクライアントと複数サーバで実装しましたが、IoTぽいものの場合はサーバ同士でお話しするパターンもありでしょうし、サーバで判断した情報をブラウザでまとめて見るということもできそう。

Saturday, December 10, 2016

平均寿命の国際比較

平均寿命というものが、個々人にとってどういう意味があるのかははっきりしないですが、平均寿命の国際比較(厚生労働省)というのがあります。

ニュースでは「日本が一位」「長寿日本」という報道の仕方をするので、なんとなく日本の医療のお陰かなと思っているのです。上の厚生省のデータを見ると、確かに日本は順序の上で一位が続いているのですが、実際の意味はあるんでしょうか。

例えば、男の平均は80歳程度なわけですが、自分がどうかというと、70で死ぬかもしれないし、90まで生きるかもしれないと思う。少なくとも±5歳くらいの誤差というか幅があるように感じますね。

そこで他の国を見ると、先進国、少なくともヨーロッパとは大差ないじゃないですか。どうしたニッポン。だいたいが男の場合70後半。誤差の範囲ですよね。まあロシアは低そうですね。不摂生だからでしょうか。アメリカも少し低いようです。

Aの平均と、Bの平均を比べる時に、AとBの差に比べてAやBの分散が大きいと、A、Bの区別はつかないというのが統計学のココロのはず(分散分析)。平均寿命に対する分散が幾つなのかは知りませんが、直感的に誤差の範囲と言って良いんじゃないでしょうか。

ヨーロッパのある国では、病院が混雑していて、救急車で運ばれないかぎりお医者さんにj見てもらえないだの、待合室で待っている間に死んだだのと悪口を聞きますが、その国の寿命も特に低くないですね。不思議です。イギリスの話として聞きましたが、ブリティッシュジョークなのかな。

もう一つは、寿命ってのは人種と関係ないように思えますね。体の大きさや肌の色は違うのに、寿命ってのは人間の仕組みが持ってる根源的なものなのですかね。


Monday, November 14, 2016

オンキョー

BoseのWave(2007年!)を使っていたのだけど、当初からCDが出てこなくなる症状があって、最近の一体型の機種を物色した結果、オンキョーになりました。Marantzの似た製品も検討していましたが、たまたま店頭で聞いた女性ボーカルの音が良かったでのオンキョーにしました。

CR-N765という「レシーバー」と、D-212EXというスピーカーです。我が家のオーディオはだんだん安くなってゆくなあ‥

Waveは子供に与えました。

そろそろ2ヶ月くらいになるけど、まあ良かったかな。音はWaveと似たような感じかなあ。スピーカーが離して置けるので、良くなったかも。あまり気にしすぎないようにしてます。

iPadやインターネットにはまだつないでないです。面倒だからやってないだけ。

Monday, October 31, 2016

Python3とPython2違いメモ

join
Python2では";".join(['a','b'])という奇怪な文法だったが、Python3ではは以下のようになっている。
 
>>> str.join(',', ['a','b'])
'a,b'
strはbuiltinのクラスなのでインポートする必要はない。

reduce
Python3ではfunctoolsの一部になった。functoolsをインポートする必要がある。
 
>>> from functools import reduce
>>> reduce(lambda x,y:x+y, [1,2,3])
6
map
mapが返すのはiteratorに変わった。listが欲しい場合はlistで囲む。
>>> map(str, [1,2,3])
<map 0x205b20b0="" at="" object="">
>>> list(map(str, [1,2,3]))
['1', '2', '3']
>>> 

多次元配列のsort
やりたいことは2つ目の要素でソートする、などのこと。Python2について昔ここに書いたことがあったのだけど、Python3ではkeyで渡すように変わっている。関数の書き方も変わったようだ。
>>> a = [[1,2],[3,0]]
>>> a.sort()
>>> a
[[1, 2], [3, 0]]
>>> a.sort(key=lambda x: x[1])
>>> a
[[3, 0], [1, 2]]
数の型
$ python2.7
Python 2.7.10 (default, Jul 30 2016, 18:31:42) 
>>> type(1)

>>> type(1.2)

>>> 
$ python3.5
Python 3.5.2 (default, Aug 16 2016, 05:35:40) 
>>> type(1)

>>> type(1.5)