試行錯誤の年末年始 2026
1月半ばだというのに、外気温が20℃を超える陽気な日が続いています。
昔はこういうものに気分が左右されることはなかったのですが、最近は天気と気分が連動するようになって、なんだか自分も人間らしくなったなと思います。(曇天や夜中のほうがテンションが上がるタイプだったのに)
最近の出来事など
歯医者
先週から親知らずの治療を始めました。
一度で抜歯せず、先端をカットしてから数か月後に飛び出してきた部分を抜く、という方法を選びました。
治療後は血がなかなか止まらず、縫合したあとはかなり痛いです。
「若いうちに抜いておいた方が良い」と言われるのは、こういうことなのですね。
カフェイン断ち
痛み止めや抗生物質を飲んでいる間は、余計なサプリメントは控えたほうが良いと思い、5日ほどカフェインを断ちました。
この数日は、テンションの下落がかなりひどかったです。
こういうときの対処法として意識しているのは、ネガティブな理由づけをしないことです。
「感情が思考の領域を選び、理由づけによって感情が増幅する。そして、人は見ている方向に進む」
これが、自分なりに見つけた心の仕組みです。
気分が悪いときは、「楽しかった反動だ」「おなかが空いている」「睡眠不足だ」など、できるだけ肉体的な理由に置き換えることで、不幸な思考にとらわれるのを防ぐことができます。
今日は暖かく、よく晴れているので気分が良いのです。
株
最近、株価のプログラミングをいろいろと改良してみましたが、結局は予想に反する動きばかりで、うまくいきません。
所詮は素人ですね。
ドルベース
まず最初に試してみたのが、ドルベースで日経平均を見たらどうなるのか、という作戦です。
「相場を操作しているのは海外の機関投資家」
日経平均は下がっていないのに、円安が進むことで実質的な価値は下がっているのではないか。
その乖離を見てみようと考えました。

日経先物とドル円を二軸にして、データを記録するようにしました。
最初は、特定の範囲内に収まるように動いているように見えたのですが、実際には両者はほぼ連動していました。
さらに、時間外に大きく動いたあとに高止まりすることも多く、株価の予想に使えるようなものではありませんでした。
ヒートマップ
株価の記録データが蓄積するにつれて、ヒートマップも次第に当たらなくなってきました。
突発的な値動きに対する、その後の動きを予想する手法でしたが、年末年始のような例外的な動きには対応できませんでした。

上り調子のときのデータと、下り調子のときのデータが混ざり合い、データは次第に均一化していきますね。
過去一週間分、といった区切り方をしたほうが良いのかもしれません。
とはいえ、どちらにせよ突然の急上昇には対応できません。
(一晩で1500円上昇って何なんですか… orz)
ヒストグラム
12月のMSQ日の値動きを見ていて、特定の価格に強い引力がかかっているように感じました。
どんなに上げようとしても下げようとしても、最終的には 50,500円 に収束していくのです。そのときはマイクロを売り買いして、2万円ほど勝つことができました。
プットだのコールだの、正直よく分かってはいませんが、機関投資家にとって「この価格でないと困る」という水準があるのではないか、と思いました。
そこで、記録していた10秒刻みの株価データをヒストグラム化してみることにしました。

おお、これは見事に癖が出ていますね。
真空地帯もはっきり見えます。
ただ、これを見て52,200円で売ったら、2,000円以上踏み上げられているのですが……orz
日銀さん、ETFを5年分くらい一気に売ってもいいですよ(笑)
ゲーム
最近は、マインクラフトのRLCraftにハマっていました。
ボスやステータス育成など、RPG要素が多く追加されていて、やりごたえは抜群です。最初こそ高難度と言われていますが、育成が進むと一気にイージー化します。
ダイヤ剣の数倍の威力を持つレジェンダリー剣、6個まで装備できるアクセサリ。マップに頻繁に出現する中ボスは、レベルが15上がる経験値本を大量に落とします。
ファストトラベルも可能なので、かなり快適になっています。
最初はレベル上げに専念し、城を攻略し、遺跡を攻略し。
その後ドラゴンを探し始めましたが、なかなか見つからず、そのあたりで飽きました。

今年はブランチマイニングで年を越しました。
ゲーム改造
スキルアップのためというか、暇つぶしというか、最近はまたゲーム改造にも少しずつ手を出しています。
15年近く離れていたのですが、最近は Cheat Engine という便利なソフトがあるようです。
Cheat Engine には、標準的なメモリサーチ機能に加えて、デバッガやメモリの読み書きブレークポイント、Luaスクリプト、アセンブラのコードインジェクションなど、高度な機能が備わっています。
今回は、その中でもコードインジェクションに挑戦してみました。
とはいえ、チャッピーに出力してもらったコードを少しずつ弄っただけなのですが、いくつか作ってみるうちに、だいたい仕組みは理解できました。
昔は OllyDbg を使って、F1ヘルプなどの使われていない領域を塗りつぶし、そこに処理を飛ばすようなことをしていましたが、このツールでは alloc でメモリを確保し、そこに処理を飛ばす方法を使っています。
コンピュータウイルスなども、基本的にはこんな感じで感染させるのでしょうね。
Javaゲー
某カードゲームの行動回数が減らないコード
[ENABLE]
aobscan(INJECT,?? ?? ?? ?? ?? ?? ?? ??)
alloc(newmem,1024,INJECT)
registersymbol(INJECT)
label(return)
label(original)
label(mycode)
newmem:
// タグ判別
cmp dword ptr [rcx+8], F80003DF
jne original
// データオフセット値判別
cmp rbx, 84
je mycode
jmp original
mycode:
// 行動回数を3以下に減らさない
mov eax,[rsp]
cmp eax, 3
jge original
add rsp,08
mov [rcx+rbx], 3
jmp return
original:
mov eax,[rsp]
add rsp,08
mov [rcx+rbx],eax
// 元の処理を再現
jmp return
INJECT:
jmp newmem
nop 5
return:
[DISABLE]
INJECT:
db ?? ?? ?? ?? ?? ?? ?? ??
unregistersymbol(INJECT)
dealloc(newmem)こんな感じのコードになります。(スキャンコードは伏せておきます)
挿入位置のバイナリをサーチし、ジャンプ命令で上書きする、という形ですね。
Java(インタプリタ)製のゲームなので、これは行動回数を書き込む専用の関数ではなく、汎用的な数値書き込み関数のようです。そのため、関数が呼ばれたときに、それが目的のデータかどうかを判別する必要があります。何度かメモリをダンプし、変化しないデータの位置を見つける、という方法を取りました。
面白いのは、しばらくプレイしているとコードが機能しなくなることです。
Java には JIT という機能があり、よく使われるコードは最適化された機械語コードに変換されるようです。
最適化後のコードに対してインジェクションを書くか、ゲームを再起動するかのどちらかになりますが、一貫して使えないのは不便ですね。
Unityゲー
次は、Unity製の某ダンジョンゲームです。
コントローラーの LB を押しながら階段を上ると、上の階ではなく下の階に降りる、という仕様になっています。
[ENABLE]
//==================================================
// 共有領域
// +0x00 : lbFlag (DWORD) LB押下で1/離すと0
//==================================================
alloc(shared_mem,0x20)
registersymbol(shared_mem)
//==================================================
// INJECT1: 階層処理
//==================================================
aobscanmodule(INJECT_FLOOR_CHANGE,GameAssembly.dll,?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??)
alloc(CODE_FLOOR_CHANGE,1024,INJECT_FLOOR_CHANGE)
registersymbol(INJECT_FLOOR_CHANGE)
label(END_FLOOR_CHANGE)
label(ORG_FLOOR_CHANGE)
label(done1)
CODE_FLOOR_CHANGE:
mov ebx,[r14+6C] // 現在階層
//----------------------------------------
// ① LBが押されてたら即「下り」扱い
//----------------------------------------
cmp dword ptr [shared_mem],1
jne done1
// 現在階層より2階層下げる(実質1階層下り)
cmp ebx,1
jle done1
sub ebx,2
done1:
// 構造体側の値も更新(状態を揃える)
mov [r14+6C],ebx
mov [rsp+000000A4],r13d
jmp END_FLOOR_CHANGE
// 上書きする8バイト分の元コードを保存(disableで戻す用)
ORG_FLOOR_CHANGE:
readmem(INJECT_FLOOR_CHANGE,12)
INJECT_FLOOR_CHANGE:
jmp CODE_FLOOR_CHANGE
nop 7
END_FLOOR_CHANGE:
//==================================================
// LB: Windows.Gaming.Input.dll 側
// 11バイト上書き:mov [r9],al / mov al,1 / inc r10 / inc r9
//==================================================
aobscanmodule(INJECT_LB_CHECK,Windows.Gaming.Input.dll,?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??)
alloc(CODE_LB_CHECK,1024,INJECT_LB_CHECK)
registersymbol(INJECT_LB_CHECK)
label(END_LB_CHECK)
label(ORG_LB_CHECK)
label(skip_lb)
CODE_LB_CHECK:
// 元コード(上書きした分)を再現
mov [r9],al
// r10==4 の要素だけをLBとして拾う
cmp r10d,4
jne skip_lb
movzx eax,al
mov dword ptr [shared_mem],eax
skip_lb:
mov al,1
inc r10
inc r9
jmp END_LB_CHECK
ORG_LB_CHECK:
readmem(INJECT_LB_CHECK,12)
INJECT_LB_CHECK:
jmp CODE_LB_CHECK
nop 6 // 12 - 5 = 7
END_LB_CHECK:
//==================================================
[DISABLE]
// 元に戻す(readmemで保存してある元バイトを復元)
INJECT_FLOOR_CHANGE:
readmem(ORG_FLOOR_CHANGE,12)
INJECT_LB_CHECK:
readmem(ORG_LB_CHECK,11)
unregistersymbol(INJECT_FLOOR_CHANGE)
unregistersymbol(INJECT_LB_CHECK)
unregistersymbol(shared_mem)
dealloc(CODE_FLOOR_CHANGE)
dealloc(CODE_LB_CHECK)
dealloc(shared_mem)一つのコード内に、二つのインジェクションコードを書いています。
LBを押したときに共有メモリへフラグを書き込み、階段を下りた際にその値を読み取って、実際に下りるかどうかを判断する仕組みです。
こういった、ゲームの遊び幅を広げるような改造が、個人的には好きですね。
ツール制作
音声ランチャー
音声でRPAを起動できたら便利だと思い、Python製の音声ランチャーを作ってみました。
Shiftキーを押しながら話しかけると、あらかじめ登録しておいたプログラムが起動する、という仕組みです。
新しいアプリを一から作るのはなかなかハードルが高く、ググって調べるのも面倒で、これまではなかなか手を出せずにいました。
ですが、今はチャッピーがいるおかげで、かなり自由に作れるようになりました。
from vosk import Model, KaldiRecognizer
import pyaudio, subprocess, json, webbrowser
import win32api
import win32con
import time
import os
# ---------------------------------------------
# ① TRIGGERデータ構造(あなたの形式)
# [アプリ名, 引数, [照合ワードリスト]]
# ---------------------------------------------
TRIGGER = list()
# ツール起動
TRIGGER.append(["calc.exe", "", ["電卓"]])
TRIGGER.append(["notepad.exe", "", ["メモ"]])
TRIGGER.append(["python", r"D:\\program\\Python\\sakimono\\main.py", [["先物", "株価"], ["監視", "関し", "記録"]]])
# サイト表示
TRIGGER.append(["https://nikkei225jp.com/", "", ["世界", "株"]])
TRIGGER.append(["https://mail.google.com/", "", [["G", "G", "じ", "ジ", "辞意", "メール"], "メール"]])
TRIGGER.append(["https://keep.google.com/", "", ["キープ"]])
TRIGGER.append(["https://www.youtube.com/", "", ["ユー", "チューブ"]])
TRIGGER.append(["https://chatgpt.com/", "", [["チャット", "GPT"]]])
TRIGGER.append(["http://192.168.1.26:5000/user/futon", "", [["布団", "毛布"], ["温", "開始", "スタート"]]])
TRIGGER.append(["http://192.168.1.26:5000/user/futon_stop", "", [["布団", "毛布"], ["止"]]])
# RPAマクロ
TRIGGER.append(["pythonw", r"D:\\program\\Python\\RPA\\guiter\\canon_open.py", [["カノン", "金", "彼", "観音"], "練習"]])
TRIGGER.append(["pythonw", r"D:\\program\\Python\\RPA\\guiter\\air_open.py", [["エア", "ギター"], "練習"]])
TRIGGER.append(["pythonw", r"D:\\program\\Python\\RPA\\MARKETSPEED\\login_market_speed.py", ["スピ", ["起動", "ログイン"]]])
TRIGGER.append(["pythonw", r"D:\\program\\Python\\RPA\\MARKETSPEED\\tyumon.py", [["新規", "注文"], "注文"]])
TRIGGER.append(["pythonw", r"D:\\program\\Python\\RPA\\MARKETSPEED\\tenbai.py", [["転売", "売却"]]])
TRIGGER.append(["pythonw", r"D:\\program\\Python\\RPA\\vscode\\debug_end.py", ["デバッグ", ["終了", "給料", "終わり"]]])
TRIGGER.append(["pythonw", r"D:\\program\\Python\\RPA\\vscode\\debug_start.py", ["デバッグ", ["開始", "スタート"]]])
TRIGGER.append(["pythonw", r"D:\\program\\Python\\RPA\\vscode\\act_editor.py", ["VS", "コード"]])
TRIGGER.append(["pythonw", r"D:\\program\\Python\\RPA\\vscode\\act_editor.py", ["エディタ"]])
TRIGGER.append(["pythonw", r"D:\\program\\Python\\RPA\\system\\volume_down.py", [["ボリューム","音"],["ダウン", "下げ", "小"]]])
TRIGGER.append(["pythonw", r"D:\\program\\Python\\RPA\\system\\volume_up.py", [["ボリューム","音"],["アップ", "上げ", "大"]]])
TRIGGER.append(["pythonw", r"D:\\program\\Python\\RPA\\system\\volume_mute.py", "ミュート"])
TRIGGER.append(["pythonw", r"D:\\program\\Python\\RPA\\system\\open_music.py", "音楽"])
TRIGGER.append(["pythonw", r"D:\\program\\Python\\RPA\\system\\run_jtrim.py", [["画像", "トリム", "ドリーム"], ["編集", "トリム", "ドリーム"]]])
# -----------------------------------------------------
# アプリ起動
# -----------------------------------------------------
def launch_app(app, arg):
#win32api.ShellExecute(0, path, arg, None, ".", 0)
#RunAs(path, "", arg)
#ctypes.windll.shell32.ShellExecuteW(0, 0, path, arg, 0, 1)
if app.startswith("http://") or app.startswith("https://"):
os.startfile(app)
return
DETACHED_PROCESS = 0x00000008
CREATE_NEW_PROCESS_GROUP = 0x00000200
subprocess.Popen(
[app, arg],
creationflags=DETACHED_PROCESS | CREATE_NEW_PROCESS_GROUP,
close_fds=True,
shell=True
)
# -----------------------------------------------------
# 条件判定関数(AND + OR対応)
# -----------------------------------------------------
def check_trigger(text, words):
"""
words の例:
["電卓", "起動"] → 両方AND
[["G","じー"], "メール"] → (G系のどれか OR) AND (メール)
"""
for w in words:
if isinstance(w, list):
# ORグループ
if not any(sub in text for sub in w):
return False
else:
# AND条件
if w not in text:
return False
return True
def show_help():
print("\n==================== コマンド一覧 ====================")
for app, arg, words in TRIGGER:
# 実行内容の表記
if app.startswith("http"):
action = f"URLを開く: {app}"
elif app == "python" or app == "pythonw":
action = f"Pythonスクリプト: {arg}"
else:
action = f"アプリ起動: {app}"
# ワードリストの整形(AND と OR を可視化)
readable = []
for w in words:
if isinstance(w, list): # OR 条件
readable.append("(" + " OR ".join(w) + ")")
else: # AND 条件
readable.append(w)
condition = " AND ".join(readable)
print(f"- {action}\n 音声認識: {condition}")
print("=====================================================\n")
# -----------------------------------------------------
# 音声認識の準備
# -----------------------------------------------------
model = Model("model-ja")
rec = KaldiRecognizer(model, 16000)
p = pyaudio.PyAudio()
stream = p.open(
format=pyaudio.paInt16, channels=1,
rate=16000, input=True, frames_per_buffer=4096
)
stream.start_stream()
print("音声常駐中…(SHIFTを押しながら音声指示)(ヘルプ or コマンド)")
# Shift キーコード
SHIFT = win32con.VK_SHIFT
recognize_until = 0 # 認識を続ける期限時刻(time.time() の値)
# -----------------------------------------------------
# メインループ
# -----------------------------------------------------
while True:
now = time.time()
# ① Shiftを押した瞬間に認識モード 5秒延長
if win32api.GetAsyncKeyState(SHIFT) & 0x8000:
if now > recognize_until:
print("▶ 音声認識モード ON(5秒)")
recognize_until = now + 5 # 現在から5秒間認識
# ② 認識モードかどうか
if now < recognize_until:
data = stream.read(2048, exception_on_overflow=False)
if rec.AcceptWaveform(data):
result = json.loads(rec.Result())
text = result.get("text", "")
if not text:
continue
print("認識:", text)
if "ヘルプ" in text or "コマンド" in text:
show_help()
for app, arg, words in TRIGGER:
if check_trigger(text, words):
print(f"▶ {app} 起動(条件一致: {words})")
launch_app(app, arg)
break
else:
# 認識していない間は負荷軽減
time.sleep(0.03)音声認識には、軽量なライブラリである vosk を使っています。
リストの入れ子構造にすることで、複数パターンの認識ができるようになっています。このあたりの処理もチャッピーにお願いしたら、数秒で作ってくれました。
(自分でやっていたら、たぶん1時間はかかっていたと思います)
音声の誤認識も多いので、["終了", "給料"] のように複数のフレーズを登録しておくと良いですね。
使い勝手は、かなり良いです。
AI制作
なかなか思考がまとまらず、AI制作も止まったままです。
寝起きには良いアイデアが浮かんだ気がするのに、いざキーボードの前に座ると、思考が止まってしまう。
何なんでしょうね、この症状は。
そこで思いついたのが、寝起きにスマホで音声メモを取る、という方法でした。
Google Keep を起動し、音声で思いついたことをそのままつらつらと入力します。
まず 知識は何と何が繋がっているかが ユニークさになる
知識には脳内の知識と現実の知識の2種類があるがややこしくしないためにここでは脳内の知識に絞る
炭素鋼 の定義について 迷った
炭素プラス 鋼とすべきなのか これはただの言葉の組み合わせ なのか
海外では 単一の単語としては使われるかもしれない
命名というのは連想しやすいように 適当につけたものであってそのものの本質を表すものではない
組み合わせ 言葉は助詞を伴うものに限定すべきだろうか
モノに対して構造 知識は必要ない
知識のミクロ マクロ 表現の仕方がそもそも間違っているのだろうか
うちへの繋がりと外へのつながりを両方使って表現してきたが もう一つ考えられるのが 横への繋がりだ
構造 分類 関連
脳内だけでなく この世界は同じ 層にあるもの同士が影響を及ぼしあっている
人間がどのような活動をしたところで 地球の自転や公転に影響を与えることはない
人は人とつながり 星は星と繋がる
ミクロとマクロだけでなく 同層のつながりが必要だ
問題は 言語の構造と物体の構造の記述が違うということ
あの山のリンゴという言葉は、あの山とりんごの組み合わせだ
あの山は 補助的なもの 条件的なものでありりんごがその言葉の主になっている
組み合わせ 言葉でありながら それは一つのモノである
物を特定するために条件をつけた とも言える
自動車の部品を 知識 ネットワークで記述しようと考えたことがある
1.ハンドルに対して自動車の部品というタグをつけるべきなのか
2.自動車に対して ハンドルが 部品 というタグをつけるべきなのか
3.自動車のハンドル という言葉を作って自動車 プラス ハンドルという構造にすべきだろうか
4.自動車の部品という言葉を作って ハンドル 座席 ドアなどの情報を列挙すべきなのだろうか
一番しっくりくるのが 3番目だろう
1番目の問題は ハンドルに対して〇〇の部品という言葉が大量についてしまうことだ
2番目の問題は ハンドル + 部品とした時に、ハンドルの部品と解釈されてしまうこと。組み合わせ 言葉は 片側が条件として扱われなければいけない。つまり助詞で言えば"の"なのだ。
4番目の問題は、列挙は 分類の逆参照によって行われるような構造になっているため 直接登録してはいけないこと。赤に色を登録し、青に色を登録して、色を逆参照した時に赤と青が列挙されるという仕組み だ。情報が爆発しないようにする 大事な仕組みだ。データベースの逆だとも言える。
3番目は とてもしっくりくる。物を特定しやすいし、情報量がすっきりとしている。
つまり 物体の構造を記述する時は ◯◯(マクロ)の△△(ミクロ)という組み合わせ 言葉を使えば良い
これはあらゆる マクロ ミクロ構造に適用できそうだ。
人間のタンパク質。鹿児島県の枕崎市。3年生の b組。
分類 リンクがある中で 構造だけで分類 構造を記述できてしまうのには少し違和感があるが これらはきっとお互いに関係しあっている 右脳と左脳の機能の違いだと思う 内側へのリンクと外側へのリンク それらは 決して 反対側にあるわけではなく交わらないながらも世界の本質を捉えるために必要な機能である
自動車のハンドルは自動車に分類されるわけではなく自動車の部品に分類されるのである
これは決して 日本語に限って話ではなく知識の本質的構造であり 英語であれば ofだったり どの言語にもあるものである。
しかしここで問題が出てくるのが 構造 知識を助詞で言うところの"の"に限定してしまうと、でとかがとかをどのように記述すればいいかという問題が出てくる。これは日本語の欠陥のようなものだろうか。赤いりんご と記述して物として登録することが正しい。リンゴが赤いやリンゴは赤い という言葉は 形容詞が主になってしまう。これらはリンゴに対して関連リンクでつなぐべきだろう。
動詞の場合はどうだろうか ボールを投げる。これは投げるを主にしてボールを条件とすれば 一見正しい記述のように見える。ボールに対して投げるを関連でリンクするのは何か違うような気がする。
ボールは投げるになってしまうからだ。名詞だけでなく 動詞 も 主にして良いというルールにすべきではないだろうか。
主に動詞が来た時だけ助詞は"を"にすれば良い。
条件 絞り込みであることに変わりはない。
しかしそうなってくると大きな問題が出てくる。
全ての言葉に対してモノなのか動詞 なのか タグをつける必要が出てくるのだ。
投げる という言葉をイメージした時とリンゴという言葉をイメージした時に感じる感覚は大きく違う おそらく これは脳の領域の違いだと思われる つまりものは物の領域へ 動詞は動詞の領域に記録されているのではないかと思う
それらをタグ付けではなく記憶領域 そのものが違う
チャンク化することで余計な情報を排除できるがコンピューターではそうはいかないのかもしれない
動詞も 名詞も同じ領域に ユニークな ID で記録する
それらを 左脳の同一機構で言語処理する……今見返すと、神の声が聞こえているやばい人みたいですね。
これをチャッピーに投げて校正してもらいます。
ここからは、実際に寝起きに録ったメモの内容です。
知識のユニークさは、「何と何がつながっているか」によって生まれる
知識には、脳内の知識と現実の知識の2種類があるが、ここでは脳内の知識に絞る
「炭素鋼」という言葉の定義に迷った
炭素+鋼という単なる組み合わせなのか
海外では単語として扱われているのか
命名とは、連想しやすさのためのものであり、本質そのものではない
組み合わせ語は、助詞を伴うものに限定すべきだろうか
モノに対しては、構造としての知識は不要なのではないか
ミクロ/マクロという切り分け自体が間違っている可能性
内へのつながり、外へのつながりに加えて、「横へのつながり」もあるのではないか
構造・分類・関連
世界は、同じ層にあるもの同士が影響を与え合っている
人は人とつながり、星は星とつながる
ミクロとマクロだけでなく、同層のつながりが必要
自動車の部品を、知識ネットワークで記述しようと考えたことがある。
1.ハンドルに「自動車の部品」というタグを付ける
2.自動車に対して、「ハンドル=部品」という関係を付ける
3.「自動車のハンドル」という言葉を作る
4.「自動車の部品」という言葉を作り、ハンドル・座席・ドアを列挙する
一番しっくりくるのは、3番目でした。
1番は、ハンドルに「○○の部品」が大量に付く
2番は、「ハンドルの部品」と誤解される
4番は、分類の逆参照で表現すべきもので、直接登録すると情報が爆発する
3番は、物を特定しやすく、情報量もすっきりしています。
つまり、物体の構造を記述するには
「○○(マクロ)の△△(ミクロ)」という組み合わせ語を使えばよい。
これは多くの構造に適用できそうです。
人間のタンパク質、鹿児島県の枕崎市、3年生のB組。
ただし、ここで問題が出てきます。
構造を助詞で言うところの「の」に限定すると、
「で」「が」「を」などをどう扱うのか、という問題です。
「赤いりんご」を物として登録するのは正しい。
一方で、「りんごが赤い」「りんごは赤い」は、形容詞が主になってしまう。
これらは、りんごに対して関連リンクでつなぐべきでしょう。
では動詞はどうか。
「ボールを投げる」。
投げるを主にして、ボールを条件とするのは正しそうに見えますが、
ボールが「投げる」になってしまう違和感もあります。
名詞だけでなく、動詞も「主」になってよい、というルールにすべきなのか。
主が動詞のときだけ助詞を「を」にする、という考え方もありそうです。
ただしそうなると、
すべての言葉に「モノか/動詞か」というタグ付けが必要になります。
投げる、という言葉を思い浮かべたときと、
りんご、という言葉を思い浮かべたときの感覚は、明らかに違います。
おそらくこれは、脳の記憶領域の違いです。
タグ付けではなく、そもそも保存される領域が違う。
人間はチャンク化で余計な情報を排除できますが、
コンピュータではそうはいかないのかもしれません。
名詞も動詞も、同一の領域にユニークなIDとして記録し、
左脳の同一機構で言語処理する。少し違うところもありますが、なかなか読みやすくまとめてくれますね。
これからも寝起きボイスメモを続けてみようと思います。
今日は久しぶりに Visual Studio を起動して、ソースコードを見直していました。
チャッピーに「こういう機能のクラス名はどう付ければいいか」といった相談をすると、すぐに答えてくれるので、プログラミングがとても捗ります。
「汎用的な自作関数をまとめたヘッダの命名法」や「知識オブジェクトの命名法」など、英語力がほぼ皆無な自分にとっては、まさに神のような存在です。
ギター練習
なかなか上達しないクラシックギター。
楽譜を見ながら練習していると、いつまで経っても楽譜なしでは弾けるようになりませんね。
もっとも、楽譜に慣れることで、楽譜を見ながら即興的に新しい曲が弾けるようになる、というのも一つのスキルではあるのですが。
Canon や Air は、楽譜を見ながらであれば大体弾けるようになったので、次のおすすめ練習曲をチャッピーに提案してもらいました。すると、グリーンスリーブスが良いとのことだったので、今はそれを練習しています。
落ち着いた、良い曲ですね。
今のところ、冒頭の4フレーズくらいは、楽譜を見ずに弾けるようになりました。
チャンチャーンチャチャーチャーチャー、チャーチャ、チャーチャチャ♪
(擬音でお楽しみください)
おわりに
こんな感じで、試したり、作ったり、うまくいかなかったりしながら、年末年始を過ごしていました。
相場も、ゲームも、プログラミングも、思い通りにはいかないことばかりですが、手を動かして考えた分だけ、少しずつ見えるものは増えていきます。
うまくいかない時間も含めて、悪くない年明けだったと思います。
最近のコメント