はてなキーワード: f.sとは
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/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
}
前にLカップブラとUカップブラの違いについて書いた増田です。
けっこう面白い問題提起だなと思ったので、お答えしようと思います。
これもネット調べで恐縮なのだが、下着店での取り扱いはB〜Dカップがボリュームゾーンらしく、Aカップはそんなに置いていないらしい。AAカップ以下については皆無な店もあるだろう。
これはその通りです。
もし採寸の結果がAA以下だった場合、「お客様はAAなのですが、そのサイズはうちには置いてないんですよね」なんて言えるだろうか?
仮にAだったとしても、「お客様はAですね」なんて伝えられるだろうか?「私はまな板じゃないからAじゃない!」と怒りだす女性もいるだろう。
どうしてこうなったのか。それは、それなりにいるはずのAAA〜Aカップ商品を作らないメーカーサイドに問題があると考える。なぜ作らないのかは単に「売れないから」である。大半の女性は自分がAカップ以下であることを絶対に認めないため、どれだけ貧乳でもBカップを着用する。
Aカップだと伝えられた客が怒らないように、下着店員が自主的にカップ数を水増ししてor下着屋が従業員に水増しさせて Bカップ以上にしているのではないかとの疑問ですね。
アパレル店員が「私もそれ持ってるんですよ(持ってない)」とか「残り一点ですよ(まだある)」とか「お似合いですよ(似合ってない)」とかの嘘をつくことはよく知られていますので、そのように下着店員も嘘をついてるんじゃないかと思われるのはわかります。
ただ、そのような水増し行為はありえません。
Aカップはそんなに置いていない
https://images.app.goo.gl/V2ai13GfzFyUoXiF6
どんなに胸の小さい客にもBカップ以上だと嘘をつくのであればAカップのブラは一つもないはずです。(中古に流れているので購入実態もある)
ならAAやAAAカップを水増ししてAカップだと嘘をつくことがあるのか、というとその可能性も低いです。
採寸は着衣のまま、あるいはブラの上からすることが多いらしい。
本当にフィットしていてパッドも入ってないブラを着けているなら良いが、多くの場合そんなことはないはずである。ほとんどのブラはパッドがデフォルトで入っているし、そもそも実際のサイズがわからないから採寸しているんじゃないのか。
仮に男の私がCカップのスカスカのブラを着けて採寸したらどうなるか。恐らくA〜Cカップ程度になってしまうだろう。痩せ型の男である私のバストサイズはAAA〜AAカップ程度のはずなのだが、大幅にサイズアップしてしまっている。
つまり、こんな測り方をしてもなんの意味もないのだ。しかし、「専門のスタッフに測ってもらった」ということから結果を盲信してしまい、自分の本来のサイズを少し大きめに誤認してしまうというわけだ。
これではいかんという気がするが、とはいえ、着衣で測るのにも理由があるはずである。そこを考察していく。
まず、女同士とはいえ裸を見せるのは恥ずかしいという方も多いだろう。これは仕方ない理由と言える。
しかしもっと大きな理由がある。ここで再度透明化されたAAカップ以下の話が出てくる。
前述の通り、Aカップは普通に膨らみがあるので、痩せ型の女性ならわりと普通に存在する。それどころかAAカップもわりといる。AAAカップまでいくと流石に少数派だろうが、恐らく全体の数パーセントぐらいはいる。
これは私の推測だが、AAA〜Aカップは全体の25〜35%程度は存在すると考えている。少なくともこの3サイズで20%前後はいるだろう。
まず、これがよくある採寸方法です。
https://www.youtube.com/watch?v=rcr_UoDSqso
採寸されている人が巻き尺の目盛りを自分の目で見ていますよね?
ここでごまかす余地はほとんどないことがお分かりになったと思います。
次に、大きくて固いブラの上から採寸すれば確かに結果もおかしくなるかもしれません。
しかしこれで騙せるのは「ブラを買いに行くためのブラがある客」だけです。
ブラをまだ持ってなくてノーブラで来た客は正直にAAやAAAと測定されます。
自分のサイズを勘違いして大きすぎるブラをつけている客であっても、ワイヤーが入っていない薄いブラ(ジュニアブラ、スポブラ、ブラレットなど)であれば膨らまし効果はあまりないのでほぼ正確なサイズが出ます。
家で裸になってセルフ採寸している客もそこまで珍しいわけではありません。
こうして自分のカップサイズがAAやAAAだと知った客にお世辞でAなどと言っても嘘だとバレてしまい、喜ばせるどころか「あの下着屋は嘘つき」と悪評を呼ぶことにしかならないでしょう。
そうなればネットでウワサになってそうなものですが一度も聞いたことがないので嘘カップが常態化しているということはないものと思われます。
ちなみにワコールはAAやAAAも一応売ってるので従業員に嘘をつかせる動機はなさそうです。
余談ですが、
これを図で表すとこのようになります。h ttps://cdn-ak.f.st-hatena.com/images/fotolife/b/brightsoda/20240930/20240930164705.png
ただ、ブラのサイズはJISで定められているが、測り方のレギュレーションは定められていない。
直立で測る、お辞儀で測る、直立で持ち上げて測るなど、正しい測り方には諸説ある。上裸でもプロに測ってもらうと基本はサイズアップするそうだ。
安心してください、増田がわざわざ提唱するまでもなく事実上ほぼ統一されています。
それぞれの下着ブランドは販売員に測り方のレギュレーションを教育しているのでどの店舗でも同じ測定サービスが受けられますし、主要ブランドはどれでも概ね同じ測り方です。
ワコール:https://youtu.be/3tHLYzHIqY8?t=70 (おそらく膨大な下位ブランドすべてで同じようにしていると思われます)
トリンプ:https://triumph-cpn.com/triumph/fitting/eventreport/
ブラデリス:https://youtu.be/Ev2x_7RTMTM?t=12
リサマリ:https://youtu.be/3WD7D_OZ0h0?t=1044
複数社横断で客のカップサイズの統計を取るんだったらもっと厳格な日本統一レギュレーションが必要になるでしょうが。
ナイキとアディダスとアシックスの足の採寸レギュレーションが統一されているとも聞いたことありません。
直立とお辞儀の姿勢の違いは胸の垂れ度合いによります。垂れている人の場合はお辞儀の姿勢にならないとうまく測れませんが、そうでなければ直立したほうが楽なのでそうされています。
これはもちろん基準の不統一です。しかし、だからどうしたというのでしょう。客にとって重要なことは自分に合う下着を選ぶことであって、よその客と同じ基準で測定されることではありません。
そもそもあなたはLサイズの服を買うかSサイズの服を買うか選ぶときに厳密に計測してますか?
もし厳密に計測したらもっとフィットする服が選べるだろうと思いますか?
S/M/Lを全部試着してみるのが簡単なのに比べてA65からF90までを試着するのは手間がかかるから採寸である程度のアタリをつけるわけです。
しかし結局のところは試着で決めるので厳密な計測はそこまで必要とされていません。
D70と計測された人にB70のブラが合うような例もあるので尚更です。
ちなみにワコールでは体全体をスキャナーにかけて3D画像を撮るサービスをしています。https://www.wacoal.jp/scanbe/service/ 全国津々浦々の下着店にこれが置かれるのであれば状況は変わるでしょう。
余談ですが、ブラジャーとメンズスーツは既成服としては数少ない「二つの寸法パラメータを割り当てるのが一般的な服」です。
実際のCカップはトップとアンダーの差が15cmなわけなのだが、これがそんなに小さいことはない。実際にアンダー67、トップ83の女性に測らせてもらったが、私が貧乳好きだからか普通にでかい。美乳といった感じ。もちろん巨乳好きからしたら全然物足りないのだろうが、がっかりするほどのサイズ感では決してないはずである。
ネットで、「男のカンチガイサイズ」と「実際のサイズ」を比べたイラストを見たことがあるだろうか?この画像は検索すればすぐ出てくる。
これについては、私は両方とも正しくないように思える。理由はもちろん、AAカップ以下が透明化されているからだ。
女性はAカップにカテゴライズされることを極端に嫌がるので、どうしてもAカップを無乳ということにしたいのである。この画像にAAカップとAAAカップを足そうとしたらどうなってしまうのだろうか。確実にえぐれてくる。
https://x.com/punipunichikori/status/331345758706102272
この画像のことですよね?
元増田さんの経験とその画像が噛み合わないのはこういうカラクリです。
h ttps://cdn-ak.f.st-hatena.com/images/fotolife/b/brightsoda/20241003/20241003094717.png
あと、AとAAAで横から見たときの出っ張りの長さはどうも大差ないようです。
h ttps://bust.k-biyou.com/new/06.html AAAからAまで豊胸した経過の写真
h ttps://minamic.com/BG/99/ AAからCまで豊胸した経過の写真
山の高さは同じで裾野の部分が変わっているような。山の高さが変わるのはA以降のように思われます。
おまけ・男性の胸は横から見るとこのようになっているようです。
h ttps://www.arizonabreast.com/gynecomastia-treatment/should-i-undergo-surgery-for-gynecomastia/
h ttps://www.arizonabreast.com/wp-content/uploads/2022/07/illustrated-grades-of-gynecomastia.jpg の左端のnormalが正常な男性
加えてその「男のカンチガイサイズ」と「実際のサイズ」を比べたイラストもあまり正しくない……いや、乳房部分は大して的外れではありません。
問題はその下の部分。実際の人体ではこの線は往々にしてデコボコです。
先ほどのAAAからAまで豊胸した経過の写真でも、アンダーのすぐ下の肋骨が第二乳房のようにムクッと盛り上がってそこからお腹にかけてへこんでいっていますよね。
カップ数には何の関係もありませんが見た目の印象は異なります。
いわゆる「隠れ巨乳(巨乳なのに、服を着ているとそうは見えない)」はここがポイントです。
カップ数はトップとアンダーの周長で決まるけれども、人体の周長は見た目の印象とは関係ないのです。
服を着ているときはアンダーがよく見えないので、乳房の大きさは「顔ーバストトップーウエストの成す角度」というアンダーとは無関係な尺度で推定されます。ここで重要なのは胸の直径です。
裸になればアンダーは見えますが、それでも周長をぐるりと確認してみるようなことはあまりないでしょう。裸になっているときに目につくのは胸の体積です。
(服は直径でも体積でもなく周に沿うものなのでブラのカップ数が周長で決まるのは理にかなっています)
体積は周長のだいたい3乗に比例します。ですからたった2.5cmの周長の違いであっても体積はかなり変化しますし、A→Bの体積増加幅よりもF→Gの体積増加幅のほうがずっと大きくなります。
しかし直径はA→BでもF→Gでもおよそ1cmしか変わりません。
なので、服を着ているときの乳房の見かけの大きさにはカップ数以外の要素の寄与が大きいのです。
h ttps://cdn-ak.f.st-hatena.com/images/fotolife/b/brightsoda/20241010/20241010120655.png
この人は純粋なカップ数はそこそこですが胸付近全体の形状によって着衣だとかなり大きく見えます。
体のメリハリがほとんど前後方面に割り振られているようで、正面から見たときより横からのほうがくびれがわかりやすい体型です。
前の増田を書いたときに「増田はフィッターなのか」と疑問に思ってる方がいましたが、違います。
フィッターでも下着専門家でもなんでもないです。自由のブラしか持ってません。ブラジャーや他人の胸をまじまじ見たこともほとんどありません。
前にLカップブラとUカップブラの違いについて書いたときに「ブラトップをつけるからもうブラは買ってない」という方が多いのがわかりました。
ブラトップはブラに比べて圧倒的に「楽」です。この楽さは柔らかくて締め付けがないことから来ています。
買わない人が増えてきた以上、ブラはそろそろ滅びが近いのかもしれません。
一方で、少数派の体型の人はブラトップでは間に合わないということもわかりました。
XSから4XLまでの1パラメータしかない…つまり、同じ服を拡大・縮小したようなものしかなくて縦長や横長やカップ数のバリエーションがないので当然そうなります。中小企業やファストファッションならともかくユニクロがこうしているのは不可解です。
h ttps://www.uniqlo.com/jp/ja/products/E457925-000/00/size?sizeDisplayCode=003&measurementUnit=cm
これはエアリズムのブラトップの商品展開です。G65だったりA90だったり身長180cmの細身だったりすると着るものがありませんね。
ところで私はD65で身長158cmと幸運にも平均的な体格で、Mサイズが適合するようなので買いました。
フィットしませんでした。h ttps://cdn-ak.f.st-hatena.com/images/fotolife/b/brightsoda/20241005/20241005212900.png
これでは困ります。
前に乳房間のスキマの有無と、U字(前中心が高い)ブラとL字(前中心が低い)ブラの違いについて書きましたね。
増田は極端なスキマなし体型のようで、ホールド力の弱いブラで軽く寄せただけでも谷間にシワができるほど深く寄ります。ちょっとでも前中心が高いブラをつけると干渉するので極端に前中心の低い「自由のブラ」をつけています。
痛くも苦しくもなく、ズレも浮きもせず、みっちり支えてくれる非常に良いものです。ユニクロのノンワイヤーと着用感は大差ありません。
僕はプログラミング歴2週間の初心者です。キーと値を入力できるデータベースを作っています。
以下のコードを実行してデータを追加し続けると、一定のサイズを超えるとエラーが出てしまうみたいです。
理想は、データが追加された後にサイズが足りなくなったら動的に自動拡大されることです。
もし詳しい人がいたらご教示お願い致します。
import sys import os import mmap import hashlib def h(x): return int(hashlib.sha512(x.encode()).hexdigest(), 16) def create_db(filename): with open(filename, 'wb') as f: f.write(b'\0' * 1024 * 1024) # 1MBの空ファイルを作成 def set_key(filename, key, value): with open(filename, 'r+b') as f: mm = mmap.mmap(f.fileno(), 0) pos = h(key) % mm.size() while mm[pos:pos+1] != b'\0': pos = (pos + 1) % mm.size() if pos == h(key) % mm.size(): f.seek(0, os.SEEK_END) f.write(b'\0' * mm.size()) # ファイルサイズを2倍にする mm = mmap.mmap(f.fileno(), f.tell()) # ファイルサイズを反映させる pos = h(key) % mm.size() # ハッシュ値を再計算する data = key + '\0' + value + '\0' data = data.encode() mm[pos:pos+len(data)] = data mm.close() # mmapオブジェクトを閉じる def get_key(filename, key): with open(filename, 'r+b') as f: mm = mmap.mmap(f.fileno(), 0) pos = h(key) % mm.size() while mm[pos:pos+1] != b'\0': end = mm.find(b'\0', pos, mm.size()) # 第2引数と第3引数を指定する if end == -1: end = mm.size() if mm[pos:end].decode() == key: pos = end + 1 end = mm.find(b'\0', pos, mm.size()) # 第2引数と第3引数を指定する if end == -1: end = mm.size() value = mm[pos:end].decode() mm.close() # mmapオブジェクトを閉じる return value pos = (pos + 1) % mm.size() if pos == h(key) % mm.size(): break mm.close() # mmapオブジェクトを閉じる return None def main(): cmd = sys.argv[1] if cmd == 'create': create_db(sys.argv[2]) elif cmd == 'set': set_key(sys.argv[2], sys.argv[3], sys.argv[4]) elif cmd == 'get': print(get_key(sys.argv[2], sys.argv[3])) if __name__ == '__main__': main()
侵入しない。
どちらかと言うとイギリスEUとUSの画策に見える。ロシアはNATOが騙したまで話してる。ガスをもらっておいて、NATOはロシアの約束は破る。USが分断しようとしてるように見える。USが戦争を仕掛けてるよう。 https://t.co/th6tEqxIJI— TAKEUCHI.F.Satomi 竹内 智美 (@OriorinOriorin1) January 24, 2022
いつも自衛隊や米軍基地に反対する人はウクライナの戦争に対しては反対しているのかなと思ったら、
from typing import Sequence class ReverseSequence(object): def __init__(self, sequence: Sequence): self.sequence = sequence # reference to container self.index = len(sequence) # current index # Step 1. define __iter__ method whitch returns self. def __iter__(self): return self # Step 2. define __next__ method # rasing StopIteration at the end of iteration. def __next__(self): if self.index > 0: self.index = self.index - 1 # next index return self.sequence[self.index] else: raise StopIteration class ReverseSequenceGenerator(object): def __init__(self, sequence: Sequence): self.sequence = sequence self.index = len(sequence) def __iter__(self): while self.index > 0: self.index = self.index - 1 yield self.sequence[self.index] raise StopIteration assert list.__eq__( [element for element in ReverseSequence('spam')], [element for element in ReverseSequenceGenerator('spam')] )
class Reverse: def __init__(self, data): self.data = data self.index = len(data) def __iter__(self): return self def __next__(self): if self.index == 0: raise StopIteration self.index = self.index - 1 return self.data[self.index] class ReverseGenerator: def __init__(self, data): self.data = data self.index = len(data) def __iter__(self): while True: if self.index == 0: raise StopIteration self.index = self.index - 1 yield self.data[self.index] assert [s for s in Reverse('spam')] == [s for s in ReverseGenerator('spam')]
DEMETER | グラディウスIV -復活- |
オープニングテーマ | 七ツ風の島物語 |
ケチャビアン | 豪血寺一族2 |
防衛圏(1Stage Demo)~踏み込め!(1Stage BGM1) | NAMCO×CAPCOM |
赤壁の戦い・呉ステージ | 真・三國無双6 |
YOU GET | ゼロウィング |
THE LAST JUDGMENT | 第3次スーパーロボット大戦 |
Capteain Falcon's Theme | F-ZERO GX |
錬金術(人間のテーマ) | ステラデウス |
Quick Master | pop'n music |
Synthetic Life | リッジレーサーズ |
最終ステージ | Braid |
Battle Train | 真魂斗羅 |
Purple Town | ボーダーダウン |
ラストバトル(ウッ…ハ!) | 超兄貴~究極無敵銀河最強男~ |
異冠の女剣士 | ワールドヒーローズ2 |
ドイツ第三帝国 | ワールドアドバンスド大戦略~鋼鉄の戦風~ |
ウェインのテーマ | ドラゴンフォース |
F.S.R | 花と太陽と雨と |
hypersonic | ゼロ・ディバイド |
The Genesis | ペルソナ4 |
Rock is Sponge | Rez |
フィールド | キングオブキングス |
Get The Sky -With Your Dream- | リアルバウト餓狼伝説2 |
Revolt | オウガバトル64 |
ラスボス最終形態 | Hard Corps:Uprising |
MIZOGUCHI'S THEME | ファイターズヒストリー |
ポルナレフ | ジョジョの奇妙な冒険 黄金の旋風 |
味方1 | デアラングリッサーFX |
Philistine | ノーモアヒーローズ2 |
Rough And Lady | ガーディアンヒーローズ |
The Reverse Will | サイレントヒル2 |
タイトル | ソルスティス 三次元迷宮の狂獣 |
ミラの加護とともに(セリカマップ1) | 大乱闘スマッシュブラザーズX |
G ~Blast ver.~(Fallen Colony) | 鉄拳6 BLOODLINE REBELLION |
地上ステージ | SION2 |
Battleship -stage 2 & 8- | グラディウスV |
電力供給ビル | ブレスオブファイアV ドラゴンクォーター |
活撃、そして活撃! | レガイア デュエルサーガ |
Oops! | ビブリボン |
METAL GEAR SOLID MAIN THEME | メタルギアソリッド |
UFO End | サイレントヒル |
受けてきた。
覚えているうちにメモ。
午後Ⅰ
<問2>
設問1
……ユーザは正確な時刻は覚えていないものなので「日時」にしてみた。
担当者は、この時点では、XSRFでなく不正ログインを疑っている。
設問2
(1)a.クロスサイトリクエストフォージェリ
(2)b.3
(4)e.confirm f.submit
設問3
(1)イ、ウ
……適当。onmouseoverとかでもイケるらしい。ダメだこれは。
(2)g.セッションハイジャック
<問3>
設問1
設問2
(1)a.ウ b.エ c.ア d.イ
(2)e.1 f.3
(3)g.オ
(4)h.IdP i.改ざん
(5)事前にIdPとSP間で情報共有し、信頼関係を構築しているから。
ここだけ設問に『具体的に述べよ』って書いてないので、。
抽象的なやつかなと思ってこれに。
設問3
社外から社内IdPへの通信は、ファイアウォールで禁止されているから
接続元IPアドレスを制限する機能によって、社外からアクセスできないから
……地味にFWという略語はでてきていないので、ファイアウォールと記載。
ここの説明はすごく問題に出そうだったので、ぐりぐりとマークしていたからすぐに気づいた。
午後Ⅱ
<問2>
設問1
(2)b.ウ d.ア
設問2
(1)e.プロキシサーバ f.URLがC&Cサーバである通信
(2)g.外部メールサーバ h.外部サーバに転送が成功している通信
(3)外部DNS: 内部DNSサーバからの再帰問合わせを許可しない
……よく分からないけど、TXTレコードってSE作業とか以外で問い合わせあるの?
と思ったので、これを問い合わせるのはマルウェアYかなと。
設問3
(2)ウィルススキャンで異常が検出された場合に、システム部が即時検知できること
……「調査及び着手の早期化」の機能要件=システム部が迅速検知できる、かな。
A社の問題点として、セキュリティパッチ適用の遅さ(どこの会社でもあるよね~)も
あるけど、今回、社員PCのフルスキャン(毎日12:00。これは頻度高い。)から、
連絡受けてシステム部が検知する13:10まで時間かかっているのも問題かなと。
設問4
設問5
業務LANのサーバ間通信は、日次データ転送で用いるプロトコルのみを許可する
……『日次でデータ転送』もぐりぐりマークしていたので使ってみた。
以上
http://anond.hatelabo.jp/20141106161928
st-hatena.com の現在の状況 現在のところ、このサイトは疑わしくないと認識されています。 Google がこのサイトを巡回したときの状況 このサイトで過去 90 日間に Google がテストした 2542 ページのうち 122 ページで、ユーザーの同意なしに不正なソフトウェアがダウンロードされ、インストールされていたことが判明しました。Google が最後にこのサイトを巡回したのは 2014-11-06 で、このサイトで不審なコンテンツが最後に検出されたのは 2014-11-06 です。 不正なソフトウェアには 110 scripting exploit(s), 19 exploit(s), 6 trojan(s) などがあります。感染先のコンピュータで平均 3 個のプロセスが新たに発生しています。 不正なソフトウェアは 40 個のドメイン(fn84.fr/, wkdjfgka.ddns.me.uk/, javaterm.com/ など)でホストされています。 15 個のドメイン(muramoto.net/, meomore.com/, fn84.fr/ など)がこのサイトの訪問ユーザーに不正なソフトウェアを配布する媒体となっていたようです。 このサイトは 29 個のネットワーク(AS9370 (SAKURA-B), AS701 (UUNET), AS209 (QWEST) など)でホストされていたことが判明しました。 不正なソフトの感染を広げる媒介をしていたかどうか st-hatena.com は、過去 90 日間に 59 個のサイト(vip2ch.com/, blog.goo.ne.jp/nakazato-hitoshi/, netouyomilitary.com/ など)への感染媒体となっていた形跡があります。 サイトで不正なソフトウェアをホストしていたかどうか いいえ、このサイトでは過去 90 日間に不正なソフトウェアのホスティングは検出されていません。
これは、a.st-hatena.com のカウントと一致する。
a.st-hatena.com の現在の状況 現在のところ、このサイトは疑わしくないと認識されています。 Google がこのサイトを巡回したときの状況 このサイトで過去 90 日間に Google がテストした 247 ページのうち 122 ページで、ユーザーの同意なしに不正なソフトウェアがダウンロードされ、インストールされていたことが判明しました。Google が最後にこのサイトを巡回したのは 2014-11-06 で、このサイトで不審なコンテンツが最後に検出されたのは 2014-11-06 です。 不正なソフトウェアには 110 scripting exploit(s), 19 exploit(s), 6 trojan(s) などがあります。感染先のコンピュータで平均 3 個のプロセスが新たに発生しています。 不正なソフトウェアは 40 個のドメイン(fn84.fr/, wkdjfgka.ddns.me.uk/, javaterm.com/ など)でホストされています。 15 個のドメイン(muramoto.net/, meomore.com/, fn84.fr/ など)がこのサイトの訪問ユーザーに不正なソフトウェアを配布する媒体となっていたようです。 このサイトは 1 個のネットワーク(AS9370 (SAKURA-B) など)でホストされていたことが判明しました。 不正なソフトの感染を広げる媒介をしていたかどうか 過去 90 日間に a.st-hatena.com が他サイトへの感染媒体となっていた形跡はありません。 サイトで不正なソフトウェアをホストしていたかどうか いいえ、このサイトでは過去 90 日間に不正なソフトウェアのホスティングは検出されていません。
a.st-hatena.com はリダイレクト用のドメイン。
例えば http://a.st-hatena.com/go?http://anond.hatelabo.jp/ にアクセスすると http://anond.hatelabo.jp/ に飛ぶ。
はてなアンテナでリンクするときにクッションページの役割を担ってる。
なにかおかしいな、と思って goo.gl ドメインの結果も見てみたら似たような感じだった(後述)。
おそらくリダイレクト先が危険サイトだった場合、リダイレクト元のドメイン(goo.glとかbit.ly、t.coなど)もカウントされるような仕組みになっているんじゃないだろうか?
a.st-hatena.com + b.st-hatena.com + d.st-hatena.com + f.st-hatena.com + ... とすべて足し合わせたものが st-hatena.com の結果になるようだ。
はてなアンテナのリンク先(はてなと関係ないサイト)に危険なサイトがいくつかある、というだけ。
st-hatena.com は現状でウィルスを配信してはいないし被害を被ることもない。
・・・と断定していいだろう。
http://www.google.com/safebrowsing/diagnostic?site=goo.gl
goo.gl の現在の状況 現在のところ、このサイトは疑わしくないと認識されています。 過去 90 日間に、このサイトの一部で不審な動きが 1 回検出されています。 Google がこのサイトを巡回したときの状況 このサイトで過去 90 日間に Google がテストした 5488513 ページのうち 2753 ページで、ユーザーの同意なしに不正なソフトウェアがダウンロードされ、インストールされていたことが判明しました。Google が最後にこのサイトを巡回したのは 2014-11-06 で、このサイトで不審なコンテンツが最後に検出されたのは 2014-11-06 です。 不正なソフトウェアには 1174 exploit(s), 708 trojan(s), 200 scripting exploit(s) などがあります。感染先のコンピュータで平均 2 個のプロセスが新たに発生しています。 不正なソフトウェアは 594 個のドメイン(shop-corp24.com/, mt.co.kr/, jvvupdate.com/ など)でホストされています。 157 個のドメイン(feedburner.com/, finanstek.net/, padsdel.com/ など)がこのサイトの訪問ユーザーに不正なソフトウェアを配布する媒体となっていたようです。 このサイトは 1 個のネットワーク(AS15169 (GOOGLE) など)でホストされていたことが判明しました。 不正なソフトの感染を広げる媒介をしていたかどうか goo.gl は、過去 90 日間に 990 個のサイト(nudevista.tv/, vporn.com/, acervoamador.com/ など)への感染媒体となっていた形跡があります。 サイトで不正なソフトウェアをホストしていたかどうか いいえ、このサイトでは過去 90 日間に不正なソフトウェアのホスティングは検出されていません。
このサイトで過去 90 日間に Google がテストした 5488513 ページのうち 2753 ページで、ユーザーの同意なしに不正なソフトウェアがダウンロードされ、インストールされていたことが判明しました。Google が最後にこのサイトを巡回したのは 2014-11-06 で、このサイトで不審なコンテンツが最後に検出されたのは 2014-11-06 です。
もしも「st-hatena.com がウィルスをばら撒いている」と考えた場合、Googleもまた現在進行形でウィルスをばら撒いているということになる。
どちらも似たような結果になっている。
http://www.google.com/safebrowsing/diagnostic?site=bit.ly
http://www.google.com/safebrowsing/diagnostic?site=t.co
dwang厨が無謀にもfroyoを入れてみる記録のページ。
結局CM6-RC1+yay-gapps で落着きそうな雰囲気。
dwang-1.17.1
→ eMonster用に使ってた sandisk 2GB (メモ)
7/9 にリリースされているもの
ext partition 要対応? とおもったら仏語じゃねーか
@kenmood
Wifi OK
どっかから落した20090801-docomo-ht-03a.rar のうち、boot, cache, data, system のみをnandroidで復旧してみる。nandroid.md5 の復元も忘れずに。
手順
追加手順:
http://www.androidinforum.fr/htc-dream-android/froyo-french-connection-100-t1742.html#p6156
partition: swap 160M, ext 500M, 残り vfat がおすすめとな。
何度か丹念に「目標をwipeしてreboot」を繰り返してたら安定した気がする。
豆腐をfont入れ、localeをlibicudata.so の入れ替えで対処 (できるかな? reboot中)
→ libicudata.so は入れかえちゃダメ。起動しなくなる。recoveryで起動して/systemをマウントしてことなきを得る。
2010-07-11 追記
2chでも報告されているとおり、wlanが使えない。あと細かい話だけど、live wallpaperが使えない気がする。メモリが足りないだけかもしれないけど。
marketが死にまくる (acoreが死ぬ)。ほかにも死にまくるけど、何故かはよくわからない。とりあえず体験はできるけど、まだ常用には至らないかも。
(安定している、と言っている人もいる)
2010-07-11 追記
zip落してきて上書きinstallしてみた。なんか日本語fontが消されたんだけど(ぶー!)
ちなみに日本語fontはM+を利用してます。
数時間つかった限りでは、他人にお勧めできるほどじゃないけど何とか使いものになるかも。dwangの環境はnandroidでしかバックアップしていないので、手作業でアプリなどは手作業で復帰する予定。
(2010-07-11 午後5時追記)
どうもSPF Connectionが安定しないのと、ベースがCM6ということで、まずはベースに近いほうが良いだろうと
CM6-RC1を焼いてみる(この項続く)
http://www.cyanogenmod.com/home/cyanogenmod-6-0-0-rc1
E/AndroidRuntime( 2000): FATAL EXCEPTION: UpdateCheckinDatabaseService
E/AndroidRuntime( 2000): java.lang.SecurityException: Permission Denial: writing com.google.android.gsf.settings.GoogleSettingsProvider uri content://com.google.settings/partner from pid=2000, uid=10036 requires com.google.android.providers.settings.permission.WRITE_GSETTINGS
すぐ直りそうではあるけど。
(エラー内容から察するに、installされたapkの記録をgoogle accountに書き込めない)
c.f. http://forum.xda-developers.com/showpost.php?p=7139560&postcount=109