Gauche-package

詐欺P

防災無線で、息子をかたるオレオレ詐欺の前兆と思われる電話が多数かかってきておりますとか、還付金詐欺でカードの暗証番号を聞き出す電話とかの注意喚起が毎日なされている。

怪しい電話はすぐに切ってください、留守電にしておいて下さいの予防策も紹介してる。 そのせいか、直電は効率が悪いって学習したみたい。

そこで、SMS方面にも進出したみたい。オイラーの所にも入電したよ。

ご利用料金の支払い確認が取れておりません。
本日中に、050-XXXX-XXXX
あうファイナンシャルサービス迄ご連絡下さい。

発信元はSMSなんで、090-YYYY-YYYY という奴だった。

これを詐欺と見破れるか? 世の中AI盛り。多数の写真から猫を抽出しますとか、将棋馬鹿なAIとか。これらは、特定分野に強い、弱いAIって奴だ。強いAIは何時になったら出てくる?

本日中にって、そんなにせかせるの怪しい。そもそもSMSってのもなんだかなあ。携帯番号知ってるならまず電話でしょ。相手に電話かけさるってビジネスマナー違反と思うぞ。担当者誰なん? 等々、怪しさ満載だ。 強いAIは、こういうの考慮出来るのかな?

警察にかけこんで、その場で逆探知ってのを体験してみたいぞ。探知にはある程度の時間が必要ですから、なるべく話を引っ張ってくださいとかドラマみたいな体験をしてみたい。

まて、敵はそういう事は考慮済みなんだろうね。多分電話をリダイレクトしてるよ。ああ、電話を転送するしくみね。

じゃ、携帯へ直接電話して、その間に探知ってのはどうだ? これも対策済だろうね。GPSなんてあらかじめ切っているだろう。すると、ある程度の範囲までしか絞りこめない。木は森に隠せの諺どうりに、繁華街でしかも移動しながら、ね。それぐらいは頭が回るだろう。

携帯番号がバレているんで、そこへ返信。おだやかな案として、全く身に覚えがありません。本日中に電話願う。それとも過激に、通報 録音 逆探知 って返信かな。後の案だと、サギ師はびびって、携帯と固定電話を放棄するかな。

そうなれば、少しは被害が減るか。いや、相手は馬の耳に念仏、カエルに小便、厚顔無知な輩だから、そんな事ではひるまないか。

まあ、こういうのは無視が一番。近寄らないのが一番の対策です。

gauche-gl

前回からgauche-glをやったけど、過去にもやってないか、セルフ・ググるしてみる。 過去の投稿をgrepすると言う、全文検索ね。複数のキーワードで検索して、それをw3mに渡して表示出来る。190304な年月日に作成した。もうどんな風にしたか忘れたぞ。

sakae@pen:~/DB$ ./zg.sh gauche-gl
     1  ./111218.html
     2  ./090629.html

なんだ、FAQじゃん。我乍ら進歩ないね。それでも、毎年同じ事の繰返しの雑誌よりはましか。本当に唐突にやってるもんね。

gauche-package

という事で、関連事業の可能性を探ってみる。

Gauche の 外部パッケージ作成手順 メモ (Gauche v0.9.6 の場合)

gauche-packageを利用したgaucheの拡張モジュールの作り方

今でも通用するか、やってみます。

sakae@deb:/tmp$ gauche-package generate mine
sakae@deb:/tmp$ cd mine/
sakae@deb:/tmp/mine$ ls
configure*        Makefile.in  mine.h        mine.scm     test.scm
configure-compat  mine.c       minelib.stub  package.scm

ここまでは前回やった。拡張パッケージのひな型を作ってくれるんだな。

sakae@deb:/tmp/mine$ ./configure
checking package dependencies... ok
checking for gosh... /usr/bin/gosh
checking for gauche-config... /usr/bin/gauche-config
checking for gauche-package... /usr/bin/gauche-package
checking for gauche-install... /usr/bin/gauche-install
checking for gauche-cesconv... /usr/bin/gauche-cesconv
creating mine.gpd
configure: creating Makefile

configureするとMakefileが作成されるってのは、理解の範疇だけど、mine.gpdって何?

sakae@deb:/tmp/mine$ cat mine.gpd
;; -*-Scheme-*-
;; Gauche Package Description

(define-gauche-package "mine"
  :version "1.0"
  :description "Sample package.scm\nWrite your package description here."
  :require (("Gauche" (>= "0.9.10")))
  :maintainers ()
  :authors ()
  :licenses ()
  :homepage #f
  :repository #f
  :providing-modules (mine)
  :gauche-version "0.9.10"
  :configure "./configure"
)

多分gauche側から参照出来るようにした、概要ファイルなんだろうね。次はmakeだな。

sakae@deb:/tmp/mine$ make
"/usr/bin/gauche-package" compile \
  --cppflags="" --cflags="-g -O2 -fstack-protector-strong -Wformat -Werror=format-security -Wall -Wextra -Wno-unused-label" \
  --ldflags="" --libs="" \
  --local="" --verbose mine ./mine.c ./minelib.stub
gcc -c  '-I/usr/lib/gauche-0.97/0.9.10/include' '-I/usr/lib/gauche-0.97/site/include' -g -O2 -fstack-protector-strong -Wformat -Werror=format-security -Wall -Wextra -Wno-unused-label -fPIC -o 'mine.o' './mine.c'
gcc -c  '-I/usr/lib/gauche-0.97/0.9.10/include' '-I/usr/lib/gauche-0.97/site/include' -g -O2 -fstack-protector-strong -Wformat -Werror=format-security -Wall -Wextra -Wno-unused-label -fPIC -o 'minelib.o' './minelib.c'
gcc  '-L/usr/lib/gauche-0.97/0.9.10/i686-pc-linux-gnu' '-L/usr/lib/gauche-0.97/site/i686-pc-linux-gnu'  -shared -o mine.so 'mine.o' 'minelib.o' -lgauche-0.97 -ldl -lcrypt -lrt -lm  -lpthread

gauche-packageのやってる事が良く解る。最終目標は、mine.soを作る事。その材料は、mine.cとminelib.stubとな。

次は、出来上がったsoファイルの試験。

sakae@deb:/tmp/mine$ gosh -I. test.scm
Testing mine ...
testing bindings in #<module mine> ... ok
test test-mine, expects "mine is working" ==> ok
passed.

結局、中間作成物を含めると、下記のようになったよ。

sakae@deb:/tmp/mine$ ls
config.log        Makefile     mine.gpd   minelib.stub  mine.so*     VERSION
configure*        Makefile.in  mine.h     mine.o        package.scm
configure-compat  mine.c       minelib.o  mine.scm      test.scm

裸のtest.scmを呼び出さなくても、マナー通りに make check 出来るように仕込んであった。

sakae@deb:/tmp/mine$ make check
"/usr/bin/gosh" -I. -I. ./test.scm > test.log
Testing mine ...                                                 failed.
discrepancies found.  Errors are:
test test-mine: expects "mine is working NOW" => got "mine is working"
make: *** [Makefile:59: check] Error 1

期待値をちょっと書き換えて、エラーを発生させてみた。

sakae@deb:/tmp/mine$ cat test.log
Testing mine ==================================================================
testing bindings in #<module mine> ... ok
test test-mine, expects "mine is working NOW" ==> ERROR: GOT "mine is working"
failed.
discrepancies found.  Errors are:
test test-mine: expects "mine is working NOW" => got "mine is working"

エラーログもちゃんと収集されてる。素晴しいね。

example

次は、これを使っての実例だな。何か面白い物をと空想して、2piが出て来るやつが良いと思い付いた。

LC 回路

そりゃ、電気の分野でしょ。 LC回路 の共振周波数を求めると言う、古典的なやつが良かろう。

(use math.const)

(define (resf L C)
  (/ (* 2pi (sqrt (* L C)))))

; (resf 1e-6 500e-12)

コメントしてるS式は、1uHと500pFのLC回路。共振周波数は、7117625Hz,約7M帯の真ん中になった(良い勸してるな)。

ついでなので、回路定数が変った時の変動具合を確認。 1pF容量が変化するだけで、7KHzも周波数がずれる。これじゃSSB用のVFOとしては失格だな。 まあ、どうでもいいけどね。

検算用のサイトがあった。LC共振の周波数 こういうのを活用して、テストすればいいんだな。このサイトのコメントを読むと、ルートの計算が大変とか言ってるけど、そんな人には、上記のgaucheとこの関数を教えてあげたいぞ。年代が年寄族ってのがアレだな。

組込む

さて、これを組み込んで、発売する。主なクライアントは、1,2級アマチュア無線技士の受験生。

使いたかった2piのために、minelib.stubにuseを宣言したし、mine.scmには関数を登録したし、いざmake

sakae@pen:/tmp/mine$ make
"/usr/bin/gauche-package" compile \
  --cppflags="" --cflags="-g -O2 -fstack-protector-strong -Wformat -Werror=forma
t-security -Wall -Wextra -Wno-unused-label" \
  --ldflags="" --libs="" \
  --local="" --verbose mine ./mine.c ./minelib.stub
 *** CGEN-STUB-ERROR: invalid stub form: (use math.const)
    While compiling "./minelib.stub" at line 5: (use math.const)

あれ、盛大な間違いをしてるな。このファイルはS式を書けるんでschemeの世界と思ってたけど、全く別物。どちらかと言うとC言語よりのヘッダーファイルだな。

と言う事は、上で作ったresfは今回は出番が無い。S式をC言語に書き換えてみる(本末転倒もはなはだしいな。まあ、乗り掛けた舟ですから)。

sakae@pen:~/byC$ cat resf.c
#include <math.h>
#include <stdio.h>

float resf(float l, float c){
  float tmp =  6.283185307179586 * sqrt(l * c);
  return (1.0 / tmp);
}

int main(){
  printf("%15.2f\n", resf(1e-6, 500e-12));
}

一歩一歩確実に、試験しとく。

sakae@pen:~/byC$ cc resf.c -lm
sakae@pen:~/byC$ ./a.out
     7117625.50

よさそうなので、resfの関数をminelib.cに文字列として配置し、呼び出す側も定義する。

"
#include <math.h>

float resf(float l, float c){
  float tmp =  6.283185307179586 * sqrt(l * c);
  return (1.0 / tmp);
}
"

(define-cproc resf(l::<float> c::<float>) ::<float>
  (result (resf l c)))

C言語の引数区切りはカンマ、それに対してscheme側はスペース。頭ではわかっていても、とっさに切り換えられず、不要なエラーを多数見たのは内緒だ。

試験して実戦投入

sakae@deb:/tmp/mine$ gosh -I. -l test.scm
Testing mine ...
testing bindings in #<module mine> ... ok
test test-mine, expects "mine is working" ==> ok
passed.
(resf 1e-6 500e-12)
7117625.5

インストールしなくても、上記のようにして確認出来る。問題なさそうなので、基地に配備する。

sakae@deb:/tmp/mine$ sudo make install
"/usr/bin/gauche-install" -C -m 444 -T "/usr/lib/gauche-0.97/site/include"
"/usr/bin/gauche-install" -C -m 444 -T "/usr/share/gauche-0.97/site/lib" ./mine.scm
"/usr/bin/gauche-install" -C -m 555 -T "/usr/lib/gauche-0.97/site/x86_64-pc-linux-gnu" mine.so
"/usr/bin/gauche-install" -C -m 444 -T "/usr/share/gauche-0.97/site/lib"/.packages mine.gpd

一応配備されたか、確認。

sakae@deb:/tmp/mine$ gauche-package list
 Gauche-gl           0.6
 c-wrapper           0.6.1
 mine                1.0

問題なさそう。バージョンが1から始まってるって、よそ様に比べて強気だな。

で、配備されたのを確認。うごかないぞーーー。じっと配備の手配書をみる。実体なsoファイルが、64Bitの所に置かれているぞ。そう、64Bitのマシンでconfigureしたんだった。それを一式32Bitなマシンに持ってきて開発継続とインストールしちゃったんで、昔の配備計画通りに、64Bit環境へ行ってしまったんだな。こういう落とし穴も有るって事で。

sakae@deb:/usr/lib/gauche-0.97/site$ sudo mv x86_64-pc-linux-gnu/mine.so i686-pc-linux-gnu/
sakae@deb:/usr/lib/gauche-0.97/site$ gosh
(use mine)
(resf 1e-6 500e-12)
7117625.5

これにて、一件落着。まて、折角の機会なんで配備計画書、俗名Makefileを見て桶。

GAUCHE_PKGINCDIR  = "$(DESTDIR)${libdir}/gauche-0.97/site/include"
GAUCHE_PKGLIBDIR  = "$(DESTDIR)${datadir}/gauche-0.97/site/lib"
GAUCHE_PKGARCHDIR = "$(DESTDIR)${libdir}/gauche-0.97/site/x86_64-pc-linux-gnu"

ちゃんと環境に根差した配備計画をたてているのね。普通のcofigureが掃き出す難解なMakefileに比べて極めて簡潔。こうでなくちゃね。

ああ上でsoファイルを強引にmvしたけど、これは悪い見本です。正しくは、make clean; ./configre; make install です。

ruby-ffi

OpenBSDだとrubyXX-ffiてのとrubyXX-ffi-compilerってのと2種類有る。取り敢えずruby26-ffiを入れたよ。

ruby-ffi-compiler の方は、有り難さが解らないので、取り敢えず保留にした。

FFIで何をするかの例

vbox$ cat getpid.rb
require 'ffi'

module Foo
  extend FFI::Library
  ffi_lib FFI::Library::LIBC
  attach_function :getpid, [ ], :int
end
puts "My pid=#{Foo.getpid}"
vbox$ ruby getpid.rb
My pid=78877

rubyに負けるなでもう一例

一応、getpidのmanを見て億。これ、億の価値がありますよ!

NAME
     getpid, getppid – get parent or calling process identification

LIBRARY
     Standard C Library (libc, -lc)

SYNOPSIS
     #include <unistd.h>

     pid_t
     getpid(void);

これを組込むのが、第2弾だ。先の例では、C言語の関数が書下ろしだったけど、今度のやつは、既存のlibcにあるやつを呼ぶ事になる。簡単に書ければ、ruby-ffiに十分に対抗出来るぞ。

そう、さっと書いて蓄積しとくんだ。だから、どらえもんのポケットみたいな気分で使いたい。それを願って、mine.scmを編集してから、configureしたよ。

[sakae@fb /tmp/mine]$ cat mine.gpd
;; -*-Scheme-*-
;; Gauche Package Description

(define-gauche-package "mine"
  :version "0.1"
  :description "Pocket of DORAE-MON."
  :require (("Gauche" (>= "0.9.10")))
  :maintainers ("sakae")
  :authors ("sakae, bsd @ hamesspam.sakura.ne.jp")
  :licenses ("BSD")
  :homepage "https://hamesspam.sakura.ne.jp"
  :repository #f
  :providing-modules (mine)
  :gauche-version "0.9.10"
  :configure "./configure"
)

バージョン番号は、慎しい所からのスタートだ。

C言語での関数名はgetpidなんだけど、同じ名前じゃつまらんと言う偏屈な理由で、別の名前を登録した。

で、test.scmにちゃんとテストコードを書いておけってのが頭の隅にある。実行する度に異る値になる場合は、どうする? 心を広くするんだ。

[sakae@fb ~]$ cat test.sh
#! /bin/sh
echo $$
exec gosh -e '(use mine) (display (mypid)) (newline) (exit)'

サブシェルを起動してpidを確認、次はそのシェルをgoshに変身させて、pidを確認って流れ。どらえもんのポケット内では、mypidなんて名前にしたんだ。

[sakae@fb ~]$ ./test.sh
1511
1511
[sakae@fb ~]$ ./test.sh
1512
1512

これが確認例。FreeBSDやリナでは、pidが連番になるって弱点があるんで、悪い人に付け狙われかも。その点OpenBSDでは、ランダムなpidになるんで、いらん心配無用。gaucheも動いて欲しいぞ、とさりげなく。

先に書いたresfを、正規と思われる場所に移した。それから、今回のmypidを含めたものを、次の場所に置いておきます。どうぞ、叩き台にしてください。

mine.tgz

ちと気になった事がある。getpidの返り値が、 pid_t それに対して<fixnum>を割当てたんだけど、それでいいのかな? gcc -E でマクロ展開したのを使うから大丈夫、いまいち自信無し。

もう一点は、自動でリンクされるlibは、

-lcrypt -lutil -lrt -lm  -pthread

になってるけど、それ以外のものも追加したい場合、どこに書いておくのかな? 原始人なら、 Makefile中にある、LDFLAGSとかLIBSを埋めちゃうけど、それじゃ、あんまりっぽい。

Makefile.inを見ると、どこかから値を取り込むようになってるな。強引に書き換えてしまう手もあるけど、それもなあ悪手だと思うぞ。

ついでに、もう一点。インストール先をHOMEDIR/.gauche/ に指定出来て、デフォでそこを見てくれるようになったら嬉しい。

gemとかpipなんかだと、–localオプションで、HOMEDIRにインストール出来たはず。今回みたいに、わざわざmineってモジュール名にしてるのは、秘伝のたれ よろしく、どんどん追加していきたいから。そこに管理者権限が出てくるのは、重荷です。

sudoはセキュリティー的にどうよってのが有って、FreeBSDには入れていないって裏事情があったりします。

おまけで差分チェック

今回mine/の色々なファイルに変更を加えている。どのファイルに変更が入ったかは、下記のようにすると、簡単に確認出来る。

sakae@deb:/tmp$ gauche-package generate org
sakae@deb:/tmp$ diff -u -r org mine | less

なお、モジュール名が異るんで、モジュール名由来の余計なものも見えてしまうけど、それも勉強かと。

純粋な変更点だけを見たいなら、

mv mine MINE
gauche-package generate mine
diff -rq mine MINE
diff -u -r mine MINE | less

とかすれば良い。

まず、-rq で概要を掴み、それから太った内容の確認だ。 diffの見方は、冒頭にマイナス記号が付いてるのは削除。プラス記号は追加という意味になります。


This year's Index

Home