はてなキーワード: strとは
今日の夕食はいつも通り、日曜恒例のピザスケジュールを厳守した。
厳密に言えば、ルームメイトが2分遅れで注文したため、配達時刻が18時00分ではなく18時02分になった。
この誤差は一見些細だが、僕の体内リズムに対しては量子重力的なバックリアクションを生む。
夕食の周期は宇宙の膨張と同じく、初期条件の微小なゆらぎが数時間後に巨大な非可逆性をもたらすのだ。
僕はピザを食べる前にその誤差を補正するため、腕時計を2分進め、以後すべての行動をそれに合わせた。
ルームメイトは「そんなことして何の意味があるんだ」と言ったが、彼はエントロピーの不可逆性と人間のスケジュール感覚の相互作用を理解していない。
今日の午前中は、超弦理論の非整合的双対カテゴリ構造について考えていた。
簡単に言えば、AdS/CFTのような整合的対応関係ではなく、dS空間における非ユニタリな境界理論がどのように自己整合的情報写像を持ちうるか、という問題だ。
ただしこれは普通のホログラフィック原理の範疇ではなく、∞-群oid圏上で定義される可逆でない自然変換を持つ圏論的場の理論を考える必要がある。
具体的には、僕は内部的Hom-対象の定義を修正し、対象そのものが自己準同型を持つトポス上の層圏として定義される場合に、ポテンシャル的双対写像が一意に定まる条件を導いた。
非ユニタリ性は単なる障害ではなく、境界理論が持つ時間的向きの非可換性の反映であると考えられる。
ウィッテンでさえ、この構造を「理解できた気になって途中でやめる」だろう。僕はちゃんと最後まで考えた。
午後は隣人がリビングで大音量で音楽を流していた。たしかTaylor SwiftのFortnightだったと思うが、音圧が80dBを超えていた。
僕はそれを測定してから耳栓を装着し、「音楽とは定常波の社会的誤用である」と心の中で唱えた。
数分後、隣人がドアをノックして「ノックが三回じゃなくて二回だった」と文句を言った。
僕は謝罪せず、むしろ彼女に対して「三回のノックは物理的ではなく、社会的エネルギーの保存則を守るための儀式」だと説明したが、彼女は「意味わかんない」と言ってドアを閉めた。
僕はそれを確認してから三回ノックしてドアをもう一度閉めた。これで系は整合的になった。
夕方、友人たちとオンラインでBaldur’s Gate 3の協力プレイを行った。ハードモード。僕のキャラクターはHigh Elf Wizardで、最適化の結果INT 20、DEX 14、CON 16を確保している。
友人の一人は相変わらずSTR特化Barbarianで、戦略性の欠片もない突撃を繰り返す。僕はFireballを詠唱しようとした瞬間に味方の背後に敵がいることに気づき、範囲攻撃を中止した。
代わりにWeb+Grease+Fire Boltの複合制御で戦場を支配。完璧な行動だったのに、彼らは「お前、また燃やしただろ」と言った。無知は罪だ。
僕がやっているのは「燃やす」ではなく「エントロピーを増大させて戦局を支配する」だ。
日課として、ゲーム終了後にワンパンマン第198話を再読。ブラストが高次元的存在と通信している描写を見て、僕はふと考えた。
彼が見ている空間は、もしかするとp進的幾何空間上の位相的射影なのではないか?もしそうなら、サイタマの「無限力」は単なる物理的強度ではなく、位相層上の恒等射である可能性がある。
僕はノートにその仮説を書き留めた。いつか論文化できるかもしれない。
これからの予定としては、19時からはスタートレック:ディープ・スペース・ナインの再視聴。
シーズン4、エピソード3。正確に再生開始するために、Blu-rayプレイヤーのリモコンを赤外線強度で較正済み。
ここ10年前後クトゥルフ神話TRPGを嗜む人間なのですが、SIZの扱いにもやもやもやもやする為ここに叫びを記す。
SIZに対して「平均身長から算出すると、日本人男性でSIZ18なら○cm、日本人女性△cm……」みたいな算出してるの、ゲーム的におかしいだろーー!!!!!!!!!!!
今後も6版で例えているが7版でも同じことが言えるだろう。
よく考えて欲しい。
SIZ18のキャラがいたとして、そのキャラクターを持ち上げられるかどうかは別のキャラクターのSTRで判定したりするじゃないですか。
筋肉量(STR)によってそりゃあ「重さ」としてのSIZは前後するとはいえ、STRを10の平均値として考えた場合……
仮に
筋力が同じくらいで、30cmくらい身長差がある男と女を持上げるために必要な筋肉量さすがに違うだろ………………!?
…………いや、女性の方が大変ナイスバディだったり、世界を占めている横幅があるキャラでいらっしゃる可能性はあるが。
……つまりSIZを始めとした数値は「その人種性別の平均値からどれだけ離れてるか」じゃなくてそのまま数値として扱うことをゲーム的には前提にしてる……と思うんだ……?たぶん、だってデータだから。
いや、いや確かに公式が明確に示してないんだから自由の範囲内だと思います。けど。
同じ卓内に上記のようなキャラが揃ってしまった場合数値的に矛盾していて、気持ち悪い!となってしまい……気にする人少ないのかなあ!
そ、それに、たしかに、元々が海外のゲームだから、アジア人的には下限が高すぎるのかもなとは思うけど!
そそそそ、それに、たしかに、同卓内とはいえ他の人のキャラの身長体重なんてわからんことの方が多いので基準もわかりにくいとは思うけど。
同卓者がいいならいいと思うけど!
だから、チラシの裏みたいなここで叫ぶしか出来んのだけど……!
でもさあ!せめてこの「日本人男性の場合SIZ18なら〇cm!17なら……」みたいな表をさも公式ですよーとか、スタンダードな考え方ですよー、みたいに広めないで……欲しい!
キャラクターの背の高さと体重を一緒にしてひとつの数字で表したもの(引用:6版:42ページ)
手足を酷く失ったような場合には、それを表すためにSIZを下げることもあるが(引用:6版:42ページ)
7版もおおよそ同じようなことが書いてある。こっちは身長と体重の平均くらいとしていたはず。
だから上記の3キャラの例でも、女性が大変ナイスバディだった場合は矛盾しないことになる。
前述の通り、同卓者の許容があるなら前述したような数値的に大きく矛盾してしまう設定でも問題は無い。
でもやっぱりそれが王道のように、初心者に「参考にしてね」と男女別でSIZを身長と並べたような表を出すのはやめて欲しいなー……と思った。それは公式ルールでは無い事は留意して欲しい。あくまで公式ではSIZ=身長ではないし、男女共用の数値のはずだから………………
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("これは、現行システムが特定グループだけでなく全体の非効率性につながっていることを示唆しています。")
すまんな、増田たち。ワイくんはまた一歩、一般人に近づいてしまったわ
前回までのお話
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
}
マーセナリーズサーガクロニクルズのマーセナリーズサーガ2をクリアした。
システムは1と変わりない。バトル面も同じ。
1とほぼ同じシステムだったからアイテム合成を最初から多少意識して進めれたと思う。
次は3をやるかな、たぶん。
「DNA検査は必ずしも正確ではない」って言うと、え?って驚かれることが多い。
特に推理小説やドラマでは、DNA一致が決定的証拠として扱われていることがほとんどだよね。
犯人の髪の毛や血液が現場に残されていて、それがDNA鑑定で一致したらもう逃げ場なし!って感じ。正直、その描写を見るたびに「いや、ちょっと待てよ」ってツッコミたくなる。
確かにDNA検査は、親子関係を調べたり、犯罪捜査で使われたりと便利で強力なツールだけど、だからと言って100%の正確さを保証するものではないんだよ。
たとえば、科学的には「ミトコンドリアDNA」という母方から受け継がれる特定のDNA部分を解析することがあるんだけど、これは母系の祖先を辿るには有効なんだけど、全く同じDNAを持っている人が他にもいる可能性があるんだよ。そうすると、特定の個人を完璧に区別するのは難しくなることがあるの。
それから、DNAの検体が完全に清潔な状態で採取されているかどうかも大事。現場で回収されたDNAサンプルが汚染されていたり、混ざってしまったりすると、鑑定の結果も狂ってしまうことがあるんだ。たとえば、犯行現場にあったコップを通じて犯人のDNAが見つかったとしても、そのコップが他の人の手に渡っていたり、触られていたりした場合、別の人のDNAが混ざる可能性もある。
これに加えて、「一致率」っていう言葉もよく出てくるけど、これも注意が必要。
DNA検査で「一致した」と言っても、それは必ずしも100%完全一致という意味ではないんだ。
例えば、何百万人に一人の確率で一致する、というレベルでの一致を「確定的」とされることが多いけど、それでも「何百万人に一人」は存在するんだよね。つまり、稀なケースだけど、全く無関係な人が偶然DNAが一致してしまうこともあるってこと。
さらに、実際のDNA検査って、さまざまな種類の手法があるんだ。たとえば、法科学でよく使われる「STR(Short Tandem Repeat)」という手法があるんだけど、これも100%ではない。STRは特定のDNAの繰り返し部分を分析して、個人特定に役立てるんだけど、この繰り返し部分の数がたまに似ている人もいて、誤った結果に繋がるリスクがあるんだ。人間のDNAはとてつもなく長くて、解析するのはほんの一部に過ぎないから、どうしても「完全に一致する」とは限らないんだよね。
それに、DNA鑑定が使われるのは犯罪捜査だけじゃなくて、最近は家系図作成やルーツ探索、さらには「健康リスクの判定」にも使われるようになってる。でもこれも、必ずしも正確とは言えない。たとえば、あるDNA検査では「あなたは将来的に心臓病になるリスクが高いですよ」と言われるかもしれないけど、それが本当にその人の運命かというと、そうでもない場合がある。だって、環境やライフスタイルも健康には大きな影響を与えるから、DNAだけじゃ全てを決められないんだよね。
結局のところ、DNA検査って便利で強力だけど、万能ではない。
ドラマや映画みたいに「これが決定的証拠だ!」と簡単に断言できるものではないし、現実の世界ではもっと複雑で曖昧な部分もあるんだ。
import os
# ファイルが存在するか確認し、存在しない場合は初期値を設定
if not os.path.exists(file_path):
with open(file_path, 'w') as file:
# 現在の年数を読み込み
with open(file_path, 'r') as file:
year_count = int(file.read())
# メッセージを表示
print(f"{year_count}年間で最も暑い夏")
with open(file_path, 'w') as file:
file.write(str(year_count + 1))
インデントつけれね
イギリスとノルウェーのすべてをレビューすることはできませんが、ロンドン(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つの修道院があっただろう。
他のいくつかの観察:
さて、ゴールデンウィークですね。
皆さんは新しい環境に馴染めているでしょうか。はたまたあぶれてしまったでしょうか。
安心してください。人生は何度でもやり直し可能なローグライクの繰り返しです。
まず、一人の人間がオギャーとこの世に生み出されたとする
その時点で、というよりも受精した時点である程度の初期能力が決まる
STR 9
INT 10
DEX 8
CON 12
WIS 9
LUC 10
こんなもんでしょうか。
これらの数値は、モノと質によるがある程度は鍛錬によって底上げが可能。
例えば
INTは読書、会話。
CONは走る。
WISはパワハラを受ける。
LUCはゴミを拾う。身だしなみを整える。
ただ、ここの数値以外の、BAD TRAITSを持って生まれることもある。
身体欠損とか、五感の一部がないとか、昭和以前は…ここまでにしておこう。
最近では怒りっぽいとか、飽きっぽいとか、気に病みやすいとか、
そして現代、戦後から平成に至るまで人権、というものが非常に重視されてきた。
あからさまなBAD TRAITを持つもの、あまりにステータスが低い人間は
成人する前に原因不明のまま亡くなった。
種族全体、集落全体を考えれば致し方ない部分もあったかもしれない。
翻って現代、この日本語を理解できる人間として産まれてきたのなら
先人たちのお陰で、衣食住には困っていないはず。
もちろん、困っている人が一定数いることは理解していますがここでは取り扱いません。
どんなBAD TRAITSを持とうと、どれだけ低いSTRで産まれようと
成人まで生きていける社会。
否、生かされてしまう。という風に受け取る方もいるかもしれない。
自殺者が増えている、という切り口で、日本が悪い国だという方がいる。
さも、日本社会が、戦前・戦後と比べて不幸せな国になったかのように。
それも当然そのはず。
社会についていけないだろう、あるいはついていけなかった人間は、
けれど、あまねく救ったのなら、彼らが幸せな生活を送れるようにすること、
これはセットでなくてはならない。
もちろん、日本人として生きるのなら勤労、教育、納税、これらを行ったうえで、が大前提だ。
その中、ごく一部の、理由なく働きたくないでござる、という人間は放っておいていい。
ここまでが、大前提。
生まれ持った能力と特性。変えられようが無いこと。神様どうか。
わたしの目が悪いのも、ADHDでどうしても忘れ物をしてしまうのも変えようがない。
変えようがないけれども、眼鏡を掛けて、リマインダーを駆使して
それは全て先人たちの努力と試行錯誤のお陰だ。大いなる巨人の肩だ。
そしてそれらのハンディキャップは、現在進行形で見えなくなりつつある。
さてそうした時に、だ。
配られたカードが、それほど変わり映えしなくなった後、
一体なにが大事になるのだろう。
実家の太さか?生まれた国か、地域か?運か?学歴か?親か?国か?
いずれも違う。
自分の周囲にいる人間をどういう構成で固めるか、これに尽きる。
これはもう詰みかもしれない。
これはどうだろうか。それほど悪くないんじゃないか。
1人の人間が、社会的接触を保持している関係の人の数のことらしい。
150人くらいが、社会的交流が保たれる限界の数ということが有名な部分だろうが、
3~5人が最も親密な友人関係を築ける人数だというものもある。
あなたの年収は、自分の近しい周囲の5人の年収の平均値になる。
というものがある。
これが友人なのか、職場の友人なのかしれないが、
5人の平均値になるのだとして。
といったようにするか。
果敢にも、孫正義、イーロンマスク、ジャックマー、ウォーレンバフェット
とするのか。
おれは、幼少のころからインターネットの世界にのめりこんできた。
周囲に馴染む同年代がいなかったマセガキだからだ。要するにいじめられっ子だ。
一人っ子だった自分のデッキには、両親以外には1人親友がいるかいないかで、
親を周囲の四枚に加える必要は無かった。
月一回程度は気に掛けてくれたから。
高校でも大学でも、大体の場合は10以上年の離れた人間を入れていた。
年上の人間は優れているかは別にして、必ず別の視点を提供してくれるからだ。
一つ変わったのは今までいなかった年下が入り込んでいることくらいか。
ローグライクでいう選択肢、何か挑戦するものがあるかといえば、
仕事や子育てなど、人生のターニングポイント的なところになる。
攻略できる算段はないが、失敗したとしても納得がいく構成なのか。
子育てもそう。
どういう人となら、子育てという20年を超える一大事業を完遂できるのか。
お互いの両親の支援はどうか。
"こうしたら上手くいくかな"といって何かのツールでアシストするのか。
そこでベートーベンやヘレンケラーの伝記を読んで自分を奮い立たせられるのか。
そして上記で挙げたLUC、つまり運は何かと言えば、コネ・人脈の源泉だ。
自分にできる最大限の努力をしている姿を見れば、誰だってあなたを助ける。
決して腐らず、善い人であり続けろ。神様・仏様は見てくれる。俺も見る。
どの部活に入るのか。
どのサークルに入るのか。
どの会社に入るのか。
逆に何かを辞めてみるのか。逃げてみるのか。
もちろん、あなたも人"間"です。
あなたが人々に影響を与えることもできるのです。
グループを、目の前のマンモスをやっつけるよう鼓舞することもできるのです。
自信がない?
あなたのステータス、トレイツに応じた貢献の仕方がきっとあります。
さあ、春です。
巨人たちの肩に乗り、素晴らしい仲間たちと、どんなマンモスを倒していこうか。
わくわくしますね。皆さんの新しい門出に幸あれ。
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()
def get_game_number(remaining_teams, games):
if remaining_teams < 2:
return games
remaining_teams = remaining_teams / 2
if int(remaining_teams) < 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)))
ワイ:
GPT:
了解しました。以下は指定された条件に基づいて動作するPythonのGUIアプリのコードです。このアプリは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:
こっちの方がいいな。
本当にあった話だけど、JavaScriptでstrっていう変数にテキストが入っていて
その変数に'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を書きましょう」
「動いてるからいいじゃない」
「綺麗に書いても性能上意味ない」
「言ってることが良く分からない。何が違うのか」
とか言ってくるし
自分は上段に座しているつもりで偉そうな上から目線の半分的外れな説教だの、はたまたその体すら為していない放言だのを安全な位置から投げつけたいだけのカスしかここにはいない。
このタイトルを見て、意識高い系文系イキリ勘違い野郎に何事か物申してやろうと考えたそこの画面の前でニチャニチャしているパソカタオタク(パソコンカタカタキモオタク: 声は小さいがタイプ音はでかい)のことである。
あるいは増田のことかもしれない。増田は日頃増田に生息している訳ではないが。
お分かりの通り、これは釣り記事である。そもそも意識高い系文系イキリ勘違い野郎が増田に記事を書くわけがない。が、一応タイトルに嘘はない。
ので意識高い系文系イキリ勘違い野郎を志す意識高い系文系イキリ勘違い野郎予備軍のことを思って以下を書く。
ちなみに、この記事のタイトルは増田が一番嫌いなタイプのそれである。自分で設定したのに今、額に青筋が浮かんでいる。
本項では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エンジニアと言いきってよいか悩ましい類だったので嘘は吐いていない。
ちなみに増田は増田に書き込むような人間であるからして社会性というものが欠落している。
ちなみに月収は大学院2回生の収入0時代からの差分で算出して+50万なのでつまるところそれが現在の月収である。
増田にとって低くはないが、決してITエンジニアとして高い方であると主張することはできない程度の額である。
釣りのためにタイトルに含めた以上最低限の説明のはしたが、増田は金の話をすると脳の血管がブチギレそうになるのでこれ以上その話はしない。
ここまで読んだならわかると思うが、増田は意識高い系文系イキリ勘違い野郎(タイプ音がでかい)ではなく、パソカタオタク(パソコンカタカタキモオタク: 声は小さいがタイプ音はでかい)である。
そして、意識高い系文系イキリ勘違い野郎予備軍に言うべきことがあるとすれば、そもそもこの記事をここまで読んでいる時点でITエンジニアには向いていないので止めといたほうがよい。
また、ひょっとすると思い違いをしているかもしれないが、ITエンジニアというのは大抵 (増田は社会経験がほぼないので一般論を言うことは出来ないが) 意識高い系イキリキラキラ野郎サイドではなくパソカタオタクばかりである。
というよりTwitterにいる意識高い系イキリキラキラ野郎は多くの場合意識高い系文系イキリ勘違い野郎予備軍を養分にする人でなしである。騙されてはならない。
また、一つ理解しなければならないのは意識高い系文系イキリ勘違い野郎予備軍諸兄姉が張り合わなければならないのは、プログラミングスクールの同期でも、「#駆け出しエンジニアと繋がりたい」している有象無象でもなく、幼少から寝食や友人や遊びを自ら捨ててパソカタにのめり込んでいた、そして現在進行系でのめり込んでいる歴10年や20年をゆうに超えるSSRパソカタオタクであるということである (そしてそれはNRパソカタ増田も同様である)。
彼らが「スクールで半年学びました」で並び立てるような人間でないのは単純な算数でわかるほど明らかである。悪いこと言わんからキラキラWebエンジニアを目指すのはやめとけ。
あるいはそれでも目指すのであれば自分が何を捧げられるのかを考えた方がいい。
【うるてぃましっくす いつわりのよげんしゃ】
開発元 インフィニティー
定価 9800円(税別)
プレイ人数 1人
判定 なし
世界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されるため、無駄ではない。補欠となる仲間にレベルアップさせてカルマを回復するのにも使える。
シリーズキャラ「ねずみのシェリー」は、本作ではなんとアイテムとして持ち歩く事になる。
その小さいサイズから、主人公達が入れない場所のアイテム回収に用いる。実は重要アイテムの回収の為にシェリーが必要な場面もある。
ポーランドではブルマーを何と呼んでいたか。調査が難航したため、僕は気分転換のためハンガリーについて調べた。そこで、思いがけない事実を見つけた。どうやらハンガリーではブルマーでは少数派で、レオタードが中心であったらしい。しかも、学校によっては今でも使われている形跡があるのだ。以下、ハンガリーのレオタード事情について概説する。
Í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年代のレオタードをこちらで見つけることができた。
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世紀の体育の授業を見ると、まるで軍事教練のように男子が上半身裸の例が多い。このあたりの規範についても時間があればまとめたい。
それと、ウィキぺディアの制服のページを見ると、日本統治下の台湾で、提灯ブルマーかモンペが採用されているのが見えた。もしこれが提灯ブルマーならば、なぜ台湾や韓国ではショーツ型ブルマーにならなかったのか。最初から短パンだったのならともかく、疑問である。
服飾史、まったく沼が深くて驚いている。
最初にブルマーについて調査した記事で、ポーランドのブルマーの映っている動画を紹介した(3:55頃から)。そのことから、自分はポーランドにおけるブルマーの存在を証明したと満足し、それ以上の調査をやめた。しかし、先日のドイツのブルマーにまつわる記事で、ドイツ語のブルマーの名称を知ったことから、そもそもポーランドでブルマーを何と呼んでいるかを調べた。
結果として、今回は具体的な名称を見つけることはできなかったが、ポーランドにおけるブルマーの年代をもう少し細かく絞り込むことができた。
ポーランドの体育の歴史は1805年にさかのぼる。医師であり化学者でもあるJędrzej Śniadeckiが、身体の訓練がなおざりにされ、精神だけの訓練が行われていることを嘆き、体育を創始した。彼の目指した水準は高く、「レスリング、さまざまな武器の使用、ダンス、ジャンプ、高い木に登る、溝をジャンプする、水泳、乗馬、走りながら馬に乗る」などが教科に含まれていた。また、どうやらそこの学校では、ポーランド語も教えられていたようである。ポーランドが分割されていた時代のことと考えれば、驚きである。
ソコルはチェコのブルマーについて記載した記事でも書いた通り、チェコの民族的体育運動協会である。ポーランドのソコウはそこから派生した団体である。1863年蜂起の失敗後、同年2月に設立された。同時期のスカウト運動とは逆に、右翼的傾向があった。それに危機を覚えた当局による迫害が続いた。プロイセン占領下のポーランドでもそうであったし、独立後、再びナチスに占領されても迫害を受けた。
にもかかわらず、ソコウはポーランドの独立運動の一翼を担ったのである。
しかし、共産主義政権が成立するとソコウは違法化され、これにまつわる情報はすべて検閲された。1989年に合法化され、1990年にソコルポーランド体育協会連盟(とでも訳せるか)
へ名称を変更、現在は80のグループに8000人を擁し、若者に愛国心や市民の義務を教える団体となっている。
なお、余談だがサッカーを庶民のスポーツとして嫌ったため、20世紀に何人かのメンバーが離脱、独自のサッカークラブができるが、これがポーランド最初のサッカーチームの起源である。
(英語版では1935年の提灯ブルマーが確認できる。ポーランド語版では1937年、提灯ブルマーでのマスゲームが確認できる)
上記の「ファクト」というサイトによれば、当時はズボンとゆったりとしたシャツを着て、女の子はドレスを着て運動した、と書かれている。またソコウ(自動翻訳では「ファルコン」と出てくる)では軍服のようなものを身に着けた、とある。ブルマーに関する記載がないことに、僕は困惑した。証拠となる映像も画像もそろっているのに、文章が見つからないのである。
ポーランド語は一言もわからないので、以下の語を翻訳し、組み合わせて検索してみた。「体操着」「紺色」「ブルマ」「短パン」「共産主義」「1960年」「歴史」「恥ずかしい」など。ここで思いがけなかったのが、中東欧の多くの言語で「体操着」で画像検索すると、女性用のレオタードばかりヒットすることだった。
Wikipediaのポーランド語版Mundurek szkolny(学校の制服)で検索したが、それらしいものはヒットしなかった。イギリスの制服に関する項で、
とあり、これは
を意味するので、検索のヒントになるかと思ったが、結局見つからなかった。
pamietam obowiazkowy stroj na wf szorty granatowe bialy podkoszulek.
これを日本語にするとこうなる。
これが数少ない、ポーランドのブルマーにまつわる証言である。名も知らない誰かのコメントで、ポーランドのブルマーはあったのだと、映像だけでなく、言語でも納得できた。
こちらは過去のポーランドを撮影した写真のアーカイブだ。検索ワードをgimnastykaに変えても同じような写真が出てくる。
幸いなことに、写真の下には年代が記載されている。1930年代、1948年と書かれた写真は提灯ブルマーだが、1960年代を映している写真は、間違いなくショーツ型ブルマーだ。
また、こちらでは、少しダボダボしているが1950年代のブルマーを確認できる。
他にもブルマーで運動する女性の写真は何枚か見つけたが結論は同じであり、リンクをいたずらに増やしても意味がないので、割愛する。
陸上のブルマーやバレーボールのブルマーについてもある程度調べようと思った。一つには、日本のブルマーがバレーボールに影響されたという説があるからであり、もう一つにはブルマーのポーランド語での名称を探すヒントになるかと思ったからだ。
こちらでは1972年の陸上ブルマーの普及の様子を確認できる。
また、こちらでは陸上ブルマーの是非について論じているが、タイトルが「Majtki dla biegaczek」、和訳すると「陸上のパンティー」である。これがブルマーの正式名称かと思ったが、どうやら違うようである。
これ以上探しても見つからないので、調査は一段落とした。元々は体育のブルマーの調査だ。プロスポーツのブルマーとは少し違う。日本でも競技用ブルマーの浸透した年代と、学校制服のブルマーの普及した年代には、かなりのずれがある。名称の調査はともかく、この画像検索ではずれが出てくる。いずれ、競技用ブルマーの普及した年代を調査することがあれば、そのときに改めてまとめなおす。
もしかしたら、グーグルもDeepLも、単語レベルでの正確なニュアンスに関してはまだ改良の余地があるのかもしれない。また、日本語からか英語からかでも、訳語がぶれた。
それと、今回は自分の落ち度だが、系統的に単語を調べず、頭に浮かんだまま検索したので、何度も同じ単語で検索してしまった。また、サイトによっても訳語のブレがあった。気晴らしの調査であるとはいえ、ドキュメントファイルかなにかで記録を取りながら調査すべきであった。
もしかしたら、画像検索ではなく、文章で検索すべきかもしれない。たとえば、「体操着 共産主義」ではこちらの質問サイトが見つかり、ブルマーが黒っぽかったことを示唆する内容もある。
Wątek "Strój gimnastyczny " - wielkiezarcie.com
できることなら、なんとかポーランドのブルマーの名称を確認したい。
また、ブルマーの普及状況について、国ごとに調査を継続したい。
ちなみに、今回自分は並行してハンガリーのブルマー事情について調べていたのだが、思いがけないことが明らかになった。それに関してはできたら一週間以内に記事をアップロードし、共有したい。
遅れたら失礼。