olllama で翻訳: FreeBSD man から "[" 　

# ゴミをまた書いてしまった・・・
- ノイズレベルを上げることには定評があります。

# ollama　どうしたっけ・・・あっ？
ollama常駐していることをすっかり忘れて..
正月からｺﾂｺﾂつまらない業務に追われると生成AIで戯れることすら出来ません。

誰が遊んでも結果が分かりきったことでも、日々親しんでいるうちに何か別なことができるようになるものです。私の人生、チュートリアルの連続と言っても過言ではありませんが・・・

と、資源の無駄使い blah blah blah 取り敢えず気を取り直して、有効活用を考えます。

# FreeBSD のマニュアル..

<b>小金丸さんの日本語翻訳サイトの存在はでかい。
しばしば参照します。足を向けて寝られません。</b>

とはいえ、敢えて 大規模言語モデルの　”phi4”　を使ったらどう翻訳されるかを試してみます。

## お題　"[" 
いわゆる　Sheelスクリプトを書くとついてくる、なくてはならない
ご飯にふりかけ^H^H^H^H ならぬ、いわゆる「式評価だけやる」コマンドです。

test が　正式名称ですが、 "[]" で括って 条件式をはめ込むと、以後の処理分岐のための判定が出てきます。この仕組みよくわかってないので、後ほどソースを読みながら説明しようかと。

今回 ollama-cpu を載せた PCのスペック/OSを紹介しておきます。2-3年前に買い換えてそのまま。

* ASUS TUF GAMING B550M-PLUS 
* AMD Ryzen 7 5700G
* CORSAIR DDR4-3200MHz 16GB x 2
* ubuntu 24.04
``` 
Linux version 6.8.12-060812-generic (kernel@sita) (x86_64-linux-gnu-gcc-13 (Ubuntu 13.2.0-23ubuntu4) 13.2.0, GNU ld (GNU Binutils for Ubuntu) 2.42) #202405300722 SMP PREEMPT_DYNAMIC Thu May 30 11:55:07 UTC 2024
```

  LLM なんて骨太の問題にのに取り組むには、皆さんが心血を注いで組まれている業務機器に比べたらトンデモなくしょぼいモノですが、なんと llama.cpp/ollamaの登場で手元で動くのに何度も驚いています（＝ボケの始まり）　前回似たような投稿をしていると思い出しましたが取り敢えず無視してください。僕が伸び盛りの頃は「ハードウェアの進化がソフトウェアのチューニングを毎年覆していく」というチューニングなんて無駄！みたいな、物理的に新しいモノ買う金がアレば何でも解決の時代だったのです。そのおかげでブクブクと資源浪費の肥大化する文化が爛熟したのですが、この数年ムーアの法則の威力が衰えてきたように思えてきた昨今にこれですこれ。今日昨日株式市場に大打撃を加えたと噂されるDeepSeekなんかも　「ｵﾏｴﾗｱﾀﾏﾂｶｯﾃﾈｴﾀﾞﾛ」というか「ハードウェアの進化＞ソフトウェアの効率化」の流れをぶっ壊しに来たんだと思います。次のブレイクスルーは何年先なのでしょうね？　ちょっと面白い。　長生きはするものだと思うわけです。

* ollamaさんのこと：
```
strnh@ryzen5700-pc:~$ ollama ls
NAME                  	ID          	SIZE  	MODIFIED    
phi4:latest           	ac896e5b8b34	9.1 GB	2 weeks ago	
gemma2:latest         	ff02c3702f32	5.4 GB	2 weeks ago	
gemma:latest          	a72c7f4d0a15	5.0 GB	2 weeks ago	
llama2:latest         	78e26419b446	3.8 GB	2 weeks ago	
aya-expanse:latest    	65f986688a01	5.1 GB	2 weeks ago	
llama3.2-vision:latest	085a1fdae525	7.9 GB	2 weeks ago	
strnh@ryzen5700-pc:~$ 
```
↑ ちょっと遊んですぐ忘れてました。もったいねえ。

- 翻訳をやらせてみます。 "phi4" をロード。 
```
Model                                 
  	arch            	phi3  	                
  	parameters      	14.7B 	                
  	quantization    	Q4_K_M	                
  	context length  	16384 	                
  	embedding length	5120  	                

```
* FreeBSD の "man [" の出力を翻訳させています。CPUでやるので遅いんだろうと思いますが・・
* 実機に載せているGPUは nVidia Quadro K4000..  しょぼすぎて3GBしかないのでこのモデルを展開させようがありません。一応 CUDA11.4ドライバまで入れたのですがどうにもメモリが小さい...

* 以下出力です（phi4 が 独自に説明を付け足した部分があります）
```
テストユーティリティは式を評価し、それが真であればゼロ（真）の終了ステータス
を返します。そうでない場合は1（偽）を返します。式がない場合もtestは1（偽）を
返します。

すべての演算子とフラグは、別々の引数としてテストユーティリティに渡されます。


以下のプライマリが式構築に使用されます：

- `-b file` ファイルが存在しブロック特殊ファイルである場合は真です。
  
- `-c file` ファイルが存在し文字特殊ファイルである場合は真です。

- `-d file` ファイルが存在しディレクトリである場合は真です。
- `-e file` ファイルが存在する場合は真です（タイプに関わらず）。

- `-f file` ファイルが存在し、通常ファイルである場合は真です。

- `-g file` ファイルが存在し、そのセットグループIDフラグが設定されている場合
は真です。

- `-h file` ファイルが存在しシンボリックリンクである場合は真です。この演算子
はプログラムの以前のバージョンとの互換性を保つために残されています。その存在
に依存しないでください；代わりに `-L` を使用してください。

- `-k file` ファイルが存在し、スティッキービットが設定されている場合は真です
。

- `-n string` 文字列の長さが非ゼロである場合は真です。

- `-p file` ファイルが名前付きパイプ（FIFO）である場合は真です。

- `-r file` ファイルが存在し読み取り可能である場合は真です。

- `-s file` ファイルが存在し、サイズが0より大きい場合は真です。

- `-t file_descriptor`  
  `file_descriptor` のファイルディスクリプタ番号に対応するファイルが開いてお
り、端末と関連付けられている場合は真です。

- `-u file` ファイルが存在し、そのセットユーザーIDフラグが設定されている場合
は真です。

- `-w file`  
  ファイルが存在し書き込み可能である場合は真です。真が示すのは、書き込みフラ
グがオンであることだけです。ファイルテストが真を示していても、ファイルシステ
ムが読み取り専用の場合にはファイルは書き込み可能ではありません。

- `-x file`  
  ファイルが存在し実行可能である場合は真です。真が示すのは、実行フラグがオン
であることだけです。ファイルがディレクトリの場合、真はそのファイルが検索可能
であることを意味します。

- `-z string` 文字列の長さがゼロである場合は真です。

- `-L file` ファイルが存在しシンボリックリンクである場合は真です。

- `-O file`  
  ファイルが存在し、その所有者がこのプロセスの効果的なユーザーIDと一致する場
合は真です。

- `-G file` ファイルが存在し、そのグループがこのプロセスの効果的なグループ
IDと一致する場合は真です。
- `-S file` ファイルが存在しソケットである場合は真です。

- `file1 -nt file2`  
  `file1` が存在し、`file2` より新しい場合は真です。

- `file1 -ot file2`  
  `file1` が存在し、`file2` より古い場合は真です。

- `file1 -ef file2`  
  `file1` と `file2` が存在し、同じファイルを参照している場合は真です。

- `string` 　　文字列が空文字列でない場合は真です。

- `s1 = s2` 　文字列 `s1` と `s2` が一致する場合は真です。

- `s1 != s2`  文字列 `s1` と `s2` が異なる場合は真です。

- `s1 < s2`  文字列 `s1` が、文字のバイナリ値に基づいて `s2` より前に来る場合は真です。

- `s1 > s2`  
  文字列 `s1` が、文字のバイナリ値に基づいて `s2` より後に来る場合は真です。

- `n1 -eq n2`  
  整数 `n1` と `n2` が代数的に等しい場合は真です。

- `n1 -ne n2`  
  整数 `n1` と `n2` が代数的に等しくない場合は真です。

- `n1 -gt n2`  
  整数 `n1` が整数 `n2` より代数的に大きい場合は真です。

- `n1 -ge n2`  
  整数 `n1` が整数 `n2` より代数的に大きかったり等しい場合は真です。

- `n1 -lt n2`  
  整数 `n1` が整数 `n2` より代数的に小さい場合は真です。

- `n1 -le n2`  
  整数 `n1` が整数 `n2` より代数的に小かったり等しい場合は真です。

シンボリックリンクであるファイルの場合、テストはそれを完全にディレファレンス
してから参照されているファイルに対して式を評価しますが、`-h` と `-L` のプラ
イマリーを除きます。

これらのプライマリーは以下の演算子と組み合わせて使用できます：

- `!`: NOT 演算子。式全体を否定します。
- `&&`: AND 演算子。複数のテストが連続して行われ、すべてが真（成功）である場
合に結果が真となります。
- `\|\|`: OR 演算子。複数のテストが連続して行われ、少なくとも一つが真（成功
）である場合に結果が真となります。

これらを使うことで、より複雑な条件チェックをシンプルに記述することが可能です
。
- `! expression`  
  式が偽の場合は真です。NOT 演算子として使用され、式全体を否定します。

- `expression1 -a expression2`  
  `expression1` と `expression2` の両方が真である場合に真です。AND 演算子と
して機能し、二つの条件を同時に満たす必要があります。

- `expression1 -o expression2`  
  `expression1` または `expression2` のいずれか一方が真である場合に真です。
OR 演算子として機能し、少なくとも一つの条件が満たされていれば結果は真です。


- `( expression )`  
  式が真である場合は真です。括弧を使うことで、複数の演算子や式を明確にグルー
プ化し、優先順位を管理するために使用されます。

- 演算子 `-a` は `-o` よりも優先度が高いです。  
  これはAND 演算子（`-a`）がOR 演算子（`-o`）よりも強く評価されることを意味
します。

さらに、一部のシェルでは、このユーティリティに類似または同等の `test` コマン
ドを組み込み関数として提供する場合があります。詳細は `builtin(1)` のマニュア
ルページを参照してください。

これらの演算子や機能により、シェルスクリプト内で条件を柔軟かつ効率的にチェッ
クすることが可能です。

### GRAMMAR AMBIGUITY

テストの文法は本質的にあいまいです。一貫性を確保するために、IEEE Std 
1003.2（"POSIX.2"）のセクションD11.2/4.62.4で説明されているケースは、標準文
書で指定されたルールに従って一貫して評価されます。その他すべてのケースはコマ
ンドセマンティクスのあいまいさにさらされています。

特に、-a, -o, ( や ) を含む式だけがあいまいになり得ます。これらの演算子やグ
ループ化方法が複雑である場合、解釈が異なる可能性があります。

### EXIT STATUS

`test` ユーティリティは以下のいずれかの値を使って終了します：

- `0`：式が真に評価されました。
- `1`：式が偽に評価された、または式が欠けています。
- `>1`：エラーが発生しました。

### EXAMPLES

POSIX 機能のみを使用して、`test FILE1 -nt FILE2` を実装する方法：

   test -n "$(find -L -- \( -path FILE1 -prune \) -o -newer FILE2  2>/dev/null)"

説明:

- `find -L`: リンクを解決してファイルシステムを再帰的に検索します。
- `-- \( -path FILE1 -prune \)`: FILE1 と一致するパスの処理を中断し、サブデ
ィレクトリを再帰的に探索しないようにします。
- `-o -newer FILE2`: FILE1 以外で、FILE2 より新しいファイルまたはディレクト
リを検索します。
- `2>/dev/null`: 標準エラー出力を無視します。

このコマンドは、FILE1 が FILE2 よりも新しくないかどうかを確認し、結果の標準
出力が空でない場合（つまり、FILE1 より新しいファイルやディレクトリが存在する
場合）、`test -n` は真として評価されます。

### MODIFICATION USING NON-STANDARD PRIMARY

`find(1)` コマンドには標準でないプライマリーがあり、例えば `-newerca` を使用
して他のタイムスタンプを比較することが可能です。これにより、ファイルの変更時
間やアクセス時間など、さまざまなタイムスタンプを用いた条件分岐が行えます。

### COMPATIBILITY

一部の他の実装との互換性を持つために、`=` プライマリーは同じ意味で `==` と置
き換えることができます。この代替構文により、他システム間でも同等の動作を保証
することが可能です。

### SEE ALSO

- `builtin(1)`: シェルバイトインストールコマンドに関する情報。
- `expr(1)`: 式評価コマンドについての詳細。
- `find(1)`: ファイル検索と操作を行うコマンド。
- `sh(1)`: シェルコマンドに関する情報。
- `stat(1)`: ファイルの属性やステータスを取得するためのコマンド。
- `symlink(7)`: シンボリックリンクの作成および管理について。

### STANDARDS

`test` ユーティリティは IEEE Std 1003.2（POSIX.2）仕様のスーパーセットを実装
しています。以下のプライマリーは拡張機能です：

- `<`: 小さい
- `==`: 等しい
- `>`: 大きい
- `-ef`: 同じファイルエントリーを持つか
- `-nt`: より新しい（modification time）
- `-ot`: 古い（modification time）
- `-G`: グループ所有者と同一であるか
- `-O`: 所有者と同一であるか

### HISTORY

`test` ユーティリティは Version 7 AT&T UNIX に登場しました。

### BUGS

`test` コマンドにおける `-a`（AND）および `-o`（OR）オプションは、両方の条件
が常に評価されます。これにより、最初の条件式が偽であっても後続の条件を確認す
るためにファイルシステムへアクセスする必要があります。例えば、次のコマンドで
は `file` の書き込み可能性が常にチェックされてしまいます：

   [ -z abc -a -w file ]


この場合、変数 `abc` が空でないため `-z abc` は偽を返しますが、`-w file` の
条件も評価されるためファイルシステムに不要なアクセスが行われます。

このような問題を回避するためには、論理演算子 `&&` を使用して条件を分割するこ
とが推奨されます：

    [ -z abc ] && [ -w file ]

この書き方では、最初の式 `[ -z abc ]` が偽であれば2番目の式 `[ -w file ]` は
評価されず、ファイルシステムに不要なアクセスを避けることができます。

### 版情報

この部分は FreeBSD 14.2-RELEASE のリリースノートから抜粋されており、2016年
10月5日付けのものです。当時のバージョンではこのような特性が存在していました
。

これにより、効率的で不要なファイルシステムアクセスを避けた条件式の書き方を理
解することができます。
```

## 追補
よくみたら翻訳だけじゃなかった。

* shell の　コードには phi4 が bash の文法で解釈した内容説明が付きました。
ハルシネーションかと思ったのですが、 ここから bash の文ですよという認識をして付け足しをしたようです。なるほど厳密にコードレビューに使えるのかは私の経験は大したことがありませんから、まったく判断付きかねます・・