vlang

Table of Contents

googleの横暴

女房からipadが壊れたと主訴が有った。無理もないか。あいつの体内にある 一番古い記録は、2013/04/11に実験したバッテリーの充/放電記録だったからなあ。 初めてのモバイル機器なんで電池の持ちが一番気になって、実験したんだった。 それにしても、もう12年、壊れるのも納得。大往生だったねと、笑って送って あげたい心境。最後だから、せめて死亡診断書を発行してアプルに返却しようか。

主訴は、ネット検索で変なメッセージが出るというもの。適当に検索してみると、 不正なパケットを検出したんで、ロボットでない事を証明してくださいって出た。 ロボットちゃうでにマークを入れてからクリックすると、9枚の写真が出てきて、 信号機が写ってるのにチェックを入れろとか。。対象がバイクだったり自転車 だったり、階段だったりと様々。認知試験だ。で、それを無事にクリアすると 普通に検索できた。なーんだ、別に壊れてしまった訳じゃないじゃん。

ググルはウザイのでBingに変更した。この延命処置で、もう少し使えそう。 それにしても、ググルは横暴だな。いや、AIのデータ探しにロボットが押し よせるものだから、それへの対向かな。

そう言えばJavaScriptを理解できないブラウザーは門前払いとか言ってたけど、w3m は大丈夫か? –> 大丈夫だった。

女房が姉にSMSしようとしたら、今迄と違った画面に誘導されたと主訴。スマホが 変ったせい? RCSとか言う暗号通信みたい。いきなりでビックリ。案内を読むと相手を見てるみたい。 オイラーのガラパゴス携帯を目指してSMSしてみたら、今迄通りだった。

姉さんに聞いたら、スマホのバッテリィーが弱くなったので、5年使ったやつを 新らしいのに、つい最近更新したとの事。この証言が取れたので合点したよ。

SMSは電話回線に文字列を載せる仕組み。電話だから普通の人は盗聴とかは不可。 でも内部の人なら平文だから容易に盗聴可能。これはマズイぞと、アンドロイドの 人達(== Google)は気付いた。セキュリティーについては、盗聴自在なtelnetだな。 ならばsshに通信方式を改めよう。ちょっと通信の事をかじった人なら、誰でも 思いつく。

SMSのアイコンをタップした時、こっそり相手側とネゴシェーションするんだろうね。 ならば相手のスマホが圏外の場合は、どんな挙動になるんだろう? 姉さんみたいな 素人を実験に巻き込むと顰蹙を買うな。実験相手を求む。

セキュリティーを錦にして、ユーザーを煙に巻くのヤメレ。

Google メッセージのエンドツーエンドの暗号化によるセキュリティ強化 これみたいだな。

検索も勝手にまとめてしまうし。fuckingAI って語句を追加すると、余計な事を しなくなるそうだ。本当か確かめてみるよ。

vlang

過去帳をめくると、2021年の4月ごろ Rust -> v って流れでV語をやってる。 pythonとAIを毎号特集してる某雑誌よりはましだな。でも、歴史は繰り返すのね。

i386ではパッケージが提供されてなかったので、自前でやってみた。

ob$ gmake
gmake fresh_vc
gmake[1]: Entering directory '/var/SRC/v'
  :
Note: `tcc` was not used, so unless you install it yourself, your backend
C compiler will be `cc`, which is usually either `clang`, `gcc` or `msvc`.

These C compilers, are several times slower at compiling C source code,
compared to `tcc`. They do produce more optimised executables, but that
is done at the cost of compilation speed.

V has been successfully built
V 0.4.9 8dbde18

とりあえずコンパイル出きたけど、tccを利用させるとか、過去にごちゃごちゃ やってたな。

v doctor

OpenBSD飯はうっちゃっておいて、lubuntuでの環境を晒す。

sakae@lu:tmp$ v doctor
|V full version      |V 0.4.9 5c4f7ca.62cbc8b
|:-------------------|:-------------------
|OS                  |linux, Ubuntu 24.04.2 LTS
|Processor           |4 cpus, 64bit, little endian, Intel(R) Core(TM) i5-6200U CPU @ 2.30GHz
|Memory              |3.31GB/7.64GB
|                    |
|V executable        |/var/my/srcs/v/v
|V last modified time|2025-02-27 05:28:51
|                    |
|V home dir          |OK, value: /var/my/srcs/v
|VMODULES            |OK, value: /home/sakae/.vmodules
|VTMP                |OK, value: /tmp/v_1000
|Current working dir |OK, value: /tmp
|                    |
|Git version         |git version 2.43.0
|V git status        |weekly.2025.09-13-g62cbc8be (44 commit(s) behind V master)
|.git/config present |true
|                    |
|cc version          |cc (Ubuntu 13.3.0-6ubuntu2~24.04) 13.3.0
|gcc version         |gcc (Ubuntu 13.3.0-6ubuntu2~24.04) 13.3.0
|clang version       |Ubuntu clang version 18.1.3 (1ubuntu1)
|tcc version         |tcc version 0.9.28rc 2024-07-31 HEAD@1cee0908 (x86_64 Linux)
|tcc git status      |thirdparty-linux-amd64 0134e9b9
|emcc version        |N/A
|glibc version       |ldd (Ubuntu GLIBC 2.39-0ubuntu8.4) 2.39

過去の物との互換性

過去帳に、v 0.2ぐらいの時の血圧グラフ(goのサフィクスをvに変更して、エラー まみれになりながら移植したもの)が有ったのでコンパイルしてみたぞ。

sakae@lu:nbldv$ make r
v -g nbldv.v
nbldv.v:17:1: warning: const () groups will be an error after 2025-01-01 (`v fmt -w source.v` will fix that for you)
   15 | }
   16 |
   17 | const ( // rows index name 0 .. 3
      | ~~~~~
   18 |     ymdh = 0
   19 |     hi   = 1
nbldv.v:50:16: warning: function `strconv.v_sprintf` must be called from an `unsafe` block
   48 |     mut s := ''
   49 |     for _, v in ds.bld {
   50 |         s += strconv.v_sprintf('%d,%d,%d,%d\n', v[ymdh], v[hi], v[low], v[pls])
      |                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   51 |     }
   52 |     os.write_file(csf, s) or { panic(err) }
nbldv.v:72:34: error: propagating a Result like an Option is deprecated, use `foo()!` instead of `foo()?`
   70 |         }
   71 |         rs = [0, 0, 0, 0] // for tunnel bug go away
   72 |         rs[ymdh] = strconv.atoi(ar[0]) ?
      |                                        ^
   73 |         rs[hi] = strconv.atoi(ar[1]) ?
   74 |         rs[low] = strconv.atoi(ar[2]) ?

盛り沢山のエラーの洗礼を受けてしまった。emacsとのコンビネーションで make -k してから、M-g n とかしながら、潰していく。

ワーニングだけだとdebugモードなら実行できた。保護観察処分中って扱かいか。でも、-prod オプションをつけて、製品版にしようとするとエラーになる。Vのブランド汚すなよって事だ。

sakae@lu:nbldv$ diff -u nbldv.v ../nbldv.new/nbldv.v
--- nbldv.v     2021-04-19 15:20:19.000000000 +0900
+++ ../nbldv.new/nbldv.v        2025-03-03 07:12:34.360246036 +0900
@@ -14,12 +14,11 @@
        bld [][]int // main data type
 }

-const ( // rows index name 0 .. 3
-       ymdh = 0
-       hi   = 1
-       low  = 2
-       pls  = 3
-)
+// rows index name 0 .. 3
+const ymdh = 0
+const hi = 1
+const low = 2
+const pls = 3

 fn ag(path string) string { // for gnuplot option
        contents := os.read_file(path.trim_space()) or { panic(err) }
@@ -47,16 +46,16 @@
 fn savecsv(csf string, ds AAy) {
        mut s := ''
        for _, v in ds.bld {
-               s += strconv.v_sprintf('%d,%d,%d,%d\n', v[ymdh], v[hi], v[low], v[pls])
+               s += unsafe { strconv.v_sprintf('%d,%d,%d,%d\n', v[ymdh], v[hi], v[low], v[pls])}
        }
        os.write_file(csf, s) or { panic(err) }
 }

 // add new data
-fn ire(ym int, mut ds AAy) ? {
+fn ire(ym int, mut ds AAy) ! {
  :

大体、指示に従って変更をしていけば、何とかなる。指示が適切なんだな。これなら エラーログをAIに食わせて、勝手に修正させる事も可能だろう。

sakae@lu:nbldv$ cat Makefile
PN = nbldv
comp:
        v $(PN).v
r:
        v -g $(PN).v
        ./$(PN)
prod:
        v -prod -show-timings $(PN).v

これ使い廻せばいいな。

repare by ChatGPT

決りきった作業は、下僕に指示だな。

A: エラーログを見ると、以下の修正が必要です:

  1. `const ()` の変更

    const (

    は将来的にエラーになるので、修正が推奨されています。`v fmt -w nbldv.v` を実行すると自動修正されるかもしれません。

  2. `strconv.vsprintf` の `unsafe` 指定 `strconv.vsprintf` を使用している部分を `unsafe` ブロック内に移動する必要があります:

    unsafe { s += strconv.vsprintf('%d,%d,%d,%d\n', v[ymdh], v[hi], v[low], v[pls]) }

    同様の箇所をすべて修正。

  3. `?` の `!` への置換 `foo()?` の形で `Result` を `Option` のように扱うのは非推奨になりました。 例えば:

    rs[ymdh] = strconv.atoi(ar[0]) ?

    rs[ymdh] = strconv.atoi(ar[0])!

    に修正。同様の箇所(`os.writefile` や `os.rm` など)もすべて `!` に変更。

修正後の `nbldv.v` をアップロードするので、確認してください。

修正が完了しました。 最新のV言語の仕様に適合させるために、以下の修正を行いました:

  • `const ()` のグループ化を修正
  • `strconv.vsprintf` を `unsafe` ブロック内に移動
  • `?` を `!` に変更し、エラー処理の方式を更新
  • `os.writefile` や `os.rm` のエラーハンドリングを適切に変更

修正後のコードを確認し、コンパイルを試してみてください。

修正済みの全体を表示してくれるかと思ったら、そうでもなかったぞ。これを見な がら修正するのも手間のかかる事です。

ved

本家のHPにFAQが有って、そこを辿って行くと、What about editor support? なんて項がある。Vはシンプルな言語だから重厚なIDEなんて必要無いよ、と 自慢?してる。どうせなら、Vの勉強方々、Vで記述されたeditorである vlang/ved なんか、どうでっしゃろと推し。 git logすると、更新が年末で止っているようだけど、開発は継続してるのかな?

純然たるGUIなアプリである。普通GUIって言うと、GUIの為の土台が必要。それの準備 に多大な時間を要すものだけど、ほとんど気にする必要はなかった。エラーになったのは、 リナのいじわるだけだった。そう、X関係のヘッダーファイルが無いぞと言うあれである。 ヘッダー名を、apt-file search Xcursor.h みたいにしてパッケージ名を探し出し、 それをインストールするだけ。3回程のもぐら叩きで、無事にコンパイルできた。

sakae@lu:ved$ ldd ved
        linux-vdso.so.1 (0x00007ffe36b72000)
        libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x000072fd3b61b000)
        libmvec.so.1 => /lib/x86_64-linux-gnu/libmvec.so.1 (0x000072fd3b522000)
        libX11.so.6 => /lib/x86_64-linux-gnu/libX11.so.6 (0x000072fd3b3e5000)
        libGL.so.1 => /lib/x86_64-linux-gnu/libGL.so.1 (0x000072fd3b35e000)
        libXcursor.so.1 => /lib/x86_64-linux-gnu/libXcursor.so.1 (0x000072fd3b352000)
        libXi.so.6 => /lib/x86_64-linux-gnu/libXi.so.6 (0x000072fd3b33d000)
        libXrandr.so.2 => /lib/x86_64-linux-gnu/libXrandr.so.2 (0x000072fd3b330000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x000072fd3b000000)
        /lib64/ld-linux-x86-64.so.2 (0x000072fd3b71d000)
        libxcb.so.1 => /lib/x86_64-linux-gnu/libxcb.so.1 (0x000072fd3b307000)
        libGLdispatch.so.0 => /lib/x86_64-linux-gnu/libGLdispatch.so.0 (0x000072fd3b24f000)
        libGLX.so.0 => /lib/x86_64-linux-gnu/libGLX.so.0 (0x000072fd3b21a000)
        libXrender.so.1 => /lib/x86_64-linux-gnu/libXrender.so.1 (0x000072fd3aff4000)
        libXfixes.so.3 => /lib/x86_64-linux-gnu/libXfixes.so.3 (0x000072fd3b212000)
        libXext.so.6 => /lib/x86_64-linux-gnu/libXext.so.6 (0x000072fd3afe0000)
        libXau.so.6 => /lib/x86_64-linux-gnu/libXau.so.6 (0x000072fd3afda000)
        libXdmcp.so.6 => /lib/x86_64-linux-gnu/libXdmcp.so.6 (0x000072fd3afd0000)
        libbsd.so.0 => /lib/x86_64-linux-gnu/libbsd.so.0 (0x000072fd3afba000)
        libmd.so.0 => /lib/x86_64-linux-gnu/libmd.so.0 (0x000072fd3afab000)

こんなのを内部的に使っていたぞ。ザッと見、特殊なパッケージは使用していない風だ。 起動時に色々な設定情報が出てくるんで、それをconf.tomlに記述すると有効になるはず なんだけど、使い方が悪いせいか思い通りにコントロールできなかった。 もう、さっさと見切りを付けましょ。emacs用のv-modeが有る事は承知してるけど、 ここは、goとvがお友達って事を思いだして、goに便乗する事にした。

;; V
(setq auto-mode-alist
      (append '(("\\.v" . go-mode))
              auto-mode-alist))

examples

山のように(119個)サンプルが提供されてて圧倒される。 そのうちの半数が *.v というシングルファイル。後の半数はdir形式になってた。 ならば、ちゃんとv.modが用意されてるかと思ったら、そうでもない。まともに 利用してたのは、これぐらい。

Module {
        name: 'vviewer',
        description: 'A simple image viewer written in V.',
        version: '0.9',
        repo_url: 'https://github.com/vlang/v/tree/master/examples/viewer',
        dependencies: []
}

Module {
        name: 'v2048',
        description: 'A simple 2048 game written in V.',
        version: '0.0.2',
        repo_url: 'https://github.com/spytheman/v2048',
        dependencies: []
}

単なるメモ程度の機能しかない。goなんかと違って自由度100%って感じがする。その点 goは色々なコーダーを想定してるんで、強制力を持って製品の品質を保とうという方針。 雑に言えば窮屈この上ない、監獄仕様(ちょっと言い過ぎ?)だ。

興味の有るのは、簡単にGUI出来る事。有名なのはテトリスだな。でも正直ゲームは 好きではない。工芸品(ブルジョア向け)に興味を覚える。時計なんかは工芸品と言うか 工業製品(庶民向け)だな。

スイス国鉄御用達の視認性の良い時計が公開されてた。OSSだね。こちらは皆大好き pythonによる時計の作成方法。 【Tkinter】アナログ時計の作り方!

sakae@lu:clock$ v run clock.v
Press 'q' to quit.
sokol.memory.slog | user_data: (nil),
const_tag: sapp,
level: 2,
item_id: 49,
fname: /var/my/srcs/v/thirdparty/sokol/sokol_app.h,
line: 10180,
message: LINUX_X11_QUERY_SYSTEM_DPI_FAILED:
  failed to query system dpi value, assuming default 96.0

何かちゃんと設定すれば、このエラーは消えそうだ。

ちょいとコンパイル時間を計測。

sakae@lu:clock$ time v clock.v

real    0m0.603s
user    0m0.533s
sys     0m0.114s

正確に測るならVに任せてしまえば良い。

sakae@lu:clock$ v -show-timings clock.v
0.002    ms v start
0.851    ms v parsing CLI args
72.621   ms Builder.front_stages.parse_files
0.847    ms Builder.resolve_deps
211.775  ms Builder.parse_imports
51.428   ms SCAN
213.988  ms PARSE
284.498  ms ALL_FRONT_STAGES
0.019    ms Checker.generic_insts_to_concrete
110.514  ms CHECK
20.268   ms TRANSFORM
0.181    ms Table.complete_interface_check
16.029   ms all_fn_const_and_global
26.895   ms MARKUSED
0.119    ms Gen.write_sorted_fn_typesymbol_declaration
7.271    ms Gen.sort_structs
9.776    ms cgen init
26.190   ms cgen parallel processing
0.476    ms Gen.sort_globals_consts
2.159    ms cgen unification
0.654    ms Gen.write_init_function
0.342    ms Gen.interface_table
2.291    ms cgen common
40.654   ms C GEN
116.545  ms C tcc.exe
6.440    ms Checker.struct_init
1.840    ms Checker.struct_decl
0.556    ms Checker.struct setting default_expr_typ
24.504   ms C GEN thread 0
23.597   ms C GEN thread 1
25.433   ms C GEN thread 2
618.695  ms TOTAL

随分細かい工程まで提示してきたな。昔はもっと大雑把だったような。

into v

そこら辺の記録が残っているか検索してみる。

sakae@lu:v$ grep show-timings -r .
./vlib/v/pref/pref.v:                   '-show-timings' {
./vlib/v/help/build/build.txt:  -show-timings
./vlib/v/help/build/build.txt:    Related to -show-timings, is the ability to compile a special instrumented
./CHANGELOG.md:- Add thread timing stats too, on `-show-timings -stats` (#22990)
./CHANGELOG.md:- Add a TOTAL line, to the output of -show-timings, to minimise the need for external tools on windows (#21847)
./CHANGELOG.md:- More detailed timings in `v -show-timings`.
./cmd/tools/fast/fast.v:const voptions = ' -skip-unused -show-timings -stats '
./cmd/tools/vrepeat.v:  if !cmd.contains('-show-timings') {
./cmd/tools/vrepeat.v:  // This is specific to V compilations, when they are run with `-show-timings`,
./cmd/tools/vcomplete.v:        '-show-timings',
./cmd/v/v.v:    if '-show-timings' in os.args {
./changelogs0.x/0.4.md:- More detailed timings in `v -show-timings`.
./vc/v_win.c:           else if (_SLIT_EQ(arg.str, arg.len, "-show-timings")) {
./vc/v_win.c:   if ((Array_string_contains(_const_os__args, _SLIT("-show-timings")))) {
./vc/v.c:               else if (_SLIT_EQ(arg.str, arg.len, "-show-timings")) {
./vc/v.c:       if ((Array_string_contains(_const_os__args, _SLIT("-show-timings")))) {

git logを追跡してみると、こんな履歴(抜粋)だった。

Date:   Tue Jul 14 18:45:44 2020 +0300
    pref: add -show-timings option

Date:   Thu Dec 29 17:33:40 2022 +0200
    cgen: add more detailed cgen stage timing info on `-show-timings`

Date:   Fri Jul 12 01:42:41 2024 +0300
    v: add a TOTAL line, to the output of -show-timings, to minimise the need for external tools on windows (#21847)

Date:   Wed Nov 27 16:40:31 2024 +0200
    v.util, v.builder, v.cgen: add thread timing stats too, on `-show-timings -stats` (#22990)

やけに横道に逸れたな。この続きは次回に(気が向いたら)ね。

沸点

Q: 高い山で米を炊くと芯のあるご飯になります。水の沸点が低くなるのが原因です。 富士山頂(3776m)での沸点は何度ですか? 標高での換算式が有ったら提示して。

A: 標高が上がると気圧が下がるため、水の沸点も低くなります。標高 \( h \)(m)での水の沸点 \( T_b \)(℃)を求める近似式は以下のようになります。

### 標高と沸点の関係式 \[ T_b \approx 100 - \frac{h}{300} \] (この式は標高が高くなると約 300mごとに沸点が1℃下がる という経験則に基づいています)

### 富士山頂(標高 3776m)の場合 \[ T_b \approx 100 - \frac{3776}{300} \] \[ T_b \approx 100 - 12.59 \] \[ T_b \approx 87.4℃ \]

したがって、**富士山頂での水の沸点は約 87.4℃** となります。

より厳密には、大気圧と沸点の関係を示す クラペイロン-クラウジウスの式 を使うこともできますが、通常の計算ではこの経験式で十分な精度が得られます。

README

ご冗談でしょう,ファインマンさん 文庫本の上下を読んでみた。

名前だけは知ってたけど、初めての読書です。ノーベル物理学賞を受賞した 物理学者の軽妙なエッセイ。難しい話は全く出てこず、気楽に読めた。 翻訳は彼の奥さんとママ友になる方。先生が一生懸命に応援してくれたとの事。 そのせいか、とても身近に感じられた。

興味が有ったら、何事にも一生懸命。蟻さんがどうやって巣に帰るか 動線を色鉛筆で付けてみたり。そこから蟻の撃退方法を編み出す所 なんて面白いねぇ。

金庫破りのテクニックをあからさまに、ここまで暴露しちゃっていいものか? 金庫屋から営業妨害と訴えられないか心配。金庫破りもパスワード・クラックも 一種通じるものがあるなあと、変な感心をしたりしたぞ。

まあ、彼はアインシュタインやらオッペンハイマーとかの同世代の戦中派。 金庫の秘密も、もう時効だろう。

表題は、MITからイギリス色豊かなプリンストン大学に編入した時の 歓迎会での一齣から取られている。

マントを着用して(ハリポタの世界です)、パーティに出席させられた。 学長夫人が新入生にお茶をふるまう。彼の所にやってきて、レモンそれとも ミルクって尋ねたそうな。そこで、彼は両方頂きます。

で、それを聞いた夫人の言葉を表題にした。面白いから読んでミレ!


This year's Index

Home