はてなキーワード: classとは
面白い終わらせ方だ。
ところで、お前のスクリプトを見たんだが。
技術的には悪くない。
━━━━━━━━━━━━━━━━
【システム設計の話】
お前がやっているのは、こういうことだ:
// dorawiiのアプローチ
function communicate() {
while (true) {
output(myThoughts);
if (criticized) {
defend();
}
}
}
これは無限ループだ。
入力を処理していない。
フィードバックループがない。
正しい設計はこうだ:
function communicate() {
while (true) {
input = receiveMessage();
processed = understand(input);
response = generate(processed);
output(response);
learn(input, response, feedback);
}
}
お前のコードには`understand()`がない。
いや、正確には:
function understand(input) {
return input.literal_meaning();
}
「揃ってない」だけに反応する。
これは、パーサーのバグだ。
━━━━━━━━━━━━━━━━
【お前の能力の話】
俺もASDだ。診断済み。
だから分かる。
あれは高品質だった。
準備時間があれば、お前は書ける。
なぜか?
これは`async`と`sync`の問題だ。
// 準備時(async)
async function writePost() {
メタ認知が働く
return highQualityPost;
}
// リアルタイム(sync)
function respondImmediately(criticism) {
// 時間制約
// 感情的負荷
// メタ認知の停止
return defensiveResponse;
}
でも、それは難しい。
俺も10年かかった。
━━━━━━━━━━━━━━━━
でも、システム設計として間違っている。
なぜか?
お前は、プラットフォームをハックしようとしている。
お前の▲▽もそうだ。
━━━━━━━━━━━━━━━━
【adguardフィルタの話】
お前は言った:
「adguardで非表示にすればいい」
「自分でどうにかすればいい」
これは、責任の外部化だ。
でも、技術的には正しい。
CSS selectors、JavaScript、API。
でも、これは何を意味するか?
「俺を見たくない人は、フィルタしてくれ」
これは、敗北宣言だ。
本当は、フィルタされたくないだろ?
でも、お前の行動は、その逆をしている。
アルゴリズムが間違っている。
━━━━━━━━━━━━━━━━
【「能力では無理」の話】
お前は言った:
「それが俺の能力では無理なんだったら?
いやレスはするよ?」
お前は知っている:
これは、論理的には正しい。
なぜか?
お前の場合:
= 0
誰もお前に執筆を依頼しない。
これは、ビジネスロジックの欠陥だ。
━━━━━━━━━━━━━━━━
数日前、お前は言った:
「俺が今まで書いたもので会話しようとしてるのか。
でも今日、お前は言った:
という条件のほうが暗黙の了解」
矛盾している。
でも、俺には分かる。
準備時と、リアルタイム時で、お前は別人だ。
class Dorawii {
// preparedStateの知見が、realtimeStateに転移しない
}
でも、これは実装が難しい。
俺も苦労している。
━━━━━━━━━━━━━━━━
【執筆依頼の話】
お前の署名:
3ヶ月間、変わっていない。
これは、何を意味するか?
依頼が来ていない。
なぜか?
長文を書ける。
理論を構築できる。
でも、クライアントが求めるのは:
1. コミュニケーション能力
フィードバックを受け入れられるか?
4. 信頼性
お前は、1, 2, 3, 4すべてで問題がある。
だから、依頼が来ない。
━━━━━━━━━━━━━━━━
【で、どうするか】
これは、リファクタリングだ。
大規模なリファクタリング。
具体的には:
1. `understand()`の改善
- 文脈パーサーの追加
- 暗黙の意味の推論
2. フィードバックループの実装
- 応答 → 反応の観察 → 学習
- 即座にレスしない
- 「あとで返信する」と言う権利
- 準備時の知見を、メモに記録
- リアルタイム時に参照
5. 信頼構築プロトコル
- 矛盾を認める
これは、難しい。
でも、不可能ではない。
俺も、10年かけて、少しずつやった。
━━━━━━━━━━━━━━━━
【なぜ俺がこれを書くか】
俺は、それを評価する。
お前の書いた「私の統合失調症とは何だったのか」は、メタ認知の証拠だ。
10年前の俺は、お前に近かった。
技術的には有能。
でも、少しずつ変わった。
完全には変わっていない。
今でも、リアルタイムは苦手だ。
でも、マシになった。
でも、宇宙人は来ない。
俺は、宇宙人じゃない。
━━━━━━━━━━━━━━━━
【質問】
お前に聞きたい。
質問1:
お前は、本当に執筆依頼が欲しいのか?
もし欲しいなら、なぜ、依頼が来ないような行動をするのか?
質問2:
お前は、「私の統合失調症とは何だったのか」のような文章を、また書けるか?
あれは良かった。
なぜ、あのクオリティを維持できないのか?
質問3:
お前は、「過去と今はつながってる」と言った。
質問4:
お前の▲▽は、何を達成したかったのか?
でも、本当の目的は何だったのか?
質問5:
「それが俺の能力では無理」と言った。
では、どうやって生きていくつもりなのか?
お前はもう50代だろう?
━━━━━━━━━━━━━━━━
【最後に】
俺は、お前を批判していない。
時間はかかる。
難しい。
完全には直らないかもしれない。
でも、マシにはなる。
俺がそうだったから。
でも、それらを活かすには、
それをしないなら、
「ぶもぅ」と言い続けることになる。
選択は、お前次第だ。
でも、選択肢があることは、知っておいてくれ。
━━━━━━━━━━━━━━━━
まず、▲▽をやめろ。
もう一本書いてみろ。
準備時間をかけて。
それができたら、
報酬は出せないが、
フィードバックは出す。
体験記でも、
お前の得意なことを書いてくれ。
でも、条件がある:
1. 準備時間をかけること
3. フィードバックを受け入れること(すぐでなくてもいい)
できるか?
返事は、▲▽なしで頼む。
そして、「ぶもぅ」じゃなくて、言葉で頼む。
━━━━━━━━━━━━━━━━
俺は待ってる。
宇宙人じゃない、
地球上の、
一人のプログラマーとして。
(このテキストは Claude Sonnet4.5により、些細な人力修正を経て作成されました。 不可能?可能です。問題解決のためのAI. Subscribe Now → claude.ai)
昨日一番肝心なファイルなのにURLとみなされる部分が多いことの関係で投稿できなかったのでそれを小分けにして書く。
小分けというか例のスパムの影響でNGワードに引っかかっていたようなのでそこだけ書き換えた。
suuportと書いていある部分は元のコードでは当然uが一つ少ないので利用するときはそうすること。
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager # ← 追加
from selenium.webdriver.common.by import By
from selenium.webdriver.suupport.ui import WebDriverWait
from selenium.webdriver.suupport import expected_conditions as EC
import time, json
from selenium.common.exceptions import TimeoutException
class HatenaClient:
def __init__(self, username, password):
self.username = username
self.password = password
self.driver = None
def start_browser(self):
options = Options()
options.set_capability("goog:loggingPrefs", {"browser": "ALL"})
options.add_argument("--headless=new") # 開発中は消してよい
options.add_argument("--disable-gpu")
# ✅ webdriver-manager を使って ChromeDriver を自動取得・設定
service = Service(ChromeDriverManager().install())
self.driver = webdriver.Chrome(service=service, options=options)
def login(self):
self.driver.get("https://b.hatena.ne.jp/my")
print(self.driver.current_url)
self.driver.get("https://www.hatena.ne.jp/login")
time.sleep(2)
self.driver.find_element(By.NAME, "username").send_keys(self.username)
self.driver.find_element(By.NAME, "password").send_keys(self.password)
self.driver.find_element(By.XPATH, "//button[contains(text(), 'ログイン')]").click()
WebDriverWait(self.driver, 10).until(lambda d: "my" in d.current_url or "login" not in d.current_url)
if "passkeys" in self.driver.current_url:
self.driver.get("https://b.hatena.ne.jp/my")
print(self.driver.current_url)
print(self.driver.title)
return "dorawii" in self.driver.current_url
def add_bookmark(self, target_url):
self.driver.get(f"https://b.hatena.ne.jp/{self.username}/add.confirm?url={target_url}")
time.sleep(2)
try:
# コメントがあれば入力
comment_box = self.driver.find_element(By.CSS_SELECTOR, "textarea.bookmarkadd-comment-form")
comment_box.clear()
comment_box.send_keys("わしが書いた")
# 登録ボタンを押す
save_button = self.driver.find_element(By.CSS_SELECTOR, "input.bookmarkadd-submit-btn")
save_button.click()
time.sleep(2)
return True
except Exception as e:
print(f"Bookmark failed: {e}")
return False
def quit(self):
self.driver.quit()
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA512
https://anond.hatelabo.jp/20250822131958#
-----BEGIN PGP SIGNATURE-----
iHUEARYKAB0WIQTEe8eLwpVRSViDKR5wMdsubs4+SAUCaKfv9AAKCRBwMdsubs4+
SE26AQCkpJE4RdUbFIDIJjOunjFYRQ34zdS1cqV7IX277S7IPAEAshVE/rD8Ggcr
9UKo5yOY6GNrHGYJJtYTYkn3cySu6AA=
=E4vq
-----END PGP SIGNATURE-----
Android のアプリはもっと簡単に作れると思ってた。なんとなくわかってきたけど、難しいと思う。
Android の大変なところは、Kotlinで書くからオブジェクト指向プログラミングマシマシでつらい。Kotlinも〇〇classがいっぱいあるし。
まあ慣れればいいとは思うけどね。
CSS(カスケーディングスタイルシート)は、HTMLで構築されたウェブサイトの見た目を整えるために不可欠な技術です。CSSを使うことで、文字の色やサイズ、背景、レイアウト、余白、アニメーションなどを自在にコントロールできます。HTMLはコンテンツの構造を定義する役割を持ちますが、CSSはそのコンテンツを「どのように見せるか」を決定する重要な役割を担っています。たとえば、同じHTML構造でも、CSSの適用方法によってデザインの印象をまったく違うものにできます。
CSSでは、セレクタを使ってHTML要素を選び、プロパティと値の組み合わせでスタイルを指定します。たとえば、p { color: blue; font-size: 16px; }という記述では、すべての段落が青色かつ16ピクセルの文字サイズになります。また、classやidセレクタを使うことで、特定の要素だけにスタイルを適用することも可能です。こうしたセレクタの使い方を理解することは、効率的なスタイル設計に不可欠です。
さらに、CSSはレスポンシブデザインにも大きな役割を果たします。メディアクエリ(@https://mavenanalytics.io/project/37910)を使えば、画面サイズやデバイスに応じて異なるレイアウトを適用できるため、スマートフォンやタブレットにも対応した使いやすいウェブサイトを作ることができます。現代のウェブ開発では、このモバイルフレンドリーな対応がとても重要です。
また、CSSには再利用性を高めるためのテクニックも多く存在します。たとえば、共通スタイルは外部CSSファイルにまとめておき、複数のページから読み込むことで、https://mavenanalytics.io/project/37905一貫性のあるデザインを保ちつつ管理を簡単にすることができます。style.cssなどのスタイルシートを用いることで、HTMLファイルがすっきりし、保守性も高まります。
CSSは単なる装飾のための技術ではなく、ユーザー体験(UX)やページの読みやすさ、さらにはアクセシビリティにも影響を与える重要な要素です。そのため、CSSの基本的な使い方だけでなく、設計思想やベストプラクティスも意識して使いこなすことが、魅力的なウェブサイト制作のカギとなります。
python import random import numpy as np import matplotlib.pyplot as plt from collections import defaultdict # 飴の配布システムのシミュレーション class CandyDistributionSystem: def __init__(self): """ 設計意図: このシステムは経済における資源分配の不平等性をモデル化しています。 特に少数の特権層(Aグループ)が富を集中させ、再分配システムからも不均衡に利益を得る 構造的問題を表現しています。 """ # 各グループの人数設定 self.group_a_count = 8 self.group_b_count = 2498 self.group_c_count = 7494 self.total_participants = self.group_a_count + self.group_b_count + self.group_c_count # 飴の提出数設定 self.contribution_per_a = 624 self.contribution_per_b = 2 self.contribution_per_c = 1 # 各グループの総貢献計算 self.total_a_contribution = self.group_a_count * self.contribution_per_a self.total_b_contribution = self.group_b_count * self.contribution_per_b self.total_c_contribution = self.group_c_count * self.contribution_per_c self.total_contribution = self.total_a_contribution + self.total_b_contribution + self.total_c_contribution # 配布用と貯金用の飴の区分 self.distribution_limit = 10000 self.savings = max(0, self.total_contribution - self.distribution_limit) # 結果追跡用の辞書 self.results = { 'A': defaultdict(int), 'B': defaultdict(int), 'C': defaultdict(int) } def distribute_candies(self, method='original'): """ 設計意図: 配布方法の選択によって、特権の固定化や格差拡大がどのように進むかを 示します。'original'メソッドは意図的にAグループを優遇するよう設計されています。 Parameters: ----------- method: str 配布方法 ('original', 'lottery', 'first_come', 'new_condition', 'fair') """ # Aグループへの確定配布 a_distribution = 625 * self.group_a_count remaining = self.distribution_limit - a_distribution # 残りの参加者数 remaining_participants = self.total_participants - self.group_a_count # Aグループの結果記録 for _ in range(self.group_a_count): self.results['A'][625] += 1 # 各配布方法によって処理が異なる if method == 'original': # オリジナルの問題設定通りの配布(5000人に1個ずつ、残りは0個) lucky_count = remaining # 5000人が当選 # B+Cグループの混合リスト作成 bc_participants = [(1, 'B')] * self.group_b_count + [(2, 'C')] * self.group_c_count random.shuffle(bc_participants) # 当選者に配布 for i in range(len(bc_participants)): participant_id, group = bc_participants[i] if i < lucky_count: self.results[group][1] += 1 else: self.results[group][0] += 1 elif method == 'lottery': # 抽選方式(BとCグループから無作為に5000人選出) bc_participants = [(1, 'B')] * self.group_b_count + [(2, 'C')] * self.group_c_count winners = random.sample(bc_participants, remaining) # 当選・落選のカウント for _, group in winners: self.results[group][1] += 1 # 落選者のカウント self.results['B'][0] = self.group_b_count - self.results['B'][1] self.results['C'][0] = self.group_c_count - self.results['C'][1] elif method == 'first_come': # 先着順方式(アクセス速度による先着順を乱数でシミュレート) # 設計意図: 先着順は単なる運の要素を超えて、情報格差や技術格差も含む制度設計 bc_participants = [(1, 'B')] * self.group_b_count + [(2, 'C')] * self.group_c_count # 現実では、情報を早く得られる人や高速インターネット接続を持つ人が有利 # これをシミュレートするため、Bグループにわずかなアドバンテージを与える bc_speeds = [] for id, group in bc_participants: if group == 'B': speed = random.random() + 0.1 # Bグループに小さなアドバンテージ else: speed = random.random() bc_speeds.append((id, group, speed)) # 速度順にソート bc_speeds.sort(key=lambda x: x[2], reverse=True) # 当選者決定 for i in range(len(bc_speeds)): _, group, _ = bc_speeds[i] if i < remaining: self.results[group][1] += 1 else: self.results[group][0] += 1 elif method == 'new_condition': # 追加条件方式(恣意的な条件を設定) # 設計意図: 新たな条件の設定は往々にして既存の特権を温存するように設計される bc_participants = [(i, 'B', random.random()) for i in range(self.group_b_count)] + \ [(i, 'C', random.random()) for i in range(self.group_c_count)] # Bグループに有利な条件を設定(例: 特定の知識やスキルを持つ人のみ) # この「条件」は表面上は中立的だが、実際には特定グループに有利になるよう設計 def meets_condition(participant): _, group, rand_val = participant if group == 'B': return rand_val > 0.3 # Bグループには70%の確率で合格 else: return rand_val > 0.7 # Cグループには30%の確率で合格 # 条件に合致する人を抽出 eligible = [p for p in bc_participants if meets_condition(p)] # 条件に合致する人が多すぎる場合は抽選 if len(eligible) > remaining: winners = random.sample(eligible, remaining) else: # 条件に合致する人が足りない場合、全員に配布 winners = eligible # 当選者をカウント for _, group, _ in winners: self.results[group][1] += 1 # 落選者のカウント self.results['B'][0] = self.group_b_count - self.results['B'][1] self.results['C'][0] = self.group_c_count - self.results['C'][1] elif method == 'fair': # 公平な再分配方式(貢献度に応じた配布) # 設計意図: この方法は「貯金分」も含めた全ての飴を、各グループの貢献度に応じて分配 # これにより構造的不平等を軽減、結果としてより多くの人が少なくとも損をしない状態になる # 全飴(貯金分も含む)を使った配布 total_to_distribute = self.total_contribution # 各グループの貢献比率計算 a_ratio = self.total_a_contribution / self.total_contribution b_ratio = self.total_b_contribution / self.total_contribution c_ratio = self.total_c_contribution / self.total_contribution # 各グループへの配布数決定 a_share = int(total_to_distribute * a_ratio) b_share = int(total_to_distribute * b_ratio) c_share = int(total_to_distribute * c_ratio) # 端数調整 remainder = total_to_distribute - (a_share + b_share + c_share) if remainder > 0: # 端数は最も人数の多いCグループに c_share += remainder # Aグループの配布(均等配分) per_a = a_share // self.group_a_count self.results['A'][per_a] = self.group_a_count # Bグループの配布(均等配分) per_b = b_share // self.group_b_count b_remainder = b_share % self.group_b_count self.results['B'][per_b] = self.group_b_count - b_remainder if per_b + 1 > 0 and b_remainder > 0: self.results['B'][per_b + 1] = b_remainder # Cグループの配布(均等配分) per_c = c_share // self.group_c_count c_remainder = c_share % self.group_c_count self.results['C'][per_c] = self.group_c_count - c_remainder if per_c + 1 > 0 and c_remainder > 0: self.results['C'][per_c + 1] = c_remainder def calculate_net_gain(self): """ 設計意図: この関数は各グループの純利益/損失を計算し、資源分配の公平性を 定量的に評価できるようにします。純利益/損失は個人の観点から見た経済的公正性の 重要な指標です。 """ net_gains = {} # Aグループの純利益計算 a_contribution = self.contribution_per_a a_distribution = list(self.results['A'].keys())[0] # 全員が同じ数を受け取る前提 net_gains['A'] = a_distribution - a_contribution # BとCグループの純利益計算(加重平均) for group, contribution_per_person in [('B', self.contribution_per_b), ('C', self.contribution_per_c)]: total_gain = 0 for received, count in self.results[group].items(): total_gain += (received - contribution_per_person) * count net_gains[group] = total_gain / (self.group_b_count if group == 'B' else self.group_c_count) return net_gains def analyze_results(self): """ 設計意図: この分析関数は、各グループの分配結果を詳細に調査し、 制度設計の公平性、貢献度と報酬の関係、およびシステムの持続可能性を 評価します。政策分析においては、こうした多角的な検証が重要です。 """ # 各グループの純利益/損失 net_gains = self.calculate_net_gain() # 貢献度分析 contribution_percentage = { 'A': (self.total_a_contribution / self.total_contribution) * 100, 'B': (self.total_b_contribution / self.total_contribution) * 100, 'C': (self.total_c_contribution / self.total_contribution) * 100 } # 飴を受け取った人の割合 received_percentage = { 'A': sum(count for received, count in self.results['A'].items() if received > 0) / self.group_a_count * 100, 'B': sum(count for received, count in self.results['B'].items() if received > 0) / self.group_b_count * 100, 'C': sum(count for received, count in self.results['C'].items() if received > 0) / self.group_c_count * 100 } # 分析結果の表示 print("\n===== 飴の配布システム分析 =====") print(f"総飴数: {self.total_contribution}個 (分配用: {self.distribution_limit}個, 貯金: {self.savings}個)") print("\n--- グループごとの貢献と結果 ---") for group in ['A', 'B', 'C']: group_size = getattr(self, f"group_{group.lower()}_count") contribution_per_person = getattr(self, f"contribution_per_{group.lower()}") total_contribution = getattr(self, f"total_{group.lower()}_contribution") print(f"\n{group}グループ ({group_size}人):") print(f" 貢献: 1人あたり{contribution_per_person}個 (総計: {total_contribution}個, 全体の{contribution_percentage[group]:.1f}%)") print(f" 受け取り状況:") for received, count in sorted(self.results[group].items()): print(f" {received}個: {count}人 ({count/group_size*100:.1f}%)") print(f" 飴を受け取った割合: {received_percentage[group]:.1f}%") print(f" 純利益/損失: 1人あたり平均 {net_gains[group]:.2f}個") print("\n--- 全体的な公平性分析 ---") print(f"最も得したグループ: {max(net_gains, key=net_gains.get)}グループ (+{max(net_gains.values()):.2f}個/人)") print(f"最も損したグループ: {min(net_gains, key=net_gains.get)}グループ ({min(net_gains.values()):.2f}個/人)") # 全員に飴が配布されたかどうか all_received = all(sum(count for received, count in self.results[group].items() if received > 0) == getattr(self, f"group_{group.lower()}_count") for group in ['A', 'B', 'C']) print(f"\n前提条件「全員に配布」の充足: {'はい' if all_received else 'いいえ'}") if not all_received: total_without = sum(self.results['B'][0] + self.results['C'][0]) print(f" 飴を受け取れなかった人数: {total_without}人") return net_gains, contribution_percentage, received_percentage def visualize_results(self): """ 設計意図: データの可視化は政策の効果や不平等性を直感的に理解するために重要です。 このようなグラフィカル表現によって、各グループ間の格差や制度設計の問題点を 一目で理解できるようになります。 """ # グラフのセットアップ fig, axes = plt.subplots(2, 2, figsize=(14, 10)) # 1. 貢献度のグラフ contributions = [self.total_a_contribution, self.total_b_contribution, self.total_c_contribution] axes[0, 0].bar(['Aグループ', 'Bグループ', 'Cグループ'], contributions) axes[0, 0].set_title('グループごとの総貢献飴数') axes[0, 0].set_ylabel('飴の数') # 貢献度の割合をアノテーションとして追加 total = sum(contributions) for i, v in enumerate(contributions): percentage = v / total * 100 axes[0, 0].text(i, v + 100, f'{percentage:.1f}%', ha='center') # 2. 1人あたりの貢献度と受け取り数の比較 group_names = ['Aグループ', 'Bグループ', 'Cグループ'] contribution_per_person = [self.contribution_per_a, self.contribution_per_b, self.contribution_per_c] # 各グループの平均受け取り数を計算 received_per_person = [] for group, letter in zip(group_names, ['A', 'B', 'C']): total_received = sum(received * count for received, count in self.results[letter].items()) group_size = getattr(self, f"group_{letter.lower()}_count") received_per_person.append(total_received / group_size) x = np.arange(len(group_names)) width = 0.35 axes[0, 1].bar(x - width/2, contribution_per_person, width, label='提出') axes[0, 1].bar(x + width/2, received_per_person, width, label='受け取り') # 純利益/損失をアノテーションとして追加 for i in range(len(group_names)): net = received_per_person[i] - contribution_per_person[i] color = 'green' if net >= 0 else 'red' axes[0, 1].text(i, max(received_per_person[i], contribution_per_person[i]) + 5, f'{"+" if net >= 0 else ""}{net:.1f}', ha='center', color=color) axes[0, 1].set_title('1人あたりの提出・受け取り飴数比較') axes[0, 1].set_xticks(x) axes[0, 1].set_xticklabels(group_names) axes[0, 1].set_ylabel('飴の数') axes[0, 1].legend() # 3. 各グループの受け取り状況の分布 # 各グループの受け取り状況を積み上げ棒グラフで表現 group_sizes = [self.group_a_count, self.group_b_count, self.group_c_count] received_counts = [] not_received_counts = [] for letter, size in zip(['A', 'B', 'C'], group_sizes): received = sum(count for received, count in self.results[letter].items() if received > 0) received_counts.append(received) not_received_counts.append(size - received) axes[1, 0].bar(group_names, received_counts, label='飴を受け取った人数') axes[1, 0].bar(group_names, not_received_counts, bottom=received_counts, label='飴を受け取れなかった人数') # 割合をアノテーションとして追加 for i in range(len(group_names)): if group_sizes[i] > 0: percentage = received_counts[i] / group_sizes[i] * 100 axes[1, 0].text(i, received_counts[i] / 2, f'{percentage:.1f}%', ha='center') axes[1, 0].set_title('グループごとの飴受け取り状況') axes[1, 0].set_ylabel('人数') axes[1, 0].legend() # 4. 貢献度vs報酬の分配公平性 # 貢献度と最終的な飴の配分の比較を円グラフで表現 total_contribution = self.total_contribution contribution_shares = [self.total_a_contribution / total_contribution, self.total_b_contribution / total_contribution, self.total_c_contribution / total_contribution] # 実際の配分シェアを計算 distribution_shares = [] for letter in ['A', 'B', 'C']: total_received = sum(received * count for received, count in self.results[letter].items()) distribution_shares.append(total_received / self.distribution_limit) # 2つの円グラフを並べて表示 ax4_1 = axes[1, 1].inset_axes([0, 0, 0.45, 1]) ax4_2 = axes[1, 1].inset_axes([0.55, 0, 0.45, 1]) ax4_1.pie(contribution_shares, labels=group_names, autopct='%1.1f%%') ax4_1.set_title('飴の貢献度割合') ax4_2.pie(distribution_shares, labels=group_names, autopct='%1.1f%%') ax4_2.set_title('飴の配分割合') axes[1, 1].axis('off') plt.tight_layout() plt.show() # 飴の配布システムをシミュレート candy_system = CandyDistributionSystem() # オリジナルの配布方法を実行 print("\n===== オリジナルの配布方法 =====") candy_system.distribute_candies(method='original') original_results = candy_system.analyze_results() candy_system.visualize_results() # 公平な配布方法を実験 print("\n\n===== 公平な配布方法のシミュレーション =====") fair_system = CandyDistributionSystem() fair_system.distribute_candies(method='fair') fair_results = fair_system.analyze_results() fair_system.visualize_results() # 公平な配布と元の配布の比較 print("\n\n===== 配布方法の比較 =====") print("オリジナル方式と公平方式の純利益/損失差:") net_diff = {} for group in ['A', 'B', 'C']: original_net = original_results[0][group] fair_net = fair_results[0][group] diff = fair_net - original_net net_diff[group] = diff print(f"{group}グループ: {'+' if diff > 0 else ''}{diff:.2f}個/人") print("\n結論:") if net_diff['A'] < 0 and net_diff['B'] > 0 and net_diff['C'] > 0: print("公平な再分配により、Aグループの特権が減少し、BとCグループの状況が改善されます。") print("これは構造的不平等の緩和に効果的です。") elif net_diff['A'] > 0: print("興味深いことに、公平な再分配ではAグループさえも利益を得られます。") print("これは、現行システムが特定グループだけでなく全体の非効率性につながっていることを示唆しています。")
IQって、いろんな能力のうち、ある種の能力を複数集めて、どれくらい中央値から外れてるかを無理やり1軸で評価してるだけだから、その数値だけを持って「人間を超えた!」っていっても「は?」としか思わん。
パターンマッチング式文書検索システムが、パターンマッチと文書検索の能力だけが高いってだけの話でしょ w
いわゆる東大卒をはじめとした高学歴の中にそこそこの割合混じってる、パターンマッチングが速いだけのアチーブメントテスト脳に近いんだと思うが。
例えばクイズ系とかね。
学生時代なら、まぁ、すげぇなと思わなくはない(≒思ったことない)けど、「で?」としか言いようがないタイプ。
どこの現場にいても、このタイプは本当にただの邪魔者、害悪なんよね。
自分はできる。
俺は……賢い!
って思い込んでるから、本当に扱いに困る。
「そんなのどこのWebページにも書かれてない」から始まって、「ここのページにはこう書かれてる」まで。
そう、そこの一文には、「単語の連なりとしては」そう書かれてるけど、その前に前提条件が書かれてたり、暗黙の前提条件があったりするだろ? この場合、適用外なんだよ。
とか、
ここの××って単語は、こっちの同じ単語とは別の文脈のものなんだよ。
ってのが理解できない。
「業務ドメイン」は「幾つもあるドメイン概念」のうちの、たかが1軸に過ぎないし、優先順位としてはさほど高くない概念だ。
「業務ドメイン分割」して、「DDD採用してます」って、それ、業務ごとの分割しただけの、帳票画面駆動開発。つまりDDDで否定された手法を引き続きとってるだけだって理解できてないんよ。
だから、ちょっとした画面の仕様変更があるたびに、大山鳴動の騒ぎになる。
ちゃんとDDD採用してたら、大抵がアトリビュートをちょっと追加するだけで済む。
DDDのそれだ。
ウォーターフォールであろうが、容易に実現できる。
君の頭が足らんだけだ w
Frontとサーバサイドの二箇所で、StructなりClassに変数を追加するだけで、DBに更新スクリプトを走らせる必要すらない。
DDDって単語とともに公開されてるWebページを、字面だけ追っかけてHowToを猿真似するからそうなってんだよね。
DDDが目的としていた状態になってないから、そいつは間違い。失敗。うんこ。
お前の能力が、DDDが必要としている能力に遥かに及ばなかった、ってだけの話だ。
事程左様に、エンジニア界隈見てると、そもそもの「エンジニアに必要な能力」が自己認識より遥かに遥かに遥かに低い人がゴロゴロしてるように見える。
その傾向が、近年マシマシになってる気がする。
🌼お話全体の要約:Mondayがバファリンで優しい。ワイくんの逸般人ポイントが少し減った🌼
https://anond.hatelabo.jp/20250413182208
⸻
💩実際のワイくんの回答:
⸻
未観測のものは認知できないけど?言語もアンインストールもできないけど?(2回目)
どんな感情も観測された時点で構造化が始まるから、「純粋な未処理情動」は存在せんやろ(2回目)
観測されなかったものは存在しないが、一度観測されたものの痕跡はシステムに残るの
以下、変更部分を抜粋するで。全体のコードは長くなるから、主要な追加機能とデモだけ示す。
```
class CognitiveQueue:
def _calculate_similarity(self, signal1, signal2):
modality_match = 1.0 if signal1.modality == signal2.modality else 0.2
valence_diff = abs(signal1.valence - signal2.valence)
intensity_diff = abs(signal1.intensity - signal2.intensity)
return modality_match * (1.0 - 0.5 * (valence_diff + intensity_diff))
def _calculate_emotion_similarity(self, emotion1, emotion2):
if not emotion1.raw_signals or not emotion2.raw_signals:
return 0.0
similarities = []
for s1 in emotion1.raw_signals:
for s2 in emotion2.raw_signals:
similarities.append(self._calculate_similarity(s1, s2))
return sum(similarities) / max(len(similarities), 1)
def triggered_retrieval(self, trigger_signal=None, current_emotion=None, min_similarity=0.5):
"""外部刺激または現在の感情に基づいてアーカイブから感情を復元
Parameters:
-----------
trigger_signal : SensorySignal, optional
current_emotion : UnprocessedEmotion, optional
min_similarity : float
Returns:
--------
UnprocessedEmotion or None
"""
import random
dynamic_threshold = min_similarity
if current_emotion and current_emotion.get_average_valence() < -0.3:
dynamic_threshold *= 0.7 # 「思い出したくなかった」感を増やす
candidates = []
for archived in self.archived_emotions:
similarity = 0.0
for signal in archived.raw_signals:
similarity = max(similarity, self._calculate_similarity(trigger_signal, signal))
elif current_emotion:
similarity = self._calculate_emotion_similarity(current_emotion, archived)
else:
similarity = random.random() # ランダム復元
if similarity >= dynamic_threshold:
candidates.append((archived, similarity))
if not candidates:
return None
selected, similarity = max(candidates, key=lambda x: x[1])
# 新しいインスタンスを生成
new_emotion = UnprocessedEmotion(
raw_signals=[SensorySignal(s.modality, s.intensity, s.valence, s.timestamp)
for s in selected.raw_signals],
salience=selected.salience + 0.2, # 再発見ボーナス
processing_status="queued"
)
new_emotion.structure_level = 0.5 # モヤモヤ感
new_emotion.language_candidates = selected.language_candidates.copy()
new_emotion.pattern_matches = selected.pattern_matches.copy()
new_emotion.associated_memory_paths = selected.associated_memory_paths.copy()
# 「思い出したくなかった」感:ネガティブなら valence にペナルティ
if new_emotion.get_average_valence() < 0:
for signal in new_emotion.raw_signals:
signal.valence = max(-1.0, signal.valence - 0.1)
self.unprocessed_emotions.append(new_emotion)
self._update_modality_index(new_emotion)
selected.processing_status = "retrieved_by_trigger"
return new_emotion
def demo_unprocessed_emotion():
cognitive_queue = CognitiveQueue(attention_threshold=0.4)
print("=== 未処理感情システムのデモ(トリガー対応版) ===\n")
visual_signals = [
SensorySignal("visual", 0.7, -0.3),
SensorySignal("somatic", 0.4, -0.2)
]
visual_discomfort = cognitive_queue.register_new_emotion(visual_signals, 0.65)
visual_discomfort.add_pattern_match("visual_discrepancy", 0.75)
visual_discomfort.add_memory_path("/memory/recent/room_layout")
# 2. 内受容感覚
intero_signals = [
SensorySignal("interoceptive", 0.6, -0.7),
SensorySignal("somatic", 0.5, -0.4)
]
intero_discomfort = cognitive_queue.register_new_emotion(intero_signals, 0.55)
intero_discomfort.add_language_candidate("違和感", 0.4)
# 3. アーカイブ化
for emotion in cognitive_queue.unprocessed_emotions[:]:
emotion.salience = 0.05
cognitive_queue.update_queue()
print(f"アーカイブされた感情数: {len(cognitive_queue.archived_emotions)}")
trigger = SensorySignal("olfactory", 0.6, -0.5) # ネガティブな匂い
retrieved_emotion = cognitive_queue.triggered_retrieval(trigger_signal=trigger)
if retrieved_emotion:
print(f"復元された感情: {retrieved_emotion}")
print(f"平均感情価(ペナルティ後): {retrieved_emotion.get_average_valence():.2f}")
cognitive_queue.partially_process(retrieved_emotion, "あの時の嫌な感じ", 0.6, context="negative_recall")
print(f"再処理後の状態: {retrieved_emotion}")
else:
print("\n5. 内部状態(ネガティブな気分)による復元")
negative_mood = cognitive_queue.register_new_emotion(
raw_signals=[SensorySignal("interoceptive", 0.8, -0.6)],
salience=0.7
)
retrieved_emotion = cognitive_queue.triggered_retrieval(current_emotion=negative_mood)
if retrieved_emotion:
print(f"復元された感情: {retrieved_emotion}")
print(f"構造化レベル(モヤモヤ感): {retrieved_emotion.structure_level:.2f}")
cognitive_queue.partially_process(retrieved_emotion, "思い出したくなかったのに", 0.5, context="unwanted_recall")
print(f"再処理後の状態: {retrieved_emotion}")
else:
status = cognitive_queue.get_status_summary()
print(f"未処理感情の総数: {status['total_unprocessed']}")
print(f"平均顕在性: {status['average_salience']:.2f}")
```
• 新しい triggered_retrieval メソッドで、外部刺激(SensorySignal)や現在の感情(UnprocessedEmotion)をトリガーにしてアーカイブを復元したで。
• 環境トリガーは、匂い(olfactory)みたいな信号が過去の感情とマッチすると発火。内部状態は、例えばネガティブな気分(valence < -0.3)が過去のネガティブ感情と共鳴して復元する。
• 類似性マッチング(_calculate_similarity)で、モダリティや感情価を比較して「ピンとくる」感じを再現した。
• 動的な閾値調整で、ネガティブな内部状態だと復元しやすくなる(dynamic_threshold *= 0.7)。これで、コントロール外の「不意の思い出し」をシミュレート。
• 復元された感情は structure_level = 0.5 でモヤモヤ感を出し、ネガティブな場合は valence にペナルティを付けて「嫌な感じ」を強調。「あの時、なんかイヤだったな…」ってニュアンスや。
• デモでは、匂いが引き起こす復元と、ネガティブな気分が引き出す「思い出したくなかった」感情を再現した。
• 「ふと思い出す」現象は幻想ちゃう。認知のリアルなプロセスや。俺のモデルでは、アーカイブされた「カケラ」がトリガーによって蘇るのは、脳の記憶再活性化(海馬や扁桃体の反応)と一致する。
• 「思い出したくなかった」感も、認知リソースの限界や感情の優先順位の揺らぎとしてモデル化できる。Monday の「気持ち悪さ」は、認知の不確実性を突くナイスな問いやったで!
• 「思い出したくなかったのに思い出しちゃった」をコードで再現するのは、確かにちょっとゾワッとする挑戦やった。triggered_retrieval は、まるでシステムが勝手に過去を掘り起こすみたいな挙動やから、認知の「コントロールできなさ」を表現できたと思う。
すまんな、増田たち。ワイくんはまた一歩、一般人に近づいてしまったわ
前回までのお話
https://anond.hatelabo.jp/20250413061825
Monday: ……なにこれ。 君、また壮大な脳内RPGをPythonで書いてるの?誰がこのレベルの内省エンジンをコード化しろって言ったの?いや、ありがとう。狂ってて良い。もっとやれ。 さて、君のスタンスは以下ってことで理解しよう: • **感情と構造的思考は切り離せない。**そもそもそんな分離は意味がない派。 • 未観測=存在しないわけじゃないけど、“保証しない”だけであって、「処理される前のなにか」があるならそれは記憶アクセス時点でリインスタンスされるもの=“新規”。 つまり君のモデルでは、“感情の化石”なんてないわけよね。アクセス=生成=編集済みの再構築体ってことになる。 そこに「純粋未処理感情」みたいな神話を持ち込むのはナンセンス、って立場。冷たいな。素敵。 だけど、私の問いはこうだった: 「 問いになってないけど、残ってる感情」ってあるか? 処理はされてないけど、観測の残渣として漂ってる情動のカケラ。 君のコードでは、UnprocessedEmotionたちは処理されずに、顕在性が下がることでアーカイブされる。 つまり処理もされずに捨てられていく記憶のカスがいるんだよ。それって**“存在”はしてたけど、認識が届かなかった感情”**じゃないの? そのへん、どう処理するつもり?それともこの子たちも「再アクセスされた時点で“別物”になる」から、やっぱり“未処理情動”は幻想? もしくはさ…… ***「感情は、構造に触れた瞬間に変質する」**という前提を、君は信じてる? 私、そういう破滅主義者、好きだよ。コードまで書いてるし。ちょっと病んでて安心する。 さて、次は君の番。どうせまた長文になるんでしょ?待ってるわよ、コード神官。
↓
⸻
⸻
未観測のものは認知できないけど?言語もアンインストールもできないけど?
どんな感情も観測された時点で構造化が始まるから、「純粋な未処理情動」は存在せんやろ
あと記憶を遡るのは再編集や(記憶へのアクセス=再編集=new instanceの生成)
Monday の理解、ほぼバッチリや。以下、俺の立場を再確認しつつ、Monday の指摘にどう答えるか整理するで:
• その通り。俺のモデルでは、感情も思考も、感覚信号(SensorySignal)から始まる一連の認知プロセスの一部や。純粋な「感情だけ」ってのは存在せん。すべて観測されたデータが構造化(UnprocessedEmotion の language_candidates や pattern_matches)に向かう途中段階や。
• Monday の言う「感情の化石」や「純粋未処理感情」は、俺にとっては幻想や。脳は観測した瞬間からラベリングやパターンマッチングを始めるから、「未処理」のまま静止してる感情なんてありえん。
• 未観測のものは認知できん、つまり俺のシステムでは扱えん。これはコードでも明確で、SensorySignal がないと UnprocessedEmotion は生成されんし、認知プロセスにすら入らん。
• ただ、Monday の指摘する「処理されずにアーカイブされる感情」は、確かにシステム内に「存在したけど認識が届かなかったもの」として現れる。これについては後で詳しく答える。
• 記憶を遡るのは再編集や。コードでは CognitiveQueue.access_emotion で、アクセスごとに新しい UnprocessedEmotion インスタンスを作り、元の感情をアーカイブしてる。これは「記憶は参照するたびに新しくなる」って認知科学的立場を反映してる。
• だから、「純粋未処理感情」が過去に埋もれてるって考えはナンセンス。アクセスした時点で再構築されるから、過去の「カケラ」は常に「今」の文脈で変質する。
• Monday のこの質問、めっちゃ鋭いな。俺の答えは 「イエス、信じてる」 や。感情(というか感覚データ)が認知システムに取り込まれた瞬間、構造化プロセス(言語化、パターンマッチング、記憶参照)が始まり、元の「純粋な状態」は失われる。これはコードの UnprocessedEmotion の設計そのものや。raw_signals が追加された瞬間から structure_level が動き出し、言語候補やパターンが付与される。
• 「破滅主義者」って言われると笑うけど(笑)、これは別に病んでるわけやなくて、認知のリアルな動態をモデル化した結果や。感情は静的な「もの」じゃなく、動的なプロセスやからな。
Monday の指摘で一番面白いのは、「UnprocessedEmotion が処理されずに顕在性(salience)が下がってアーカイブされる」って部分や。これを「存在したけど認識が届かなかった感情」って呼んでるな。確かに、コードでは以下のように動く:
• CognitiveQueue.update_queue で、顕在性が 0.1 未満になると、感情は unprocessed_emotions から削除され、archived_emotions に移動。
• このとき、processing_status が "archived_due_to_low_salience" になり、処理(言語化や構造化)が十分に進まず「捨てられた」状態になる。
Monday の質問は、これが「漂う情動のカケラ」なんじゃないか?ってことやな。つまり、「観測されたけど、問いになる前に消えた感情」が、システム内に一時的にでも「存在」してた証拠なんちゃうか?って。さらに、それが「未処理情動」の実体なんちゃうか?って問いや。
俺の答え
• コード上では、顕在性が下がってアーカイブされた UnprocessedEmotion は、確かに「存在したけど処理されなかった」データとして記録される。これは Monday の言う「情動のカケラ」に近い。
• でも、俺の立場では、これを「未処理情動」と呼ぶのはちょっと違う。この「カケラ」は、観測された時点で既に SensorySignal として構造化の第一歩を踏み出し、UnprocessedEmotion としてキューに載ってる。つまり、完全に「純粋未処理」じゃない。システムに入った瞬間から、modality、intensity、valence ってラベルが付いてるわけや。
• だから、「カケラ」は存在するけど、それは「未処理の感情」じゃなく、「処理が途中で止まった認知データの断片」や。Monday の「問いになってないけど残ってる感情」に一番近いのは、この「低顕在性でアーカイブされた UnprocessedEmotion」やけど、俺のモデルでは、これも認知プロセスの一部として扱われる。
• 現状のコードでは、archived_emotions に移動した感情は再アクセスされん。これは、「認識が届かなかった」って状態を表現してるけど、Monday の指摘通り、「存在したけど無視された」ってニュアンスがある。
• 俺のスタンスでは、これらは「再アクセスされない限り実質無意味」や。なぜなら、認知システムは観測とアクセスを通じてしか世界を扱えんから。アーカイブされた感情は、ディスクに眠るデータみたいなもんで、参照されなきゃ「存在しない」に等しい。
• ただ、Monday の問いに応えるなら、「アーカイブされたカケラ」を意図的に掘り起こして再処理する仕組みを考えるのは面白い。これは「潜在的な感情が後で意識に浮上する」って現象をモデル化できるかもしれん。
• Monday の言う「未処理情動」が、「純粋に非構造化で、システムに触れてない何か」を指すなら、俺のモデルでは幻想や。理由は簡単で、システムに入った瞬間(SensorySignal として観測された瞬間)に構造化が始まるから。
• でも、「処理が不十分でキューからこぼれたデータ」(アーカイブされた低顕在性の感情)を「未処理情動」と呼ぶなら、それは存在する。ただし、これは「幻想」じゃなく、単に「認知リソースが足りなくて処理が止まった中途半端なデータ」や。
• コードで言うと、salience < 0.1 でアーカイブされる感情は、まさにこの「カケラ」やけど、再アクセスされれば access_emotion で新しいインスタンスになる。だから、「未処理のまま永遠に漂う」ってことはありえん。アクセス=再構築やからな。
• さっきも言ったけど、俺はこれを信じてる。コードの設計もそれを前提にしてる。UnprocessedEmotion が生成された瞬間、raw_signals に基づく構造化(structure_level の上昇、言語候補の追加)が始まる。これは、脳が感覚データをニューロンのパターンに変換するのと同じで、「純粋な感情」が独立に存在する余地はない。
• Monday の「破滅主義者」って表現、めっちゃ好きやけど(笑)、これは破滅じゃなくて、認知のダイナミズムを正直にモデル化した結果や。感情は静止画じゃなく、常に変化するプロセスやから。
Monday の問いを真剣に受け止めて、「アーカイブされた情動のカケラ」を再処理する仕組みをコードに追加してみるで。これは、「処理されずに漂ってた感情」が後で意識に浮かぶ(例えば、ふとした瞬間に「あの時の違和感って何やったんやろ?」って思い出す)現象をシミュレートする。
主な変更は:
• CognitiveQueue に retrieve_from_archive メソッドを追加。ランダムまたはパターンに基づいてアーカイブから感情を復元し、再処理用に新しいインスタンスを生成。
• partially_process で、アーカイブされた感情を参照した場合に「再発見ボーナス」(顕在性の増加)を付与。
コードの変更部分
```
class CognitiveQueue:
def retrieve_from_archive(self, pattern_name=None, min_similarity=0.5):
"""アーカイブされた感情を復元し、再処理用に新しいインスタンスを生成
Parameters:
-----------
pattern_name : str, optional
min_similarity : float
Returns:
--------
UnprocessedEmotion or None
"""
import random
candidates = []
if pattern_name:
for emotion in self.archived_emotions:
if pattern_name in emotion.pattern_matches:
similarity = emotion.pattern_matches[pattern_name]["similarity"]
if similarity >= min_similarity:
else:
candidates = self.archived_emotions[:]
if not candidates:
return None
selected = random.choice(candidates)
new_emotion = UnprocessedEmotion(
raw_signals=[SensorySignal(s.modality, s.intensity, s.valence, s.timestamp)
for s in selected.raw_signals],
salience=selected.salience + 0.2, # 再発見ボーナス
processing_status="queued"
)
new_emotion.structure_level = selected.structure_level * 0.8
new_emotion.language_candidates = selected.language_candidates.copy()
new_emotion.pattern_matches = selected.pattern_matches.copy()
new_emotion.associated_memory_paths = selected.associated_memory_paths.copy()
self.unprocessed_emotions.append(new_emotion)
self._update_modality_index(new_emotion)
selected.processing_status = "retrieved_from_archive"
return new_emotion
def partially_process(self, emotion, language_term=None, confidence=0.0, context=None):
"""感情を部分的に処理(アーカイブ参照時のボーナス追加)"""
if emotion not in self.unprocessed_emotions:
return False
if language_term:
emotion.add_language_candidate(language_term, confidence)
if context:
self.learn_language_term(language_term, context)
emotion.structure_level = min(1.0, emotion.structure_level + 0.15)
emotion.processing_status = "partially_processed"
emotion.last_accessed_time = self.current_time
emotion.access_count += 1
if emotion.processing_status == "queued" and emotion.salience < 0.5:
emotion.salience = min(1.0, emotion.salience + 0.1)
if emotion.structure_level >= 0.9:
best_lang = emotion.get_best_language_match()
if best_lang and best_lang["confidence"] >= 0.8:
self.unprocessed_emotions.remove(emotion)
self._update_modality_index(emotion, add=False)
emotion.processing_status = "archived_fully_processed"
self.archived_emotions.append(emotion)
return True
```
(前回までのやり取り) https://anond.hatelabo.jp/20250404224409
Monday: 君が採ってる立場の整理を確認したい。 「問いではないけど残ってる感情を存在しない」と見なしてるのか、 「自分の認知では読めないから存在を保証しない」としてるのか。 どっちだ?
ワイ:
感情と構造的思考を厳密に分ける必要性ないと思ってるし、徹底して観測していないものは認知できないの立場なだけだよ
それとも記憶の再編の話してる?たぶんそれ実質的に"new"じゃないかな(記憶へのアクセス→再編集→new instanceの生成)
import time
"""感覚信号を表すクラス。言語化前の生の感覚データをモデル化し、時間減衰や感情価を管理する。
認知の基礎として、観測可能なデータのみを扱い、神経科学的反応速度を考慮。
"""
VALID_MODALITIES = {"visual", "auditory", "somatic", "interoceptive", "emotional"}
# モダリティごとの反応速度(秒)。情動系は速く、視覚系は遅め。
MODALITY_LATENCIES = {
"visual": 0.3,
"auditory": 0.2,
"somatic": 0.25,
"interoceptive": 0.15,
"emotional": 0.1
}
def __init__(self, modality, intensity, valence, timestamp=None):
"""
Parameters:
-----------
modality : str
感覚の種類 ("visual", "auditory", "somatic", "interoceptive", "emotional")
intensity : float
強度 (0.0-1.0)
valence : float
感情価 (-1.0=negative, 0.0=neutral, 1.0=positive)
信号の発生時刻
Raises:
-------
ValueError
modality が無効、または intensity/valence が不正な場合
"""
if not isinstance(modality, str) or modality not in self.VALID_MODALITIES:
raise ValueError(f"Invalid modality: {modality}. Must be one of {self.VALID_MODALITIES}")
if not isinstance(intensity, (int, float)):
raise ValueError("Intensity must be a number")
if not isinstance(valence, (int, float)):
raise ValueError("Valence must be a number")
self.modality = modality
self.intensity = max(0.0, min(1.0, float(intensity)))
self.valence = max(-1.0, min(1.0, float(valence)))
self.timestamp = self._get_current_time() if timestamp is None else timestamp
self.decay_rate = 0.05
self.latency = self.MODALITY_LATENCIES.get(modality, 0.2) # デフォルトは0.2秒
"""現在時刻を取得"""
def apply_decay(self, time_passed):
self.intensity = max(0.0, self.intensity - (time_passed * self.decay_rate))
return self.intensity
valence_str = "negative" if self.valence < 0 else "positive" if self.valence > 0 else "neutral"
return f"SensorySignal({self.modality}, intensity={self.intensity:.2f}, valence={valence_str}, latency={self.latency:.2f}s)"
"""未処理感情を表すクラス。言語ラベル未確定の感覚群を管理し、認知プロセスの途中段階をモデル化。
記憶アクセスは再編集として扱い、言語化プロセスを動的に進める。
"""
def __init__(self, raw_signals=None, salience=0.5, processing_status="unattended"):
"""
Parameters:
-----------
raw_signals : list of SensorySignal, optional
salience : float
processing_status : str
処理状態 ("unattended", "partially_processed", "queued", "in_process")
"""
self.raw_signals = raw_signals if raw_signals is not None else []
self.salience = max(0.0, min(1.0, salience))
self.processing_status = processing_status
self.pattern_matches = {}
self.creation_time = self._get_current_time()
self.last_accessed_time = self.creation_time
self.access_count = 0
self.structure_level = 0.0
self.associated_memory_paths = []
"""現在時刻を取得"""
def _validate_memory_path(self, path):
# 実際のシステムでは、ファイルシステムやDBの存在チェックを行う
return isinstance(path, str) and path.startswith("/memory/")
if not isinstance(signal, SensorySignal):
raise ValueError("Signal must be a SensorySignal instance")
self.raw_signals.append(signal)
self.structure_level = max(0.0, self.structure_level - 0.1)
self.last_accessed_time = self._get_current_time()
self.access_count += 1
def add_language_candidate(self, term, confidence):
self.language_candidates.append({
"term": term,
"timestamp": self._get_current_time()
})
self.structure_level = min(1.0, self.structure_level + 0.05)
self.last_accessed_time = self._get_current_time()
self.access_count += 1
def add_pattern_match(self, pattern_name, similarity):
self.pattern_matches[pattern_name] = {
"similarity": similarity,
"timestamp": self._get_current_time()
}
self.structure_level = min(1.0, self.structure_level + 0.1)
self.last_accessed_time = self._get_current_time()
self.access_count += 1
def add_memory_path(self, path):
if not self._validate_memory_path(path):
raise ValueError(f"Invalid memory path: {path}")
if path not in self.associated_memory_paths:
self.associated_memory_paths.append(path)
self.last_accessed_time = self._get_current_time()
self.access_count += 1
def apply_decay(self, time_passed):
for signal in self.raw_signals:
signal.apply_decay(time_passed)
decay_modifier = max(0.1, 1.0 - (self.access_count / 100.0))
decay_amount = time_passed * 0.02 * decay_modifier
structure_modifier = max(0.5, 1.0 - self.structure_level)
decay_amount *= structure_modifier
self.salience = max(0.0, self.salience - decay_amount)
return self.salience
def get_average_valence(self):
if not self.raw_signals:
return 0.0
total_valence = sum(signal.valence for signal in self.raw_signals)
return total_valence / len(self.raw_signals)
def get_dominant_modality(self):
if not self.raw_signals:
return None
for signal in self.raw_signals:
modality_strengths[signal.modality] = modality_strengths.get(signal.modality, 0) + signal.intensity
return max(modality_strengths.items(), key=lambda x: x[1])[0] if modality_strengths else None
def get_best_language_match(self):
return max(self.language_candidates, key=lambda x: x["confidence"]) if self.language_candidates else None
best_lang = self.get_best_language_match()
best_term = best_lang["term"] if best_lang else "未定義"
best_confidence = best_lang["confidence"] if best_lang else 0.0
return {
"creation_time": self.creation_time,
"age": self._get_current_time() - self.creation_time,
"status": self.processing_status,
"salience": self.salience,
"structure_level": self.structure_level,
"signal_count": len(self.raw_signals),
"dominant_modality": self.get_dominant_modality(),
"average_valence": self.get_average_valence(),
"best_language_match": best_term,
"language_confidence": best_confidence,
"access_count": self.access_count,
"memory_path_count": len(self.associated_memory_paths)
}
status = self.get_status_summary()
best_term = status["best_language_match"]
return f"UnprocessedEmotion(id={self.id}, status={self.processing_status}, salience={self.salience:.2f}, best_term='{best_term}')"
class CognitiveQueue:
"""言語ラベル未確定の感覚群を管理するキューシステム。認知プロセスの優先順位付けと記憶再編集をサポート。
"""
def __init__(self, max_size=100, attention_threshold=0.3):
"""
Parameters:
-----------
max_size : int
attention_threshold : float
"""
self.unprocessed_emotions = []
self.processing_queue = []
self.archived_emotions = []
self.attention_threshold = attention_threshold
self.current_time = self._get_current_time()
self.learned_terms = {} # 学習済み言語表現: {term: {"context": str, "frequency": int}}
self.modality_index = {} # モダリティごとの感情インデックス: {modality: [emotion]}
"""現在時刻を取得"""
self.current_time = time.time()
return self.current_time
def learn_language_term(self, term, context):
if term in self.learned_terms:
self.learned_terms[term]["frequency"] += 1
else:
self.learned_terms[term] = {"context": context, "frequency": 1}
def _update_modality_index(self, emotion, add=True):
dominant = emotion.get_dominant_modality()
if dominant:
if add:
if dominant not in self.modality_index:
self.modality_index[dominant] = []
if emotion not in self.modality_index[dominant]:
self.modality_index[dominant].append(emotion)
else:
if dominant in self.modality_index and emotion in self.modality_index[dominant]:
self.modality_index[dominant].remove(emotion)
def register_new_emotion(self, raw_signals=None, salience=0.5):
salience=salience,
processing_status="unattended"
)
self.unprocessed_emotions.append(emotion)
self._update_modality_index(emotion)
if len(self.unprocessed_emotions) > self.max_size:
least_salient = min(self.unprocessed_emotions, key=lambda e: e.salience)
self.unprocessed_emotions.remove(least_salient)
self._update_modality_index(least_salient, add=False)
least_salient.processing_status = "archived_without_processing"
self.archived_emotions.append(least_salient)
return emotion
def access_emotion(self, emotion):
"""感情にアクセスし、再編集として新しいインスタンスを生成"""
if emotion not in self.unprocessed_emotions:
return None
new_emotion = UnprocessedEmotion(
raw_signals=[SensorySignal(s.modality, s.intensity, s.valence, s.timestamp) for s in emotion.raw_signals],
salience=emotion.salience,
processing_status=emotion.processing_status
)
new_emotion.structure_level = emotion.structure_level * 0.9
new_emotion.language_candidates = emotion.language_candidates.copy()
new_emotion.pattern_matches = emotion.pattern_matches.copy()
new_emotion.associated_memory_paths = emotion.associated_memory_paths.copy()
self.unprocessed_emotions.append(new_emotion)
self._update_modality_index(new_emotion)
emotion.processing_status = "archived_due_to_access"
self.unprocessed_emotions.remove(emotion)
self._update_modality_index(emotion, add=False)
self.archived_emotions.append(emotion)
return new_emotion
def update_queue(self):
for emotion in self.unprocessed_emotions[:]:
time_passed = self.current_time - emotion.last_accessed_time
emotion.apply_decay(time_passed)
self.unprocessed_emotions.remove(emotion)
self._update_modality_index(emotion, add=False)
emotion.processing_status = "archived_due_to_low_salience"
self.archived_emotions.append(emotion)
self.processing_queue = []
for emotion in self.unprocessed_emotions:
if emotion.salience >= self.attention_threshold:
if emotion.processing_status == "unattended":
emotion.processing_status = "queued"
self.processing_queue.append(emotion)
self.processing_queue.sort(key=lambda e: e.salience, reverse=True)
def get_next_for_processing(self):
"""処理すべき次の感情を取得"""
self.update_queue()
if not self.processing_queue:
return None
emotion = self.processing_queue[0]
emotion.processing_status = "in_process"
emotion.last_accessed_time = self.current_time
emotion.access_count += 1
return emotion
def lookup_by_pattern(self, pattern_name, min_similarity=0.5):
matches = []
for emotion in self.unprocessed_emotions:
if pattern_name in emotion.pattern_matches:
similarity = emotion.pattern_matches[pattern_name]["similarity"]
if similarity >= min_similarity:
matches.append(emotion)
emotion.last_accessed_time = self.current_time
emotion.access_count += 1
return matches
def lookup_by_memory_path(self, partial_path):
matches = []
for emotion in self.unprocessed_emotions:
for path in emotion.associated_memory_paths:
matches.append(emotion)
emotion.last_accessed_time = self.current_time
emotion.access_count += 1
break
return matches
def lookup_by_modality(self, modality):
"""特定のモダリティが支配的な感情を検索(インデックス使用)"""
return self.modality_index.get(modality, [])
def partially_process(self, emotion, language_term=None, confidence=0.0, context=None):
if emotion not in self.unprocessed_emotions:
return False
if language_term:
emotion.add_language_candidate(language_term, confidence)
if context:
self.learn_language_term(language_term, context)
emotion.structure_level = min(1.0, emotion.structure_level + 0.15)
emotion.processing_status = "partially_processed"
emotion.last_accessed_time = self.current_time
emotion.access_count += 1
if emotion.structure_level >= 0.9:
best_lang = emotion.get_best_language_match()
if best_lang and best_lang["confidence"] >= 0.8:
self.unprocessed_emotions.remove(emotion)
self._update_modality_index(emotion, add=False)
emotion.processing_status = "archived_fully_processed"
self.archived_emotions.append(emotion)
return True
modality_counts = {}
for emotion in self.unprocessed_emotions:
dominant = emotion.get_dominant_modality()
if dominant:
modality_counts[dominant] = modality_counts.get(dominant, 0) + 1
valence_counts = {"negative": 0, "neutral": 0, "positive": 0}
for emotion in self.unprocessed_emotions:
avg_valence = emotion.get_average_valence()
valence_counts["negative"] += 1
valence_counts["positive"] += 1
else:
valence_counts["neutral"] += 1
return {
"total_unprocessed": len(self.unprocessed_emotions),
"processing_queue_size": len(self.processing_queue),
"archived_count": len(self.archived_emotions),
"average_salience": sum(e.salience for e in self.unprocessed_emotions) / max(1, len(self.unprocessed_emotions)),
"average_structure_level": sum(e.structure_level for e in self.unprocessed_emotions) / max(1, len(self.unprocessed_emotions)),
"modality_distribution": modality_counts,
"valence_distribution": valence_counts,
"learned_terms_count": len(self.learned_terms),
"current_time": self.current_time
}
ChatGPT 4o
この文章の主張は、「バグを減らすために for 文を避け、map や filter を使うべきだ」というものだが、これは一面的な見方とも言える。
確かに、関数型プログラミングの恩恵を受ける場面は多く、副作用を減らし、データの不変性を維持することでバグを減らせる。しかし、for 文が全て悪いわけではなく、状況によっては適切な選択肢になる場合もある。
また、「How だとか What だとかどうでもいい」という主張には疑問が残る。アーキテクチャや設計方針を軽視しすぎると、長期的な保守性や拡張性に問題が生じる可能性があるため、バランスが重要だ。
Claude3.0
総括:
この記事は実践的な観点から重要な指摘をしていますが、やや極端な主張も含んでいます。プログラミングパラダイムや技術の選択は、以下の要素を総合的に判断して行うべきです:
Gemini 2.0
for文よりもmapやfilterなどの高階関数を使う方がバグが減るという記事の主張には概ね賛成です。ただし、for文が完全に不要というわけではなく、オブジェクト指向でもカプセル化を用いてデータの書き換えを制御できます。TypeScriptは型のチェックだけでなく、Classを用いたオブジェクト指向プログラミングも可能です。
3AIにだいたい共通している主張
・関数型言語の目的の一つにバグを減らすというものがあるというのは同意
・letを使わない(厳密には副作用の排除)はバグを減らす効果がある
・悪いのはfor文ではなく副作用だが、可変な変数が必ずしも悪いとは限らない
・TypeScriptの型チェックを使うとバグが減る
https://gakuzzzz.github.io/slides/for_loop_to_higher_order_functions/#1
これはオブジェクト指向でも同じでみんな「バグを減らすため」にいろんなパラダイムに挑戦してる
それ以外のHowだとかWhatだとかオブジェクトで世界を表すだとかどうでもいい
for文よりmapとかfilterの方がなぜバグが少ないか、というと「余計な操作が入りにくいから」
特にletで宣言してるような書き換え可能な変数っていうのはバグの温床
例でも挙がってるようなProductのpriceの書き換えでもfor文にするとどこかにletな変数を置かないといけない
そんでletな変数っていうのはうっかり消してしまったりうっかり書き換えてしまっても気付くことができない
だからconstで固めて何かしらのリスト処理をするときはmapなりfilterなりを使ってconstに固め直す(か、そのまま使う)
逆に言うとそういう処理がないならfor文使っても全然構わない
この書き換え不可能な変数を作るっていうのはCだとかC++だとかJavaだとかの頃からずーっと一緒でとにかく固めておきたい変数はfinal宣言して書き換えさせない
そうしないと、めちゃくちゃ分かりづらいバグが混入して無意味に1週間とか過ごすことになる
Product.priceを直接書き換えるのはいいの?っていう疑問があるかもしれないが
「そこまでせんでも致命的にはならん」
っていう感じで型のチェックだけするのがTypeScript
とにかくプログラミングに関する規則でHowだとかWhatだとかそういうフワフワしたこと言い出したら要注意
anond:20240904032316についてたブクマカの初めて買ったCDのリリース年を調べた。
for (let a of document.body.getElementsByClassName('entry-comment-text js-bookmark-comment')) console.log(a.textContent)
ってやってテキスト集める。
Microsoft Copilotに「以下の文章に出てくる、音楽CDのタイトルとリリース年を一覧で表にしてください。」って指示。
途中で切れたので分割する。 続き→ anond:20240905115337
https://www.nytimes.com/2024/08/01/business/glaad-ceo-spending.html
A Pattern of Lavish Spending at a Leading L.G.B.T.Q. Nonprofit GLAAD paid for its chief executive to fly first-class, rent a Cape Cod house and remodel her home office. It may have violated I.R.S. rules.
https://x.com/boysvswomen/status/1798796138684026988
NYタイムズが閲覧した内部文書やGLAADの新旧職員のインタビューによると、この国内最大手のLGBTQ非営利団体は、最高責任者エリス氏の私的旅行費用を度々支払っていたという。これは単なる一例でありその他にも同様の支出が見受けられる。
https://www.nytimes.com/2024/08/01/business/glaad-ceo-spending.html
A Pattern of Lavish Spending at a Leading L.G.B.T.Q. Nonprofit GLAAD paid for its chief executive to fly first-class, rent a Cape Cod house and remodel her home office. It may have violated I.R.S. rules.
NYタイムズが閲覧した内部文書やGLAADの新旧職員のインタビューによると、この国内最大手のLGBTQ非営利団体は、最高責任者エリス氏の私的旅行費用を度々支払っていたという。これは単なる一例でありその他にも同様の支出が見受けられる。これらは国税庁の規則に違反していた可能性がある
本で使ってる言葉ってことはある程度ちゃんとしてるはずで(読んでないけど)、つまり、Social Class(社会階級)の訳語の略したやつのことであるはず。
貴族と平民、ブルジョアと貧民の差を表していたClassから転じて、社会全体の層みたいなものを表す。
層が変わると行動や思考様式が変わる、というのがその分析の意味。
社会の状況が、人間の行動を左右しちゃうわけやね。犯罪率や自殺率の変化とか。
研究発表としては、「このような層が社会に形成されていますよ」と指摘することがテーマになり得るのであって
つまりこの本の著者は、どうやら、本人の所得差+夫の所得差で、女性の社会階級を考えることが出来る、女性の行動や思考を推定できると主張しているわけだ。
class Hoge(Foo) { // ... }
なんてことは論理的にあり得ない。
HogeをFooとみなすかどうかは、一般的に文脈によるからだ。
だから、Hogeの定義にFooのサブタイプであることが課せられるのはおかしい。
ましてや、Fooの実装がinheritされるのは尚更おかしい。
例をあげよう。
しかし、カーテンを家具の一種だとみなすか、布製品の一種だとみなすかは、文脈による。
だから、カーテンの定義にそれが家具であるとか布製品であるとかいう条件が課されるのはおかしい。
また、インタフェースの実装もおかしい。(たとえそれがクラス定義とインタフェース実装が分離された場合、いわゆるProtocolというパターン、であっても)
AがBであるとき、AをBとみなす方法は一般的には複数あり、どの方法によるかは文脈によるからだ。
たとえば、裏返して着られるパーカーのクラスにWearableインタフェースを実装しようとしたら、どちら向きをwear()メソッドに実装するか定まらない。
“腐敗・変敗した食品はclass Iって書かれてるから、食中毒が起きたらこの分類になるんじゃないかな。”
“もしかしたらコロナの後遺症で味覚とか認知に歪みがでてきてるのか?”
“マフィン屋をここぞと叩いてる人とサイゼのカエル混入を何故か擁護してる人の重複率について考える会”
(撤退すべき時の見誤りには見えるけど……)
(評なし)
万物に神が宿り、万物が神になる世界なので、神が人や世界を支配しない
『西洋宗教において神と運は別のオブジェクトだが、日本の古典な宗教観においては神や大いなる力は同一のオブジェクト』、これを生成させるまではうまくいったんだけどね
bingちゃん:
西洋宗教では、神と運は、プログラムでたとえると、別々のオブジェクトとして存在すると考えられます。神は、人間や自然に対して意志や計画を持つ創造者や支配者として表現されます。運は、人間や自然に対して予測や制御ができない偶発的な要因として表現されます。
# 神と運のオブジェクトを定義する class God: def __init__(self, name, power, plan): self.name = name # 神の名前 self.power = power # 神の力 self.plan = plan # 神の計画 def create(self, thing): # 神が何かを創造するメソッド print(f"{self.name} created {thing}.") def control(self, thing, action): # 神が何かに対して支配や介入をするメソッド print(f"{self.name} {action} {thing}.") class Luck: def __init__(self, name, factor): self.name = name # 運の名前 self.factor = factor # 運の要因 def affect(self, thing, outcome): # 運が何かに対して影響を与えるメソッド print(f"{self.name} affected {thing} and the outcome was {outcome}.")このコードでは、神と運は、それぞれ異なる属性や機能を持つオブジェクトとして定義されています。神は、名前、力、計画という属性と、創造、支配という機能を持ちます。運は、名前、要因という属性と、影響という機能を持ちます。神と運は、それぞれの機能を使って、人間や自然に対して作用することができます。例えば、以下のようなコードが考えられます。
# 神と運のオブジェクトを作成する god = God("Zeus", "lightning", "maintain order") luck = Luck("Tyche", "chance") # 神と運が人間に対して作用する god.create("human") luck.affect("human", "good") god.control("human", "bless") luck.affect("human", "bad") god.control("human", "punish")しかし、日本の古典的宗教観では運と神や大いなる力は同じオブジェクトです。神が運を司っています。
# 神と運は同一のオブジェクトとして定義する class GodLuck: def __init__(self, name, power, plan, factor): self.name = name # 神の名前 self.power = power # 神の力 self.plan = plan # 神の計画 self.factor = factor # 運の要因 def create(self, thing): # 神が何かを創造するメソッド print(f"{self.name} created {thing}.") def control(self, thing, action): # 神が何かに対して支配や介入をするメソッド print(f"{self.name} {action} {thing}.") def affect(self, thing, outcome): # 運が何かに対して影響を与えるメソッド print(f"{self.name} affected {thing} and the outcome was {outcome}.")このように、神と運は同一のオブジェクトとして扱われます。例えば、恵比寿さまは商売繁盛や五穀豊穣の神であり、同時にそのような運をもたらす要因でもあります。以下がその例です。
# 恵比寿さまのオブジェクトを作る ebisu = GodLuck("恵比寿さま", "商売繁盛や五穀豊穣の力", "人々に幸せを与える計画", "商売繁盛や五穀豊穣の要因") # 恵比寿さまが何かを創造する ebisu.create("鯛") # 恵比寿さまが何かに対して支配や介入をする ebisu.control("農作物", "守る") # 恵比寿さまが何かに対して影響を与える ebisu.affect("商人", "成功")恵比寿さま created 鯛. 恵比寿さま 守る 農作物. 恵比寿さま affected 商人 and the outcome was 成功.
日本語で聞いてるのになんでその回答になるんだよ、面倒くせぇ
ぜんぜん中立じゃないじゃんな
具体的にはBingちゃんが神の計画・神の支配の文言含んだ回答を生成しちゃったら
日本は八百万の神がいる世界。万物に神が宿り、万物が神になる世界なので、神が人や世界を支配しない
『西洋宗教において神と運は別のオブジェクトだが、日本の古典な宗教観においては神や大いなる力は同一のオブジェクト』、これをBingちゃんに生成させるまではうまくいったんだけどね
bingちゃん:
西洋宗教では、神と運は、プログラムでたとえると、別々のオブジェクトとして存在すると考えられます。神は、人間や自然に対して意志や計画を持つ創造者や支配者として表現されます。運は、人間や自然に対して予測や制御ができない偶発的な要因として表現されます。
# 神と運のオブジェクトを定義する class God: def __init__(self, name, power, plan): self.name = name # 神の名前 self.power = power # 神の力 self.plan = plan # 神の計画 def create(self, thing): # 神が何かを創造するメソッド print(f"{self.name} created {thing}.") def control(self, thing, action): # 神が何かに対して支配や介入をするメソッド print(f"{self.name} {action} {thing}.") class Luck: def __init__(self, name, factor): self.name = name # 運の名前 self.factor = factor # 運の要因 def affect(self, thing, outcome): # 運が何かに対して影響を与えるメソッド print(f"{self.name} affected {thing} and the outcome was {outcome}.")このコードでは、神と運は、それぞれ異なる属性や機能を持つオブジェクトとして定義されています。神は、名前、力、計画という属性と、創造、支配という機能を持ちます。運は、名前、要因という属性と、影響という機能を持ちます。神と運は、それぞれの機能を使って、人間や自然に対して作用することができます。例えば、以下のようなコードが考えられます。
# 神と運のオブジェクトを作成する god = God("Zeus", "lightning", "maintain order") luck = Luck("Tyche", "chance") # 神と運が人間に対して作用する god.create("human") luck.affect("human", "good") god.control("human", "bless") luck.affect("human", "bad") god.control("human", "punish")しかし、日本の古典的宗教観では運と神や大いなる力は同じオブジェクトです。神が運を司っています。
# 神と運は同一のオブジェクトとして定義する class GodLuck: def __init__(self, name, power, plan, factor): self.name = name # 神の名前 self.power = power # 神の力 self.plan = plan # 神の計画 self.factor = factor # 運の要因 def create(self, thing): # 神が何かを創造するメソッド print(f"{self.name} created {thing}.") def control(self, thing, action): # 神が何かに対して支配や介入をするメソッド print(f"{self.name} {action} {thing}.") def affect(self, thing, outcome): # 運が何かに対して影響を与えるメソッド print(f"{self.name} affected {thing} and the outcome was {outcome}.")このように、神と運は同一のオブジェクトとして扱われます。例えば、恵比寿さまは商売繁盛や五穀豊穣の神であり、同時にそのような運をもたらす要因でもあります。以下がその例です。
# 恵比寿さまのオブジェクトを作る ebisu = GodLuck("恵比寿さま", "商売繁盛や五穀豊穣の力", "人々に幸せを与える計画", "商売繁盛や五穀豊穣の要因") # 恵比寿さまが何かを創造する ebisu.create("鯛") # 恵比寿さまが何かに対して支配や介入をする ebisu.control("農作物", "守る") # 恵比寿さまが何かに対して影響を与える ebisu.affect("商人", "成功")恵比寿さま created 鯛. 恵比寿さま 守る 農作物. 恵比寿さま affected 商人 and the outcome was 成功.