maximaとか(5)

朝、下の葡萄畑がやけに騒がしいと思ったら、おばちゃんの集団がブドウの取り入れをやっていた。 ぶどうの取り入れとワイン製造の第一工程であるぶどう踏み(潰し)は、民族衣装を着た華やかな 乙女の仕事と思っていたら、違ってて興が削がれちゃいました。(って、ここはドイツじゃ ありませんからね)

ブドウの王様、巨峰。ブドウの貴婦人、ロザリオビアンコ。フルーティなマスカット。色鮮やかな、 なんとかバイオレットとかいろいろ取れるよ。食べて良し、ワインに良し。マスカットのワイン なんて最高でっせ。密造酒作っちゃおうか(おいおい)

桃はシーズンが終わったかと思うと、しつこくネクタリンなんてのが出てきたりして息が長い。 ああ、梨も有るなあ、豊水だか幸水だか。正に食べるジュースですよ。後、おいらの初体験版で ある、生プルーン。干したやつは食べた事あるんだけど(そして、何故か腹具合が悪くなった)、 生き生きしたのは初めて。日本でも取れるんだ。そうそう、取れると言えばもうシーズンが 終わってしまったけど、子葡萄みたいなやつもそうでした。えっと名前何ってたかな。ほら、眼 にいいってやつです。(名前がぱっと出てこないのは、もうろくした証拠でっせ!)

リンゴは早生が出てきているけど、まだちょっとえぐぐてお勧めは出来ない。霜が下りるぐらい の時期まで待ったほうがいいな。その頃になると、柿って手もあるけど。

変なかぼちゃに出合ったぞ。普通カボチャと言うと、トウキョウディズニーランドにあるような 形(何と言う形容だ)の物を思い浮かべるけど、違うんだな。 胡瓜のおばけみたいに、長細いんだ。もうひとつへんてこりんなのがあって、名前をピーナッツかぼちゃと 言うそうな。ピーナッツの外殻を大きくしたと言うか瓢箪と言うか、ピーナッツ色してる。 かぼちゃスープにすると絶品。

枝豆もシーズンが終わったかと思っていたら、茶豆と言う名前でちゃっかり売られていた。 これって、残暑のお供にどうぞって事なんですかね。果物、各種野菜類に囲まれて幸せ。 近くの野菜販売所に行けば、これらが手に入る。あらかた100円で売ってて、財布も幸せ。

この販売所に、旨そうな赤ピーマンが陳列してあった。これは食べなくちゃと思って、レジへ 持って行ったら、『御客さん、これピーマンじゃなくて、激辛の獅子唐ですよ、食べると泣ける けど宜しいですか?』って、親切に教えてくれた。聞けば、よく間違えて買って行って、文句を 言いにくる人が居るとか。ああ、命拾いしたよ。そうそう、命びろいと言えば、怪しいきのこ の季節でもありますな。笑いたけぐらいなら許しちゃう?

Why Lisp

IEしてたら面白いエントリーを見つけた。

プログラマは皆どのようにしてLisperと化して行くのか?

よく集めましたねぇ。根性の成果でしょうか。ちまちまと見て行くと、JVMで走るらしいので なんてのが紹介されてた。どんなに良いものでも、どこでも走らなければ それは絵に描いた餅だ。どこでもったら、悔しいけど、JVMあたりが妥当な線だろう。

そんじゃ、何処でもSchemeはどうだ? The Kawa language frameworkとか SISCあたりが有名な所かな。今なら、GNU陣営に属したKAWAが 元気っぽい。ああ、元気と言えばClojureも思い出してあげてください。 もうすgVer1.3が出てくる予定です。

他に無いかと探してみたら、日本の人がひっそりと作っていた。 Schluessel - A Scheme Implementation on Java - サウンド機能を利用してオシロスコープのまねが出来るみたい。今後の発展に期待したいぞ。

で、Lisperになるなら、Lispの掲示板を見ましょう。 Schemeならこちらですかね。それにしても、上で上げてある中に、 maximaがLispで出来ていたから ってのが無いのは、ちょっと残念。教えてあげようかな。

sbclでasdf

折角sbclが入っているんで、いろいろなライブラリーを体験してみたい。共通リスプの事だから きっと、rubyのgem相当が有る事だろう。どんなのが有るか探してみたよ。 いろいろあるようだけど、古い方がライブラリーが豊富にあるだろうって事でasdfに決定。asdfって 変な名前だなあ、と、しばしキーボードを眺めると、キーの並びがホームポジションじゃないですか! Lisperはものぐさって事が証明されちゃいました。

sbclには既にasdfへのインターフェースが用意されているので、起動時に有効になるよう、.sbclrc に、設定をしておく。

(require 'asdf)
(require 'asdf-install)

sbclを起動させて、ltk(共通リスプをtkから使っちゃえ版)を入れてみる。

; loading system definition from
; /usr/local/lib/sbcl/sb-bsd-sockets/sb-bsd-sockets.asd into #<PACKAGE "ASDF0">
; registering #<SYSTEM SB-BSD-SOCKETS {5A53F529}> as SB-BSD-SOCKETS
; registering #<SYSTEM SB-BSD-SOCKETS-TESTS {59BB8CE9}> as SB-BSD-SOCKETS-TESTS
; loading system definition from /usr/local/lib/sbcl/sb-posix/sb-posix.asd into
; #<PACKAGE "ASDF0">
; registering #<SYSTEM SB-POSIX {59DD1639}> as SB-POSIX
; registering #<SYSTEM SB-POSIX-TESTS {59EE7DB1}> as SB-POSIX-TESTS
* (asdf-install:install :ltk)
Install where?
1) System-wide install:
   System in /usr/local/lib/sbcl/site-systems/
   Files in /usr/local/lib/sbcl/site/
2) Personal installation:
   System in /home/sakae/.sbcl/systems/
   Files in /home/sakae/.sbcl/site/
 --> 2
Downloading 240780 bytes from http://www.peter-herth.de/ltk/ltk-0.91.tgz ...

debugger invoked on a ASDF-INSTALL::KEY-NOT-TRUSTED:
  GPG warns that the key id 0xNIL () is not fully trusted

Type HELP for debugger help, or (SB-EXT:QUIT) to exit from SBCL.

restarts (invokable by number or by possibly-abbreviated name):
  0: [CONTINUE      ] Install the package anyway
  1: [SKIP-GPG-CHECK] Don't check GPG signature for this package
  2: [ABORT         ] Exit debugger, returning to top level.

(ASDF-INSTALL::VERIFY-GPG-SIGNATURE/STRING
 "-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.1 (Darwin)

iD8DBQBHBO31zjTrP0KPCrYRAlADAJ47Yw8iD1Et2VjocvuNjypjBUDdrACfTEYd
mLtXPtQ4pA7w497qmX6pPGs=
=1lf5
-----END PGP SIGNATURE-----
"
 #P"/usr/home/sakae/LTK.asdf-install-tmp")
0] 1
   :
; compiling (DEFUN LRTEST ...)
; compiling (DEFUN RLB-TEST2 ...)

; /usr/home/sakae/.sbcl/site/ltk-0.91/ltk-remote.fasl written
; compilation finished in 0:00:00.076
NIL
*

ファイルをネットから取って来るんで、ソケット機能が用意され、ファイルもいじるんでその関係 もロードされる。インストールを始めると、何処に入れるか質問が有り、それに答えると ファイルを御取りよせ。いきなりdebuggerが起動するけど、これが共通リスプ流?

メニューに従って、GPG-CHECKを飛ばして継続すると、コンパイルが行われて、所定の場所に ライブラリーが鎮座される。

後は、試運転だな。IEしたらこんなのが有ったので、利用させて貰った。

(eval-when (:compile-toplevel :load-toplevel :execute)
  (require :ltk))

(in-package :ltk)

;;デモ
;;(ltktest)
;;(ltk-eyes)

(defun main ()
  (setf *debug-tk* nil)
  (with-ltk ()
    (let ((btn (make-instance
              'button
              :text "やあ、LTK♪"
              :command (lambda ()
                         (do-msg "それでは。" "ハローワールド!")
                         (setf *exit-mainloop* t))))
          (txt (make-instance 'text)))
      (pack btn)
      (pack txt))))

(main)

で、問題はどんなのが公開されてるかだな。それはここに行けば分かります。CPANやgemに 比べて圧倒的に少ないと思ったら、こちらを見て対抗しましょう。(笑)

sbcl source

とまあ、ちょっとがっかりしちゃったりするんで、内部探検でもするか。チルチルミチルの 『幸せの青い鳥』じゃないけど、福は内に有ると思うからだ。

そんじゃ、SE(ソース探検)の準備をば。まずは、 こちらへ行って、今お使いのsbclソースを 取ってきます。そして適当な所(私は、.sbcl/ の中へひっそりと入れました)へ展開。

続いて、.sbclrc に、その在り処かを書いておきます。

(setf (logical-pathname-translations "SYS")
        '(("SYS:SRC;**;*.*.*" #P"/home/sakae/.sbcl/sbcl-1.0.34/src/**/*.*")
          ("SYS:CONTRIB;**;*.*.*" #P"/home/sakae/.sbcl/sbcl-1.0.34/contrib/**/*.*")))

これで、準備完了。tagを作ったりglobalする必要も有りません。ものぐさ仕様がプチ嬉しかったり します。

emacsからslimeを起動して、適当なファイルを開き、見たい関数の 所へカーソルを合せてから、M-. これで、その関数なりマクロのソース定義が一気に表示され ます。元居た所に戻るには、M-, です。丁度、shellのpushd、popd みたいな感覚で、ネスト も出来るんで、超便利。

ついでなので、sbclではtimeがどうなってる見てみます。

(defmacro time (form)
  #!+sb-doc
  "Execute FORM and print timing information on *TRACE-OUTPUT*.

On some hardware platforms estimated processor cycle counts are
   :
  `(call-with-timing #'print-time (lambda () ,form)))

ちゃんとドキュメントが付いてますんで、理解にはうってつけです。で、えらくすっきりしてる と思ったら、下請けに任せてるのね。call-with-timingにカーソルを合せて、M-. します。

(defun call-with-timing (timer function &rest arguments)
  #!+sb-doc
  "Calls FUNCTION with ARGUMENTS, and gathers timing infomation about it.
    :
    (declare (function fun))
    ;; Calculate the overhead...
    (multiple-value-setq
        (old-run-utime old-run-stime old-page-faults old-bytes-consed)
    :

長いので割愛したけど、こやつ芸が細かい。それぞれの時間データを取得するにに要する時間を あらかじめ測定して、それを加味して、実行時間を求めてる。面白いな。気分はすっかり スモールトークのインスペクターだな。今動いているコードがその場で見られるって嬉しい。 こういうの、参照透明性が有るって言うんでしょうね。他の言語じゃ絶対真似出来ないな。

インスペクターって、アセンブルコードも見えるのかな? sbclのソースツリーの中の runtimeの下は、C言語なんだけど。。。ここの中は、各種の石(ppc,x86,sparc等)と各種の OS(Linux,*BSD,Win,solaris等)の差異を 吸収するための、低位レイヤー部分が置いてあるのね。

こうやって、探検続ければ、Lisperになれるかな。 料理本ぐらいは用意しておいた方がいいのかな。新しい 関数なりマクロを開く前に、おまえはどっちだと丁半博打をやるのも感覚が研ぎ澄まされて良い 修行になります。ちなみに、今のおいらは負け越してます。精進せねば!

最新式sbcl

今使ってるsbclは、ちょっと古い。portupgradeで更新かけてもいいんだけど、それじゃFreeBSD にお任せって感じで面白くない。ここはひとつソースから入れてみるか。新しいソースを取って きた。INSTALLにざっと目を通す。sbclをコンパイルするにはsbclが必要なんか。鶏が先か卵が 先かの論争だな。まあ、こういう局面はいろいろあって、gccをコンパイルするにはcのコンパイラが 必要なのと一緒。

sbclの場合も、sbcl以外の共通リスプが有ればOKっとは書いてあるな。 (こういうの、クロスビルドって言うんか)但し、他の共通リスプの 場合は、バージョンを選ぶようだけど。それと、遅いマシンじゃ辛いよとも書いてあるな。 リスプを作って、そいつでリスプを再コンパイルするとかの、凝った事してるのかな? まあいいや、とりあえずやってみよう。何事も経験だから!

[sakae@cdr ~/sbcl-1.0.51]$ export GNUMAKE=gmake
[sakae@cdr ~/sbcl-1.0.51]$ sh make.sh --prefix=/home/sakae/APP
             :
; compiling (DEFUN TEST-0 ...)
; compiling (DEFUN TEST ...)
; compiling (PROVIDE (QUOTE SB-SPROF));
; compilation unit finished
;   printed 1 note


; SYS:CONTRIB;SB-SPROF;SB-SPROF.FASL.NEWEST written
; compilation finished in 0:00:01.272
* true
gmake: Leaving directory `/usr/home/sakae/sbcl-1.0.51/contrib/sb-sprof'
       56.51 real        27.47 user        26.56 sys

The build seems to have finished successfully, including       17 (out of       17)
 :
To install SBCL (more information in INSTALL):

  sh install.sh

//build started:  Wed Sep 17 09:00:28 JST 2011
//build finished: Wed Sep 17 09:11:03 JST 2011

脅かすわりには短い時間で終了したな。ちゃんと動くか試運転。

[sakae@cdr ~]$ APP/bin/sbcl
This is SBCL 1.0.51, an implementation of ANSI Common Lisp.
More information about SBCL is available at <http://www.sbcl.org/>.

* (* 1 2 3 4 5 6 7 8 9 10)

3628800
* *package*

#<PACKAGE "COMMON-LISP-USER">
* (list-all-packages)

(#<PACKAGE "ASDF-INSTALL-CUSTOMIZE"> #<PACKAGE "ASDF-INSTALL">
 #<PACKAGE "SB-POSIX"> #<PACKAGE "SB-BSD-SOCKETS"> #<PACKAGE "SB-POSIX-SYSTEM">
 #<PACKAGE "SB-BSD-SOCKETS-SYSTEM"> #<PACKAGE "SB-GROVEL-SYSTEM">
 #<PACKAGE "SB-GROVEL"> #<PACKAGE "ASDF-INSTALL-SYSTEM">
 #<PACKAGE "SB-BSD-SOCKETS-INTERNAL"> #<PACKAGE "ASDF">
 #<PACKAGE "COMMON-LISP-USER"> #<PACKAGE "SB-LOOP"> #<PACKAGE "SB-EVAL">
 #<PACKAGE "SB-WALKER"> #<PACKAGE "SB-UNIX"> #<PACKAGE "SB-SEQUENCE">
 #<PACKAGE "SB-PROFILE"> #<PACKAGE "SB-PRETTY"> #<PACKAGE "SB-MOP">
 #<PACKAGE "SB-THREAD"> #<PACKAGE "SB-GRAY"> #<PACKAGE "SB-FORMAT">
 #<PACKAGE "SB-FASL"> #<PACKAGE "SB-DISASSEM"> #<PACKAGE "SB-DEBUG">
 #<PACKAGE "SB-C"> #<PACKAGE "SB-BIGNUM"> #<PACKAGE "SB-ASSEM">
 #<PACKAGE "SB-ALIEN"> #<PACKAGE "SB-PCL"> #<PACKAGE "SB-ALIEN-INTERNALS">
 #<PACKAGE "SB-DI"> #<PACKAGE "KEYWORD"> #<PACKAGE "SB-IMPL">
 #<PACKAGE "SB-SYS"> #<PACKAGE "SB-KERNEL"> #<PACKAGE "SB-VM">
 #<PACKAGE "SB-INT"> #<PACKAGE "SB-EXT"> #<PACKAGE "COMMON-LISP">)
* (length *)

41

どうやら動いているみたい。packageと言う表が一杯登録されてるなあ。MOPってclosの事かしら? 頂いたサイン本を読んでいじってみようかな。

そんじゃ、リグリッションテストやらもやってみるかな。 やってみた。こちらは死ぬほど時間がかかったよ。メモリーがふんだんに無いんで、SWAP しまくりが原因かな。(特にgcの所)

再びmaxima

いかんいかん、ついつい遊び過ぎちゃった。ちと反省して、maximaに戻ります。起動したら、 いきなり、剣幕を落とされましたよ。

[sakae@cdr ~]$ maxima

debugger invoked on a SB-INT:EXTENSION-FAILURE:
  Don't know how to REQUIRE ASDF-INSTALL.
See also:
  The SBCL Manual, Variable *MODULE-PROVIDER-FUNCTIONS*
  The SBCL Manual, Function REQUIRE

Type HELP for debugger help, or (SB-EXT:QUIT) to exit from SBCL.

restarts (invokable by number or by possibly-abbreviated name):
  0: [CONTINUE] Ignore error and continue processing userinit file "/home/sakae/.sbclrc".
  1: [ABORT   ] Skip rest of userinit file "/home/sakae/.sbclrc".
  2:            Skip to toplevel READ/EVAL/PRINT loop.
  3: [QUIT    ] Quit SBCL (calling #'QUIT, killing the process).

(SB-IMPL::REQUIRE-ERROR "Don't know how to ~S ~A.")[:EXTERNAL]
0] c
Maxima 5.25.0 http://maxima.sourceforge.net
using Lisp SBCL 1.0.34
Distributed under the GNU Public License. See the file COPYING.
Dedicated to the memory of William Schelter.
The function bug_report() provides bug reporting information.
(%i1)

どうやら、.sbclrcに書いた、ものぐさ設定がお気に召さなかったみたいです。asdfはこの際 捨てておきましょう。必要な時は手打ちすればいいんですから。

maximaのマニュアルを見て行くと、その他のパッケージにボード線図なんてのがある。 これって、伝達関数から、ゲインと位相回りをグラフ化してくれるやつね。こんなラクチン パッケージが40年も前(の高校時代)に有ったら、随分さぼれたのになあ、時既に遅し。

後、面白いのは、次元量と言うパッケージ。これって、unixの

UNITS(1)                FreeBSD 一般コマンドマニュアル                UNITS(1)

名称
     units - いろいろな単位の換算を行う

書式
     units [-f filename] [-qv] [from-unit to-unit]

と、一部機能が重なっているけど、このパッケージの方が圧倒的に機能が豊富だ。これも高校 時代に有ったら、随分楽が出来たのにね。

(%i2) demo(ezunits);

read and interpret file: /usr/local/share/maxima/5.25.0/share/contrib/ezunits/ezunits.dem

At the '_' prompt, type ';' and <enter> to get next demonstration.
(%i3) if get('ezunits, 'version) = false then load(ezunits)
                                                           else 'already_loaded
(%o3)  /usr/local/share/maxima/5.25.0/share/contrib/ezunits/ezunits.mac
_
(%i4)                          ... SI units ...
_
(%i5)                            foo : 10 ` m
(%o5)                               10 ` m
_
(%i6)                              qty(foo)
(%o6)                                 10
_
(%i7)                             units(foo)
(%o7)                                  m
_
(%i8)                           dimensions(foo)
(%o8)                               length
  :
(%i20)                        100 ` degC `` degF
(%o20)                            212 ` degF
  :
(%i25)                        100 ` ft + 100 ` m
(%o25)                        100 ` m + 100 ` ft
_
(%i26)                    (100 ` ft + 100 ` m) `` ft
                                  163100
(%o26)                            ------ ` ft
                                   381
_
(%i27)                           ev(%, numer)
(%o27)                      428.0839895013123 ` ft

使い方はデモしてみれば大体分かる。単位にはバッククォートを付けるんだな。foo = 10mと定義して おいて、その無名数は、10、単位はメートル、次元は長さね。こんな調子でデモは進んで行く んで、眺めていると、どんな事が出来るか分かってくる。

なんじゃこりゃ

折角、自前でsbclを作ったんで、maximaが動くか確かめてみる。

[sakae@cdr ~]$ PATH=/home/sakae/APP/bin:$PATH
[sakae@cdr ~]$ maxima
fatal error encountered in SBCL pid 6646:
can't load .core for different runtime, sorry


Welcome to LDB, a low-level debugger for the Lisp runtime environment.
ldb> ?
help    Display this help information.
?       (an alias for help)
backtrace       Backtrace up to N frames.
catchers        Print a list of all the active catchers.
context Print interrupt context number I.
dump    Dump memory starting at ADDRESS for COUNT words.
d       (an alias for dump)
exit    Exit this instance of the monitor.
flush   Flush all temp variables.
grab-signals    Set the signal handlers to call LDB.
kill    Kill ourself with signal number N (useful if running under gdb)
purify  Purify. (Caveat purifier!)
print   Print object at ADDRESS.
p       (an alias for print)
quit    Quit.
regs    Display current Lisp registers.
search  Search for TYPE starting at ADDRESS for a max of COUNT words.
s       (an alias for search)
ldb>

混ぜるな危険! このエラーはsbcl 1.0.51 が出してきたのかな? Welcomeって歓迎して くれてるんだから、どんな風になってるかSEしてみようかな。

ldb> backtrace
Backtrace:
Segmentation fault: 11 (コアダンプ)

あらら、地雷踏んじゃったかな? backtraceの使い方ってこれでいいのだろうか? info sbcl してみると

If you run into a signal related bug, you are getting fatal errors such
as `signal N is [un]blocked' or just hangs, and you want to send a
useful bug report then:

  1. Compile sbcl with ldb support (feature `:sb-ldb', see
     `base-target-features.lisp-expr') and change `#define QSHOW_SIGNAL
     0' to `#define QSHOW_SIGNAL 1' in `src/runtime/runtime.h'.

  2. Isolate a smallish test case, run it.

  3. If it just hangs kill it with sigabrt: `kill -ABRT <pidof sbcl>'.

  4. Print the backtrace from ldb by typing `ba'.

  5. Attach gdb: `gdb -p <pidof sbcl>' and get backtraces for all
     threads: `thread apply all ba'.

さらっと書いてあった。baでセグフォになるのは、ダブルフォルトって事だな。 他のOSでも再現するなら、http://www.chiark.greenend.org.uk/~sgtatham/bugs.html を見てから通報 すればいいんだな。 取りあえず、検視しとくか。

[sakae@cdr ~]$$ gdb sbcl sbcl.core
GNU gdb 6.1.1 [FreeBSD]

Core was generated by `sbcl'.
Program terminated with signal 11, Segmentation fault.
Reading symbols from /lib/libm.so.5...done.
Loaded symbols for /lib/libm.so.5
Reading symbols from /lib/libc.so.7...done.
Loaded symbols for /lib/libc.so.7
Reading symbols from /libexec/ld-elf.so.1...done.
Loaded symbols for /libexec/ld-elf.so.1
#0  0x08050410 in backtrace_from_fp (fp=0xbfbfa378, nframes=100)
    at backtrace.c:309
309       return (altstack_pointer_p(p)
(gdb) bt
#0  0x08050410 in backtrace_from_fp (fp=0xbfbfa378, nframes=100)
    at backtrace.c:309
#1  0x08050677 in lisp_backtrace (nframes=100) at backtrace.c:586
#2  0x08056bf7 in ldb_monitor () at monitor.c:499
#3  0x08053fe3 in lose (
    fmt=0x8064600 "can't load .core for different runtime, sorry\n")
    at interr.c:71
#4  0x08050e9b in load_core_file (file=0x2822d010 ";\017", file_offset=0)
    at coreparse.c:361
#5  0x08059edc in main (argc=12, argv=0xbfbfe64c, envp=0xbfbfe69c)
    at runtime.c:548

ここ見ろ、ワンワンって教えてくれているな。親切なやっちゃ! で、見てくと

                /* .core files are not binary-compatible between
                 * builds because we can't easily detect whether the
                 * sources were patched between the time the
                 * dumping-the-.core runtime was built and the time
                 * that the loading-the-.core runtime was built.
                 *
                 * (We could easily detect whether version.lisp-expr
                 * was changed, but people experimenting with patches
                 * don't necessarily update version.lisp-expr.) */

                lose("can't load .core for different runtime, sorry\n");

マナーの悪い人が居るんで、困ってまーすって事かな。いずれにしろ、バイナリーでの互換性 は無いって事だな。更にスタックのTOPの方を見て行くと

static int
stack_pointer_p (void *p)
{
  /* we are using sizeof(long) here, because that is the right value on both
   * x86 and x86-64.  (But note that false positives would not cause much harm
   * given the heuristical nature of x86_call_context.) */
  unsigned long stack_alignment = sizeof(long);

  return (altstack_pointer_p(p)
          || (p < (void *) arch_os_get_current_thread()->control_stack_end
              && (p > (void *) &p || altstack_pointer_p(&p))
              && (((unsigned long) p) & (stack_alignment-1)) == 0));
}

関数名にもLispの片鱗が見えてて、ほほえましい。名前の最後にpを付ける人は、生粋のLisperに 間違い無いな。

おまけに、オシロスコープとか

冒頭に、JVM上で走るSchemeのデモとしてオシロスコープの例が出てきた。Javaのサウンドに おんぶされてSwingで画面を構成するってやつ。だれでも考えそうなアイデアだな。実現出来る (する)かは別にして。。。

世の中広いから、きっと実用になるようなオシロスコープアプリが公開されているだろう。 探してみたよ。そしたら有った。

ハンディ・オシロスコープ。これ ベクターに有るぐらいだから日本製。オシロスコープの代わりにシンクロスコープとも言うけど、 これ、岩崎通信の登録商票になってたはずだから、オシロスコープってのが普通の呼び方ね。 シンクロって言ってる人が居たら、その人結構年季が入っているかも?

このオシロ、ボード線図も書けるようになってて、ちょっと面白いです。使いこなしの技は トラ技を見てねってのも好感。貧乏HAMにはいいかも。

折角なので、ドイツ製のオシロスコープも 上げておこう。機能はハンディのやつとほぼ一緒なので、お好きな方をどうぞ。