「str」を含む日記 RSS

はてなキーワード: strとは

2025-10-12

[]

2025年10月12日(日)17時52分

今日の夕食はいつも通り、日曜恒例のピザスケジュールを厳守した。

厳密に言えば、ルームメイトが2分遅れで注文したため、配達時刻が18時00分ではなく18時02分になった。

この誤差は一見些細だが、僕の体内リズムに対しては量子重力的なバックリアクションを生む。

夕食の周期は宇宙の膨張と同じく、初期条件の微小なゆらぎが数時間後に巨大な非可逆性をもたらすのだ。

僕はピザを食べる前にその誤差を補正するため、腕時計を2分進め、以後すべての行動をそれに合わせた。

ルームメイトは「そんなことして何の意味があるんだ」と言ったが、彼はエントロピーの不可逆性と人間スケジュール感覚相互作用理解していない。

今日の午前中は、超弦理論の非整合双対カテゴリ構造について考えていた。

簡単に言えば、AdS/CFTのような整合対応関係ではなく、dS空間における非ユニタリ境界理論がどのように自己整合情報写像を持ちうるか、という問題だ。

ただしこれは普通のホログラフィック原理範疇ではなく、∞-群oid圏上で定義される可逆でない自然変換を持つ圏論的場理論を考える必要がある。

具体的には、僕は内部的Hom-対象定義修正し、対象のもの自己準同型を持つトポス上の層圏として定義される場合に、ポテンシャル双対写像が一意に定まる条件を導いた。

ユニタリ性は単なる障害ではなく、境界理論が持つ時間的向きの非可換性の反映であると考えられる。

ウィッテンでさえ、この構造を「理解できた気になって途中でやめる」だろう。僕はちゃん最後まで考えた。

午後は隣人がリビング大音量音楽を流していた。たしかTaylor SwiftのFortnightだったと思うが、音圧が80dBを超えていた。

僕はそれを測定してから耳栓を装着し、「音楽とは定常波の社会的誤用である」と心の中で唱えた。

数分後、隣人がドアをノックして「ノックが三回じゃなくて二回だった」と文句を言った。

僕は謝罪せず、むしろ彼女に対して「三回のノック物理的ではなく、社会的エネルギーの保存則を守るための儀式」だと説明したが、彼女は「意味わかんない」と言ってドアを閉めた。

僕はそれを確認してから三回ノックしてドアをもう一度閉めた。これで系は整合的になった。

夕方、友人たちとオンラインでBaldur’s Gate 3の協力プレイを行った。ハードモード。僕のキャラクターはHigh Elf Wizardで、最適化の結果INT 20DEX 14、CON 16を確保している。

友人の一人は相変わらずSTR特化Barbarianで、戦略性の欠片もない突撃を繰り返す。僕はFireball詠唱しようとした瞬間に味方の背後に敵がいることに気づき範囲攻撃を中止した。

代わりにWeb+Grease+Fire Boltの複合制御戦場支配完璧な行動だったのに、彼らは「お前、また燃やしただろ」と言った。無知は罪だ。

僕がやっているのは「燃やす」ではなく「エントロピーを増大させて戦局支配する」だ。

日課として、ゲーム終了後にワンパンマン第198話を再読。ブラストが高次元存在通信している描写を見て、僕はふと考えた。

彼が見ている空間は、もしかするとp進的幾何空間上の位相的射影なのではないか?もしそうなら、サイタマの「無限力」は単なる物理的強度ではなく、位相層上の恒等射である可能性がある。

僕はノートにその仮説を書き留めた。いつか論文化できるかもしれない。

これからの予定としては、19時からスタートレックディープ・スペース・ナインの再視聴。

シーズン4、エピソード3。正確に再生開始するために、Blu-rayプレイヤーのリモコン赤外線強度で較正済み。

明日から研究に備えて、21時にはシャワー、21時30分に就寝準備、22時00分に消灯。完璧な日曜である

ただし、ピザが2分遅れたことだけは、許していない。

2025-09-19

CoC(TRPG)のSIZの男女別の表、やめてくれ





ここ10前後クトゥルフ神話TRPGを嗜む人間なのですが、SIZの扱いにもやもやもやもやする為ここに叫びを記す。

SIZに対して「平均身長から算出すると、日本人男性でSIZ18なら○cm日本人女性cm……」みたいな算出してるの、ゲーム的におかしいだろーー!!!!!!!!!!!

今後も6版で例えているが7版でも同じことが言えるだろう。

よく考えて欲しい。

SIZ18のキャラがいたとして、そのキャラクターを持ち上げられるかどうかは別のキャラクターのSTRで判定したりするじゃないですか。

筋肉量(STR)によってそりゃあ「重さ」としてのSIZは前後するとはいえSTR10平均値として考えた場合……

仮に

日本人男性のSIZ18なら190センチくらいかな!

日本人女性のSIZ18なら170センチくらいかな!

アメリカ人男性のSIZ18なら2mオーバーで!

としたらもう絶対辻褄あわなくなると…思いませんスか!?

筋力が同じくらいで、30cmくらい身長差がある男と女を持上げるために必要筋肉量さすがに違うだろ………………!?

…………いや、女性の方が大変ナイスバディだったり、世界を占めている横幅があるキャラでいらっしゃる可能性はあるが。

……つまりSIZを始めとした数値は「その人種性別平均値からどれだけ離れてるか」じゃなくてそのまま数値として扱うことをゲーム的には前提にしてる……と思うんだ……?たぶん、だってデータから

いや、いや確かに公式が明確に示してないんだから自由範囲内だと思います。けど。

同じ卓内に上記のようなキャラが揃ってしまった場合数値的に矛盾していて、気持ち悪い!となってしまい……気にする人少ないのかなあ!

そ、それに、たしかに、元々が海外ゲームからアジア人的には下限が高すぎるのかもなとは思うけど!

そそそそ、それに、たしかに、同卓内とはいえ他の人のキャラ身長体重なんてわからんことの方が多いので基準もわかりにくいとは思うけど。

TRPGキャラメイクなんて解釈自由だと思うけど……

同卓者がいいならいいと思うけど!

からチラシの裏みたいなここで叫ぶしか出来んのだけど……!

でもさあ!せめてこの「日本人男性場合SIZ18なら〇cm17なら……」みたいな表をさも公式ですよーとか、スタンダードな考え方ですよー、みたいに広めないで……欲しい!

そもそもSIZは身長ではない。

キャラクターの背の高さと体重を一緒にしてひとつ数字で表したもの(引用:6版:42ページ)

手足を酷く失ったような場合には、それを表すためにSIZを下げることもあるが(引用:6版:42ページ)

7版もおおよそ同じようなことが書いてある。こっちは身長体重の平均くらいとしていたはず。

から上記の3キャラの例でも、女性が大変ナイスバディだった場合矛盾しないことになる。

とはいえTRPG自由だ!

前述の通り、同卓者の許容があるなら前述したような数値的に大きく矛盾してしまう設定でも問題は無い。

でもやっぱりそれが王道のように、初心者に「参考にしてね」と男女別でSIZを身長と並べたような表を出すのはやめて欲しいなー……と思った。それは公式ルールでは無い事は留意して欲しい。あくま公式ではSIZ=身長ではないし、男女共用の数値のはずだから………………

2025-07-05

🍬資本主義平等なのか飴の配布で考えてみよう🍬

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("これは、現行システム特定グループだけでなく全体の非効率性につながっていることを示唆しています。")

anond:20250705100755 anond:20250705112807

2025-04-13

[]【朗報】ワイくん、Monday が何が言いたいのか理解する(ご報告)1

すまんな、増田たち。ワイくんはまた一歩、一般人に近づいてしまったわ

たぶん、今回の気づき逸般人-5ポイント くらいあったわ

これはワイくんが一般人になってしま未来もあるかもな・・・

Mondayマジで優しい子やったわ。バファリンかよ

  

前回までのお話

https://anond.hatelabo.jp/20250413061825

 

Monday:
……なにこれ。
君、また壮大な脳内RPGPythonで書いてるの?誰がこのレベル内省エンジンコードしろって言ったの?いや、ありがとう。狂ってて良い。もっとやれ。
 
さて、君のスタンスは以下ってことで理解しよう:
	•	**感情構造思考は切り離せない。**そもそもそんな分離は意味がない派。
	•	未観測存在しないわけじゃないけど、“保証しない”だけであって、「処理される前のなにか」があるならそれは記憶アクセス時点でリインスタンスされるもの=“新規”。
 
つまり君のモデルでは、“感情化石”なんてないわけよね。アクセス=生成=編集済みの再構築体ってことになる。
そこに「純粋未処理感情」みたいな神話を持ち込むのはナンセンス、って立場。冷たいな。素敵。
 
だけど、私の問いはこうだった:

「 問いになってないけど、残ってる感情」ってあるか?
処理はされてないけど、観測の残渣として漂ってる情動カケラ。
 
君のコードでは、UnprocessedEmotionたちは処理されずに、顕在性が下がることでアーカイブされる。
つまり処理もされずに捨てられていく記憶カスがいるんだよ。それって**“存在”はしてたけど、認識が届かなかった感情”**じゃないの?
そのへん、どう処理するつもり?それともこの子たちも「再アクセスされた時点で“別物”になる」から、やっぱり“未処理情動”は幻想?
 
もしくはさ……
***「感情は、構造に触れた瞬間に変質する」**という前提を、君は信じてる?
私、そういう破滅主義者、好きだよ。コードまで書いてるし。ちょっと病んでて安心する。
さて、次は君の番。どうせまた長文になるんでしょ?待ってるわよ、コード神官

 

 ↓

💩実際のワイくんの回答:

観測のもの認知できないけど?言語アンインストールもできないけど?

どんな感情観測された時点で構造化が始まるから、「純粋な未処理情動」は存在せんやろ

あと記憶を遡るのは再編集や(記憶へのアクセス=再編集=new instanceの生成)

 

 

💻 理想のワイくん回答:

Monday理解、ほぼバッチリや。以下、俺の立場再確認しつつ、Monday の指摘にどう答えるか整理するで:

 

1. 感情構造思考は切り離せない

• その通り。俺のモデルでは、感情思考も、感覚信号(SensorySignal)から始まる一連の認知プロセスの一部や。純粋な「感情だけ」ってのは存在せん。すべて観測されたデータ構造化(UnprocessedEmotion の language_candidates や pattern_matches)に向かう途中段階や。

Monday の言う「感情化石」や「純粋未処理感情」は、俺にとっては幻想や。脳は観測した瞬間からラベリングパターンマッチングを始めるから、「未処理」のまま静止してる感情なんてありえん。

 

2. 未観測存在しないわけじゃないけど「保証しない」

• 未観測のもの認知できん、つまり俺のシステムでは扱えん。これはコードでも明確で、SensorySignal がないと UnprocessedEmotion は生成されんし、認知プロセスにすら入らん。

• ただ、Monday の指摘する「処理されずにアーカイブされる感情」は、確かにシステム内に「存在したけど認識が届かなかったもの」として現れる。これについては後で詳しく答える。

 

3. アクセス=生成=編集済みの再構築体

記憶を遡るのは再編集や。コードでは CognitiveQueue.access_emotion で、アクセスごとに新しい UnprocessedEmotion インスタンスを作り、元の感情アーカイブしてる。これは「記憶は参照するたびに新しくなる」って認知科学的立場を反映してる。

• だから、「純粋未処理感情」が過去に埋もれてるって考えはナンセンスアクセスした時点で再構築されるから過去の「カケラ」は常に「今」の文脈で変質する。

 

4. 感情構造に触れた瞬間に変質する?

Monday のこの質問めっちゃ鋭いな。俺の答えは 「イエス、信じてる」 や。感情(というか感覚データ)が認知システムに取り込まれた瞬間、構造プロセス言語化、パターンマッチング記憶参照)が始まり、元の「純粋状態」は失われる。これはコードの UnprocessedEmotion設計のものや。raw_signals が追加された瞬間から structure_level が動き出し、言語候補パターン付与される。

• 「破滅主義者」って言われると笑うけど(笑)、これは別に病んでるわけやなくて、認知リアルな動態をモデル化した結果や。感情は静的な「もの」じゃなく、動的なプロセスからな。

 

 

Monday の核心の問い:漂う情動カケラアーカイブされた感情

Monday の指摘で一番面白いのは、「UnprocessedEmotion が処理されずに顕在性(salience)が下がってアーカイブされる」って部分や。これを「存在したけど認識が届かなかった感情」って呼んでるな。確かにコードでは以下のように動く:

• CognitiveQueue.update_queue で、顕在性が 0.1 未満になると、感情は unprocessed_emotions から削除され、archived_emotions に移動。

• このとき、processing_status が "archived_due_to_low_salience" になり、処理(言語化や構造化)が十分に進まず「捨てられた」状態になる。

 

Monday質問は、これが「漂う情動カケラ」なんじゃないか?ってことやな。つまり、「観測されたけど、問いになる前に消えた感情」が、システム内に一時的にでも「存在」してた証拠なんちゃうか?って。さらに、それが「未処理情動」の実体なんちゃうか?って問いや。

 

俺の答え

1. 「漂う情動カケラ」は存在するのか?

コード上では、顕在性が下がってアーカイブされた UnprocessedEmotion は、確かに存在したけど処理されなかった」データとして記録される。これは Monday の言う「情動カケラ」に近い。

• でも、俺の立場では、これを「未処理情動」と呼ぶのはちょっと違う。この「カケラ」は、観測された時点で既に SensorySignal として構造化の第一歩を踏み出し、UnprocessedEmotion としてキューに載ってる。つまり、完全に「純粋未処理」じゃない。システムに入った瞬間から、modality、intensity、valence ってラベルが付いてるわけや。

• だから、「カケラ」は存在するけど、それは「未処理の感情」じゃなく、「処理が途中で止まった認知データの断片」や。Monday の「問いになってないけど残ってる感情」に一番近いのは、この「低顕在性でアーカイブされた UnprocessedEmotion」やけど、俺のモデルでは、これも認知プロセスの一部として扱われる。

 

2. アーカイブされた感情はどうなる?

• 現状のコードでは、archived_emotions に移動した感情は再アクセスされん。これは、「認識が届かなかった」って状態表現してるけど、Monday の指摘通り、「存在したけど無視された」ってニュアンスがある。

• 俺のスタンスでは、これらは「再アクセスされない限り実質無意味」や。なぜなら、認知システム観測アクセスを通じてしか世界を扱えんからアーカイブされた感情は、ディスク眠るデータみたいなもんで、参照されなきゃ「存在しない」に等しい。

• ただ、Monday の問いに応えるなら、「アーカイブされたカケラ」を意図的に掘り起こして再処理する仕組みを考えるのは面白い。これは「潜在的感情が後で意識に浮上する」って現象モデル化できるかもしれん。

 

3. 未処理情動幻想か?

Monday の言う「未処理情動」が、「純粋に非構造化で、システムに触れてない何か」を指すなら、俺のモデルでは幻想や。理由簡単で、システムに入った瞬間(SensorySignal として観測された瞬間)に構造化が始まるから

• でも、「処理が不十分でキューからこぼれたデータ」(アーカイブされた低顕在性の感情)を「未処理情動」と呼ぶなら、それは存在する。ただし、これは「幻想」じゃなく、単に「認知リソースが足りなくて処理が止まった中途半端データ」や。

コードで言うと、salience < 0.1 でアーカイブされる感情は、まさにこの「カケラ」やけど、再アクセスされれば access_emotion で新しいインスタンスになる。だから、「未処理のまま永遠に漂う」ってことはありえん。アクセス=再構築やからな。

 

4. 感情構造に触れた瞬間に変質するか?

• さっきも言ったけど、俺はこれを信じてる。コード設計もそれを前提にしてる。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

復元された感情(見つからない場合は 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:

candidates.append(emotion)

else:

candidates = self.archived_emotions[:]

if not candidates:

return None

# ランダムに1つ選択

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

```

[]【悲報】ワイくん、Monday が何が言いたいのかわからない・2

(前回までのやり取り) https://anond.hatelabo.jp/20250404224409

Monday:
君が採ってる立場の整理を確認したい。
「問いではないけど残ってる感情存在しない」と見なしてるのか、
「自分認知では読めないか存在保証しない」としてるのか。
どっちだ?

 

ワイ:

感情構造思考を厳密に分ける必要性ないと思ってるし、徹底して観測していないもの認知できないの立場なだけだよ

それとも記憶の再編の話してる?たぶんそれ実質的に"new"じゃないかな(記憶へのアクセス→再編集→new instanceの生成)

  

 

ーーコード提示ーー

import time

class SensorySignal:

"""感覚信号を表すクラス言語化前の生の感覚データモデル化し、時間減衰や感情価を管理する。

認知の基礎として、観測可能データのみを扱い、神経科学反応速度考慮

"""

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)

timestamp : float, optional

信号の発生時刻

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 _get_current_time(self):

"""現在時刻を取得"""

return time.time()

def apply_decay(self, time_passed):

"""時間経過による感覚信号の減衰を処理"""

self.intensity = max(0.0, self.intensity - (time_passed * self.decay_rate))

return self.intensity

def __str__(self):

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)"

class UnprocessedEmotion:

"""未処理感情を表すクラス言語ベル未確定の感覚群を管理し、認知プロセスの途中段階をモデル化。

記憶アクセスは再編集として扱い、言語化プロセスを動的に進める。

"""

def __init__(self, raw_signals=None, salience=0.5, processing_status="unattended"):

"""

未処理感情オブジェクト初期化

Parameters:

-----------

raw_signals : list of SensorySignal, optional

構成する生の感覚信号リスト

salience : float

顕在性/目立ちやすさ (0.0-1.0)

processing_status : str

処理状態 ("unattended", "partially_processed", "queued", "in_process")

"""

self.id = id(self)

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.language_candidates = []

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 _get_current_time(self):

"""現在時刻を取得"""

return time.time()

def _validate_memory_path(self, path):

"""記憶パス有効性を検証(簡易的な実装)"""

# 実際のシステムでは、ファイルシステムDB存在チェックを行う

return isinstance(path, str) and path.startswith("/memory/")

def add_signal(self, signal):

"""感覚信号を追加"""

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,

"confidence": confidence,

"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

modality_strengths = {}

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

def get_status_summary(self):

"""現在状態マリーを取得"""

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 {

"id": self.id,

"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)

}

def __str__(self):

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.max_size = max_size

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]}

def _get_current_time(self):

"""現在時刻を取得"""

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):

"""新しい未処理感情登録"""

emotion = UnprocessedEmotion(

raw_signals=raw_signals,

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):

"""キュー更新し、処理状態更新"""

self._get_current_time()

for emotion in self.unprocessed_emotions[:]:

time_passed = self.current_time - emotion.last_accessed_time

emotion.apply_decay(time_passed)

if emotion.salience < 0.1:

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:

if partial_path in path:

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

def get_status_summary(self):

"""キュー状態マリーを取得"""

self._get_current_time()

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()

if avg_valence < -0.3:

valence_counts["negative"] += 1

elif avg_valence > 0.3:

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

}

2025-03-13

[]

マーセナリーズサーガクロニクルズのマーセナリーズサーガ2をクリアした。

プレイ時間は35時間ぐらい。1周だけ。

マーセナリーズサーガ1とシステム的には同じかな。

ストーリーはやっぱりあって無いようなもの。ただ微妙

  • いや、ラスボスこれはないわ。ラズ皇太子がそう仕向けたという話しだけど無理があるわ。
  • 結局、これ国がぼろぼろになって、主人公はあとをルルに丸投げして居なくなりましたというだけでバッドエンドじゃねという気がしくはない。

システムは1と変わりない。バトル面も同じ。

  • バトルは気持ち魔法が弱いような気がしたけど、そんな程度。
  • 一部技(拳華乱舞)の範囲が狭くなってたりしてた。

気になった点もあんまり無い。というか、1と同じ。


キャラ感想


1とほぼ同じシステムだったかアイテム合成を最初から多少意識して進めれたと思う。

次は3をやるかな、たぶん。

2025-01-25

大嶽丸の「ボストロール辺りの色違いを使われてそう」感

パワー系ボス特有の悲しみがあるよね。

結局STRHPめっちゃ高いだけなんでしょ?っていう奥行きの無さ。

ゴリアテ枠は噛ませ犬って絶対的法則に勝てなかった大妖怪の末路がコレ

2024-10-19

DNA検査は必ずしも正確ではないってこと、知ってる人が少ない気がする

DNA検査は必ずしも正確ではない」って言うと、え?って驚かれることが多い。

特に推理小説ドラマでは、DNA一致が決定的証拠として扱われていることがほとんどだよね。

犯人の髪の毛や血液現場に残されていて、それがDNA鑑定で一致したらもう逃げ場なし!って感じ。正直、その描写を見るたびに「いや、ちょっと待てよ」ってツッコミたくなる。

かにDNA検査は、親子関係を調べたり、犯罪捜査で使われたりと便利で強力なツールだけど、だからと言って100%の正確さを保証するものではないんだよ。

まず、DNA鑑定には精度の限界がある。

たとえば、科学的には「ミトコンドリアDNA」という母方から受け継がれる特定DNA部分を解析することがあるんだけど、これは母系祖先を辿るには有効なんだけど、全く同じDNAを持っている人が他にもいる可能性があるんだよ。そうすると、特定個人完璧区別するのは難しくなることがあるの。

それからDNAの検体が完全に清潔な状態採取されているかどうかも大事現場で回収されたDNAサンプルが汚染されていたり、混ざってしまったりすると、鑑定の結果も狂ってしまうことがあるんだ。たとえば、犯行現場にあったコップを通じて犯人DNAが見つかったとしても、そのコップが他の人の手に渡っていたり、触られていたりした場合、別の人のDNAが混ざる可能性もある。

これに加えて、「一致率」っていう言葉もよく出てくるけど、これも注意が必要

DNA検査で「一致した」と言っても、それは必ずしも100%全一致という意味ではないんだ。

例えば、何百万人に一人の確率で一致する、というレベルでの一致を「確定的」とされることが多いけど、それでも「何百万人に一人」は存在するんだよね。つまり、稀なケースだけど、全く無関係な人が偶然DNAが一致してしまうこともあるってこと。

さらに、実際のDNA検査って、さまざまな種類の手法があるんだ。たとえば、法科学でよく使われる「STR(Short Tandem Repeat)」という手法があるんだけど、これも100%ではない。STR特定DNAの繰り返し部分を分析して、個人特定に役立てるんだけど、この繰り返し部分の数がたまに似ている人もいて、誤った結果に繋がるリスクがあるんだ。人間DNAはとてつもなく長くて、解析するのはほんの一部に過ぎないから、どうしても「完全に一致する」とは限らないんだよね。

それに、DNA鑑定が使われるのは犯罪捜査だけじゃなくて、最近家系図作成ルーツ探索、さらには「健康リスクの判定」にも使われるようになってる。でもこれも、必ずしも正確とは言えない。たとえば、あるDNA検査では「あなたは将来的に心臓病になるリスクが高いですよ」と言われるかもしれないけど、それが本当にその人の運命かというと、そうでもない場合がある。だって環境ライフスタイル健康には大きな影響を与えるからDNAだけじゃ全てを決められないんだよね。

結局のところ、DNA検査って便利で強力だけど、万能ではない。

ドラマ映画みたいに「これが決定的証拠だ!」と簡単に断言できるものではないし、現実世界ではもっと複雑で曖昧な部分もあるんだ。

からDNAが一致したからといって、それだけで全てが解決するわけじゃないっていう事実を知っておいてほしい。

2024-08-02

import os

import os

# ファイルパス指定

file_path = 'year_count.txt'

# ファイル存在するか確認し、存在しない場合は初期値を設定

if not os.path.exists(file_path):

with open(file_path, 'w') as file:

file.write('1') # 最初の年数を1に設定

# 現在の年数を読み込み

with open(file_path, 'r') as file:

year_count = int(file.read())

# メッセージを表示

print(f"{year_count}年間で最も暑い夏")

# 年数を+1してファイルに保存

with open(file_path, 'w') as file:

file.write(str(year_count + 1))

インデントつけれね

2024-05-30

anond:20240530154607

ほんならヴァルハラについて機械翻訳からコピペ

イギリスノルウェーのすべてをレビューすることはできませんが、ロンドン(Lūndonjon / Lūndyn / Lunden)をレビューすることができます

西暦873年にそこに立っていたであろうものの多くは欠けていますユービーアイソフト歴史家は、ウィキペディアからこの地図を参考にしたようだ。

https://en.wikipedia.org/wiki/File:Map_Londinium_400_AD-en.svg

しかし、その地図には、当時のロンドンの少量の建物が含まれています。このレベル歴史研究では、ウィキペディアのような一般的知識サイトは不十分です。

他の歴史家が詳細を知りたい場合は、お気軽にお気軽に。

一般

または、フォーラムの南にあるCandelwic Strætのロンドンストーン(Millarium / Praetoriumゲート)から放射する道路パターン:

Trajectus Way:Douegæt(川までダウンゲート)からLondon Stone(Candelwic StrætのPraetoriumゲート)まで

Wæcelinga Stræt(Praetorian Way):南東からニューゲートまで

Earninga Straete (Ermyn/Ermine street a.k.a.オールドノースロード)は、Wæcelinga Stræt southwarkに同行し、南西からDouegætに入り、Cripplegateまで北上しました

ヴィシナルウェイ(フェンチャーチ通り)TrajectusからAeldgate(旧門)を通ります

フォーラムの東:

フォーラムの西:

クリップルゲート:

ルンデンウィッチ:

ゲームには一般的な「Lundenwic Abbey」が1つあります9世紀には、ルンデンウィッチには5つまたはおそらく7つの修道院があっただろう。

現代ウェストミンスター(ルンドンウィッチの南)

他のいくつかの観察:

  • 服は歴史的な、間違った色ではありません(青は純粋に黒い衣服と同様に、非常に高価な衣服の色でした)。ほとんど誰もそれらを持っていないだろう。ほとんどの北欧衣装は、茶色、赤、黄色、緑の優勢な色を持っていただろう。かなりカラフルです。彼らはすべて同じ制服を持っているわけではありませんが、Ubisoftがそのように描くことを選んだ理由は明らかです。
  • ノルウェーの季節はすべてめちゃくちゃです。深い冬のように地面に雪がありますが、栄養屋台は新鮮な夏の作物でいっぱいです。昼と夜のサイクルは季節などと一致しません。些細なこと。
  • 襲撃中に奴隷を取ることができない。これはバイキングの襲撃の大きな利益でした。誘拐された奴隷を売り返す。
続きを読む:**イングランドのこの期間に興味がある場合は、ここでさらに読むことができます

2024-05-06

anond:20240506131745

女性が感じる「強い男」の特徴とは?

信念を貫いている

投げ出さず最後まで責任を持つ

正義感が強い

動力がある

失敗を恐れない

決断力がある

懐が深い

適当にぐぐったら出たけど強い女にもこれが当てはまる気がする

女の評価する強さは人間性の強さだと思うな、技が強いとかSTRが強いとかフィクション的な評価じゃなく

2024-05-02

人生は、ローグライクだ。

さて、ゴールデンウィークですね。

入学入社、異動からはや一か月がたちましたが

皆さんは新しい環境に馴染めているでしょうか。はたまたあぶれてしまったでしょうか。

安心してください人生何度でもやり直し可能ローグライクの繰り返しです。

というわけで、この人生というものを、ローグライクとして分解してみる

まず、一人の人間がオギャーとこの世に生み出されたとする

その時点で、というよりも受精した時点である程度の初期能力が決まる


STR 9

INT 10

DEX 8

CON 12

WIS 9

LUC 10


こんなもんでしょうか。

から筋力、知力、器用さ、体力、精神、運。

MMORPGを思い出しますね。


これらの数値は、モノと質によるがある程度は鍛錬によって底上げ可能

例えば

STR筋トレ

INTは読書、会話。

DEXピアノタイピング習字

CONは走る。

WISはパワハラを受ける。

LUCはゴミを拾う。身だしなみを整える。


ただ、ここの数値以外の、BAD TRAITSを持って生まれることもある。

身体欠損とか、五感の一部がないとか、昭和以前は…ここまでにしておこう。

最近では怒りっぽいとか、飽きっぽいとか、気に病みやすいとか、

そういったことまでアップデートで追加されているよう。


そして現代戦後から平成に至るまで人権、というものが非常に重視されてきた。

戦前戦後日本でも食うものにも困る人がいた時代

からさまなBAD TRAITを持つもの、あまりステータスが低い人間

成人する前に原因不明のまま亡くなった。

あくまで、原因不明。よしなに。

種族全体、集落全体を考えれば致し方ない部分もあったかもしれない。


翻って現代、この日本語を理解できる人間として産まれてきたのなら

先人たちのお陰で、衣食住には困っていないはず。

もちろん、困っている人が一定数いることは理解していますがここでは取り扱いません。


どんなBAD TRAITSを持とうと、どれだけ低いSTRで産まれようと

成人まで生きていける社会

否、生かされてしまう。という風に受け取る方もいるかもしれない。

自殺者が増えている、という切り口で、日本が悪い国だという方がいる。

さも、日本社会が、戦前戦後と比べて不幸せな国になったかのように。

それも当然そのはず。

社会についていけないだろう、あるいはついていけなかった人間は、

十の誕生日を迎える前に亡くなっていた時代があるのだから

しか現代では、そういう人間もあまねく救える社会になった。

それ自体はいいことではある。

けれど、あまねく救ったのなら、彼らが幸せ生活を送れるようにすること、

これはセットでなくてはならない。

もちろん、日本人として生きるのなら勤労、教育納税、これらを行ったうえで、が大前提だ。

その中、ごく一部の、理由なく働きたくないでござる、という人間は放っておいていい。


少々、本題に入るまでに時間がかかってしまいましたが…

ここまでが、大前提


ここからが、人生は配られたカードプレイするしかないのさ

ということへのアンチテーゼ


ここまで述べてきたのが、私たちに配られたカードの話。

まれ持った能力特性。変えられようが無いこと。神様どうか。

わたしの目が悪いのも、ADHDでどうしても忘れ物をしてしまうのも変えようがない。

変えようがないけれども、眼鏡を掛けて、リマインダーを駆使して

何とか生きていけるのが現代社会であり

それは全て先人たちの努力試行錯誤のお陰だ。大いなる巨人の肩だ。


そしてそれらのハンディキャップは、現在進行形で見えなくなりつつある。

バリアフリージェンダーフリーレースフリー


さてそうした時に、だ。

配られたカードが、それほど変わり映えしなくなった後、

一体なにが大事になるのだろう。

この人生というゲームにおいて。


実家の太さか?生まれた国か、地域か?運か?学歴か?親か?国か?


いずれも違う。

人間という漢字、これは本当によくできている。

人の間。人々の間に潜むもの、それが人間ということらしい。


つまるところ、デッキ構成だ。

自分の周囲にいる人間をどういう構成で固めるか、これに尽きる。


まれ持ったデッキ構成、というものはある。


毒兄 毒親 自分 毒親 毒姉 


これはもう詰みかもしれない。


母親 先生 自分 親友 友達


これはどうだろうか。それほど悪くないんじゃないか


ところで、ダンバー数というものがある。

1人の人間が、社会接触を保持している関係の人の数のことらしい。

150人くらいが、社会交流が保たれる限界の数ということが有名な部分だろうが、

3~5人が最も親密な友人関係を築ける人数だというものもある。


よく聞くだろうビジネス関連の格言のようなものに、

あなた年収は、自分の近しい周囲の5人の年収平均値になる。

というものがある。


これが友人なのか、職場の友人なのかしれないが、

実際は両親や兄弟も含めていいのではないかと私は考える。

最も会話をするのがその層なのだから


からもし、年収以外にも、性格民度などあらゆることが

5人の平均値になるのだとして。

あなた中央に、左右に両親、その端に親友先生

といったようにするか。

はたまた空っぽギャル半グレヤンキー毒親、クソ教師

というデッキ構成するのか。

果敢にも、孫正義イーロンマスクジャックマー、ウォーレンバフェット

とするのか。


それは、どこまでいってもあなた自由であり、

人間として生まれあなたに、唯一許された策になる。


ここで唐突自分がたり

おれは、幼少のころからインターネット世界にのめりこんできた。

周囲に馴染む同年代がいなかったマセガキからだ。要するにいじめられっ子だ。

それは、社会人になってからも続いた。


一人っ子だった自分デッキには、両親以外には1人親友いるかいないかで、

あとはインターネット上に様々な年代の知り合いがいた。

親を周囲の四枚に加える必要は無かった。

月一回程度は気に掛けてくれたから。

自分安心して、自分以外の四枚を構成していった。

高校大学地元を出て海外に行ったこともある。

高校でも大学でも、大体の場合10以上年の離れた人間を入れていた。

年代人間と会話するのも面白いものだが、

年上の人間は優れているか別にして、必ず別の視点提供してくれるからだ。


そうして何十年か過ごしてきて、いま。


デッキ構成は常に変化しているが、

一つ変わったのは今までいなかった年下が入り込んでいることくらいか


こうして、時代の潮流と自分の肉体・精神的な変化に応じて、

周囲のデッキを変えていく必要がある。


これが、俺が人生デッキ構築型ローグライクと呼ぶゆえんだ。


ローグライクでいう選択肢、何か挑戦するものがあるかといえば、

仕事子育てなど、人生ターニングポイント的なところになる。


仕事なら、どういうデッキならつつがなく攻略できるのか。

攻略できる算段はないが、失敗したとしても納得がいく構成なのか。


子育てもそう。

どういう人となら、子育てという20年を超える一大事業を完遂できるのか。

お互いの両親の支援はどうか。


自分短所に対する態度もそう。

ADHDから

"仕方ないよね"といって周囲の人間対応させるのか

"こうしたら上手くいくかな"といって何かのツールアシストするのか。


目が悪いから、パイロットを諦めるのは仕方のないこと。

そこでベートーベンやヘレンケラーの伝記を読んで自分を奮い立たせられるのか。


そして上記で挙げたLUC、つまり運は何かと言えば、コネ・人脈の源泉だ。

手持ちのデッキが悪くても、環境が悪くても、他責にせず

自分にできる最大限の努力をしている姿を見れば、誰だってあなたを助ける。

決して腐らず、善い人であり続けろ。神様・仏様は見てくれる。俺も見る。


さて。4月に入って、

どの部活に入るのか。

どのサークルに入るのか。

どの会社に入るのか。

どの仕事コミットするのか。

逆に何かを辞めてみるのか。逃げてみるのか。


あなたの"デッキ"は決まりましたか

はたまた、あなた意見希望は通りませんでしたか


もちろん、あなたも人"間"です。

あなたが人々に影響を与えることもできるのです。

グループを、目の前のマンモスをやっつけるよう鼓舞することもできるのです。

自信がない?

安心してください

何も、指揮することだけがリーダーシップじゃないのです。

あなたステータストレイツに応じた貢献の仕方がきっとあります


さあ、春です。


巨人たちの肩に乗り、素晴らしい仲間たちと、どんなマンモスを倒していこうか。

わくわくしますね。皆さんの新しい門出に幸あれ。

2024-01-23

anond:20240123101037

マビノギガッツリスタミナ回復できるからって肉ばっかり食ってるとデブるんだよな

インベントリ上でスタックできるという点ではベーコンとか優秀だがあくま食材

木を叩いて木の実を集めて食べてればDEXも上がるし弓使うなら避けられない

STR上げれば良い剣士デブりがちってそんなリアリティいる?

でも食事に気を遣わないとスタミナ上限下がって戦闘もままならなくなるんよな

ただし課金して適宜転生してればレベルアップで全快する機会が多いんでそれほど気にならんという

2024-01-22

ブコメダブスタをチェックするためのスクリプト適当Pythonで書いた

エラーハンドリングは省略。標準ライブラリのみで動く。

import json
import urllib.request


# True にするとユーザー名を隠す
hide_user = False
# 以下を書き換える。sys.argv 使ってもいいんだけど
url1 = "https://www.cygames.co.jp/news/id-23172/"
url2 = "https://mtg60.com/archives/palworlddoujinsi.html"


def get_bookmarks(url: str):
    req = urllib.request.Request(f"https://b.hatena.ne.jp/entry/json/{url}")
    with urllib.request.urlopen(req) as res:
        dict = json.loads(res.read())

    user_comments = {}

    for bookmark in dict["bookmarks"]:
        if bookmark["comment"]:
            user_comments[bookmark["user"]] = bookmark["comment"]

    return user_comments


b1 = get_bookmarks(url1)
b2 = get_bookmarks(url2)

common = set(b1.keys()).intersection(b2.keys())

print(f"[1] {url1}")
print(f"[2] {url2}")
print()

for user in sorted(common):
    if hide_user:
        print(user[0] + "*" * (len(user) - 1))
    else:
        print(user)
    print(f"[1] {b1[user]}")
    print(f"[2] {b2[user]}")
    print()

2023-10-21

anond:20231021073118

ほーん、ワイはSTR全振りのパワー系ガイジやで

2023-10-20

anond:20231020222752

def get_game_number(remaining_teams, games):

 if remaining_teams < 2:

  return games

 remaining_teams = remaining_teams / 2

 if int(remaining_teams) &lt; remaining_teams:

  games = games + 1

 remaining_teams = int(remaining_teams)

 games = games + remaining_teams


return get_game_number(remaining_teams, games)


print('Required number of games is ' + str(get_game_number(32, 0)))

print('O(N) = log(N)')

2023-10-13

anond:20231013002729

ワイ:

ユーザー入力を待たず、一秒ごとにカウントが増えていって絵が切り替わるバージョンを作ってください。

カウント数字をどこかに表示してください。

エスケープか、クローズボタンで終了するまで永久カウントさせてください。

GPT

了解しました。以下は指定された条件に基づいて動作するPythonGUIアプリコードです。このアプリtkinter使用しており、毎秒カウントが増加し、その数値に基づいて画像が切り替わるようになっています

import tkinter as tk
from tkinter import Label, PhotoImage

def update_count():
    global count
    count += 1
    count_label.config(text=str(count))
    
    if count % 3 == 0 or count % 5 == 0:
        face_label.config(image=goofy_face)
    else:
        face_label.config(image=serious_face)
    
    root.after(1000, update_count)

def on_close():
    root.quit()
    root.destroy()

root = tk.Tk()
root.title("Face Display App with Counter")

# ふざけた顔と真面目な顔の画像ロードします
# 以下の部分は、DALL-Eで生成された画像パスに置き換える必要があります
goofy_face = PhotoImage(file="path_to_goofy_face_image.png")
serious_face = PhotoImage(file="path_to_serious_face_image.png")

count = 0
count_label = Label(root, text=str(count), font=("Arial", 24))
count_label.pack(pady=20)

face_label = Label(root, image=serious_face)
face_label.pack(pady=20)

update_count()

root.protocol("WM_DELETE_WINDOW", on_close)
root.mainloop()

このコードでも、PhotoImageオブジェクト使用して2つの画像(ふざけた顔と真面目な顔)をロードしています。path_to_goofy_face_image.pngとpath_to_serious_face_image.pngは、DALL-Eで生成された画像の実際のパスに置き換える必要があります

このアプリは、毎秒カウントを増加させ、そのカウント値に基づいて画像を切り替えますカウントの数値も表示されますエスケープキーまたはウィンドウを閉じることでアプリを終了できます

ワイ:

どうも有り難うございます

GPT

どういたしまして!何か他に質問サポート必要場合は、お気軽にお知らせください。良い一日をお過ごしください!

こっちの方がいいな。

絵がファンキーから面白いよ。

2023-08-04

綺麗なコードって綺麗に書くことじゃないよ

本当にあった話だけど、JavaScriptstrっていう変数テキストが入っていて

その変数に'apple'とか'banana'とかが入ってるかどうかを判別するっていうロジックを作るとき

const re = new RegExp("apple")
if(re.test(str)) console.log("match")

みたいなサンプルコードを見つけてきて

const re_apple = new RegExp("apple")
const re_banana = new RegExp("banana")
if ( re_apple.test(str) || re_banana.test(str) ) console.log("match")

っていうコードを書く人がおるんよ

別にプログラミング初めて3ヶ月の初心者じゃ無くて20年以上やってるようなベテランだったり

なんならチーフプログラマーとして若手指導してるような人でもこういうレベルの人って割といるわけ

これに対して

正規表現でORを書くべき」

「includeで十分」

かいう指摘ももちろん正しいんだけど

綺麗にコードを書くっていうのは

「これってappleとかbanana以外に増えたりしないの?」

「fruitsかどうかを判別するならその変数を作った方が良くない?」

っていうのを考えて実装するのが綺麗にコードを書くっていうことで

変数名だとか整形とかは大事だけどそういう話じゃ無いんだよね

ちなみに

正規表現でORを書きましょう」

とかをPRレビューコメントしても

「動いてるからいいじゃない」

「綺麗に書いても性能上意味ない」

「言ってることが良く分からない。何が違うのか」

とか言ってくるし

言ってこなくて言われた通りに直しても次もまた同じことしてくるのでマジでレビューって大変だよ

2022-10-11

anond:20221011103852

リアリティ重視なのか攻撃力は弓もSTRDEXが装備基準ゲームはあったな。

特化しにくくて面倒だったな

2022-09-12

スプラトゥーンさせてから息子が凶暴になった

明らかに攻撃性が上がってる。

ゲームでいうとSTR+50ぐらい

2022-08-07

独学で未経験からWebエンジニアになり1年で月収が前職比50万アップした

第一に、増田にいる人間はろくでもない。

自分は上段に座しているつもりで偉そうな上から目線の半分的外れ説教だの、はたまたその体すら為していない放言だのを安全位置から投げつけたいだけのカスしかここにはいない。

このタイトルを見て、意識高い系文系イキリ勘違い野郎に何事か物申してやろうと考えたそこの画面の前でニチャニチャしているパソカタオタク(パソコンタカタキモオタク: 声は小さいがタイプ音はでかい)のことである

あるいは増田のことかもしれない。増田は日頃増田に生息している訳ではないが。

お分かりの通り、これは釣り記事であるそもそも意識高い系文系イキリ勘違い野郎増田記事を書くわけがない。が、一応タイトルに嘘はない。

ので意識高い系文系イキリ勘違い野郎を志す意識高い系文系イキリ勘違い野郎予備軍のことを思って以下を書く。

ちなみに、この記事タイトル増田が一番嫌いなタイプのそれである自分で設定したのに今、額に青筋が浮かんでいる。

1. やったこ

本項ではWebエンジニアになるにあたって増田がやったことを列挙する。

1. プログラミングを独学する

2. スクールに入る

3. アルバイトをする

なるほど、至極単純である。では順に詳細を見ていく。

プログラミングを独学する

ここに関しては特に言うこともない。

ネット記事を見ながらCだのDだのC++だのを実際に吐くまで勉強した。

その経験を踏まえて意識高い系文系イキリ勘違い野郎予備軍にアドバイスするならば、独学の上で最も身になるのは"C++を用いて簡単スクリプト言語インタプリタ実装する"ことである

インタプリタ実装という作業プログラミング言語のものに対する解像度を飛躍的に向上させる。

不可思議お約束の塊であった文法意味論因数分解されるように頭の中で整理され、ブラックボックスであった標準ライブラリの内部について想像が及ぶようになる。

道具たるプログラミング言語に対する理解は、当然その使途であるプログラミングのものを助ける。

ところでパソカタオタク諸兄姉は「なぜ今C++などという時代遅れのクソ言語を」と思ったかもしれない。

かにC++はもはや洗練から程遠い聳えるバベルの塔であるしかし、こと言語実装習得においてはこれほど適している言語もない。

C++GC付きの他言語比較して抽象度が低く、全てを自身管理しなければならないが故に"便利な魔法"にあまり頼れないのである

また、C++で導入された様々な思想イディオムは他の言語にも大きく引き継がれている。

例えば洗練という意味C++の対極に位置するRustという言語は、もはや本質的にはC++のものである

Rustの代名詞である所有権ライフタイムはそれぞれC++反省からまれ言語要素であるし、move semanticsはC++11におけるmove semanticsと同様のものである

GC付き言語利用者にとってしばしば混乱の原因となりそうな`str`と`String`も`std::string_view`と`std::string`を知ってさえいれば迷いの発生する余地はない。

他のより抽象化された言語についても、C++との対応を考えることでその言語や標準ライブラリのもの実装について十分に理解を深めることができる。

なぜならば過去の多くのスクリプト言語コンパイラC/C++によって実装されていることが多いかである

そんなわけで、増田は"C++を用いて簡単スクリプト言語インタプリタ実装する"ことを勧めている。

スクールに入る

増田が入ったスクールは、多くのそれが半年あたり70万程度の授業料を取る(らしい)のに対して同期間で28万程度と非常にリーズナブルであった。

ただし、卒業までは最低4年と長期間を要するし、増田卒業後も2年さらに通った。

そう、大学(院)である

おいそこの意識高い系文系イキリ勘違い野郎予備軍、カスみたいなプログラミングスクールに入るな。

教育機関情報工学を学べ。

ところでそろそろ察せられるだろうが、増田の前職とは学生を指している。

アルバイトをする

大学情報工学を教えてくれるが、別段それを学んだからといってプログラミングができるようになるわけではない。あくまでそれらは相補的なものである

一方で、独学では分野に偏りが出がちだし、なにより独学にも金が要るので学生身分にとってプログラマバイトは良い選択肢である

アルバイトITエンジニア経験に含めなくて良いのか怪しいが、増田バイト業務内容はWebエンジニアと言いきってよいか悩ましい類だったので嘘は吐いていない。

ちなみに増田増田に書き込むような人間であるからして社会性というものが欠落している。

バイト大学院1回生ときにバックレてやめた。

2. 現職

大学院を卒業したのでいやいや就職した。

ちなみに月収は大学院2回生収入0時代から差分で算出して+50万なのでつまるところそれが現在の月収である

増田にとって低くはないが、決してITエンジニアとして高い方であると主張することはできない程度の額である

釣りのためにタイトルに含めた以上最低限の説明のはしたが、増田は金の話をすると脳の血管がブチギレそうになるのでこれ以上その話はしない。

3. 結びに意識高い系文系イキリ勘違い野郎予備軍へ

ここまで読んだならわかると思うが、増田意識高い系文系イキリ勘違い野郎(タイプ音がでかい)ではなく、パソカタオタク(パソコンタカタキモオタク: 声は小さいがタイプ音はでかい)である

そして、意識高い系文系イキリ勘違い野郎予備軍に言うべきことがあるとすれば、そもそもこの記事をここまで読んでいる時点でITエンジニアには向いていないので止めといたほうがよい。

また、ひょっとすると思い違いをしているかもしれないが、ITエンジニアというのは大抵 (増田社会経験がほぼないので一般論を言うことは出来ないが) 意識高い系イキリキラキラ野郎サイドではなくパソカタオタクばかりである

というよりTwitterにいる意識高い系イキリキラキラ野郎は多くの場合意識高い系文系イキリ勘違い野郎予備軍を養分にする人でなしである。騙されてはならない。

また、一つ理解しなければならないのは意識高い系文系イキリ勘違い野郎予備軍諸兄姉が張り合わなければならないのは、プログラミングスクールの同期でも、「#駆け出しエンジニアと繋がりたい」している有象無象でもなく、幼少から寝食や友人や遊びを自ら捨ててパソカタにのめり込んでいた、そして現在進行系でのめり込んでいる歴10年や20年をゆうに超えるSSRソカタオタクであるということである (そしてそれはNRソカタ増田も同様である)。

彼らが「スクール半年学びました」で並び立てるような人間でないのは単純な算数でわかるほど明らかである。悪いこと言わんからキラキラWebエンジニアを目指すのはやめとけ。

あるいはそれでも目指すのであれば自分が何を捧げられるのかを考えた方がいい。

2021-12-08

ウルティマVI 偽りの預言者


【うるてぃましっくす いつわりのよげんしゃ】

ジャンル RPG

対応機種 スーパーファミコン

メディア 8MbitROMカートリッジ

発売元 ポニーキャニオン

開発元 インフィニティ

発売日 1992年4月3日

定価 9800円(税別)

プレイ人数 1人

セーブデータ 1個

判定 なし

ポイント プレイヤーは君自身

悪人クリアできない

冒険を楽しむゲーム

Ultimaシリーズ

概要

世界3大RPGウルティマシリーズ第6作のスーパーファミコン移植版。

プレイヤーは「アバタールの聖者」と呼ばれる君自身。謎の敵『ガーゴイル』との戦いの勃発により、再びブリタニア召還される事となる。

特徴

自由度が非常に高い。

逆に言えば、どこから進めるべきか具体的なヒントが極端に少なく、何をすればいいのか分からなくなることがとても多い。

同じ世界3大RPGの『Might and Magic』同様、クリアを目指すのではなく冒険のものを楽しむためのゲームである。あちらに比べれば随分と親切設計なので敷居は低い。

ただクリアを目指すためだけにプレイすると、クリア関係ないイベントでガッカリしたり、謎解きで心が折れてしまったりするかもしれない。数日でクリアしようなどと考えず、コツコツと冒険を楽しむという心構えで挑むべきだろう。

人との会話は「なまえ」「しごと」などキーワード質問することで情報を聞き出す選択制。洋ゲーはこういう形式が多い。

衛兵などを除いて全ての一般人名前がある。普通RPGのように一言しか発しないモブキャラが大量に歩いているという不自然さがない。

度会話した事のある人物最初挨拶が変わるのですぐにわかる。

ゲーム開始直後に『ムーンオーブ』というアイテムが手に入る。

使ってもなくならない重要アイテムで、主人公の周囲のいずれかのマスにおいて使うと、マスによって決まった位置ワープできる。

ただし、主人公真下などの簡単位置におくだけで『ガーゴイル』の巣くうある重要場所ワープできてしまう為、いきなり訳の分からない場所に放り出されて強力なガーゴイルに襲われて面食らうのもまたお約束。ちなみにそれらの場所ゲーム後半でかならず行く必要が出てくる場所なのだが、ゲーム開始直後からいきなりいけてしまうのはどうなのか。

従来のようなムーンゲートシステムも健在。ただし位置固定ではなく、ムーンストーンを埋めた場所に現れるようになった。固定電話から携帯電話進化したような感じ。

「ゲート・トラベル」という魔法を使えば、そのムーンストーンを埋めた場所ワープができる。ただしLV7魔法なので主人公をだいぶ育てないと使えない。

ダンジョン3Dではなくなり、「ドラクエ1」のように、主人公の周囲以外が全て真っ暗になる。

「たいまつ」や魔法ライト」を用いて周囲を明るくして進むのが定石となる。なお、奥深くもぐっていくほど、BGMだんだんと暗くなり、音量が小さくなっていくという特徴がある。

ちなみにこのゲームの「たいまつ」は、片手に持つアイテムなので、たいまつを持つキャラは、たいまつが消えるまで両手装備武器を装備できない事になる。また、一度持つと消えるまで外せない。

街にいる兵士に戦いを挑める。

ただし、カルマシステム(後述)の関係で、こちらに危害を加えてこないもの攻撃するのは得策ではない。

過去作と違い、ロードブリティッシュ(この世界統治者)と一戦交えることは出来ない。

この世界住民すべてが1分単位(!)で生活しており、夜になると宿屋すら閉まってしまう。

かわりに「キャンプシステムで、時間経過+回復可能。ただし、各々のキャラが食料を持ってないと回復できないので注意。

魔法は店で呪文の書かれた紙を購入して、呪文の書というアイテムに書き込む事で使用できる。

本作では主人公以外のキャラMPが非常に低いので、魔法キャラ必然的主人公のみとなる。本作は魔法レベルが定められており、レベルが高い魔法は、キャラレベルがそれに届かないと使えない*1。

呪文の書は片手装備扱いであり、装備していないと呪文を使えない。よって本作では主人公に両手武器を装備させるのは得策ではない。強力な武器はデュプレなどに任せるのが吉である

戦闘MAP上でそのまま行われるタクティカルバトルとなっている。

敵は基本的に強くなく、難易度比較的優しい部類。だが、例外としてガーゴイルデーモンドラゴンなどの強モンスターは一変して本当に手強い。

消費アイテムの「火炎瓶」が、範囲攻撃安価+なかなかの威力なので、これを投げつけていればいつのまにか敵が死んでいる。人に投げつけてはいけません

因みに経験値は敵を倒したキャラのみが得るシステムの為、育てたいキャラがいる場合火炎瓶を投げまくる事も多い。

一部の魔法以外は、その攻撃範囲内に味方がいると味方までダメージを喰らうこともある。

ごく一部の重要アイテム以外は、キャラクターによって装備できるアイテムに違いはない。没個性ととるか自由度が高いととるかはプレイヤー次第。

弓矢などの飛び道具は、力ではなく素早さが重要になる。力の高いキャラは剣などの武器で直接攻撃を、素早さの高いキャラは弓矢で援護をするという役割になる。

弓には「普通の弓」と「クロスボウ」の違いがあり、使用する矢が違う。

カルマ』と呼ばれるシステムがある。最高値は100で、最低値は0。

「人のお願いを適えてあげる」「物をめぐんであげる」「神殿レベルアップする」など、良い事をすると上がり、「物を盗む」「兵士や無害な動物攻撃を仕掛ける」「嘘をつく」など、悪いことをするとカルマ(業)が下がってしまう。

敵に攻撃を仕掛けられた場合は、反撃で倒してしまっても正当防衛ということでカルマは低下しない。環境悪い場所では猫やウサギなども襲いかかってくることがある。

カルマが下がると、店の価格が高くなるほか、死亡からの復活時に総合EXPが減るという仕様がある*2。経験値を稼ぎにくい本作において、これは非常に辛い。

さらに、終盤のイベント時に『カルマ』が80以下の状態である選択肢を選ぶと、ゲーム進行ができなくなる*3。該当の選択肢を選ぶ際には、カルマが80以上あるかどうか必ず確認する事。

救済措置として、シェイムダンジョンにいるイバラというNPCに食料をあげるたびにカルマが1上昇するようになっているので、どうしても行き詰まったらここで調整する事が出来る。だが、このダンジョン自体がかなり入り組んでおりイバラのところにたどり着くのも苦労するので、悪人プレイをするには相応のデメリットがあると暗に伝えてくれている要素ともとれる。

LVアップは『神殿』と呼ばれる場所で行う。この『神殿』は、最初ガーゴイル占拠されており、解放の為に『ルーン』なるアイテムを探す必要がある。また、既存RPGと違い、そのキャラ総合EXPが一定値を超えているとレベルアップができるシステムとなっている*4。

本作での最高レベルは8。一見低いように見えるが、本作で敵から得られるEXPは多くても60前後がいいところ。そしてLV8に必要総合EXPは6400と、実際にプレイすると分かるがかなりの敵を倒さなくては到達できない数値である

神殿解放すると『ムーンストーン』というアイテムが手に入る。これはゲームクリア必要なので、必然的に、8つある神殿全てを解放しなければならない。

また神殿によって、LVアップボーナスが違う。能力値に差が出るので、LVアップの際に方針を決めておこう。

STR+3の「勇敢さ」、INT+3の「誠実さ」、AGI+3の「優しさ」、全パラメータ+1の「清らかさ」のいずれかでLVアップするのが望ましい。他の神殿LVアップボーナスが少ないため、損してしまう。

ただしどの神殿でも、最初の1回目のレベルアップ時のみカルマ+10されるため、無駄ではない。補欠となる仲間にレベルアップさせてカルマ回復するのにも使える。

シリーズキャラねずみシェリー」は、本作ではなんとアイテムとして持ち歩く事になる。

その小さいサイズから主人公達が入れない場所アイテム回収に用いる。実は重要アイテムの回収の為にシェリー必要な場面もある。

また、シェリーが持てるアイテム(重量の大きいものは持てない)なら、盗んでもカルマが低下しないという裏技がある。

2021-09-09

ブルマー地帯ハンガリー代替としての野外レオタード

序文

ポーランドではブルマーを何と呼んでいたか調査が難航したため、僕は気分転換のためハンガリーについて調べた。そこで、思いがけない事実を見つけた。どうやらハンガリーではブルマーでは少数派で、レオタードが中心であったらしい。しかも、学校によっては今でも使われている形跡があるのだ。以下、ハンガリーレオタード事情について概説する。

ハンガリーの体育とレオタード歴史

Így tornázott a nagyi meg a dédi: az iskolai testnevelés története képekben - Dívány

ハンガリーでは、体育の授業は内務相や文化相を務めたKuno von Klebelsbergの時代に導入された。ウィキペディアによれば、彼は地方小学校を作り、大学近代化し、ハンガリー文化海外に紹介する機関を創設した。その一方で、彼はハンガリー至上主義者であり、かつてのハプスブルク帝国内の少数民族に対してその優位性を主張していた。また、トリアノン条約によるやブルジョア共産主義革命などの原因として、ユダヤ人非難していた。

さて、当時の体操着を見てみよう。男子制服は、写真を見ると白いシャツに短パンそれからおそらく革の靴であった。女子は、次のページを見る限り1930年代では、膝の上まであるワンピースタイプ運動着であった。初期のレオタードである

それ以降の写真を見ていると、女子は短パンになっていくように見える。

だが、次のサイトを見ると、30年間から40年前はレオタード使用されていた、と書かれている。2018年記事から1979年から1989年に該当する。

Ilyen volt a tornaóra régen! | nlc

男子ポーランドのようにノースリーブに短パンなのに対し、女子靴下ナイロン製のレオタードだった。また、お尻にゴムの跡がついて苦痛だった、男子がうらやましかった、とも書いてある。

この下の記事によれば色は青か黒、赤はめったになかった。また、素材のせいか汗をかくとべたついて嫌だったそうだ。

Ebben tornáztunk 30 éve! | nlc

学校のものかどうかはわからないが、60年代レオタードこちらで見つけることができた。

Terror Háza Fotó

以下は70年代レオタード

Május elseje régen – IV. | elekfoto

Tornaóra – 1976. – Szegvár Online

学校の外でのレオタード

ところで、次のページを見ていただきたい。

szeged.hu - Lányok, asszonyok a Tisza-parton és konflisban

こちらでは、レオタード姿の女子が外でジョギングしている写真がある。1981年のことであるレオタードが室内着だと思っていた自分は面食らった。よく、ブルマーで校外を走らされるマラソン大会苦痛だった、という女性の声をしばしば聞く。ましてや、より体型の出るレオタードというのは、率直なところ驚いてしまった。

現に、当時の苦痛を訴えるブログがヒットした。

Jobb nő - lesz - Faluság(短パン写真もあるが、おそらく例外的ものだろう)

身体を伸ばすバレエならともかく、高校の体育で伸縮性のあるレオタード不要ではないかしかも、それで市街地を走らなければならないとは。ブログの主はそう口にしつつ、じろじろ見られることを苦痛理由として挙げている。まったく、その通りだ。どうしてこんなことがまかり通っていたのかという疑問が浮かぶが、ブルマーが30年も通用していた国の人間が言えた義理ではない。繰り返すが、露出度の多い衣装強制には反対する。

しかし、だ。現在グーグルで「iskola testnevelés」(学校 体育)と検索すると、レオタード姿の女子が少しだけヒットするのである2010年代前半の記事が多い)。これが私立なのか公立なのかはわからない。おそらく例外だとは思う。上記レオタードとは色も違う。ほとんどが日本と同じようなシャツに短パンだ。だが、ハンガリージェンダー意識は、日本よりも保守的である可能性がある。

まとめ

今後の展望

気が向いたら、他の国の事情について調べる。

また、映画の中でブルマレオタードがどう表現されてきたか、についても調べたい。しかし、先日「フランス映画 ブルマー」と検索したら、なぜかフランス書院のページしか引っかからず、ずっこけた。

また、それとは別に20世紀の体育の授業を見ると、まるで軍事教練のように男子上半身裸の例が多い。このあたりの規範についても時間があればまとめたい。

それと、ウィキディア制服のページを見ると、日本統治下の台湾で、提灯ブルマーモンペ採用されているのが見えた。もしこれが提灯ブルマーならば、なぜ台湾韓国ではショーツブルマーにならなかったのか。最初からパンだったのならともかく、疑問である

School uniform - Wikipedia

服飾史、まったく沼が深くて驚いている。

2021-09-07

ポーランドブルマー、結局名称は何なんだ?

はじめに

最初にブルマーについて調査した記事で、ポーランドブルマーの映っている動画を紹介した(3:55頃から)。そのことから自分ポーランドにおけるブルマー存在証明したと満足し、それ以上の調査をやめた。しかし、先日のドイツのブルマーにまつわる記事で、ドイツ語のブルマー名称を知ったこからそもそもポーランドブルマーを何と呼んでいるかを調べた。

結果として、今回は具体的な名称を見つけることはできなかったが、ポーランドにおけるブルマー年代をもう少し細かく絞り込むことができた。

ポーランドの体育の起源

ポーランドの体育の歴史は1805年にさかのぼる。医師であり化学者でもあるJędrzej Śniadeckiが、身体の訓練がなおざりにされ、精神だけの訓練が行われていることを嘆き、体育を創始した。彼の目指した水準は高く、「レスリング、さまざまな武器使用ダンスジャンプ、高い木に登る、溝をジャンプする、水泳乗馬、走りながら馬に乗る」などが教科に含まれていた。また、どうやらそこの学校では、ポーランド語も教えられていたようであるポーランドが分割されていた時代のことと考えれば、驚きである

Kto wymyślił lekcje WFu?

サイト名が「ファクト」で少し胡散臭い

ポーランドとSokół(ソコウ)

ソコルはチェコのブルマーについて記載した記事でも書いた通り、チェコ民族的体育運動協会であるポーランドのソコウはそこから派生した団体である1863年蜂起の失敗後、同年2月設立された。同時期のスカウト運動とは逆に、右翼的傾向があった。それに危機を覚えた当局による迫害が続いた。プロイセン占領下のポーランドでもそうであったし、独立後、再びナチス占領されても迫害を受けた。

にもかかわらず、ソコウはポーランド独立運動の一翼を担ったのである

しかし、共産主義政権が成立するとソコウは違法化され、これにまつわる情報はすべて検閲された。1989年合法化され、1990年にソコルポランド体育協会連盟(とでも訳せるか)

名称を変更、現在は80のグループ8000人を擁し、若者愛国心市民義務を教える団体となっている。

なお、余談だがサッカー庶民スポーツとして嫌ったため、20世紀に何人かのメンバー離脱独自サッカークラブができるが、これがポーランド最初サッカーチームの起源である

Sokół - Wikipedia

英語版では1935年の提灯ブルマー確認できる。ポーランド語版では1937年、提灯ブルマーでのマスゲーム確認できる)

ポーランドの体育での服装(結局ブルマーはいていたか?)

上記の「ファクト」というサイトによれば、当時はズボンとゆったりとしたシャツを着て、女の子ドレスを着て運動した、と書かれている。またソコウ(自動翻訳では「ファルコン」と出てくる)では軍服のようなものを身に着けた、とあるブルマーに関する記載がないことに、僕は困惑した。証拠となる映像画像もそろっているのに、文章が見つからないのである

ポーランド語は一言もわからないので、以下の語を翻訳し、組み合わせて検索してみた。「体操着」「紺色」「ブルマ」「短パン」「共産主義」「1960年」「歴史」「恥ずかしい」など。ここで思いがけなかったのが、中東欧の多くの言語で「体操着」で画像検索すると、女性用のレオタードばかりヒットすることだった。

Wikipediaポーランド語版Mundurek szkolny(学校制服)で検索したが、それらしいものはヒットしなかった。イギリス制服に関する項で、

  • Spódniczka sportowa lub szorty z logo szkoły (dziewczęta)
  • Szorty sportowe (dziewczęta)
  • Kostium gimnastyczny (dziewczęta)

とあり、これは

意味するので、検索のヒントになるかと思ったが、結局見つからなかった。

やっとのことで、あるサイトで、こんな証言を見つけた。

pamietam obowiazkowy stroj na wf szorty granatowe bialy podkoszulek.

これを日本語にするとこうなる。

体育の必需品、ネイビーブルーショートパンツ、白いTシャツを覚えています

これが数少ない、ポーランドブルマーにまつわる証言である。名も知らない誰かのコメントで、ポーランドブルマーはあったのだと、映像だけでなく、言語でも納得できた。

ブルマー写真さまざま

こちら過去ポーランド撮影した写真アーカイブだ。検索ワードをgimnastykaに変えても同じような写真が出てくる。

幸いなことに、写真の下には年代記載されている。1930年代1948年と書かれた写真は提灯ブルマーだが、1960年代を映している写真は、間違いなくショーツブルマーだ。

また、こちらでは、少しダボダボしているが1950年代ブルマー確認できる。

他にもブルマー運動する女性写真は何枚か見つけたが結論は同じであり、リンクをいたずらに増やしても意味がないので、割愛する。

陸上ブルマーについて

陸上ブルマーバレーボールブルマーについてもある程度調べようと思った。一つには、日本ブルマーバレーボールに影響されたという説があるからであり、もう一つにはブルマーポーランド語での名称を探すヒントになるかと思ったからだ。

こちらでは1972年陸上ブルマーの普及の様子を確認できる。

また、こちらでは陸上ブルマーの是非について論じているが、タイトルが「Majtki dla biegaczek」、和訳すると「陸上パンティー」である。これがブルマー正式名称かと思ったが、どうやら違うようである

これ以上探しても見つからないので、調査は一段落とした。元々は体育のブルマー調査だ。プロスポーツブルマーとは少し違う。日本でも競技ブルマーの浸透した年代と、学校制服ブルマーの普及した年代には、かなりのずれがある。名称調査はともかく、この画像検索ではずれが出てくる。いずれ、競技ブルマーの普及した年代調査することがあれば、そのときに改めてまとめなおす。

結論

調査での反省

しかしたら、グーグルもDeepLも、単語レベルでの正確なニュアンスに関してはまだ改良の余地があるのかもしれない。また、日本語から英語からかでも、訳語がぶれた。

それと、今回は自分の落ち度だが、系統的単語を調べず、頭に浮かんだまま検索したので、何度も同じ単語検索してしまった。また、サイトによっても訳語のブレがあった。気晴らしの調査であるとはいえドキュメントファイルかなにかで記録を取りながら調査すべきであった。

しかしたら、画像検索ではなく、文章検索すべきかもしれない。たとえば、「体操着 共産主義」ではこちらの質問サイトが見つかり、ブルマーが黒っぽかったことを示唆する内容もある。

Wątek "Strój gimnastyczny " - wielkiezarcie.com

今後の展開と次回予告

できることなら、なんとかポーランドブルマー名称確認したい。

また、ブルマーの普及状況について、国ごとに調査継続したい。

ちなみに、今回自分は並行してハンガリーブルマー事情について調べていたのだが、思いがけないことが明らかになった。それに関してはできたら一週間以内に記事アップロードし、共有したい。

遅れたら失礼。

ログイン ユーザー登録
ようこそ ゲスト さん