R on OpenBSD (2)

トランプ爺には笑ちゃうね。ああ言うのを日本では、「身から出た錆」と言うんよ。錆を味方(Rust beltの連中)に付けてのし上がり、錆で身を亡ぼす。とか思っていたら、したたかな爺いは、転んでもただは起きぬ。「禍を転じて福と為す」方針。 お祭りはまだまだ続くので、暫くは楽しめそう。

国勢調査

巷では国勢調査が9月下旬から始まったようであるが、調査の基点は、10月1日の深夜0時なんよ。その時に愛人宅に居ると、不都合が起きる。気をきかせて、愛人は本宅に帰るように促したとか。 そんな真夜中の調査なら、提灯が足りません、どないしましょ? って、明治の頃の話ね。

住民票で十分だろうにを押し切って、実体調査が必要。八王子市みたいに大学が集中してる所では、住民票を移動しないで、在学してる人が多数で、万人単位の幽霊市民が居るとか。そういう実体を炙りだす。

オイラーは、1日の朝にやったよ。昔はもっと面倒だった気がするけど、もう働いていないので、就業関係の質問がカットされてたんだな。

最後にアンケート。e-statとっても使い辛いので何とかしろとRの人になった積りで苦言を書いたぞ。少なくとも、jsonでさっと取れるようにしろよな。

国勢調査の悪い点は、見返りが無いと言う事。それなのに根掘り葉掘りプライバシーに踏み込んだ質問がなされる。回答する人はたまったものでは無い。

従って調査員にはなりたくない。ひょっとしたら、 国勢調査員殺害事件 なんてのに巻き込まれるかも知れないし、 国勢調査で居留守で調査票を手渡しできません。 ってなって、頭にきて調査票を燃やしちゃったなんて事もありますから。

よって、ナンバーカードを強力に推進中。今はポイントとか言う飴をぶら下げているけど、そのうちにカードを持っていないと、医者にもかかれないと言う、真綿で首を絞めつける事態に持って行かれる。

そうなれば、みんなから嫌われている国勢調査は無くなる。ああ、無くなるんではなくて、総番号制で、紐付けが簡単に出来るから、それで賄ってしまうようになる。既に北欧では、そういう事態になっているそうな。

tofu(2)

前回OpenBSDのRでplotすると、文字が豆腐になった。ああ、若い人は知らないか、豆腐文字。いわゆる文字化けで表示出来ない時、□になっちゃう事を言うんだった。 一応、解決方法を見つけておいたんだけど、par(family='console')なんてのを.Rscriptに書くとエラーになってしまう。諦めムードなんだけど、きった世界には困った人が居ると思って、gg(ぐぐる)してみたんだ。検索語は、OpenBSD r-lang plot ぐらいね。 そしたら幸運な事に、 R plots on OpenBSD show graphics but text is replaced with placeholder images なんてのが引っかかってきた。

豆腐文字なんてのは、精進料理の類なんで世界では通用しないのね。言い回しは上記のように論理的に組み立てるのが正しい。思わぬ英語の勉強である。

それにしても、セキュリティー原理主義のOpenBSD上で、特殊用途のRを使ってる人が居て、オイラーは嬉しくなってしまった。4月前の質問で67回もアクセスされてた。オイラーもそのお仲間の一人って事です。 そして、質問者はオイラーと同じその場しのぎをやってた。

解決方法は、下記のフォントを入れるそう。

ob$ less liberation-fonts/pkg/DESCR
Liberation font software consists of TrueType-OpenType formatted font
software for rendering Liberation typefaces in sans serif, serif, and
monospaced character styles.
There are three sets:
 * Sans (a substitute for Arial, Albany, Helvetica, Nimbus Sans L, and
   Bitstream Vera Sans)
 * Serif (a substitute for Times New Roman, Thorndale, Nimbus Roman, and
   Bitstream Vera Serif)
 * Mono (a substitute for Courier New, Cumberland, Courier, Nimbus Mono
   L, and Bitstream Vera Sans Mono).

フォントの事はフォントに知らないオイラーなんだけど、以前調べた時に出て来た、Sans,Serif,Monoなんてファミリー?が伺える。さざ波フォントじゃいかん訳? よう分からん。

もう一つ解決法が提示されてた。

ob$ cat .Rprofile
# package load
options(defaultPackages = c(getOption("defaultPackages"), "dplyr"))
# default X11() setting
setHook(packageEvent("grDevices", "onLoad"),
    function(...) grDevices::X11.options(width = 5, height = 5, xpos = 0, pointsize = 10, type = "x11"))

X11なデバイスの初期化をロード時に行いましょって奴。何だかjavascriptの常用句みたいだな。パッケージがロードされる時に、無名関数で、オプション設定。そんな方法を登録しておくってね。

さてどちらを採用する? セキュリティー原理主義に則り、たとえフォントであろうとも余計な物は入れないって事で、後者の方法を試した。そして、ついでと言ってはあれだけど、表示エリアを5インチスクウェアにしておいた(画面が狭い為)。これで、喉につかえていた小骨が取れた気分ですよ。

Sys.getenv(2)

前回はひょんなことから、Sys.getenvなんてのを知った。普通は引数に環境変数名を与えるんだけど、引数無しでもOK。その場合は、shellでのprintenv相当の結果が返って来る。

大体仕組みは想像付くけて、ソースが有るんで、ねちっこく追ってみるか。曲がりなりにもRのユーザーなんで、仮設を立ててみる。

mainの第三引数にenvのポインターを指定しておいて、そこから手繰るのでしょう。それしか思いつかん、ってか、それしかI/Fは無いはず。一応、p値は、自信たっぷりに100ぐらいでしょう。バーカ、確率は0から1の範囲ですよ。

と言う事で、自信たっぷりに、main/Rmain.cを調べると、、、

int main(int ac, char **av)
{
    R_running_as_main_program = 1;
    Rf_initialize_R(ac, av);
    Rf_mainloop(); /* does not return */
    return 0;
}

大外れのすってんてんである。若し賭けていたら、身ぐるみはがされて、裸でほっぽり出される所ですよ。

よーし、裸一貫から出直しだ。腹にgdbを抱えてね。

(gdb) b do_sys[TAB]  ;; compleate
do_sys         do_syschmod    do_sysinfo     do_system      do_sysumask
do_sysbrowser  do_sysgetpid   do_syssleep    do_systime
(gdb) b do_getenv
Breakpoint 1 at 0x564cb24730d0: file sysutils.c, line 367.

do_sys に続く名前にどんなのが有るか確認。お目当ては無いぞ。野生の勘で、 do_getenv を指定したら有った。本当にそれで良いのか?

正確にやるなら、main/names.c に登録されてる対応表を調べる事だ。明治の頃の国勢調査で、通称名で熊と書いた人が咎められたそうな。役場で戸籍を調べたら、全く違う名前だったらしい。ユーザーは、気軽に Sys.getenv って、呼んでるけど、システムの手続き上は、 do_getenv って事だ。

{"Sys.getenv",  do_getenv,      0,      11,     2,      {PP_FUNCALL, PREC_FN, 0}},

=>      for (i = 0, e = environ; *e != NULL; i++, e++);
        PROTECT(ans = allocVector(STRSXP, i));
        for (i = 0, e = environ; *e != NULL; i++, e++)
            SET_STRING_ELT(ans, i, mkChar(*e));

昔やったな(2018-08-27)。environって言うグローバル変数に環境変数へのポインターがセットされてる。それを使って、まずはRの領域にエリア確保。続いて、そのエリアに値を取り込みって算段か。 なお、 SET_STRING_ELT は、etagで引っかかってこないけど、memory.cに定義されてた。

void (SET_STRING_ELT)(SEXP x, R_xlen_t i, SEXP v) {
    if(TYPEOF(CHK(x)) != STRSXP)
        error("%s() can only be applied to a '%s', not a '%s'",
              "SET_STRING_ELT", "character vector", type2char(TYPEOF(x)));

こういう風に、関数名が括弧で括られている場合は、誤解しちゃうからかな? こういう奴はCARだとかもそうだ。Lispをなるべく隠しているのだな。

一方、引数を与えて ('R_HOME') 呼ぶと

  =>          char *s = getenv(translateChar(STRING_ELT(CAR(args), j)));
  :
(gdb) p s
$9 = 0x7ffe1aada67c "/home/sakae/MINE/lib/R"

因子分析

正しいRユーザーは、統計処理に勤しむものです。ソースと戯れていてはいけません。と言っても、身近に統計処理したいものなんて無いぞ。

ちらちらとCQ社出版のインターフェース誌を見てたら、Rの連載が載ってた。今まで気がつかなかったよ。で、お題に因子分析ってのを取り上げていた。

オイラーもやってみるかな。例によって、セカンドオピニオンです。

Rと因子分析

Rで因子分析やってみた

因子分析とは

サンプルを落としてみたけど、みんなSHIFT-JISのデータだったりして、Windowsと言うかEXCELがはこびっている世の中に嫌気がさしますよ。やっぱり綺麗なデータじゃないとやる気Nothing。だからtidyを使えって?日本では、それ以前の問題ですよ。データ後進国、日本。

3D-graph

と言う事で、少し違う方面に手を出してみる。

ある人と話をしてたら、Rでも3次元のグラフ表示出来るんですよねと聞かれた。多分出来るでしょうけど、みんな2次元の少女達が好きそうだからどうかな。これはもう、勇敢にアタックしてみるしかない。

rglによる3次元グラフィックス

デフォで使うなら、latticeが有る。機能不足ならrglを入れろとな。

苦しみはやがて楽しみに変わるって、お前はマゾか? いいえ、苦しい思いをして山登り、その果ては、素晴らしい景色が待っている。 若かりし頃、寮で寝てたら、おい山へ行くぞと拉致された。して、青森駅前の市場で、ホタテ貝を調達。八甲田山へ登山。苦しくて苦しくて。。。でも、処女雪が舞ってた。 ベースキャンプを設営。

今日は、あの峰から滑ってみるよとか、クタクタになるまでスキー三昧。夜は、ホタテ貝を焼いて、ウィスキーで酒盛り。こういう時は日本酒ではアルコール度数が低いので、効率が悪い。運び上げるならウィスキー等の度数が高いのがお勧め。遭難しそうになっても、気付け薬になるしね。 夜は、余りに静かすぎて、幻聴が聞こえたぞ。佳き思い出だ。

国土地理院が素晴らしいデータを公開してくれている。 日本の主な山岳 。日本百名山でNHKとかも利用してるな。e-statの連中よ。こういう易しいインターフェースを見習えよ。

遊び方は、 山頂立体地図データ を参照。 鹿児島と言えば桜島だけど、単独峰である開聞岳でもやってみるかね。久しぶりの対面になるぞ、と。

etc