Debian 7

某所で暴君もとえ某君に久しぶりに会った。何年ぶりだろう? 元気でなにより!

ソフト屋さんの彼は世間の荒波にもまれながら、頑張っているとの事。どんなソフトを やってるか聞いてみると、、、、一般向けのアプリとからしい。

一般向けと言うとアプル土台かアンドロドロイドを想像したけど、そこまでは手を 出していなくて、Windowsのあぷりとか。

どんな開発環境? C#かなそれともストレートにCふらふら? ブブーでした。 古式ゆかしいVBらしい。しぶといねぇ。VB! 一体何年生きているんだ? やっててつまんなくならない? 世間から置いていかれるって恐れない?

彼もそれは重々承知してるけど、ユーザーが許してくれないとか。曰く、新しい 開発環境にしちゃうと、ユーザーI/Fが変わってしまって、ユーザーに文句を 言われるらしい。

案外そうかも知れないな。仕事で使うアプリらしいんで、昔の感覚で使えないと だめらしい。特に新しいアイコンなんかを採用するとブースカ言われるそうだ。 ipadのHome画面のアイコン並びをちょっと整理するだけでも、女房に文句を言われる ぐらいだから、確かに見栄えが変わるだけでも、ユーザーは恐怖を覚えるの だろうね。

アイコンと言えば、dataとかのsaveのアイコンにずっとフロッピーのやつが 使われていたけど、これも未来永劫変わる(変える)事は許されないのだろうか? これはもう、国家権力(通産省って昔の名前だっけ)が主導して、上から目線で 変えるしかないかな?

中国は難しい漢字を棄てて、易しい漢字に舵を切ったよね。究極のアイコン 漢字も権力が主導しないと変えられないのね。ふと、こんな事を思った次第。

SDRのソース

前回のTODOだった、狼煙のシュミレータをやろうと思ったんだけど、これって 調べてみると、流体力学のナビアストークスとか言う微分方程式を数値的に 解かないとだめみたい。日曜プログラマーには荷が重い予感。 そのうち、日経ソフトウェアあたりで特集しないかね。かの雑誌も画像の 座標変換に行列がどうのこうのってやるぐらいだから、頑張ってみてよ。

で、もう少し難度の低いやつに手を出す。前々回だったかで、RF Worldって 雑誌にSDRが取り上げられていた。これを手にいれようとしたんだけど、田舎の 本屋には、勿論置いてない。尼あたりに頼めば届く事は承知してますが、 おいらは尼嫌い。日本で商売してるくせに税金をまともに払わない企業に 協力する事は否国民ですよ。 税務署もだらしないぞ。ちゃんとしょば代を巻き上げんかね。ああ、強い 所には尻尾を巻いて、弱い者いじめをするのが、(以下略)。

雑誌の代わりの資料が欲しいな、IQ信号とはって聞いてみたら、 直交復調の解説なんてのを案内された んで、CQ出版に頭を下げつつ、参照しましたよ。何気なく直交って言葉が出てきたけど、 多分大事な概念が隠されているはず。調べたら、 信号の直交性について なんてのが出てきた。

サンプルアプリは、ホワイトノイズを聞いたり、AM波を作ったり、録音データを 聞いたり出来るようになっている。例によって、どんなスペックで録音されてるか 確認しておこう。

$ soxi lsb.wav

Input File     : 'lsb.wav'
Channels       : 2
Sample Rate    : 16000
Precision      : 16-bit
Duration       : 00:00:08.02 = 128330 samples ~ 601.547 CDDA sectors
File Size      : 513k
Bit Rate       : 512k
Sample Encoding: 16-bit Signed Integer PCM

後は、ソースだけ観賞する事にした。emacsで開いてみたんだけど 色が付かない。C#のサフィックスcsなんて、emacs君は知らないんだな。 ならば、javaにサフィックスを付け替えちゃえ。どうせ、C#もJavaの方言でしょ。

とまあ、emacsを騙してあげたら、etagも動いたしglobalも動いた。つらつらと見て 行くと、面白いコードに出会ったよ。

        //  AGC処理を行なう
        //
        public void ApplyAgc(double[] real, double[] imag, double level)
        {
            gain = 1.0;   // デフォルトのゲイン値を設定
            if(level != 0.0)			// 0による除算を避ける為の処理
            {
                gain = 0.1 / level;	// 最大振幅が0.1になるようなゲインを算出
                if(gain > maxgain)	    // ゲインが最大値より大きいか? 
                    gain = maxgain;		// ゲインを最大値に制限
            }
            if(gain < gainavarage / agctime)	// 強い信号レベルの場合には
                gainavarage = gain * agctime; 	// すぐにAGCレベルを反映させる
            else
            {       // 弱い信号レベルなら
                gainavarage = gainavarage - gainavarage / agctime + gain;	// ゆっくりゲインを上昇させる
                gain = gainavarage / agctime;   // AGCに時定数を持たせる
            }
            MulConst(real, imag, gain);   // AGCを適用する
        }

俗に言う、ファースト・アタック、スロー・リリース型のAGC。日本語で言うと、尖頭値型の 自動感度調整機構ですかね。昔のCQ誌には、これをハードでどうやって実現するか なんていう楽しい記事が出てて、大いに楽しめたものだけど、今のCQ誌は見る影も ないね。たまにこういうのを見るとほっとしますよ。

それから、複素数をrealとimagに分けて持っているって、遅れていると思うぞ。 > Java、C#

ここは、PythonやSchemeみたいに、複素数型をネイティブで持っている言語がいいな。 ひょっとして、コード量が半分になるんではなかろうか? とか思ってコードを見てると 本体のForm1.csが大半だった。見栄えとか、いろいろ大変なのね。本質が隠れちゃってて 読み取るのが大変。

Debian 7.0

今までLinuxと言うと、ArchLinux(とその派生品)を使ってきた。おっと、ウブちゃんの サーバー版も入れていたか。でも、これらに秋田んで、2.5年ぶりに改装したと言う Debian 7.0を 入れてみる事にした。ええ、自分がインストールマニアって事は承知してますよ。

ぐのむ版とKDE版とLXDE版がLiveCDで用意されてたけど、LXDE版をチョイスした。ipadの 軽さに慣れた身にとっちゃ、重いのは苦痛ですからね。土台はVMWAREです。このPlayerは 版がちょっと古くて、Debian7には対応してないみたいだけど、さしたる問題も無く インストールを完了しましたよ。

rootでvisudoしようと思ったら、変なeditorが立ち上がってきたので、export EDITOR=vi したよ。インストール時にカーネルがミスマッチしてるとか言われて、新しいのが入らなかった んで、速攻で apt-get update; apt-get dist-upgrade したよ。

(おいらにとっちゃ)不用なだえもん君が動いているなあ。今までは強引に、/etc/rcN.dあたりのファイルを 消してたけど、正式にはどうやるんだろう。調べてみたら、 Debianの不要なサービスの自動起動を停止 なんてのがヒットした。今も昔も同じ技術が通用しそう。

Xの画面サイズがデフォでは800x600と小さ目。どうやって大きくするんだ? xorg.confを 書くんかと思ったら、プレファレンスにMonitor Settingってメニューが有った。これで 大き目になるのね。先ほどのダエモン君の所を見てたら、V-boxにもvmwareにも対応 してるっぽい。Debianの作者は、世の中の人が、WindowsからLinuxへスイッチする勇気が 無いって事知ってるな。

今回はピンポイントでやりたい事を調べてみたけど、もっと包括的に調べるなら、 Debian リファレンスが 良いかな。なんだか、このページ、昔持ってたdebian HandbookのWeb版ぽいぞ。

最近はどんなDebian本が出てるかと思ったら、でぶ専 、もとえ、 Deb専 なんてのがあるのね。Deepだなあ。

Gambit

ネットをうろうろしてたら、JAVAで独自言語を作りましょって記事が出てた。JAVAを制する 者はWindowsも制するで、枕に書いたソフト屋さんにも紹介しておきたいぞ。 で、どんな言語かと言うと、 lisp なんですよ。ひょっとしたら、彼をかっこよくしてあげられるかしらん。

新しいOSを入れると、開発環境の試運転でソースから何かをコンパイルするのが、おいらの 流儀。今までは、その何かがRubyだったんだけど、時間がかかるんで、最近はもっぱら Gaucheだったりします。

でも今回は、ipadにGambitが入っている事だし、試運転はGambitで行ってみる事にしました。 LXDEのライブ版には、デフォでコンパイル環境が入ってましたよ。うぶはどうだったかなあ。 おいらの記憶では、入っていなかったような。。。Windowsにひたすらすり替わる事を 目指すうぶは、開発環境が入っていないWindowsに倣ったってか。

コンパイル行程がREADMEに書いてありますので、その通りにやれば無問題。

Quick-install instructions for a typical installation
-----------------------------------------------------

  git clone https://github.com/feeley/gambit.git
  cd gambit
  ./configure --enable-single-host
  make bootstrap
  make bootclean
  make
  make check
  sudo make install

上記の行程だと、/usr/local/Gambit-C/ 以下にドキュメントも含めてインストールされる。 /etc/profileにPATHを追加するも、X環境上のemacsからだと、gscを認識しない? どこで、PATHを設定すればいいの? しょうがないから、フルパスを設定しておいた。

で、以前ipad上のgambitに手をいれようとして調べた、port番号。どうなってるか 調べてみた。

sakae@debian7:~$ cat a.scm

(define repl-server-address #f)
(set! repl-server-address "*:7000")

sakae@debian7:~$ gsc -c a.scm

そして、出来上がったa.cを確認してみると

___DEF_SUB_STR(___X0,6)
               ___STR6(42,58,55,48,48,48)

___BEGIN_SUB
 ___DEF_SUB(___X0)
___END_SUB

どうも、これっぽい。文字列が、ソース上では、10進数表現になってる。これがbinaryに 落ちると16進数表現になるんだな。えっと、man asciiしてみると、(2A,3A,37,30,30,30) こんな並びになるんか。

そしてコンパイル結果のa.o1あたりを、hexeditで開いてみると、

000008A0   9E 18 00 00  2A 00 00 00  3A 00 00 00  37 00 00 00  ....*...:...7...
000008B0   30 00 00 00  30 00 00 00  30 00 00 00  00 00 00 00  0...0...0.......

豪華に、1文字が、4バイトのintに展開されてますな。これだけ分かれば、バイナリー パッチを当てられるな。えっと、ipadに載ってる石のエンディアンはどうなってるのかな?

つい、豪華に1文字が4バイトのintに展開って書いちゃったけど、これは必然だな。 だって、世の中にある文字はASCIIだけじゃなくて漢字やら絵文字やらいろいろ有るものな。 Gambitの内部文字表現は、ひょっとしてUTF-32

clojure

おまけで、clojureも入れておくか。apt-cache search clojure したら、1.2版と1.4版が 有った。古い黒猫本しか持っていないので、取り合えず、1.2版を入れておいた。 最近の進歩は、 逆引きClojureあたりを見ればいいのかな。

見てたら、leinなんていうのも有ったなと思い出した。そして、emacs上から使う、 swank-clojureなんてのも 思い出したぞ。取り合えず、leinを入れて起動してみた。

sakae@debian7:~$ lein repl
nREPL server started on port 43931
REPL-y 0.1.10
Clojure 1.5.1
    Exit: Control+D or (exit) or (quit)
Commands: (user/help)
    Docs: (doc function-name-here)
          (find-doc "part-of-name-here")
  Source: (source function-name-here)
          (user/sourcery function-name-here)
 Javadoc: (javadoc java-object-or-class-here)
Examples from clojuredocs.org: [clojuredocs or cdoc]
          (user/clojuredocs name-here)
          (user/clojuredocs "ns-here" "name-here")
user=>

世の中進んでいるね。slime-connectしたら、エラッタんで、素直に、clojure-modeして M-x run-lispでいいかな。

とか、言っていたら、slime-connectに変わって、 nreplなんてのが登場してんのね。 leinのプロジェクトdirの中で、lein replして(上記のように)出てきたポート番号を 覚えておく。おもむろに、emacsを立ち上げて、M-x nreplして、host/port番号を 入れると、lein側のreplに接続出来るとな。

; nREPL 0.1.8-preview
user> (sourcery first)
(def
 ^{:arglists '([coll])
   :doc "Returns the first item in the collection. Calls seq on its
    argument. If coll is nil, returns nil."
   :added "1.0"
   :static true}
 first (fn ^:static first [coll] (. clojure.lang.RT (first coll))))
nil
user>

previewってのがちょい気になるけど、補完も効くからまあいいか。

下記は、現在の.emacsです。

(setq load-path (append '("~/.emacs.d" ) load-path))

(require 'package)
(add-to-list 'package-archives
             '("melpa" . "http://melpa.milkbox.net/packages/") t)
(package-initialize)

(require 'clojure-mode)
(require 'paredit)
(require 'nrepl)
(require 'quack)

(custom-set-variables
  ;; custom-set-variables was added by Custom.
  ;; If you edit it by hand, you could mess it up, so be careful.
  ;; Your init file should contain only one such instance.
  ;; If there is more than one, they won't work right.
 '(quack-default-program "/usr/local/Gambit-C/bin/gsc")
 '(quack-programs (quote ("/usr/local/Gambit-C/bin/gsc" "bigloo" "csi" "csi -hygienic" "gosh" "gracket" "gsi" "gsi ~~/syntax-case.scm -" "guile" "kawa" "mit-scheme" "racket" "racket -il typed/racket" "rs" "scheme" "scheme48" "scsh" "sisc" "stklos" "sxi"))))

clojure用にnrepl、gambit用には、gscって組み合わせ。 pareditは、最初からenableにしといてもいいんだけど、時と場合によってはうざいので 使う時だけ、paredit-mode してます。