emacs buffer (2)

Table of Contents

epoc

前回の冒頭でbenchmarkを調べた時、内部で現在時刻を取得してる事を知った。 そう、current-timeね。素直にepocを返すかと思ったら、4エレメントのリス トだった。

そこから、見慣れたepocに変換してみる。

(defun epoc ()
  (let ((ct (current-time)))
    (+ (* (car ct) 65536) (cadr ct))))
ELISP> (epoc)
1696281812 (#o14506632324, #x651b34d4)

検算は皆が使ってるリナでしてみたよ。*BSDなら、date -r xxxxx と簡潔だけ ど。

[sakae@deb ~]$ date --date='@1696281812'
Tue 03 Oct 2023 06:23:32 AM JST

更にソース・レベルで検算。入口は、benchmakr.elのこの部分

(float-time (time-since ,t1)))))

float-time

DEFUN ("float-time", Ffloat_time, Sfloat_time, 0, 1, 0,
       doc: /* Return the current time, as a float number of seconds since the \
epoch.
If SPECIFIED-TIME is given, it is a time value to convert to float
instead of the current time.  See `format-time-string' for the various
forms of a time value.

WARNING: Since the result is floating point, it may not be exact.
If precise time stamps are required, use either `time-convert',
or (if you need time as a string) `format-time-string'.  */)
  (Lisp_Object specified_time)
{
  return (FLOATP (specified_time) ? specified_time
          : make_float (float_time (specified_time)));
}

ラッパーがかませてあって、引き回しの刑だな。

ELISP> (float-time)
1696284750.4351497

なんだ、一発で答が得られるじゃん。そして、時刻のマニュアル へ、辿り着いた。なんか順序が逆みたいだけど、まあいいか。ソースがやけに 複雑になってると思ったら、歴史が詰っていたのね。

from manual

オンデマンドのマニュアル検索じゃなくて、摘み食いモードで発見。

32Bit system

ELISP> (garbage-collect)
((conses 8 327484 15635)
 (symbols 24 17753 6)
 (strings 16 103184 3097)
 (string-bytes 1 2616178)
 (vectors 8 28785)
 (vector-slots 4 584951 41398)
 (floats 8 100 343)
 (intervals 28 121 57)
 (buffers 556 11))

64Bit system

ELISP>  (garbage-collect)
((conses 16 259194 6691)
 (symbols 48 13765 0)
 (strings 32 89261 1135)
 (string-bytes 1 2082526)
 (vectors 16 21278)
 (vector-slots 8 359185 10618)
 (floats 8 29 224)
 (intervals 56 45 33)
 (buffers 984 9))

ポインターのサイズ違いが、如実に表われているな。

E.3 ガーベージコレクション

buffer read

前回の迷路解決スクリプト改造で、当初の目的は達成できたんだけど、一つ不 満がある。迷路問題をemacs bufferに出力。それをファイルに落している。そ の為、emacsを終了した時に、残骸のLOGファイルが残ってしまう事。大体ファ イルを作成するって無駄だよな。

と言う事で、ファイルを経由しないで、直接buffer readする方法にチャレン ジしてみたい。どんなelisp関数が提供されてるやら?

想像で、emacs buffer readかなあ? なんてググるんだけどヒットしない。 readじゃなくてgetかなあ、なんてやてるうちに、皆が検索ワードにしている、 elisp buffer contents なんていうのが出てきた。

そこから、 https://ayatakesi.github.io/lispref/25.1/html/Buffer-Contents.html に、行き着いた。 buffer-substring start end で、よさそう。駄目出しで、 https://pogin.hatenablog.com/entry/20120225/1330184480 こういう事例も、出てきた。 buffer-string も、使えるかな。 検索ワード重要って、改めて想った次第。

read-maze

次は、上記を何処に忍び込ませるかだな。そのものの関数

(defun read-maze (file-name)
  (let* ((raw (parse-maze file-name))
         (rows (1- (/ (length raw) 2)))
         (cols (length (car raw)))
         (maze (new-maze rows cols)))
    :

これを見ると、parse-mazeが肝みたいなので、そちらを参照。

(defun parse-maze (file-name)
  (let ((rtn)
        (lines (with-temp-buffer
                 (insert-file-contents-literally file-name)
                 (split-string (buffer-string) "\n" t))))
    (while lines
      (push (parse-ceilings (pop lines)) rtn)
      (push (parse-walls (pop lines)) rtn))
    (nreverse rtn)))

なんか、出たなって感がするぞ。早速、改造に着手。read-mezeでファイル名 を使っている所を削除。陽にファイルは利用しません。そのかわりバッファー 内で、データ交換しますって訳。

こちらが、今回の主役。今のバッファー・データを全て取り込み、それを改行 を目印にして分解し、そのリストにlinesと名前を付ける。改造は、これだけ だ。

(defun parse-maze ()
  (let ((rtn)
        (lines (split-string (buffer-string) "\n" t)))
    (while lines
      (push (parse-ceilings (pop lines)) rtn)
      (push (parse-walls (pop lines)) rtn))
    (nreverse rtn)))

そして、それらをドライブする、最上位の関数。read-maze関数の呼出が、 with-current-bufferの庇護の元で行なわれているのがポイントだ。

(defun qa (ys xs)
  (setq maze (new-maze ys xs))
  (dig-maze maze 1 1)
  (with-current-buffer (get-buffer-create "maze-buffer")
    (erase-buffer)
    (pmb nil maze)
    (setq rmaze (read-maze)))
  (setq res (solve-maze rmaze))
  (pmb t rmaze res) )

C-x C-b して、バッファーのステータスを表示してみた。

CRM Buffer                 Size Mode             File
---------------------------------------------------------------------
. * *ielm*                 1905 IELM:run on *i…
    elisp-maze.el          6762 ELisp/d          /tmp/elisp-maze.el
    *scratch*               145 Lisp Interaction
  * maze-buffer             462 Fundamental
 %* *Messages*              254 Messages

CRMは、current-buffer read-only modify を意味してる。

長々と迷路をやったおかげで、elispに抵抗が無くなった。emacsはdebuggerや ら、素晴しいソース閲覧ツールが同梱されてるし、何より嬉しいのは、資料が 豊富な事。それに、何処でも動くのが非常に嬉しい。

本当はschemeがいいんだけど、あれは方言の塊。前回の黒田節じゃないけど、 標準になってるってのは重要だな。

networkx examples

前回のNetworkXのexamplesを試してみる。

(mypy) [sakae@arch graph]$ python plot_morse_trie.py
•• •—•• ——— •••— • —• • — •—— ——— •—• —•— —••—
(mypy) [sakae@arch graph]$ python plot_degree_sequence.py
True
Configuration model
Degree sequence [5, 3, 3, 3, 3, 2, 2, 2, 1, 1, 1]
Degree histogram
degree #nodes
   5      1
   3      4
   2      3
   1      3

そしてグラフが出てくる。 plot_napoleon_russian_campaign.py は、ナポレオ ンのロシア行軍地図なのかな? 図になっちゃうと、この記事に載せるの非常 に面倒なのが玉に傷です。ご自分で環境を作ってウハウハして下さい。

ただ走らせて眺めるだけじゃなく、コードの説明を読んで感嘆しろよ。それが 正しい楽しみ方。なお、この例は、share/doc/networkx-3.1/ に入いっている ぞ。

BGP

例にインターネットのパケット配送の話が出てこなかったので、聞いてみた。

はい、経路コストの計算にはグラフ理論の概念が利用されます。BGPの経路選択は、ネットワークトポロジーをグラフとしてモデル化し、最適な経路を見つけるためにグラフ理論のアルゴリズムや原則を適用します。

以下は、BGPでの経路計算におけるグラフ理論の要点です:

  1. ASグラフ: インターネット内の異なる自治システム(AS)は、ノードとしてグラフ内に表現されます。ASはBGPで経路情報を交換し、異なるAS間の経路を確立します。AS間の接続は、エッジ(辺)としてグラフに表現されます。
  2. 最短経路アルゴリズム: BGPは、通常、AS間の経路を計算する際に最短経路アルゴリズムを使用します。これにより、ASパス(経路上のASのシーケンス)が最も短い経路が選択され、コストが最小化されます。最も一般的に使用されるアルゴリズムは、Dijkstraの最短経路アルゴリズムです。
  3. メトリックとコスト: BGPは通常、経路のコストやメトリックと呼ばれる値を使用して、最適な経路を選択します。ASパスの長さ、プレフィックスの属性、ポリシーに基づいてコストが計算され、最も低いコストの経路が選択されます。
  4. ルートマップ: BGP運用者は、経路のコストを調整するためにルートマップを使用します。ルートマップは、特定のASや経路に対してカスタムのコスト値を設定するのに役立ちます。

グラフ理論の概念を利用することで、BGPは複雑なインターネットトポロジーにおいて最適な経路を見つけ、トラフィックを制御し、ネットワークの効率性と信頼性を確保します。経路計算は常に進化しており、新しいアルゴリズムや技術が導入されることもありますが、グラフ理論の基本原則はBGPの基盤として重要です。

未来のアマチュア無線

CQ誌をしっかり読んでこなかったので、自分で聞いてみた。年頭の特集の先取 り。

2023年の現在、アマチュア無線は多くの変化と進化を経て、10年後にはさらなる進展が予測されます。以下に、アマチュア無線が10年後にどのように発展しているかについてのレポートを1000文字でまとめます。

  1. デジタル技術の普及: アマチュア無線は、デジタル技術の普及に大きな影響を受け、10年後にはデジタル通信が一般的になるでしょう。デジタルモードの使用が増加し、デジタル信号処理技術を活用した高度な通信が可能になります。これにより、信号の品質と効率が向上し、遠距離通信が容易になります。
  2. ソフトウェア無線技術の台頭: ソフトウェア定義無線(SDR)技術は、アマチュア無線に革命をもたらします。アマチュア無線機器はソフトウェアによって制御され、機能が柔軟に拡張できるようになります。これにより、新しい通信モードや周波数範囲へのアクセスが容易になり、アマチュア運用者はより多くの実験と創造性を発揮できます。
  3. IoTとの統合: アマチュア無線は、インターネット・オブ・シングス(IoT)との統合に進化します。アマチュア運用者は、無線ネットワークを通じてセンサーデータを収集し、環境モニタリング、気象予測、救助活動などに貢献します。これにより、アマチュア無線は社会への貢献を強化します。
  4. 新たな周波数帯域の開放: 10年後、新たな周波数帯域がアマチュア無線の利用に開放されることが期待されます。これにより、さらなる通信の幅広い選択肢が提供され、新しい実験やプロジェクトが可能になります。
  5. 教育とコミュニティ: アマチュア無線コミュニティは、教育プログラムと協力して若い世代に技術と通信の魅力を伝えることに注力します。アマチュア無線はSTEM(科学、技術、工学、数学)教育において重要なツールとなり、次世代のエンジニアや科学者の育成に貢献します。
  6. 国際協力と緊急通信: アマチュア無線は国際的な緊急通信ネットワークの一部として、自然災害や緊急事態において重要な役割を果たします。国際協力が促進され、グローバルなハムラジオコミュニティが危機管理と救助活動に参加します。
  7. 法規制とスペクトラム管理: スペクトラム管理は依然として課題であり、アマチュア無線運用のための適切な周波数帯域の確保が継続的な努力を要するでしょう。適切な法規制のもと、アマチュア無線の成長と発展がサポートされます。

アマチュア無線は、技術の進歩、教育、コミュニティ参加、緊急通信など、多くの側面で発展し続けます。10年後には、より多くの人々がアマチュア無線の魅力を発見し、新たな可能性を追求するでしょう。


まあ無難な予想。1のデジタル通信たら、スマホみたいだな。最近はFT8とかが 大流行みたい。おかげで、交信カードの転送なんだけど、交信相手が発送するまでの時間も含めるとニューカマーがJARLに入会,年会費を払っても1年間全く届かずに退会に至るケースも発生している。 特に、FT8が流行り始めてからは総交信数が増加し、より悪化している。 カードも電子化って、味気ないな。

2は、やっぱりこれでしょう。 KiwiSDR: Wide-band SDR + GPS cape for the BeagleBone Black

7のスプリアス規制。理解は出来るんだけど、再認定に、利権の匂いを感じた ので、免許の更新はしなかった。それより自作してナンボだろう。これも法の 壁を乗り越えるのは至難であります。米国みたいに包括制度にならないものか ね。そうじゃなくちゃ、5の教育なんて画餅だと思うぞ。

emacs search

Emacs-29.X の、entirely on one web page を開いて、ブラウザー内で文字列 検索しちゃうのが、楽だ。


This year's Index

Home