J

近くの家に定期的に玉子を届けに来るおばさんがいる。いつも孫をおんぶして車でやって くるもんだから、目立つよな。

ある時気になって、養鶏場の方ですかって聞いちゃった。そしたら、そのおばさんの言う 事にゃ、養鶏場から数がまとまると届けて貰えるんです。それを、こうして配っているんですとの事。

玉子なら、スーパーなに行けば買えるんじゃありませんか。って言ったら、スーパーで売ってるのは ゲージに入れられた玉子を産む機械だから美味しく無いんですって。それに、病気にならない ように、抗生物質が与えられているんで、知らず知らずのうちに、玉子を食べる人も抗生物質を 摂取しちゃう事になり、良くないんですとの事。

じゃ、その養鶏場のやつは大丈夫なんですか?って聞いたら、そこからおばやんの マシンガントークが始まりましたよ。

その養鶏場は、養護学校を退職した先生が、いちから始めたとの事。生徒の就職先が無かったので 、一緒に働ける場を作りたかったそうな。杭を打つ所から始めた、文字通りの一から。

最初の頃は、野犬に襲われて全滅。網をきちんとしたが、犬の鳴き声に怯えて、鶏が産卵拒否。 冬になると、野菜や草が無くなるので、餌におからとかを与えていたら、黄身が白くなっちゃったとか いろいろと苦労が有った様。それらを一つづつ克服して、やっと軌道に乗ったそうな。

そんな苦労を知って、度々応援の積もりに買いに行ってたとか。人手が少ない中で やってたけど、まとめて定期的に買ってくれるなら、届けますよって事で、そのおばやんが 共同購入を名乗りでて、現在に到っているそうな。

平飼い(放し飼い)してて、餌にも独特の工夫がしてあるとか。有精卵になるように、ちゃんと 雄鶏も常駐してるそうだ。人権ならぬ鶏権を守っているんですな。採算度外視とまではいか ないだろうけど、にわとりさんと敬称をつけて、大事に扱っているとか。世に溢れる、 ブラック企業よりはずっとずっとましだな。

黄身がこんもりしてて、とても美味しいとの事。女房もスーパーで買う玉子は、殻が薄くて 水っぽいと抜かすので、一度そのおばちゃんに頼んでみようかな。

で、玉子が旨いか不味いかは、生玉子で確認するのが確実かな。それじゃ蛇みたいだな。 だったら、spam and eggs がいいんでないかい。それじゃPythonだろうに。 それにしても うまそうな料理が並んでいるな。 用法・用量を守って正しく食しましょう。食べすぎ注意の事。 前回、親子丼を用意したんで、たっぷりと堪能かなあ。こちらなら幾ら食べても太りません。

Pandas

最近は、データサイエンティストとか言う新種の職業がもてはやされているみたいで、 みんな金鉱を求めているんですかね。危ういビットコインに群がるよりは、少しはましかな。

ネットを探ると、 ITエンジニアのためのデータサイエンティスト養成講座 なんてのも見つかる。遅れまいぞって訳か。この分野だとRが今まではデフォだったみたいだ けど、最近はPythonも頑張っているのね。こんな記事も有るし

Rを手本にして、pandas: powerful Python data analysis toolkit も有るようなので、Rに乗り遅れたPythonな人も安心。本も出てるようなので、今から初めても 大丈夫。

PythonでRっぽいことができるpandasとか データ分析ライブラリPandasの使い方 が、本を持っていない人(オイラーだな)にもお勧め。

ブログを読むだけじゃ無く、手を動かしてみよーってんで、fedoraに入れてみる事にした。 パッケージになってたけど、Python3系を要求されたんで、止め。だって、当分はPython2で しょ。そんな事なんで、pipとやらを入れてから、その力を借りてpandasを入れた。 裏でgccがごりごりと動いていたよ。後は、使うだけだな。

In [1]: import pandas

In [2]: data = pandas.read_csv('2013.csv')

In [3]: print(data.tail(3))
     130101:03  118  80  60
716  131230:21  126  69  64
717  131231:04  109  70  56
718  131231:21  100  56  74

取り合えず、動いてるっぽいな。

In [4]: print data
<class 'pandas.core.frame.DataFrame'>
Int64Index: 719 entries, 0 to 718
Data columns (total 4 columns):
130101:04    719  non-null values
118          719  non-null values
73           719  non-null values
57           719  non-null values
dtypes: int64(3), object(1)

データのインデックスにInt64を使ってるって事は、膨大なデータもお任せあれって印だな。 もう少しオフィシャルPDFでも読んで、勉強してみるかな。

In [5]: data.describe()
Out[5]:
              118          73          57
count  719.000000  719.000000  719.000000
mean   114.666203   68.791377   61.312935
std      8.866535    6.809659    4.714493
min     93.000000   50.000000   52.000000
25%    109.000000   64.000000   57.000000
50%    115.000000   69.000000   60.000000
75%    121.000000   73.500000   65.000000
max    138.000000   86.000000   74.000000

Rにそっくりだなあ。それにしても、列の名前を強制するのもR譲り。勝手に初行のデータを 列名に使うのは、いかがなものかと。

APL

話はくるりんと変わって、たまたま見つけたやつ。APL APLって、何のひねりも無く Array Processing Language の頭文字を取ったやつ。ほら 似てるでしょ、LISPと。LISPってのは、List Prosesserから頂いているんで、似たり寄ったり だな。Lispを好きな人なら、Listの変わりにArrayを取ったAPLもきっと好きになるはず。

R言語とも、そこはかとなく似てるとか。Rと上でやったPythonのpandasとは似てるから、 三段論法で行けば、APLとPython は似てるってなるけど、どうよ。

APLって言えば、特殊なキーボード刻印が必要で、困っちゃうなあってなる訳だけど、 この記号が全部ユニコードに収録されてるってのは、IBMの底力なんでしょうかね?

APLに似てる言語って事で いろいろ紹介されてたよ。一つやってみるかね。

J

って事で、Jを取り上げる。検索性で損をしてますなあ。まあ、ぐぐるが出て来るより ずっと前だから、そういう考慮は無かったんよ。で、苦労して見つけた資料がこれ。

配列計算言語APLとJのコーナーjlang入門 こちらの方も J言語入門 って事で、やっておられた。

J言語最速基礎マスターとか J言語基礎講座が、よくまとまっていて、お勧めです。

余り人気が無いみたいね。でも、乗りかけた船だから、どんなものか付き合ってみよー。 食べず嫌いは、いけませんよ。

J on manjaro

おいらの作法に則り、ソースから作ってみる。環境は万次郎Linux。doc/readme.txtを 読むとコンパイル方法が書いてある。jconsoleを作れ。libj.soを作れってね。 libjの所で引っかかった。sonameなんて無いぞって言われるんだ。binの下にshell語で 書かれた設定ファイル(jconfig)が有ったので、以下のように修正。

if [ $un == Linux ]
then
SOLINK="  -shared -Wl,-soname=libj.so -lm -ldl -o "
SOSUFFIX=so
fi

そしたら、無事に出来たみたい。試運転もしておくか。

[sakae@manjaro jgplsrc]$ j/bin/jconsole
   i. 5
0 1 2 3 4

これが有名なiotaの元か。SchemeのSRFIを書いた人は、APLかぶれな人だったのね。出目が 分かっちゃうよ。

気をよくしたおいらは、jconfigファイルのLinuxってなってる所をFreeBSDにしたら FreeBSDでもJ出来るんじゃなかろうかと思って実験してみたんだ。そしたらコンパイルは 出来たんだけど、リンクが失敗した。ひょっとして、上記の -ldlを何とかしたら何とか なったんでは無かろうか。もう少し粘ればよかったかな。

   -3
_3
   aa =: 3 1 4 3 1 6 7 1
   aa
3 1 4 3 1 6 7 1
   +/ aa
26
   2 + aa
5 3 6 5 3 8 9 3

マイナスは、アンダーバー(マイナス以外の文字)で表記されるのは、関数言語族の特徴だな。配列も、ただデータを 並べるだけ。合計は、プラス記号をスラッシュで修飾させるのね。と、単純に理解してたら そうじゃないみたい。プラス記号を、配列の要素間に挿入するんですって。これって、脳内 foldを実現してんだな。 プラスの前に単一数字を置くと、それが配列の各項に適用される。

   9 - 3 - 1
7

そして、衝撃的なやつが上記の例。これ壊れていないか? 普通に計算したら5になるだろうに。 いいえ、Jでは右側から(しかも演算子の優先順序無しに)評価してくって約束なんです。 すなわち、9 - (3 - 1) って計算するんだそうです。変態言語ですなあ。 変態度はいろいろな所に及んでいて、割り算演算子が / じゃなくて、% だったり するんで、びっくりモード炸裂ですよ。

   2 3 4 + aa
|length error
|   2 3 4    +aa
   1 2 3 + 4 5 6
5 7 9

サイズが合わないと怒られるけど、サイズが一致してるとちゃんと足し算してくれる。haskell あたりにあるzipwithみたいな動きをするのね。

   c =: 3 4 $ i. 12
   c
0 1  2  3
4 5  6  7
8 9 10 11

3行4列の行列の作成。$(と言う関数)の前にも引数が付けられるってのがAPLの流儀。関数の 演算対象は通常配列とかになるんで、それは関数の右側に位置する。

   'hello' ; 2014 ; 22 33
+-----+----+-----+
|hello|2014|22 33|
+-----+----+-----+

boxって言うらしい。何でも入れられる。タプル相当かな。

   6!:0 ''
2014 2 5 7 46 25.323
   7!:3 ''                 NB. free memory
  64 1284
 128  584
 256  146
 512   75
1024   52

n!:i って形をしたものを外部接続子と言うらしい。Jの外側とのやりとりだな。nが接続先の 大枠を決め、iが詳細って事だ。大枠の6は時間関係。詳細の0は、現在の日時の取得。その後の 文字列は、多分パラメータを指定するのだろう。大枠の7はメモリー関係。3は、フリーメモリーの 取得ってなってる。

詳細は、Helpの所の辞書の部(Dic) Appendix A. Foreign Conjunction に載ってる。 Jの説明書を見ると分かるんだけど、言語と言うぐらいだから、名詞(データ)とか動詞(関数) とかって分類がバンバン出てくる。先の関数の前に付く引数なんかも、修飾師って言うのかな。

言語だから、辞書が有っても当然と言えば当然だな。こういう捉え方って文系の人に受ける のかな。英文科の人なら、ほとんど記号で表された関数を、暗記して使いこなすのは容易 だろうな。理系の人は理詰めで考えるから、習得まで、容易ならざる苦労が有るんだろうな。

所で、何で J なの? 答えはdocsの中の取り扱い説明書に書いてあった。

Why "J"? It is easy to type.

さも、ありなん。

About sourcies

折角ソースから入れたので、成分を少し見ておくかな。

[sakae@manjaro jgplsrc]$ ls *.c | wc -l
124
[sakae@manjaro jgplsrc]$ ls *.h | wc -l
30
[sakae@manjaro jgplsrc]$ wc *.c
    106     361    4296 xs.c
    304     621    7575 xt.c
    153     373    3214 xu.c
  33018  106565 1153812 合計

結構沢山のファイル軍から出来上がっている。この他、ヘッダーファイルの行数は、5000行を 超えてた。歴史を積み重ねると、こうして成長してくんだな。

それにしても、ファイル名から扱っている分野をさっぱり想像出来ないよ。a.c,v.cって何よ? xu.cって何を 扱っているの?意味不だな、ってんで開いてみると

[sakae@manjaro jgplsrc]$ head xu.c
/* Copyright 1990-2011, Jsoftware Inc.  All rights reserved. */
/* License in license.txt.                                   */
/*                                                                         */
/* Xenos: u: conversions                                                   */

#include "j.h"
#include "x.h"

// utf-8 to c2v - assumes valid utf-8 data and snk of right size
static void mtow(UC* src, I srcn, US* snk){ US c,c1,c2;

とか、かろうじて冒頭付近に、申し訳程度にコメントが挿入されている。コードを見ても いかにも機械が出力しましたって感じで細密コードになってるし。思わずlintして人間様が 読めるように整形したいぞ。大丈夫、全身124箇所を整形したってただですから。 どこかの国の整形フランス人形様みたいに、お金はかかりませんから。

手書きと思われるのは、jconsole.cぐらいかなあ。後は、ひたすら、いろいろなテーブルが 並んでいたり、マクロが多用されていたり。もしこれらを手書きしてたとしたら、特殊分野に 才を発揮するサバン症候群の人か天才な人だな。

まあ、天才だから変態言語を設計出来るんだろうけど。そうそう、JはAPLの反省の上に 作られたって聞いたんで、痕跡が無いか探してみた。

[sakae@manjaro jgplsrc]$ grep APL *.[ch]
p.c:/* Parsing; see APL Dictionary, pp. 12-13 & 38.                    */
vbang.c:}}   /* P.C. Berry, Sharp APL Reference Manual, 1979, p. 132 */
vcant.c:}    /* dyadic transpose in APL\360, a f"(1,r) w where 1>:#$a  */
vd.c:}    /* R.K.W. Hui, Uses of { and }, APL87, p. 56 */
vfrom.c:/* Verbs: From & Associates. See Hui, Some Uses of { and }, APL87.         */
vrand.c:}    /* P.C. Berry, Sharp APL Reference Manual, 1979, p. 126. */

もっと沢山、過去を引きずっているかと思ったけど、余り無いようだね。歴史と言えば、js.hに いろいろなマシン名が詰まっていたぞ。

#define SYS_AMIGA           1L              /* DICE                        */
#define SYS_ARCHIMEDES      2L
#define SYS_ATARIST         4L              /* GCC                         */
#define SYS_ATT3B1          8L              /* System V C                  */
#define SYS_DEC5500         16L             /* GCC                         */
#define SYS_IBMRS6000       32L             /* AIX XL C                    */
#define SYS_MACINTOSH       64L             /* Think C                     */
#define SYS_MIPS            128L            /* GCC                         */
#define SYS_NEXT            256L            /* GCC                         */
#define SYS_OS2             512L
#define SYS_PC              1024L           /* Turbo C                     */
#define SYS_PCWIN           2048L           /* Watcom C 386                */
#define SYS_PC386           4096L           /* Watcom C 386                */
#define SYS_SGI             8192L           /* GCC                         */
#define SYS_SUN3            16384L          /* GCC                         */
#define SYS_SUN4            32768L          /* GCC                         */
#define SYS_VAX             65536L          /* GCC                         */
#define SYS_HPUX            131072L         /* C89                         */
#define SYS_LINUX           262144L         /* GCC                         */
#define SYS_FREEBSD         524288L         /* x86 only                    */
#define SYS_NETBSD          1048576L        /* GCC                         */
#define SYS_SUNSOL2         2097152L        /* GCC                         */
#define SYS_MACOSX          4194304L        /* GCC (CC)                    */

#define SY_64               0    /* 64-bit systems                         */
#define SY_WIN32            0    /* any windows intel version              */
#define SY_WINCE            0    /* any windows ce versions                */
#define SY_LINUX            0    /* any linux intel version                */
#define SY_MAC              0    /* any macosx intel or powerpc version    */
#define SY_MACPPC           0    /* macosx powerpc                         */

J on Fedora

GUIでぐいぐいとやりたくなったらどうする? そういう時は、発展性のあるj701a_linux32.shを 入れるのかな。今度はFedoraでやってみる。

落としてきたファイルがshになってるってのは懐かしいねえ。昔のjavaがこういうスタイル だったよね。どんな事をやってるか、このファイルを覗いてみた。

#!/bin/sh
product=j701
lines=47
  :
mkdir -p "$folder" || fail
tail -n +$lines $0 >"$folder/install.tar.gz" || fail
cd "$folder" || fail
tar -xzf install.tar.gz || fail
  :

ファイルの後ろにtar.gzファイルが連結されてるんで、そいつを取り出して展開してる んだな。gnuのツールは便利すぎ。man tailして

       -n, --lines=K
              output the last K lines, instead of the last 10; or use -n +K to
              output lines starting with the Kth

こんな事が書いてあったので。ああ、気になってBSDのtailも調べてみたら

     The display begins at a byte, line or 512-byte block location in the
     input.  Numbers having a leading plus (‘+’) sign are relative to the
     beginning of the input, for example, “-c +2” starts the display at the
     second byte of the input.  Numbers having a leading minus (‘-’) sign or

ちゃんとサポートしてた。歴史の所に、A tail command appeared in PWB UNIX. って 書いてあったけど、PWB UNIXってどういう系譜よ?

インストールの最後に、これからの道筋が示される。いかにもっていうjgtkってのを 起動すればOK。jhsってのは、JでもWeb出来ますよーーって証明なんだな。

jgtkを起動して、メニューからパッケージマネージャを起動し、全部選んで入れてやれば OK。でも、参考のためにWindows側にも入れたんだけど、Win側に有ってLinux側に無い メニューが有った。ランチパッドの一角なんだけどね。guiのメニューを下記のように 追加すればOK。

[sakae@fedora config]$ pwd
/home/sakae/j701/addons/ide/gtk/config
[sakae@fedora config]$ tail launch.cfg
NB. can be customized as needed.

_Life;~Demos/gtk/life/main/runlife.ijs
_Minesweeper;~addons/games/minesweeper/uigtk.ijs
_Plot Demo;~addons/demos/plot/plotdemo.ijs
_isigraph Demos;~addons/demos/isigraph/isdemo.ijs
_wd Demos;~addons/demos/wd/demos.ijs
_Open Gl Demos;~addons/demos/opengl/demo/run.ijs

面倒なこった。でも、綺麗なグラフィックとかグラフを堪能出来たよ。 まあ、綺麗なグラフとかを見たいなら、何もJを入れる必要は無い。オフィス何とかを 入れる? ブブー。そんな事を思うのは、M$かぶれ人die。

綺麗なおねーさん好きですかってCMが昔有ったような気がするけど、今だと綺麗なグラフ 好きですかってCMがぐぐるから出てるのね。 google-chartはいいんだけど、 データを抜き取られるとか、無いかなあ。昔から綺麗なバラには棘があるって言うから。

J on ipad

こういうのは、習うより慣れろだな。慣れるには、いつもさっと動かせなければならない。 パソコンに入ってると、パソコンを立ち上げてって事で、ついつい億劫になってしまう。 作者さんは、その事を良くご存知。

近頃身近にあるって言えば、そりゃパソコンより i何とか でしょ。そんな訳で、 Jsoftwareをみると、いの一番にiPhone/iPadの 案内先が出てた。こりゃ、入れてみる鹿。

アイコンは赤い字で J だけですよ。デザイン楽でよかったね。それはともかく、ちゃんと グラフもサポートしてた。

load 'plot'
'bar' plot 1 2 3 4 5

とか、やるとちゃんと綺麗な棒グラフを書いてくれた。

J602

新しい言語って事で、自習書を見ながらやってるんだけど、その中で亀さんグラフィックが 出てきた。J701の環境では、そんなの無いよとつれない返事。自習書は、J601系を元に 書かれているんで、ひょっとしたらJ601には入っているかなって思って、Window7に入れてみた。 そしたら、入っていたよ。

load 'turtle'
show repeat 5 fd 1 rt 360r5

これで、5角形を書いてくれる。360r5ってのは、360/5っていうJ的な表現だ。 簡単なので、いろいろやってみると、LOGOの気分に浸れるよ。

Jで統計のお勉強

以前、pureで統計ってのをやった。データの固まりがリストになってたんで、それをmapしたり foldしたりするのが非常に楽だった。Jでも同じだろうと思っていたら、やっぱり同じだった。 統計で金もうけってんで、金融分野で昔から、こっそり使われていたらしい。 何たって、目の前にニンジンをぶら下げられれば、馬は走るけど、人間だっておんなじさ。

Jで統計って指南書があったので、練習がてらやってみた。

   T
3.4 5.5 7.7 10.2 8.5 7.6 10.1 11.5 6.9 2 2.3 5.9 7.6 1.8 3.3 1.7 2.6 6.6 10.3 9.4 7.2 8.8 10.2 10.7 10.8
   mean T
6.904

これ、なんだか気象庁から頂いてきた、3月の温度データらしいです。平均気温が7度って、 どこなんでしょうね? meanの定義は

mean=:+/%#

らしいです。meanってのは関数名。引数は記載無し、って事はここでもポイントフリーが 炸裂してる。#ってのは、pureにも有ったけど、配列のサイズを求めるやつ。あれ? pureを 書いたドイツの人はJのたしなみも有ったの?

シャープの右側のパーセントは、Jでは割り算っていう変態仕様だったな。更にその右にある やつは、プラス・スラッシュで一つの動詞で、pure風に言うと、foldl (+) だったな。 都合、3つの関数の寄せ集めだ。

Jでは、関数を寄せ集めた場合、特殊な動作をする事になっている。寄せ集めって言ったけど、 pure語とかで言う関数合成。

変数を x、yとし、関数を、f、g、h とすると

f & g y          f (g y)             
(f g) y          y f (g y)           
x (f g) y        x f (g y)           
(f g h) y        (f y) g (h y)
x (f g h) y      (x f y) g (x h y)

関数2個の組み合わせをフック、3個の組合わせをフォークと言うらしい。それ以上 組み合わされた場合、右側からのフォークが優先される。関数が4個以上並んだものを トレイン(列車)と言うらしい。フォークって欧米では3枝なんかな。ああ、ケーキの お皿に付いてくるのは3枝だな。

4両の列車、e f g h の場合、e (f g h) って形になるんだな。

こう考えると、上記のmeanは、分かり易いpure語に翻訳すると

mean xs = sum xs / # xs

フォークの片変数版だったのね。もう一つだけやってみると

   3 max 5
5
   max 5 1 9 2 6 8
9

maxって動詞だけど、引数が両側にある2項演算子的な使い方と、片方にしかない使い方が ある。これ、どうやって定義されてるか見ると

max=:3 : 0
   >./y 
  :
   x>.y 
)

コロンの前の3が単項演算子の指定。コロンの後ろのZEROは、コッカが現れるまで複行 指定可能って意味。定義中にまたコロンが出てきて、4って事になって2項演算子の 指定に移るんだな。なんとまあ、変態チックだわなあ!!

最後に、プログラミング言語「J」がオープンソースされた あたりを参照しつつ、終わりにしましょうかね。ああ、APLは、A Progiramming Language から取ったと言う説もある事を付け加えておきます。