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: エラーログを見ると、以下の修正が必要です:
`const ()` の変更
const (
は将来的にエラーになるので、修正が推奨されています。`v fmt -w nbldv.v` を実行すると自動修正されるかもしれません。
`strconv.vsprintf` の `unsafe` 指定 `strconv.vsprintf` を使用している部分を `unsafe` ブロック内に移動する必要があります:
unsafe { s += strconv.vsprintf('%d,%d,%d,%d\n', v[ymdh], v[hi], v[low], v[pls]) }
同様の箇所をすべて修正。
`?` の `!` への置換 `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からイギリス色豊かなプリンストン大学に編入した時の 歓迎会での一齣から取られている。
マントを着用して(ハリポタの世界です)、パーティに出席させられた。 学長夫人が新入生にお茶をふるまう。彼の所にやってきて、レモンそれとも ミルクって尋ねたそうな。そこで、彼は両方頂きます。
で、それを聞いた夫人の言葉を表題にした。面白いから読んでミレ!