「f.s」を含む日記 RSS

はてなキーワード: f.sとは

2025-07-05

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

python
import random
import numpy as np
import matplotlib.pyplot as plt
from collections import defaultdict

# 飴の配布システムシミュレーション
class CandyDistributionSystem:
    def __init__(self):
        """
        設計意図: このシステム経済における資源分配の不平等性をモデル化しています特に少数の特権層(Aグループ)が富を集中させ、再分配システムからも不均衡に利益を得る
        構造問題表現しています。
        """
        # 各グループの人数設定
        self.group_a_count = 8
        self.group_b_count = 2498
        self.group_c_count = 7494
        self.total_participants = self.group_a_count + self.group_b_count + self.group_c_count
        
        # 飴の提出数設定
        self.contribution_per_a = 624
        self.contribution_per_b = 2
        self.contribution_per_c = 1
        
        # 各グループの総貢献計算
        self.total_a_contribution = self.group_a_count * self.contribution_per_a
        self.total_b_contribution = self.group_b_count * self.contribution_per_b
        self.total_c_contribution = self.group_c_count * self.contribution_per_c
        self.total_contribution = self.total_a_contribution + self.total_b_contribution + self.total_c_contribution
        
        # 配布用と貯金用の飴の区分
        self.distribution_limit = 10000
        self.savings = max(0, self.total_contribution - self.distribution_limit)
        
        # 結果追跡用の辞書
        self.results = {
            'A': defaultdict(int),
            'B': defaultdict(int),
            'C': defaultdict(int)
        }
    
    def distribute_candies(self, method='original'):
        """
        設計意図: 配布方法選択によって、特権固定化格差拡大がどのように進むかを
        示します。'original'メソッド意図的にAグループ優遇するよう設計されています。
        
        Parameters:
        -----------
        method: str
            配布方法 ('original', 'lottery', 'first_come', 'new_condition', 'fair')
        """
        # Aグループへの確定配布
        a_distribution = 625 * self.group_a_count
        remaining = self.distribution_limit - a_distribution
        
        # 残りの参加者数
        remaining_participants = self.total_participants - self.group_a_count
        
        # Aグループの結果記録
        for _ in range(self.group_a_count):
            self.results['A'][625] += 1
        
        # 各配布方法によって処理が異なる
        if method == 'original':
            # オリジナル問題設定通りの配布(5000人に1個ずつ、残りは0個)
            lucky_count = remaining  # 5000人が当選
            
            # B+Cグループの混合リスト作成
            bc_participants = [(1, 'B')] * self.group_b_count + [(2, 'C')] * self.group_c_count
            random.shuffle(bc_participants)
            
            # 当選者に配布
            for i in range(len(bc_participants)):
                participant_id, group = bc_participants[i]
                if i < lucky_count:
                    self.results[group][1] += 1
                else:
                    self.results[group][0] += 1
                    
        elif method == 'lottery':
            # 抽選方式(BとCグループから無作為に5000人選出)
            bc_participants = [(1, 'B')] * self.group_b_count + [(2, 'C')] * self.group_c_count
            winners = random.sample(bc_participants, remaining)
            
            # 当選落選カウント
            for _, group in winners:
                self.results[group][1] += 1
            
            # 落選者のカウント
            self.results['B'][0] = self.group_b_count - self.results['B'][1]
            self.results['C'][0] = self.group_c_count - self.results['C'][1]
            
        elif method == 'first_come':
            # 先着順方式アクセス速度による先着順を乱数シミュレート)
            # 設計意図: 先着順は単なる運の要素を超えて、情報格差技術格差も含む制度設計
            bc_participants = [(1, 'B')] * self.group_b_count + [(2, 'C')] * self.group_c_count
            
            # 現実では、情報を早く得られる人や高速インターネット接続を持つ人が有利
            # これをシミュレートするため、Bグループわずかなアドバンテージを与える
            bc_speeds = []
            for id, group in bc_participants:
                if group == 'B':
                    speed = random.random() + 0.1  # Bグループに小さなアドバンテージ
                else:
                    speed = random.random()
                bc_speeds.append((id, group, speed))
            
            # 速度順にソート
            bc_speeds.sort(key=lambda x: x[2], reverse=True)
            
            # 当選者決定
            for i in range(len(bc_speeds)):
                _, group, _ = bc_speeds[i]
                if i < remaining:
                    self.results[group][1] += 1
                else:
                    self.results[group][0] += 1
                    
        elif method == 'new_condition':
            # 追加条件方式恣意的な条件を設定)
            # 設計意図: 新たな条件の設定は往々にして既存特権を温存するように設計される
            bc_participants = [(i, 'B', random.random()) for i in range(self.group_b_count)] + \
                             [(i, 'C', random.random()) for i in range(self.group_c_count)]
            
            # Bグループに有利な条件を設定(例: 特定知識スキルを持つ人のみ)
            # この「条件」は表面上は中立的だが、実際には特定グループに有利になるよう設計
            def meets_condition(participant):
                _, group, rand_val = participant
                if group == 'B':
                    return rand_val > 0.3  # Bグループには70%の確率合格
                else:
                    return rand_val > 0.7  # Cグループには30%の確率合格
            
            # 条件に合致する人を抽出
            eligible = [p for p in bc_participants if meets_condition(p)]
            
            # 条件に合致する人が多すぎる場合抽選
            if len(eligible) > remaining:
                winners = random.sample(eligible, remaining)
            else:
                # 条件に合致する人が足りない場合、全員に配布
                winners = eligible
            
            # 当選者をカウント
            for _, group, _ in winners:
                self.results[group][1] += 1
            
            # 落選者のカウント
            self.results['B'][0] = self.group_b_count - self.results['B'][1]
            self.results['C'][0] = self.group_c_count - self.results['C'][1]
            
        elif method == 'fair':
            # 公平な再分配方式(貢献度に応じた配布)
            # 設計意図: この方法は「貯金分」も含めた全ての飴を、各グループの貢献度に応じて分配
            # これにより構造的不平等を軽減、結果としてより多くの人が少なくとも損をしない状態になる
            
            # 全飴(貯金分も含む)を使った配布
            total_to_distribute = self.total_contribution
            
            # 各グループの貢献比率計算
            a_ratio = self.total_a_contribution / self.total_contribution
            b_ratio = self.total_b_contribution / self.total_contribution
            c_ratio = self.total_c_contribution / self.total_contribution
            
            # 各グループへの配布数決定
            a_share = int(total_to_distribute * a_ratio)
            b_share = int(total_to_distribute * b_ratio)
            c_share = int(total_to_distribute * c_ratio)
            
            # 端数調整
            remainder = total_to_distribute - (a_share + b_share + c_share)
            if remainder > 0:
                # 端数は最も人数の多いCグループに
                c_share += remainder
            
            # Aグループの配布(均等配分)
            per_a = a_share // self.group_a_count
            self.results['A'][per_a] = self.group_a_count
            
            # Bグループの配布(均等配分)
            per_b = b_share // self.group_b_count
            b_remainder = b_share % self.group_b_count
            
            self.results['B'][per_b] = self.group_b_count - b_remainder
            if per_b + 1 > 0 and b_remainder > 0:
                self.results['B'][per_b + 1] = b_remainder
            
            # Cグループの配布(均等配分)
            per_c = c_share // self.group_c_count
            c_remainder = c_share % self.group_c_count
            
            self.results['C'][per_c] = self.group_c_count - c_remainder
            if per_c + 1 > 0 and c_remainder > 0:
                self.results['C'][per_c + 1] = c_remainder
    
    def calculate_net_gain(self):
        """
        設計意図: この関数は各グループ純利益/損失を計算し、資源分配の公平性定量的評価できるようにします。純利益/損失は個人観点から見た経済的公正性の
        重要指標です。
        """
        net_gains = {}
        
        # Aグループ純利益計算
        a_contribution = self.contribution_per_a
        a_distribution = list(self.results['A'].keys())[0]  # 全員が同じ数を受け取る前提
        net_gains['A'] = a_distribution - a_contribution
        
        # BとCグループ純利益計算(加重平均)
        for group, contribution_per_person in [('B', self.contribution_per_b), ('C', self.contribution_per_c)]:
            total_gain = 0
            for received, count in self.results[group].items():
                total_gain += (received - contribution_per_person) * count
            net_gains[group] = total_gain / (self.group_b_count if group == 'B' else self.group_c_count)
            
        return net_gains
    
    def analyze_results(self):
        """
        設計意図: この分析関数は、各グループの分配結果を詳細に調査し、
        制度設計公平性、貢献度と報酬関係、およびシステムの持続可能性を
        評価します。政策分析においては、こうした多角的検証重要です。
        """
        # 各グループ純利益/損失
        net_gains = self.calculate_net_gain()
        
        # 貢献度分析
        contribution_percentage = {
            'A': (self.total_a_contribution / self.total_contribution) * 100,
            'B': (self.total_b_contribution / self.total_contribution) * 100,
            'C': (self.total_c_contribution / self.total_contribution) * 100
        }
        
        # 飴を受け取った人の割合
        received_percentage = {
            'A': sum(count for received, count in self.results['A'].items() if received > 0) / self.group_a_count * 100,
            'B': sum(count for received, count in self.results['B'].items() if received > 0) / self.group_b_count * 100,
            'C': sum(count for received, count in self.results['C'].items() if received > 0) / self.group_c_count * 100
        }
        
        # 分析結果の表示
        print("\n===== 飴の配布システム分析 =====")
        print(f"総飴数: {self.total_contribution}個 (分配用: {self.distribution_limit}個, 貯金: {self.savings}個)")
        
        print("\n--- グループごとの貢献と結果 ---")
        for group in ['A', 'B', 'C']:
            group_size = getattr(self, f"group_{group.lower()}_count")
            contribution_per_person = getattr(self, f"contribution_per_{group.lower()}")
            total_contribution = getattr(self, f"total_{group.lower()}_contribution")
            
            print(f"\n{group}グループ ({group_size}人):")
            print(f"  貢献: 1人あたり{contribution_per_person}個 (総計: {total_contribution}個, 全体の{contribution_percentage[group]:.1f}%)")
            print(f"  受け取り状況:")
            
            for received, count in sorted(self.results[group].items()):
                print(f"    {received}個: {count}人 ({count/group_size*100:.1f}%)")
            
            print(f"  飴を受け取った割合: {received_percentage[group]:.1f}%")
            print(f"  純利益/損失: 1人あたり平均 {net_gains[group]:.2f}個")
        
        print("\n--- 全体的な公平性分析 ---")
        print(f"最も得したグループ: {max(net_gains, key=net_gains.get)}グループ (+{max(net_gains.values()):.2f}個/人)")
        print(f"最も損したグループ: {min(net_gains, key=net_gains.get)}グループ ({min(net_gains.values()):.2f}個/人)")
        
        # 全員に飴が配布されたかどうか
        all_received = all(sum(count for received, count in self.results[group].items() if received > 0) == 
                          getattr(self, f"group_{group.lower()}_count") for group in ['A', 'B', 'C'])
        
        print(f"\n前提条件「全員に配布」の充足: {'はい' if all_received else 'いいえ'}")
        if not all_received:
            total_without = sum(self.results['B'][0] + self.results['C'][0])
            print(f"  飴を受け取れなかった人数: {total_without}人")
        
        return net_gains, contribution_percentage, received_percentage

    def visualize_results(self):
        """
        設計意図: データ可視化政策効果や不平等性を直感的に理解するために重要です。
        このようなグラフィカル表現によって、各グループ間の格差制度設計問題点を
        一目で理解できるようになります。
        """
        # グラフセットアップ
        fig, axes = plt.subplots(2, 2, figsize=(14, 10))
        
        # 1. 貢献度のグラフ
        contributions = [self.total_a_contribution, self.total_b_contribution, self.total_c_contribution]
        axes[0, 0].bar(['Aグループ', 'Bグループ', 'Cグループ'], contributions)
        axes[0, 0].set_title('グループごとの総貢献飴数')
        axes[0, 0].set_ylabel('飴の数')
        
        # 貢献度の割合アノテーションとして追加
        total = sum(contributions)
        for i, v in enumerate(contributions):
            percentage = v / total * 100
            axes[0, 0].text(i, v + 100, f'{percentage:.1f}%', ha='center')
        
        # 2. 1人あたりの貢献度と受け取り数の比較
        group_names = ['Aグループ', 'Bグループ', 'Cグループ']
        contribution_per_person = [self.contribution_per_a, self.contribution_per_b, self.contribution_per_c]
        
        # 各グループの平均受け取り数を計算
        received_per_person = []
        for group, letter in zip(group_names, ['A', 'B', 'C']):
            total_received = sum(received * count for received, count in self.results[letter].items())
            group_size = getattr(self, f"group_{letter.lower()}_count")
            received_per_person.append(total_received / group_size)
        
        x = np.arange(len(group_names))
        width = 0.35
        
        axes[0, 1].bar(x - width/2, contribution_per_person, width, label='提出')
        axes[0, 1].bar(x + width/2, received_per_person, width, label='受け取り')
        
        # 純利益/損失をアノテーションとして追加
        for i in range(len(group_names)):
            net = received_per_person[i] - contribution_per_person[i]
            color = 'green' if net >= 0 else 'red'
            axes[0, 1].text(i, max(received_per_person[i], contribution_per_person[i]) + 5, 
                        f'{"+" if net >= 0 else ""}{net:.1f}', ha='center', color=color)
        
        axes[0, 1].set_title('1人あたりの提出・受け取り飴数比較')
        axes[0, 1].set_xticks(x)
        axes[0, 1].set_xticklabels(group_names)
        axes[0, 1].set_ylabel('飴の数')
        axes[0, 1].legend()
        
        # 3. 各グループの受け取り状況の分布
        # 各グループの受け取り状況を積み上げ棒グラフ表現
        group_sizes = [self.group_a_count, self.group_b_count, self.group_c_count]
        received_counts = []
        not_received_counts = []
        
        for letter, size in zip(['A', 'B', 'C'], group_sizes):
            received = sum(count for received, count in self.results[letter].items() if received > 0)
            received_counts.append(received)
            not_received_counts.append(size - received)
        
        axes[1, 0].bar(group_names, received_counts, label='飴を受け取った人数')
        axes[1, 0].bar(group_names, not_received_counts, bottom=received_counts, label='飴を受け取れなかった人数')
        
        # 割合アノテーションとして追加
        for i in range(len(group_names)):
            if group_sizes[i] > 0:
                percentage = received_counts[i] / group_sizes[i] * 100
                axes[1, 0].text(i, received_counts[i] / 2, f'{percentage:.1f}%', ha='center')
        
        axes[1, 0].set_title('グループごとの飴受け取り状況')
        axes[1, 0].set_ylabel('人数')
        axes[1, 0].legend()
        
        # 4. 貢献度vs報酬の分配公平性
        # 貢献度と最終的な飴の配分の比較円グラフ表現
        total_contribution = self.total_contribution
        contribution_shares = [self.total_a_contribution / total_contribution,
                             self.total_b_contribution / total_contribution,
                             self.total_c_contribution / total_contribution]
        
        # 実際の配分シェア計算
        distribution_shares = []
        for letter in ['A', 'B', 'C']:
            total_received = sum(received * count for received, count in self.results[letter].items())
            distribution_shares.append(total_received / self.distribution_limit)
        
        # 2つの円グラフを並べて表示
        ax4_1 = axes[1, 1].inset_axes([0, 0, 0.45, 1])
        ax4_2 = axes[1, 1].inset_axes([0.55, 0, 0.45, 1])
        
        ax4_1.pie(contribution_shares, labels=group_names, autopct='%1.1f%%')
        ax4_1.set_title('飴の貢献度割合')
        
        ax4_2.pie(distribution_shares, labels=group_names, autopct='%1.1f%%')
        ax4_2.set_title('飴の配分割合')
        
        axes[1, 1].axis('off')
        
        plt.tight_layout()
        plt.show()

# 飴の配布システムシミュレート
candy_system = CandyDistributionSystem()

# オリジナルの配布方法を実行
print("\n===== オリジナルの配布方法 =====")
candy_system.distribute_candies(method='original')
original_results = candy_system.analyze_results()
candy_system.visualize_results()

# 公平な配布方法実験
print("\n\n===== 公平な配布方法シミュレーション =====")
fair_system = CandyDistributionSystem()
fair_system.distribute_candies(method='fair')
fair_results = fair_system.analyze_results()
fair_system.visualize_results()

# 公平な配布と元の配布の比較
print("\n\n===== 配布方法比較 =====")
print("オリジナル方式と公平方式純利益/損失差:")
net_diff = {}
for group in ['A', 'B', 'C']:
    original_net = original_results[0][group]
    fair_net = fair_results[0][group]
    diff = fair_net - original_net
    net_diff[group] = diff
    print(f"{group}グループ: {'+'  if diff > 0 else ''}{diff:.2f}個/人")

print("\n結論:")
if net_diff['A'] < 0 and net_diff['B'] > 0 and net_diff['C'] > 0:
    print("公平な再分配により、Aグループ特権が減少し、BとCグループの状況が改善されます。")
    print("これは構造的不平等の緩和に効果的です。")
elif net_diff['A'] > 0:
    print("興味深いことに、公平な再分配ではAグループさえも利益を得られます。")
    print("これは、現行システム特定グループだけでなく全体の非効率性につながっていることを示唆しています。")

anond:20250705100755 anond:20250705112807

2025-04-13

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

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

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

 

ワイ:

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

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

  

 

ーーコード提示ーー

import time

class SensorySignal:

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

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

"""

VALID_MODALITIES = {"visual", "auditory", "somatic", "interoceptive", "emotional"}

# モダリティごとの反応速度(秒)。情動系は速く、視覚系は遅め。

MODALITY_LATENCIES = {

"visual": 0.3,

"auditory": 0.2,

"somatic": 0.25,

"interoceptive": 0.15,

"emotional": 0.1

}

def __init__(self, modality, intensity, valence, timestamp=None):

"""

感覚信号オブジェクト初期化

Parameters:

-----------

modality : str

感覚の種類 ("visual", "auditory", "somatic", "interoceptive", "emotional")

intensity : float

強度 (0.0-1.0)

valence : float

感情価 (-1.0=negative, 0.0=neutral, 1.0=positive)

timestamp : float, optional

信号の発生時刻

Raises:

-------

ValueError

modality が無効、または intensity/valence が不正場合

"""

if not isinstance(modality, str) or modality not in self.VALID_MODALITIES:

raise ValueError(f"Invalid modality: {modality}. Must be one of {self.VALID_MODALITIES}")

if not isinstance(intensity, (int, float)):

raise ValueError("Intensity must be a number")

if not isinstance(valence, (int, float)):

raise ValueError("Valence must be a number")

self.modality = modality

self.intensity = max(0.0, min(1.0, float(intensity)))

self.valence = max(-1.0, min(1.0, float(valence)))

self.timestamp = self._get_current_time() if timestamp is None else timestamp

self.decay_rate = 0.05

self.latency = self.MODALITY_LATENCIES.get(modality, 0.2) # デフォルトは0.2秒

def _get_current_time(self):

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

return time.time()

def apply_decay(self, time_passed):

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

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

return self.intensity

def __str__(self):

valence_str = "negative" if self.valence < 0 else "positive" if self.valence > 0 else "neutral"

return f"SensorySignal({self.modality}, intensity={self.intensity:.2f}, valence={valence_str}, latency={self.latency:.2f}s)"

class UnprocessedEmotion:

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

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

"""

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

"""

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

Parameters:

-----------

raw_signals : list of SensorySignal, optional

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

salience : float

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

processing_status : str

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

"""

self.id = id(self)

self.raw_signals = raw_signals if raw_signals is not None else []

self.salience = max(0.0, min(1.0, salience))

self.processing_status = processing_status

self.language_candidates = []

self.pattern_matches = {}

self.creation_time = self._get_current_time()

self.last_accessed_time = self.creation_time

self.access_count = 0

self.structure_level = 0.0

self.associated_memory_paths = []

def _get_current_time(self):

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

return time.time()

def _validate_memory_path(self, path):

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

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

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

def add_signal(self, signal):

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

if not isinstance(signal, SensorySignal):

raise ValueError("Signal must be a SensorySignal instance")

self.raw_signals.append(signal)

self.structure_level = max(0.0, self.structure_level - 0.1)

self.last_accessed_time = self._get_current_time()

self.access_count += 1

def add_language_candidate(self, term, confidence):

"""言語表現の候補を追加"""

self.language_candidates.append({

"term": term,

"confidence": confidence,

"timestamp": self._get_current_time()

})

self.structure_level = min(1.0, self.structure_level + 0.05)

self.last_accessed_time = self._get_current_time()

self.access_count += 1

def add_pattern_match(self, pattern_name, similarity):

"""パターンマッチング結果を追加"""

self.pattern_matches[pattern_name] = {

"similarity": similarity,

"timestamp": self._get_current_time()

}

self.structure_level = min(1.0, self.structure_level + 0.1)

self.last_accessed_time = self._get_current_time()

self.access_count += 1

def add_memory_path(self, path):

"""関連する記憶パスを追加"""

if not self._validate_memory_path(path):

raise ValueError(f"Invalid memory path: {path}")

if path not in self.associated_memory_paths:

self.associated_memory_paths.append(path)

self.last_accessed_time = self._get_current_time()

self.access_count += 1

def apply_decay(self, time_passed):

"""時間経過による感情の減衰を処理"""

for signal in self.raw_signals:

signal.apply_decay(time_passed)

decay_modifier = max(0.1, 1.0 - (self.access_count / 100.0))

decay_amount = time_passed * 0.02 * decay_modifier

structure_modifier = max(0.5, 1.0 - self.structure_level)

decay_amount *= structure_modifier

self.salience = max(0.0, self.salience - decay_amount)

return self.salience

def get_average_valence(self):

"""全感覚信号の平均感情価を取得"""

if not self.raw_signals:

return 0.0

total_valence = sum(signal.valence for signal in self.raw_signals)

return total_valence / len(self.raw_signals)

def get_dominant_modality(self):

"""最も強い感覚モダリティを取得"""

if not self.raw_signals:

return None

modality_strengths = {}

for signal in self.raw_signals:

modality_strengths[signal.modality] = modality_strengths.get(signal.modality, 0) + signal.intensity

return max(modality_strengths.items(), key=lambda x: x[1])[0] if modality_strengths else None

def get_best_language_match(self):

"""最も確信度の高い言語表現を取得"""

return max(self.language_candidates, key=lambda x: x["confidence"]) if self.language_candidates else None

def get_status_summary(self):

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

best_lang = self.get_best_language_match()

best_term = best_lang["term"] if best_lang else "未定義"

best_confidence = best_lang["confidence"] if best_lang else 0.0

return {

"id": self.id,

"creation_time": self.creation_time,

"age": self._get_current_time() - self.creation_time,

"status": self.processing_status,

"salience": self.salience,

"structure_level": self.structure_level,

"signal_count": len(self.raw_signals),

"dominant_modality": self.get_dominant_modality(),

"average_valence": self.get_average_valence(),

"best_language_match": best_term,

"language_confidence": best_confidence,

"access_count": self.access_count,

"memory_path_count": len(self.associated_memory_paths)

}

def __str__(self):

status = self.get_status_summary()

best_term = status["best_language_match"]

return f"UnprocessedEmotion(id={self.id}, status={self.processing_status}, salience={self.salience:.2f}, best_term='{best_term}')"

class CognitiveQueue:

"""言語ベル未確定の感覚群を管理するキューシステム認知プロセス優先順位付けと記憶編集サポート

言語学習モダリティインデックス効率化を図る。

"""

def __init__(self, max_size=100, attention_threshold=0.3):

"""

認知キューシステム初期化

Parameters:

-----------

max_size : int

キューの最大サイズ

attention_threshold : float

注意を向けるための最低顕在閾値

"""

self.unprocessed_emotions = []

self.processing_queue = []

self.archived_emotions = []

self.max_size = max_size

self.attention_threshold = attention_threshold

self.current_time = self._get_current_time()

self.learned_terms = {} # 学習済み言語表現: {term: {"context": str, "frequency": int}}

self.modality_index = {} # モダリティごとの感情インデックス: {modality: [emotion]}

def _get_current_time(self):

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

self.current_time = time.time()

return self.current_time

def learn_language_term(self, term, context):

"""新しい言語表現を学習し、以降の候補生成に影響"""

if term in self.learned_terms:

self.learned_terms[term]["frequency"] += 1

else:

self.learned_terms[term] = {"context": context, "frequency": 1}

def _update_modality_index(self, emotion, add=True):

"""モダリティインデックス更新"""

dominant = emotion.get_dominant_modality()

if dominant:

if add:

if dominant not in self.modality_index:

self.modality_index[dominant] = []

if emotion not in self.modality_index[dominant]:

self.modality_index[dominant].append(emotion)

else:

if dominant in self.modality_index and emotion in self.modality_index[dominant]:

self.modality_index[dominant].remove(emotion)

def register_new_emotion(self, raw_signals=None, salience=0.5):

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

emotion = UnprocessedEmotion(

raw_signals=raw_signals,

salience=salience,

processing_status="unattended"

)

self.unprocessed_emotions.append(emotion)

self._update_modality_index(emotion)

if len(self.unprocessed_emotions) > self.max_size:

least_salient = min(self.unprocessed_emotions, key=lambda e: e.salience)

self.unprocessed_emotions.remove(least_salient)

self._update_modality_index(least_salient, add=False)

least_salient.processing_status = "archived_without_processing"

self.archived_emotions.append(least_salient)

return emotion

def access_emotion(self, emotion):

"""感情アクセスし、再編集として新しいインスタンスを生成"""

if emotion not in self.unprocessed_emotions:

return None

new_emotion = UnprocessedEmotion(

raw_signals=[SensorySignal(s.modality, s.intensity, s.valence, s.timestamp) for s in emotion.raw_signals],

salience=emotion.salience,

processing_status=emotion.processing_status

)

new_emotion.structure_level = emotion.structure_level * 0.9

new_emotion.language_candidates = emotion.language_candidates.copy()

new_emotion.pattern_matches = emotion.pattern_matches.copy()

new_emotion.associated_memory_paths = emotion.associated_memory_paths.copy()

self.unprocessed_emotions.append(new_emotion)

self._update_modality_index(new_emotion)

emotion.processing_status = "archived_due_to_access"

self.unprocessed_emotions.remove(emotion)

self._update_modality_index(emotion, add=False)

self.archived_emotions.append(emotion)

return new_emotion

def update_queue(self):

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

self._get_current_time()

for emotion in self.unprocessed_emotions[:]:

time_passed = self.current_time - emotion.last_accessed_time

emotion.apply_decay(time_passed)

if emotion.salience < 0.1:

self.unprocessed_emotions.remove(emotion)

self._update_modality_index(emotion, add=False)

emotion.processing_status = "archived_due_to_low_salience"

self.archived_emotions.append(emotion)

self.processing_queue = []

for emotion in self.unprocessed_emotions:

if emotion.salience >= self.attention_threshold:

if emotion.processing_status == "unattended":

emotion.processing_status = "queued"

self.processing_queue.append(emotion)

self.processing_queue.sort(key=lambda e: e.salience, reverse=True)

def get_next_for_processing(self):

"""処理すべき次の感情を取得"""

self.update_queue()

if not self.processing_queue:

return None

emotion = self.processing_queue[0]

emotion.processing_status = "in_process"

emotion.last_accessed_time = self.current_time

emotion.access_count += 1

return emotion

def lookup_by_pattern(self, pattern_name, min_similarity=0.5):

"""特定パターン類似した感情検索"""

matches = []

for emotion in self.unprocessed_emotions:

if pattern_name in emotion.pattern_matches:

similarity = emotion.pattern_matches[pattern_name]["similarity"]

if similarity >= min_similarity:

matches.append(emotion)

emotion.last_accessed_time = self.current_time

emotion.access_count += 1

return matches

def lookup_by_memory_path(self, partial_path):

"""記憶パスに関連する感情検索"""

matches = []

for emotion in self.unprocessed_emotions:

for path in emotion.associated_memory_paths:

if partial_path in path:

matches.append(emotion)

emotion.last_accessed_time = self.current_time

emotion.access_count += 1

break

return matches

def lookup_by_modality(self, modality):

"""特定モダリティ支配的な感情検索インデックス使用)"""

return self.modality_index.get(modality, [])

def partially_process(self, emotion, language_term=None, confidence=0.0, context=None):

"""感情部分的に処理"""

if emotion not in self.unprocessed_emotions:

return False

if language_term:

emotion.add_language_candidate(language_term, confidence)

if context:

self.learn_language_term(language_term, context)

emotion.structure_level = min(1.0, emotion.structure_level + 0.15)

emotion.processing_status = "partially_processed"

emotion.last_accessed_time = self.current_time

emotion.access_count += 1

if emotion.structure_level >= 0.9:

best_lang = emotion.get_best_language_match()

if best_lang and best_lang["confidence"] >= 0.8:

self.unprocessed_emotions.remove(emotion)

self._update_modality_index(emotion, add=False)

emotion.processing_status = "archived_fully_processed"

self.archived_emotions.append(emotion)

return True

def get_status_summary(self):

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

self._get_current_time()

modality_counts = {}

for emotion in self.unprocessed_emotions:

dominant = emotion.get_dominant_modality()

if dominant:

modality_counts[dominant] = modality_counts.get(dominant, 0) + 1

valence_counts = {"negative": 0, "neutral": 0, "positive": 0}

for emotion in self.unprocessed_emotions:

avg_valence = emotion.get_average_valence()

if avg_valence < -0.3:

valence_counts["negative"] += 1

elif avg_valence > 0.3:

valence_counts["positive"] += 1

else:

valence_counts["neutral"] += 1

return {

"total_unprocessed": len(self.unprocessed_emotions),

"processing_queue_size": len(self.processing_queue),

"archived_count": len(self.archived_emotions),

"average_salience": sum(e.salience for e in self.unprocessed_emotions) / max(1, len(self.unprocessed_emotions)),

"average_structure_level": sum(e.structure_level for e in self.unprocessed_emotions) / max(1, len(self.unprocessed_emotions)),

"modality_distribution": modality_counts,

"valence_distribution": valence_counts,

"learned_terms_count": len(self.learned_terms),

"current_time": self.current_time

}

2024-10-24

おっぱい世界はどれくらい嘘なのか(隠れ巨乳について)

anond:20240928003415

前にLカップブラとUカップブラの違いについて書いた増田です。

けっこう面白い問題提起だなと思ったので、お答えしようと思います

ちなみに増田はD65のナイスバディです。

これもネット調べで恐縮なのだが、下着店での取り扱いは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カップのブラは一つもないはずです。(中古に流れているので購入実態もある)

ならAAAAAカップを水増ししてAカップだと嘘をつくことがあるのか、というとその可能性も低いです。

採寸は着衣のまま、あるいはブラの上からすることが多いらしい。

本当にフィットしていてパッドも入ってないブラを着けているなら良いが、多くの場合そんなことはないはずであるほとんどのブラはパッドがデフォルトで入っているし、そもそも実際のサイズがわからいから採寸しているんじゃないのか。

仮に男の私がCカップスカスカのブラを着けて採寸したらどうなるか。恐らくA〜Cカップ程度になってしまうだろう。痩せ型の男である私のバストサイズAAA〜AAカップ程度のはずなのだが、大幅にサイズアップしてしまっている。

まり、こんな測り方をしてもなんの意味もないのだ。しかし、「専門のスタッフに測ってもらった」ということから結果を盲信してしまい、自分本来サイズを少し大きめに誤認してしまうというわけだ。

これではいかんという気がするが、とはいえ、着衣で測るのにも理由があるはずである。そこを考察していく。

まず、女同士とはいえ裸を見せるのは恥ずかしいという方も多いだろう。これは仕方ない理由と言える。

しかもっと大きな理由がある。ここで再度透明化されたAAカップ以下の話が出てくる。

前述の通り、Aカップ普通に膨らみがあるので、痩せ型の女性ならわりと普通に存在する。それどころかAAカップもわりといる。AAAカップまでいくと流石に少数派だろうが、恐らく全体の数パーセントぐらいはいる。

これは私の推測だが、AAA〜Aカップは全体の25〜35%程度は存在すると考えている。少なくともこの3サイズ20前後はいるだろう。

まり、裸でサイズを測ってしまうとそれなりの割合Aカップ以下を告げなければならないケースが出てくる。

まず、これがよくある採寸方法です。

https://www.youtube.com/watch?v=rcr_UoDSqso

採寸されている人が巻き尺の目盛りを自分の目で見ていますよね? 

ここでごまかす余地ほとんどないことがお分かりになったと思います

次に、大きくて固いブラの上から採寸すれば確かに結果もおかしくなるかもしれません。

しかしこれで騙せるのは「ブラを買いに行くためのブラがある客」だけです。

ブラをまだ持ってなくてノーブラで来た客は正直にAAAAAと測定されます

自分サイズ勘違いして大きすぎるブラをつけている客であっても、ワイヤーが入っていない薄いブラ(ジュニアブラ、スポブラ、ブラレットなど)であれば膨らまし効果はあまりないのでほぼ正確なサイズが出ます

家で裸になってセルフ採寸している客もそこまで珍しいわけではありません。

こうして自分カップサイズAAAAAだと知った客にお世辞でAなどと言っても嘘だとバレてしまい、喜ばせるどころか「あの下着屋は嘘つき」と悪評を呼ぶことにしかならないでしょう。

そうなればネットでウワサになってそうなものですが一度も聞いたことがないので嘘カップ常態化しているということはないものと思われます

ちなみにワコールAAAAAも一応売ってるので従業員に嘘をつかせる動機はなさそうです。

余談ですが、

仮に男の私がCカップスカスカのブラを着けて採寸したらどうなるか。恐らくA〜Cカップ程度になってしまうだろう。

これを図で表すとこのようになります。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の普通の服とブラジャーでは事情が違います

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まで豊胸した経過の写真でも、アンダーのすぐ下の肋骨が第二乳房のようにムクッと盛り上がってそこからお腹にかけてへこんでいっていますよね。

カップ数には何の関係もありませんが見た目の印象は異なります

いわゆる「隠れ巨乳巨乳なのに、服を着ているとそうは見えない)」はここがポイントです。

カップ数はトップとアンダーの周長で決まるけれども、人体の周長は見た目の印象とは関係ないのです。

服を着ているときはアンダーがよく見えないので、乳房の大きさは「顔ーバストトップウエストの成す角度」というアンダーとは無関係尺度推定されます。ここで重要なのは胸の直径です。

裸になればアンダーは見えますが、それでも周長をぐるりと確認してみるようなことはあまりないでしょう。裸になっているときに目につくのは胸の体積です。

(服は直径でも体積でもなく周に沿うものなのでブラのカップ数が周長で決まるのは理にかなっています

カップ数は2.5cm刻みです。

体積は周長のだいたい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字(前中心が低い)ブラの違いについて書きましたね。

増田は極端なスキマなし体型のようで、ホールド力の弱いブラで軽く寄せただけでも谷間にシワができるほど深く寄りますちょっとでも前中心が高いブラをつけると干渉するので極端に前中心の低い「自由のブラ」をつけています

痛くも苦しくもなく、ズレも浮きもせず、みっちり支えてくれる非常に良いものです。ユニクロのノンワイヤーと着用感は大差ありません。

極端な形なので合わない人が多そうですが少なくとも前中心が胸に刺さる痛みから解放されるでしょう。

今は公式から消えているのでzozoで見てください。

案外似たような品がないので、もし廃盤になったらどうしたものか。

2024-08-31

2023-12-17

プログラミング初心者です。以下のコードの誤りはなんですか

僕はプログラミング歴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()
 

2022-01-24

反戦平和主義者は今回のウクライナの緊張をどう見ているのか

いつも自衛隊米軍基地に反対する人はウクライナ戦争に対しては反対しているのかなと思ったら、

しかに反対はしているけどアメリカイギリスが画策して戦争を仕掛けているという世界観のようである

大日本帝国反省からスタートしたはずの反戦平和主義が「鬼畜米英」に帰着するのはなんとも皮肉というか…

2019-11-16

東北きりたんが邪魔をしてWinndows10 20H1のインストールをさせてくれない

VOICEROIDで採用されてるジェムアルトDRMのHASP sentinelってのだと思う多分。

aksdf.sysってドライバーがPAGE_FAULT_IN_NONPAGED_AREAを吐いてWindows10アップデートに失敗して毎日インストール再起動かましてくれちゃってやっぱりDRM絶滅しろって気分になってる。

2018-11-28

7年軟禁したNTが脱走しました

E.F.S.F.やZ.I.O.N.などが流行していますが、A.E.U.G.へ転職したようです

2018-06-29

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')]

2017-10-09

第5回

DEMETERグラディウスIV -復活-
オープニングテーマ七ツ風の島物語
ケチャビアン豪血寺一族2
防衛圏(1Stage Demo)~踏み込め!(1Stage BGM1)NAMCO×CAPCOM
赤壁の戦い・呉ステージ真・三國無双6
YOU GETゼロウィング
THE LAST JUDGMENT第3次スーパーロボット大戦
Capteain Falcon's ThemeF-ZERO GX
錬金術人間テーマステラデウス
Quick Masterpop'n music
Synthetic Lifeリッジレーサーズ
最終ステージBraid
Battle Train真魂斗羅
Purple Townボーダーダウン
ラストバトル(ウッ…ハ!)超兄貴~究極無敵銀河最強男~
異冠の女剣士ワールドヒーローズ2
ドイツ第三帝国ワールドアドバンスド大戦略鋼鉄の戦風~
ウェインのテーマドラゴンフォース
F.S.R花と太陽と雨と
hypersonicゼロ・ディバイド
The Genesisペルソナ4
Rock is SpongeRez
フィールドキングオブキングス
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サイレントヒル

2017-04-17

情報処理安全確保支援士_20170416午後解答メモ

受けてきた。

覚えているうちにメモ

午後Ⅰ

<問2>

設問1

  L氏の確認内容 :退会処理完了までのログイン回数と日時

  ログイン記録から:退会処理完了までのログイン時刻

……ユーザは正確な時刻は覚えていないものなので「日時」にしてみた。

  担当者は、この時点では、XSRFでなく不正ログインを疑っている。

設問2

(1)a.クロスサイトリクエストフォージェリ

(2)b.3

(3)c.現在パスワード d.知りえない

(4)e.confirm f.submit

設問3

(1)イ、ウ

……適当。onmouseoverとかでもイケるらしい。ダメだこれは。

(2)g.セッションハイジャック

(3)h.スクリプト実行を禁止する。

……ありがちな答え。あとで考えると、サニタイズする、かも。

<問3>

設問1

 接続IPアドレスがF社のIPアドレス以外のもの

……『F社のプロキシサーバIP』まで書いてもよかった。

設問2

(1)a.ウ b.エ c.ア d.イ

(2)e.1 f.3

(3)g.オ

……ここは、ウ(クエリラメタ)が正しそう。

(4)h.IdP i.改ざん

(5)事前にIdPとSP間で情報共有し、信頼関係を構築しているから。

……『レスポンスを中継しているから』とか思ったけど、

  ここだけ設問に『具体的に述べよ』って書いてないので、。

  抽象的なやつかなと思ってこれに。

設問3

 交通費精算サービス:3

 社外から社内IdPへの通信は、ファイアウォール禁止されているか

 グループウェアサービス:1

 接続IPアドレス制限する機能によって、社外からアクセスできないか

……地味にFWという略語はでてきていないので、ファイアウォール記載

  ここの説明はすごく問題に出そうだったので、ぐりぐりとマークしていたからすぐに気づいた。



午後Ⅱ

<問2>

設問1

(1)a.SMTP over TLS

(2)b.ウ d.ア

(3)c.内部メールサーバ

設問2

(1)e.プロキシサーバ  f.URLがC&Cサーバである通信

(2)g.外部メールサーバ h.外部サーバ転送成功している通信

(3)外部DNS: 内部DNSサーバから再帰問合わせを許可しない

  内部DNS: 外部DNSDNS問合せしない

……内部のは間違っていそう。同じ内容だしかぶってるし。

(4)i.TXTレコードに対する問合せ

……よく分からないけど、TXTレコードってSE作業とか以外で問い合わせあるの?

  と思ったので、これを問い合わせるのはマルウェアYかなと。

設問3

(1)ファイル暗号化しないこと

(2)ウィルススキャンで異常が検出された場合に、システム部が即時検知できること

……「調査及び着手の早期化」の機能要件システム部が迅速検知できる、かな。

  A社の問題点として、セキュリティパッチ適用の遅さ(どこの会社でもあるよね~)も

  あるけど、今回、社員PCのフルスキャン毎日12:00。これは頻度高い。)から

  連絡受けてシステム部が検知する13:10まで時間かかっているのも問題かなと。

設問4

 j.PC-LAN

設問5

業務LANサーバ通信は、日次データ転送で用いるプロトコルのみを許可する

……『日次でデータ転送』もぐりぐりマークしていたので使ってみた。

以上

2014-11-07

st-hatena.comは危険だ!」→Google Safe Browsingの見方が間違ってるのでは?

http://anond.hatelabo.jp/20141106161928

はてブにも書いたのだけど、一応増田にもメモしておく。

st-hatena.com の結果は a.st-hatena.com の結果と一致する

http://www.google.com/safebrowsing/diagnostic?site=st-hatena.com

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 のカウントと一致する。

http://www.google.com/safebrowsing/diagnostic?site=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 っていったい何?

a.st-hatena.com はリダイレクト用のドメイン

例えば http://a.st-hatena.com/go?http://anond.hatelabo.jp/アクセスすると http://anond.hatelabo.jp/ に飛ぶ。

はてなアンテナリンクするときにクッションページの役割を担ってる。

a.st-hatena.com は「危険サイト」なの?

なにかおかしいな、と思って goo.gl ドメインの結果も見てみたら似たような感じだった(後述)。

おそらくリダイレクト先が危険サイトだった場合リダイレクト元のドメインgoo.glとかbit.ly、t.coなど)もカウントされるような仕組みになっているんじゃないだろうか?

なんで a.st-hatena.com と st-hatena.com の結果はリンクしてるの?

たぶんGoogle Safe Browsingの仕様

a.st-hatena.com + b.st-hatena.com + d.st-hatena.com + f.st-hatena.com + ... とすべて足し合わせたものst-hatena.com の結果になるようだ。

まり危険なの? 安全なの?

特に危険はない。

はてなアンテナリンク先(はてな関係ないサイト)に危険サイトがいくつかある、というだけ。

結論

st-hatena.com は現状でウィルスを配信してはいないし被害を被ることもない。

・・・と断定していいだろう。

参考: goo.gl ドメインの結果

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 です。

a.st-hatena.com の結果とよく似ている。

もしも「st-hatena.com がウィルスをばら撒いている」と考えた場合Googleもまた現在進行形ウィルスをばら撒いているということになる。

参考2:bit.ly と t.co

引用するのが面倒なのでリンクだけ。

どちらも似たような結果になっている。

http://www.google.com/safebrowsing/diagnostic?site=bit.ly

http://www.google.com/safebrowsing/diagnostic?site=t.co

編集履歴

11/7 16時くらい: 初版

11/7 16:35:見出しを使うように修正

11/7 17:25:タイトルを変更、説明を追加

2010-07-10

HT-03A froyo

dwang厨が無謀にもfroyoを入れてみる記録のページ。

名前リンクされると嫌なのでここに書いてみる。

結局CM6-RC1+yay-gapps で落着きそうな雰囲気。

まとめ (20100711 18:30 完了)

メモ
  • voldn + poweron → fastboot
  • home + poweron → recoverymode
初期状態

dwang-1.17.1

手順

eMonster用に使ってた sandisk 2GB (メモ)

確認されているROM

7/9 にリリースされているもの

  • defcon CM6 FroYo (Test9)
  • CM6-DS-Nightly (0709)
  • SPF Connection (2.7)

ext partition 要対応? とおもったら仏語じゃねーか

Wifi NG

  • Xtreme Froyo v1.9.5

@kenmood

Wifi OK

  • http://androidspin.com/2010/07/06/rom-kenmood-e-xtreme-froyo-v1-9-4-with-working-wifi-camera-bluetooth-3dgallery-for-t-mobile-g1mt3g/
1.5に戻す

どっかから落した20090801-docomo-ht-03a.rar のうち、boot, cache, data, system のみをnandroidで復旧してみる。nandroid.md5復元も忘れずに。

Xtreme Froyo v1.9.5 try
  • 日本語fontは後でupdate.zip で入れることとする (autosignとかしらないけど、あとで調べりゃなんとかなんだろ)
  • SPL 1.33.2005 ← 入ってた。
  • Latest Radio highly recommended (どうしたものか → だめなら後で考える)

手順

  1. done: ROM落せ http://tinyurl.com/extreme-froyo-1-9-5
  2. nope: (ステップ番号予約)
  3. done: black theme 落せ http://tinyurl.com/froyo-blacktheme-v2
  4. done: sdにコピれ
  5. done: full wipe
  6. done: flash rom → ついでに root.zip (以下参照) もここで焼いてしまう。suが入ってるだけだし。
  7. skip: flash a2sd + cc patch → 2ch "root13":770 によると既に適用済みらしい
  8. skip: flash froyo blacktheme → blackは面倒そうなのでやめる
  9. reboot → すげー時間かかるんですけど、ダメか。
以後実行せず
  1. ADWの設定をこうしろ → どうでもいいがな
  2. sparepartsの設定をこうしろ (launcher in memory)
  3. show clockとかいろいろ (blacktheme場合は時刻の色)
  4. notification colorの設定 (black theme場合)
  5. google mapをmarketからdownload
  6. reboot
  7. 警告: 他のkernelとかgappsをinstallすることのないように → kernelはまだしも、gappsはなんでだろ
  8. and ENJOY!

追加手順:

  1. root permissionの修正はこれを焼く: http://www.mrcellphoneunlocker.com/android/root.zip
メモ
  • rebootに必要なのは「信じる心」?
  • boot animation が重くなったり止まったりするのは何故なんだぜ
  • 最終的に、boot できずあきらめてみる。
他のromを試す
  • CM5.0.8 (Eclair) → ok (ちゃんと焼けるか念のためテストした)
  • SPF Connection 2.8 → bootはするけどfontが豆腐、あと突然死

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をマウントしてことなきを得る。

SPF Connection 2.8

2010-07-11 追記

2chでも報告されているとおり、wlanが使えない。あと細かい話だけど、live wallpaperが使えない気がする。メモリが足りないだけかもしれないけど。

marketが死にまくる (acoreが死ぬ)。ほかにも死にまくるけど、何故かはよくわからない。とりあえず体験はできるけど、まだ常用には至らないかも。

(安定している、と言っている人もいる)

SPF Connection 2.8.1

2010-07-11 追記

zip落してきて上書きinstallしてみた。なんか日本語fontが消されたんだけど(ぶー!)

ちなみに日本語fontはM+を利用してます。

時間つかった限りでは、他人にお勧めできるほどじゃないけど何とか使いものになるかも。dwang環境はnandroidでしかバックアップしていないので、手作業でアプリなどは手作業で復帰する予定。

CM6-RC1

(2010-07-11 午後5時追記)

どうもSPF Connectionが安定しないのと、ベースがCM6ということで、まずはベースに近いほうが良いだろうと

CM6-RC1を焼いてみる(この項続く)

http://www.cyanogenmod.com/home/cyanogenmod-6-0-0-rc1

Marketが極めて不安定な模様。エラー

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

すぐ直りそうではあるけど。

Market落ち対策:
  • yay-gapps を普通のgappsの上から焼いた時はMarket落ち頻発

(エラー内容から察するに、installされたapkの記録をgoogle accountに書き込めない)

  • まっさらの1.5からCM6-RC1, yay-gapps を焼いた状態ではMarket落ち発生せず

c.f. http://forum.xda-developers.com/showpost.php?p=7139560&postcount=109

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