はてなキーワード: printとは
この説明は、ダニングクルーガー効果に対する批判的な見方を数学的に表現しようとしたものです。以下にその内容を解説します:
この説明では、ダニングクルーガー効果を以下の変数で表現しています:
命題「A~Oであることを証明せよ」は、実際の評価(A)と過大評価(O)に相関関係があることを示そうとしています。
証明では、O(S,A)という関数を定義し、OがAの関数であるため、自動的にAとOに相関関係が生じると主張しています。
この説明は、ダニングクルーガー効果が単なる数学的な関係性から生じる現象であり、実際の心理学的な意味を持たないという批判を示唆しています。
具体的には:
2. 実際の能力や自己評価の内容に関わらず、統計的に成立してしまう
3. これは心理学的な現象ではなく、単なる「数字のマジック」である
さらに、平均以上バイアス(多くの人が自分を平均以上だと考える傾向)を加えることで、この相関関係がより強くなると述べています。具体的には、100点満点の評価で自己評価(S)を60点程度に設定し、実際の評価(A)をランダムに与えることで、A~Oにより強い相関が得られるとしています。
この説明は、ダニングクルーガー効果が実際の心理学的現象ではなく、単に数学的な関係性や統計的な偏りから生じる見かけ上の効果に過ぎないという批判的な見方を示しています。
import numpy as np import matplotlib.pyplot as plt from scipy import stats def simulate_correlation(n_samples=10000): # シナリオ1: AとSが一様乱数(0〜100)の場合 A1 = np.random.uniform(0, 100, n_samples) S1 = np.random.uniform(0, 100, n_samples) O1 = S1 - A1 # シナリオ2: Aが一様乱数(0〜100)、Sが60周辺の正規分布の場合 A2 = np.random.uniform(0, 100, n_samples) S2 = np.random.normal(60, 10, n_samples) S2 = np.clip(S2, 0, 100) # 0〜100の範囲に制限 O2 = S2 - A2 # 相関係数の計算 (AとOの間) corr1 = stats.pearsonr(A1, O1)[0] corr2 = stats.pearsonr(A2, O2)[0] # 結果のプロット fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5)) ax1.scatter(A1, O1, alpha=0.1) ax1.set_title(f'シナリオ1: 相関係数 = {corr1:.3f}') ax1.set_xlabel('実際の能力 (A)') ax1.set_ylabel('過大評価 (O)') ax2.scatter(A2, O2, alpha=0.1) ax2.set_title(f'シナリオ2: 相関係数 = {corr2:.3f}') ax2.set_xlabel('実際の能力 (A)') ax2.set_ylabel('過大評価 (O)') plt.tight_layout() plt.show() return corr1, corr2 # シミュレーションの実行 corr1, corr2 = simulate_correlation() print(f"シナリオ1の相関係数 (AとO): {corr1:.3f}") print(f"シナリオ2の相関係数 (AとO): {corr2:.3f}")
コードはこんな感じ
def cartesian_product(**kwargs): def recursive_product(sets, current_index=0, current_combination=[]): if current_index == len(sets): yield tuple(current_combination) else: for item in sets[current_index]: yield from recursive_product(sets, current_index + 1, current_combination + [item]) sets = list(kwargs.values()) return list(recursive_product(sets)) # 使用例 result = cartesian_product(set1=[1, 2], set2=['a', 'b'], set3=[True, False]) print(result)
で・・・できたけど木の組み立てがしんどすぎるー
class TreeNode:
def __init__(self, name, attributes=None):
self.name = name
self.attributes = attributes or {}
self.children = []
def add_child(self, child_node):
self.children.append(child_node)
def display(self, level=0):
indent = " " * level
print(f"{indent}{self.name} {self.attributes}")
for child in self.children:
child.display(level + 1)
def has_dependency(self):
# ルートノードや属性を持たないノードは依存関係を判定しない
if not self.children:
return False
for child in self.children:
# 子ノードがBusinessHourかScheduleかをチェック
if "start_at" in child.attributes and "end_at" in child.attributes:
child_start = child.attributes["start_at"]
child_end = child.attributes["end_at"]
# 現在のノードがBusinessHourで、子がScheduleの場合
if "start_at" in self.attributes and "end_at" in self.attributes:
self_start = self.attributes["start_at"]
self_end = self.attributes["end_at"]
if self_start <= child_start and self_end >= child_end:
print(f"{child.name} (start_at: {child_start}, end_at: {child_end}, room_id: {child.attributes['room_id']}) is dependent on {self.name} (start_at: {self_start}, end_at: {self_end})")
else:
print(f"{child.name} (start_at: {child_start}, end_at: {child_end}, room_id: {child.attributes['room_id']}) is NOT dependent on {self.name} (start_at: {self_start}, end_at: {self_end})")
# 現在のノードがRoomで、子がScheduleの場合
elif self.name.startswith("Room"):
print(f"{child.name} (start_at: {child_start}, end_at: {child_end}, room_id: {child.attributes['room_id']}) is dependent on Room {self.name[-1]}")
else:
child.has_dependency()
# 子ノードが属性を持たない場合、再帰的に依存関係をチェック
else:
child.has_dependency()
# ノードの作成
root = TreeNode("Root")
office_node = TreeNode("Office")
# Roomノードの作成
room1_node = TreeNode("Room1")
room2_node = TreeNode("Room2")
# BusinessHourノードの作成
business_hour1_node = TreeNode("BusinessHour1", {"start_at": 9, "end_at": 12})
business_hour2_node = TreeNode("BusinessHour2", {"start_at": 13, "end_at": 17})
# Scheduleノードの作成
schedule1_node = TreeNode("Schedule1", {"start_at": 10, "end_at": 11, "room_id": 1})
schedule2_node = TreeNode("Schedule2", {"start_at": 14, "end_at": 15, "room_id": 1})
schedule3_node = TreeNode("Schedule3", {"start_at": 10, "end_at": 11, "room_id": 2})
schedule4_node = TreeNode("Schedule4", {"start_at": 14, "end_at": 15, "room_id": 2})
# 木構造の構築
root.add_child(office_node)
office_node.add_child(room1_node)
office_node.add_child(room2_node)
office_node.add_child(business_hour1_node)
office_node.add_child(business_hour2_node)
# Room1にSchedule1, Schedule2を追加
room1_node.add_child(schedule1_node)
room1_node.add_child(schedule2_node)
# Room2にSchedule3, Schedule4を追加
room2_node.add_child(schedule3_node)
room2_node.add_child(schedule4_node)
# BusinessHour1にSchedule1, Schedule3を追加
business_hour1_node.add_child(schedule1_node)
business_hour1_node.add_child(schedule3_node)
# BusinessHour2にSchedule2, Schedule4を追加
business_hour2_node.add_child(schedule2_node)
business_hour2_node.add_child(schedule4_node)
# 木構造の表示
root.display()
# 依存関係のチェック
office_node.has_dependency()
room1_node.has_dependency()
room2_node.has_dependency()
business_hour1_node.has_dependency()
business_hour2_node.has_dependency()
Root {}
Office {}
Room1 {}
Schedule1 {'start_at': 10, 'end_at': 11, 'room_id': 1}
Schedule2 {'start_at': 14, 'end_at': 15, 'room_id': 1}
Room2 {}
Schedule3 {'start_at': 10, 'end_at': 11, 'room_id': 2}
Schedule4 {'start_at': 14, 'end_at': 15, 'room_id': 2}
BusinessHour1 {'start_at': 9, 'end_at': 12}
Schedule1 {'start_at': 10, 'end_at': 11, 'room_id': 1}
Schedule3 {'start_at': 10, 'end_at': 11, 'room_id': 2}
BusinessHour2 {'start_at': 13, 'end_at': 17}
Schedule2 {'start_at': 14, 'end_at': 15, 'room_id': 1}
Schedule4 {'start_at': 14, 'end_at': 15, 'room_id': 2}
Schedule1 (start_at: 10, end_at: 11, room_id: 1) is dependent on Room 1
Schedule2 (start_at: 14, end_at: 15, room_id: 1) is dependent on Room 1
Schedule3 (start_at: 10, end_at: 11, room_id: 2) is dependent on Room 2
Schedule4 (start_at: 14, end_at: 15, room_id: 2) is dependent on Room 2
Schedule1 (start_at: 10, end_at: 11, room_id: 1) is dependent on BusinessHour1 (start_at: 9, end_at: 12)
Schedule3 (start_at: 10, end_at: 11, room_id: 2) is dependent on BusinessHour1 (start_at: 9, end_at: 12)
Schedule2 (start_at: 14, end_at: 15, room_id: 1) is dependent on BusinessHour2 (start_at: 13, end_at: 17)
Schedule4 (start_at: 14, end_at: 15, room_id: 2) is dependent on BusinessHour2 (start_at: 13, end_at: 17)
Schedule1 (start_at: 10, end_at: 11, room_id: 1) is dependent on Room 1
Schedule2 (start_at: 14, end_at: 15, room_id: 1) is dependent on Room 1
Schedule3 (start_at: 10, end_at: 11, room_id: 2) is dependent on Room 2
Schedule4 (start_at: 14, end_at: 15, room_id: 2) is dependent on Room 2
Schedule1 (start_at: 10, end_at: 11, room_id: 1) is dependent on BusinessHour1 (start_at: 9, end_at: 12)
Schedule3 (start_at: 10, end_at: 11, room_id: 2) is dependent on BusinessHour1 (start_at: 9, end_at: 12)
Schedule2 (start_at: 14, end_at: 15, room_id: 1) is dependent on BusinessHour2 (start_at: 13, end_at: 17)
Schedule4 (start_at: 14, end_at: 15, room_id: 2) is dependent on BusinessHour2 (start_at: 13, end_at: 17)
class TreeNode:
def __init__(self, name, attributes=None):
self.name = name
self.attributes = attributes or {}
self.children = []
def add_child(self, child_node):
self.children.append(child_node)
def display(self, level=0):
indent = " " * level
print(f"{indent}{self.name} {self.attributes}")
for child in self.children:
child.display(level + 1)
def has_dependency(self):
# ルートノードや属性を持たないノードは依存関係を判定しない
if not self.children or "start" not in self.attributes or "end" not in self.attributes:
return False
# Aノードのstartとendを取得
start = self.attributes["start"]
end = self.attributes["end"]
# すべての子ノード(Bノード)に対して依存関係をチェック
for child in self.children:
if "position" in child.attributes:
position = child.attributes["position"]
if start <= position <= end:
print(f"{child.name} (position: {position}) is dependent on {self.name} (start: {start}, end: {end})")
return True
else:
print(f"{child.name} (position: {position}) is NOT dependent on {self.name} (start: {start}, end: {end})")
return False
# ノードの作成
root = TreeNode("Root")
a_node = TreeNode("A", {"start": 10, "end": 20})
b1_node = TreeNode("B1", {"position": 15})
b2_node = TreeNode("B2", {"position": 25})
# 木構造の構築
root.add_child(a_node)
a_node.add_child(b1_node)
a_node.add_child(b2_node)
# 木構造の表示
root.display()
# 依存関係のチェック
a_node.has_dependency()
こうかー
Ωを仮に100次元の実ベクトル空間R^100とする。各次元は特定の神経活動パターンに対応する。
Ω = {ω ∈ R^100 | ||ω||₂ ≤ 1}
ここで||・||₂はユークリッドノルムである。τは標準的なユークリッド位相とする。
O : Ω → Ω
O(ω) = Aω / ||Aω||₂
ここでAは100×100の実行列で、||Aω||₂ ≠ 0とする。
S[ω] = -∫Ω p(x) log p(x) dx
S[O(ω)] ≤ S[ω] + log(det(AA^T))
dω/dt = F(ω) + G(ω, O)
F(ω) = -αω + β tanh(Wω)
G(ω, O) = γ(O(ω) - ω)
ここでα, β, γは正の定数、Wは100×100の重み行列、tanhは要素ごとの双曲線正接関数である。
g_ij(ω) = E[(∂log p(x|ω)/∂ω_i)(∂log p(x|ω)/∂ω_j)]
ここでE[・]は期待値、p(x|ω)は状態ωでの条件付き確率密度関数である。
ψ(x) = √(p(x)) exp(iθ(x))
Φ[ω] = min_π (I(X;Y) - I(X_π;Y_π))
ここでI(X;Y)は相互情報量、πは可能な分割、X_πとY_πは分割後の変数である。
勾配降下法を用いて定式化する:
ω_new = ω_old - η ∇L(ω_old, O)
L(ω, O) = ||O(ω) - ω_target||₂²
G = (V, E)
V = {v_1, ..., v_100}
E ⊆ V × V
各頂点v_iはω_iに対応し、辺(v_i, v_j)はω_iからω_jへの因果関係を表す。
このモデルはPythonとNumPyを用いて以下のように実装できる:
import numpy as np from scipy.stats import entropy from scipy.integrate import odeint import matplotlib.pyplot as plt class ConsciousnessModel: def __init__(self, dim=100): self.dim = dim self.omega = np.random.rand(dim) self.omega /= np.linalg.norm(self.omega) self.A = np.random.rand(dim, dim) self.W = np.random.rand(dim, dim) self.alpha = 0.1 self.beta = 1.0 self.gamma = 0.5 self.eta = 0.01 def observe(self, omega): result = self.A @ omega return result / np.linalg.norm(result) def entropy(self, omega): p = np.abs(omega) / np.sum(np.abs(omega)) return entropy(p) def dynamics(self, omega, t): F = -self.alpha * omega + self.beta * np.tanh(self.W @ omega) G = self.gamma * (self.observe(omega) - omega) return F + G def update(self, target): def loss(o): return np.linalg.norm(self.observe(o) - target)**2 grad = np.zeros_like(self.omega) epsilon = 1e-8 for i in range(self.dim): e = np.zeros(self.dim) e[i] = epsilon grad[i] = (loss(self.omega + e) - loss(self.omega - e)) / (2 * epsilon) self.omega -= self.eta * grad self.omega /= np.linalg.norm(self.omega) def integrated_information(self, omega): def mutual_info(x, y): p_x = np.abs(x) / np.sum(np.abs(x)) p_y = np.abs(y) / np.sum(np.abs(y)) p_xy = np.abs(np.concatenate([x, y])) / np.sum(np.abs(np.concatenate([x, y]))) return entropy(p_x) + entropy(p_y) - entropy(p_xy) total_info = mutual_info(omega[:self.dim//2], omega[self.dim//2:]) min_info = float('inf') for i in range(1, self.dim): partition_info = mutual_info(omega[:i], omega[i:]) min_info = min(min_info, partition_info) return total_info - min_info def causal_structure(self): threshold = 0.1 return (np.abs(self.W) > threshold).astype(int) def run_simulation(self, steps=1000, dt=0.01): t = np.linspace(0, steps*dt, steps) solution = odeint(self.dynamics, self.omega, t) self.omega = solution[-1] self.omega /= np.linalg.norm(self.omega) return solution def quantum_state(self): phase = np.random.rand(self.dim) * 2 * np.pi return np.sqrt(np.abs(self.omega)) * np.exp(1j * phase) # モデルの使用例 model = ConsciousnessModel(dim=100) # シミュレーション実行 trajectory = model.run_simulation(steps=10000, dt=0.01) # 最終状態の表示 print("Final state:", model.omega) # エントロピーの計算 print("Entropy:", model.entropy(model.omega)) # 統合情報量の計算 phi = model.integrated_information(model.omega) print("Integrated Information:", phi) # 因果構造の取得 causal_matrix = model.causal_structure() print("Causal Structure:") print(causal_matrix) # 観測の実行 observed_state = model.observe(model.omega) print("Observed state:", observed_state) # 学習の実行 target_state = np.random.rand(model.dim) target_state /= np.linalg.norm(target_state) model.update(target_state) print("Updated state:", model.omega) # 量子状態の生成 quantum_state = model.quantum_state() print("Quantum state:", quantum_state) # 時間発展の可視化 plt.figure(figsize=(12, 6)) plt.plot(trajectory[:, :5]) # 最初の5次元のみプロット plt.title("Time Evolution of Consciousness State") plt.xlabel("Time Step") plt.ylabel("State Value") plt.legend([f"Dim {i+1}" for i in range(5)]) plt.show()
import os
# ファイルが存在するか確認し、存在しない場合は初期値を設定
if not os.path.exists(file_path):
with open(file_path, 'w') as file:
# 現在の年数を読み込み
with open(file_path, 'r') as file:
year_count = int(file.read())
# メッセージを表示
print(f"{year_count}年間で最も暑い夏")
with open(file_path, 'w') as file:
file.write(str(year_count + 1))
インデントつけれね
注意: 以下のデータは実際の統計データではなく、分析の目的で作成した仮想のデータです。実際の分析には、信頼できる公的機関からの正確なデータを使用する必要があります。
年 | ドル円為替レート(年平均) | 実質GDP成長率(%) | 有効求人倍率 |
------ | --------------------------- | ------------------- | -------------- |
1980 | 226.74 | 2.8 | 0.75 |
1985 | 238.54 | 6.3 | 0.68 |
1990 | 144.79 | 5.6 | 1.40 |
1995 | 94.06 | 2.7 | 0.63 |
2000 | 107.77 | 2.8 | 0.59 |
2005 | 110.22 | 1.7 | 0.95 |
2010 | 87.78 | 4.2 | 0.52 |
2015 | 121.04 | 1.6 | 1.20 |
2020 | 106.77 | -4.5 | 1.18 |
2023 | 140.00 | 1.9 | 1.30 |
## 2. 散布図の作成
```python
import matplotlib.pyplot as plt
# データ
exchange_rate = [226.74, 238.54, 144.79, 94.06, 107.77, 110.22, 87.78, 121.04, 106.77, 140.00]
gdp_growth = [2.8, 6.3, 5.6, 2.7, 2.8, 1.7, 4.2, 1.6, -4.5, 1.9]
job_ratio = [0.75, 0.68, 1.40, 0.63, 0.59, 0.95, 0.52, 1.20, 1.18, 1.30]
# GDP成長率との散布図
plt.subplot(121)
plt.scatter(exchange_rate, gdp_growth)
# 有効求人倍率との散布図
plt.subplot(122)
plt.scatter(exchange_rate, job_ratio)
plt.tight_layout()
plt.show()
```
## 3. 相関係数の算出
```python
correlation_gdp = np.corrcoef(exchange_rate, gdp_growth)[0, 1]
correlation_job = np.corrcoef(exchange_rate, job_ratio)[0, 1]
print(f"為替レートとGDP成長率の相関係数: {correlation_gdp:.2f}")
print(f"為替レートと有効求人倍率の相関係数: {correlation_job:.2f}")
```
## 4. 分析結果
## 5. 考察
- 弱い正の相関(0.32)が見られます。
- これは、円安傾向(為替レートの上昇)が若干のGDP成長率の上昇と関連している可能性を示唆しています。
- ただし、相関は弱いため、他の要因も大きく影響していると考えられます。
- 非常に弱い負の相関(-0.15)が見られます。
- この結果からは、為替レートと有効求人倍率の間に明確な関係性を見出すことは難しいです。
- 雇用市場は為替レート以外の多くの要因に影響されている可能性が高いです。
3. 全体的な考察:
- 為替レートと経済指標の間に強い直接的な関係性は見られませんでした。
- 経済は複雑なシステムであり、為替レート以外にも多くの要因が影響しています。
- 時期によって関係性が変化している可能性もあるため、より詳細な時系列分析が有用かもしれません。
- また、産業別の分析や、輸出入への影響など、より細分化された視点での分析も考慮する価値があります。
4. 注意点:
- このデータセットは限られたサンプル数であるため、結果の解釈には慎重になる必要があります。
- 実際の分析では、より長期かつ詳細なデータを用い、統計的有意性も考慮する必要があります。
## 6. 今後の分析案
from decimal import Decimal, getcontext
getcontext().prec = 10
a = Decimal('0.1')
b = Decimal('0.1')
c = Decimal('0.1')
result = a + b + c
しろって!
import requests import json from urllib.parse import quote def fetch_bookmarks(url): try: # URLをエスケープ escaped_url = quote(url, safe="") api_url = f"https://b.hatena.ne.jp/entry/json/?url={escaped_url}" response = requests.get(api_url) response.raise_for_status() try: return response.json() except json.decoder.JSONDecodeError as e: print(f"Error decoding JSON from {api_url}: {e}") print("Response content:", response.text) return [] except requests.exceptions.RequestException as e: print(f"Error fetching bookmarks from {api_url}: {e}") return [] def find_common_bookmarks(bookmarks1, bookmarks2, url1, url2): common_users = set(bm["user"] for bm in bookmarks1 if bm["comment"]) & set(bm["user"] for bm in bookmarks2 if bm["comment"]) common_bookmarks = [] for user in common_users: comments = [] for bm in bookmarks1: if bm["user"] == user and bm["comment"]: comments.append({"url": url1, "comment": bm["comment"], "timestamp": bm["timestamp"]}) break for bm in bookmarks2: if bm["user"] == user and bm["comment"]: comments.append({"url": url2, "comment": bm["comment"], "timestamp": bm["timestamp"]}) break if len(comments) == 2: common_bookmarks.append({"user": user, "comments": comments}) return common_bookmarks if __name__ == "__main__": url1 = "https://news.yahoo.co.jp/articles/f9966c4ccc374fc88babbb50175a9ea844c99638" url2 = "https://www.asahi.com/articles/ASN6K7F64N6KUJHB00L.html" data1 = fetch_bookmarks(url1) data2 = fetch_bookmarks(url2) common_bookmarks = find_common_bookmarks(data1["bookmarks"], data2["bookmarks"], url1, url2) print(json.dumps(common_bookmarks, indent=2, ensure_ascii=False))
url1, url2のところを対象としたいものに変えれば使えるよ
バグあったら直して使ってね
ããŒã´ã³ã¹ã¬ã€ã¤ãŒã®éèšåŒãã·ããŽéã㌠| ã¡ã¿ãã¥ãŒã«ãžããã
ã¡ã¿ãã¥ãŒã«ãžããã
NO IMAGE ããŒã´ã³ã¹ã¬ã€ã¤ãŒã®éèšåŒãã·ããŽéããŒ
æ¯æ¥ã€ã«ã¯ã¬ã¯ã³ããªã«ãšã¢ã³ãã£ã¯ã±ãã®æ¯ã«åã£ã¦ãã€ãŸã€ã赎ãåã®èªç±ãªäž»äŸåž
ä»ã®çŸ¥ããªããŸãã
éããŽå³ãŸã§ããã³ã¹ã«ã¹ã¬ã€ã¤ãŒã¢ã¯ã·ã§ã³ãããã©
ã©ãããªã€ã³ããããã¯ãåºå®... ã§ã¯ãªããããããã§ãã
èŠãã¹ã¯ã©ã³...
äžèŸŒæ¯éããã®è¬ç€Ÿ...
ã«ã€ãããŒãããªãŒã«ãã¯ã¶ã¿å€ã®ããã¬ã³ãžã³ã°ã¬ãªãŒãå®...
ã¡ããå€æŽŸããã®ãŸã
掞å¥ããæè¿ã®æ³¨ç®èŠåæž ãŒãã§åž°äžŒ
[ããã®ã»ã³ãšããªã¼ã]éãæã®åã¯ãâçœé?¥ã®ç矫ç]
( 13) 2024/02/05 ã€ããã¡æž«ã...
[ããã®ã»ã³ãšããªã¼ã]éãæã®åã¯ãâçœé?¥ã®ç矫ç]
( 12) 2024/01/29 æå°ã®äžžãã€æ¯ææãã...
[ããã®ã»ã³ãšããªã¼ã]éãæã®åã¯ãâçœé?¥ã®ç矫ç]
( 11) 2024/01/22 ãã®åžçŸ³ãæ£ãç©ããã¤ã...
ããã¯ããããã©ã®ããã§ããå°ãåã®ã©ã€ããŒã
[====] ããã¯ããããããŽãããŠãžãŽ ãã³ãã«ãŒã
ãµã€ããµãŒãã®éå§ãèžããããªã£ãã®ã§ãããŸã§ãã¹ã«ã€ããŽããã€ããªããïŒ
from ã¢ã«ã¡ã¯ãŒããããã«çŽ°ãŠãããªãŒãã£ã·ã§ã³
ã¡ã¿ãã¥ãŒã¹ã¿ãã
ã¹ããŒã£ãŒ by ã¯ã³ã¬ã¤ããŒã¡ã³ã 掞è¯åºææžãŒã«ãã¶ãã ïŒ24/04/11
ã·ããŽãã³ã¹ã¬ã€ã¤ãŒãããã§ãã331,596&ãšã§ãŒã1,483&
åæžièŠãšãžãã§æ¥çŽãã¹ãã®ã«
Press arrowkeys to scroll long documents
Instructions: ? Add bookmark: V Print: p Go: g Quit: q Help: H
[Exit: q ]
小3の先日のテストに出た問題の一つ。大学受験でも解けない学生がいっぱいいるだろうし、数学好きを除き多くの大人は解けないだろう。 - Togetter
https://togetter.com/li/2332954
let box = new Array(30).fill(0); for(let i = 1; i <= 30; i++) { for(let j = i; j <= 30; j += i) { box[j - 1]++; } } print("1. ", box.filter(v => v === 2).length); print("2. ", box.filter(v => !(v % 2)).length);
1. 10
2. 25
この日記の内容は、会社の後輩から「最近エクセルマクロを勉強し始めて(キラキラ)」という話を聞いて、先輩ムーブをかますために話した内容になります。
とにかくこれから説明する「計算用シート」が憎くて憎くてたまらず、ちょっと引かれるほど熱弁してしまいました。
ただ、他の方がどうされているのかや、逆に「計算用シート」を愛用する方の意見も聞きたくなり、増田に書いてみました。
エクセルマクロのお作法とか書きましたが、要するにエクセルマクロで「計算用シート」って色々な意味でよくないよね、という話をしたいです。
3行でまとめます。
〇 エクセルシートはユーザーインターフェース(インプット)か出力結果(アウトプット)のためのものとすべき
〇 データ加工をする場合には、原則配列や辞書型配列(連想配列)に格納して加工を行い、最後の結果だけシートに出力するべき
〇 何事にも例外はある。
エクセルマクロにも色々あると思いますが、今回は下記を想定します。
日付や人物名などを入力し、データベースや別のエクセルファイル、別のシートから取得したデータを入力された値を基に加工し、加工後のデータをシートに出力する
この場合、入力欄があり編集可能なシートがユーザーインターフェース、最終的に加工されたデータが出力されるシートが出力結果です。
(もちろん、ユーザーインターフェースの別の欄(セル)に出力する場合もあるし、その場合はユーザーインターフェースと出力結果が一体のものとみなします。)
また、データ用シートは同じエクセルファイル内に基となるデータが含まれる場合を想定します。
(これ自体が非推奨で、SQLデータベースかせめてAccessを使え、という意見はありますがそれは別にして…)
ではここで定義する計算用シートとはなにかというと、文字通り計算を行うためのシートです。
1.元となるcsvファイルをエクセルに読み出してシートに格納
2.そのデータは日付が数値型になっているので、日付(数値型)の入った列を文字列に変換した日付(文字列型)列を新たに作成
これは極端な例ですが、とにかく変数や配列を定義せず(あるいはエクセルのセルオブジェクトを変数のように扱い)、エクセルに値を入力し、それを直接加工することで目的となるデータ加工をしたり、様々な処理をします。
なんかこんな感じの処理をしているエクセルマクロ、どこの会社でも腐るほどあるんじゃないでしょうか。
ある程度マクロに慣れた気の利く人なら、このシートはロックや非表示にして、ユーザーから触れないようにするでしょう。
・・・これ、やめたほうが良くないですか?。
ある程度詳しい人なら同意してくれると思いますが、このやり方でダメな理由はいっぱいあります。
後で説明する配列や辞書型配列(連想配列)と比べると格段に処理が遅いです。
ちょっと詳しい人が知っている「画面更新の非表示」を駆使しても、配列を使った処理からみれば止まったハエです。
いったんエクセルシートにデータを格納して加工しているので、コードとエクセルシートを両方見る必要があり、とても読みにくいです。
変数として命名されていないのも致命的で、処理の意図が余計に分からなくなります。
計算用シートを事前に用意して、別のセルに関数を格納しておき、マクロと関数を使ってデータ加工をするものも見たことがあります。
あまり知られていませんが、セルの最大文字数は32,767 文字です。
セルの最大文字数を超えると自動的に隣のセルに値が入り、シートが滅茶苦茶になります。
他にもエクセルの数値を丸める自動変換の仕様とか文字列→日付の自動変換とか、いくつものバグに苦しめられます。
できる人だと、いちいち最大文字数が多い場合の処理を書いたり自動変換機能を殺したりしてくれますが、そんなことに手間をかけているから日本のGDPは上がらないんだと思います。
他にも、データが大きくなると処理が重くなり不安定になる、計算用シートを人が触ってしまうリスクがある、などいくらでも理由は上げられます。
(逆に利点は、目の前でガチャガチャ動いてスーパーハッカーになった気分になれるくらいしか思いつかない・・・)
配列を使いましょう。
配列とは何ぞや、という人はググってください。
配列にデータを入れて、データ加工は配列や変数に対して行い、一番最後の出力だけセルに値を格納する。
個人的にオススメしたいのは辞書型配列(連想配列)で、うまく使うとデータの管理が簡単になり、処理も爆速になります。
(参考)【VBA】大量データから高速で値を検索【Dictionaryを使う】
csvファイルもなまじエクセルで開けるだけに別のブックやシートで開きがちですが、これは悪魔のささやきです。
直接ファイルを読み出してLine InputやSplitで配列に格納しましょう。
エクセルとして開くやり方はコード書くのは簡単でも、実行時間に天と地ほどの差が出ます。エクセル開くと処理もめちゃ不安定です。
(参考)Excel VBAでCSVオープンするときのパフォーマンス比較
いや、冒頭のマクロを書く人の気持ちも分かるつもりです。自分もコードを書き始めたころは全部シート上で操作していました。
冒頭のマクロのほうが直感的なんですよね。自分が手で書くことをマクロにやらせる、というマクロ本来の趣旨にはあっていますし。
途中の計算過程もすべて目の前で展開されるから分かりやすいです。
ただ、それではダメなんです。。。処理は遅いし挙動は不安定だし後で改修・保守する人が死にます。
あと、エクセルシートやセルは当然エクセルにしかないので、エクセルマクロ(VBA)から他の言語に移れなくなります。
自分もエクセルマクロの里の出なので、計算用シート脱却には苦労しましたが、苦労して会得した配列や辞書型配列(連想配列)のスキルはそのまま他の言語に活かすことができました。
配列の中身を見る方法は別にある(ローカルウィンドウやDebug.printを使うなど)ので、リハビリに取り組んでほしいです。
(参考)VBA デバッグの仕方
計算用シートを許容できる、使うべきケースもあると思います。。
個人的には、
(最後のは、なんでも自分で確認しないと気が済まない上司の発注で、意味不明と思いましたしたがしぶしぶやりました。)
この場合、インプットのエクセルシートに直接加工するのは論外なので、計算用(加工用)のシートを用意してそこで操作を行うことは必要だと思います。
他にも、こういうときは「計算用シート」があったほうが良い、という状況があれば教えてもらえると嬉しいです。
そもそもツッコミとして、「データ加工するならエクセルマクロを使わずにpythonとかRとかもっとまともな言語使えよ」という言葉が来そうな気がします。
ただ、個人的にはエクセルマクロ(VBA)は大好きですし、初心者にもおすすめしたいです。
自分のような非エンジニアだと、セキュリティの関係などでPythonの開発環境とかすごく用意しにくいんですよね。
(あと、コマンドプロンプトの真っ黒な画面が怖かった)
その点エクセルマクロは、開発環境の用意はプロパティでチェック項目を一つオンにするだけだし、入門書がたくさんあるし、セルの挙動を追えば視覚的にプログラムを理解できるし、初心者に優しいです。
(そのやさしさが上述したとおり悪魔の罠なわけですが。)
最初は計算用シートに頼ってでもエクセルマクロからプログラミングを始めて、本格的なデータ加工をし始めたあたりで計算用シートという諸悪の根源から脱却する。
さらに本格的なデータ処理を行うために、PythonやRなど別の言語を習得したり、エクセルからSQLデータベースやACCESSなどに切り替えていく、というプロセスがいいのではと個人的に思います。
import json import urllib.request # True にするとユーザー名を隠す hide_user = False # 以下を書き換える。sys.argv 使ってもいいんだけど url1 = "https://www.cygames.co.jp/news/id-23172/" url2 = "https://mtg60.com/archives/palworlddoujinsi.html" def get_bookmarks(url: str): req = urllib.request.Request(f"https://b.hatena.ne.jp/entry/json/{url}") with urllib.request.urlopen(req) as res: dict = json.loads(res.read()) user_comments = {} for bookmark in dict["bookmarks"]: if bookmark["comment"]: user_comments[bookmark["user"]] = bookmark["comment"] return user_comments b1 = get_bookmarks(url1) b2 = get_bookmarks(url2) common = set(b1.keys()).intersection(b2.keys()) print(f"[1] {url1}") print(f"[2] {url2}") print() for user in sorted(common): if hide_user: print(user[0] + "*" * (len(user) - 1)) else: print(user) print(f"[1] {b1[user]}") print(f"[2] {b2[user]}") print()
こんます~
2023年も残すところわずかとなりましたが、皆様方におかれましてはいかがお過ごしでしょうか。
一年間の振り返りなどはされましたでしょうか。
2423件の日記を綴っており、
頂いた総ブクマ数は1893、総トラバ数は1060となりました。
本年も大変お世話になりました。
最期に、ポンコツの私がChatGPTの手となり足となり作成した増田集計コードを掲載します。
各日記のURL、タイトル、投稿日時、文字数、被ブクマ数、被トラバ数を取得しCSVファイルに出力するものです。
お暇な方はお使いください。
それではよいお年をお迎えください。
import requests from bs4 import BeautifulSoup import time import csv import os import re # ログインURL login_url = 'https://hatelabo.jp/login' # ログイン情報 login_data = { 'key': 'あなたのユーザ名またはメールアドレス', 'password': 'あなたのパスワード', 'mode': 'enter' } user_name = 'あなたのユーザ名' # User-Agent ヘッダー(例:Google Chrome) headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3' } # セッションを開始 session = requests.Session() # ログイン response = session.post(login_url, data=login_data, headers=headers) print('login',response.status_code) # 集計データ item = { 'url': '', # URL 'title': '', # タイトル 'datetime': '', # 投稿日時 'characters': '', # 文字数 'bookmark': '', # 被ブクマ数 'trackback': '', # 被トラバ数 } # CSVファイル名 output_file = 'masuda_output.csv' # CSVファイルが存在しない場合はヘッダーを書き込む if not os.path.exists(output_file): with open(output_file, 'w', newline='', encoding='utf-8') as file: writer = csv.DictWriter(file, fieldnames=item.keys()) writer.writeheader() # 集計 page_start = 1 page_end = 3 for i in range(page_start, page_end+1): # 待機 time.sleep(3) # 増田一覧取得 page = session.get(f'https://anond.hatelabo.jp/{user_name}/?page={i}') print(page.url) # 応答のHTMLをBeautifulSoupで解析 soup = BeautifulSoup(page.content, 'html.parser') entries = soup.find_all('div', class_='section') for entry in entries: header = entry.find('h3') timestamp = header.find('a').get('href')[1:] item['url'] = 'https://anond.hatelabo.jp/'+timestamp item['title'] = header.get_text()[:-1] item['datetime'] = f"{timestamp[0:4]}/{timestamp[4:6]}/{timestamp[6:8]} {timestamp[8:10]}:{timestamp[10:12]}" footersection_text = entry.find_all('p')[-2].get_text() item['characters'] = len(entry.find('p').get_text().strip(footersection_text)) item['trackback'] = int(re.search(r'92;((.*?)92;)', footersection_text).group(1) if re.search(r'92;((.*?)92;)', footersection_text) else '') if item['title'] == '■': item['title'] = entry.find('p').get_text().strip(footersection_text)[:35] # 待機 time.sleep(3) bookmark_page = session.get(f'https://b.hatena.ne.jp/entry/button/?url=https%3A%2F%2Fanond.hatelabo.jp%2F{timestamp}&amp;layout=basic-label-counter&amp;lang=ja') soup_b = BeautifulSoup(bookmark_page.content, 'html.parser') item['bookmark'] = int(soup_b.find('a', class_='count').get_text()) # CSVファイルに追記 with open(output_file, 'a', newline='', encoding='utf-8') as file: writer = csv.DictWriter(file, fieldnames=item.keys()) writer.writerow(item)
(追記)
わー。ごめんなさい。文字が何か所か変わっていました。
92; → \
// if (卵があったら) print(“うるせえ!俺は牛乳を買うんだよ!”); buy(牛乳);
僕はプログラミング歴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()
万物に神が宿り、万物が神になる世界なので、神が人や世界を支配しない
『西洋宗教において神と運は別のオブジェクトだが、日本の古典な宗教観においては神や大いなる力は同一のオブジェクト』、これを生成させるまではうまくいったんだけどね
bingちゃん:
西洋宗教では、神と運は、プログラムでたとえると、別々のオブジェクトとして存在すると考えられます。神は、人間や自然に対して意志や計画を持つ創造者や支配者として表現されます。運は、人間や自然に対して予測や制御ができない偶発的な要因として表現されます。
# 神と運のオブジェクトを定義する class God: def __init__(self, name, power, plan): self.name = name # 神の名前 self.power = power # 神の力 self.plan = plan # 神の計画 def create(self, thing): # 神が何かを創造するメソッド print(f"{self.name} created {thing}.") def control(self, thing, action): # 神が何かに対して支配や介入をするメソッド print(f"{self.name} {action} {thing}.") class Luck: def __init__(self, name, factor): self.name = name # 運の名前 self.factor = factor # 運の要因 def affect(self, thing, outcome): # 運が何かに対して影響を与えるメソッド print(f"{self.name} affected {thing} and the outcome was {outcome}.")このコードでは、神と運は、それぞれ異なる属性や機能を持つオブジェクトとして定義されています。神は、名前、力、計画という属性と、創造、支配という機能を持ちます。運は、名前、要因という属性と、影響という機能を持ちます。神と運は、それぞれの機能を使って、人間や自然に対して作用することができます。例えば、以下のようなコードが考えられます。
# 神と運のオブジェクトを作成する god = God("Zeus", "lightning", "maintain order") luck = Luck("Tyche", "chance") # 神と運が人間に対して作用する god.create("human") luck.affect("human", "good") god.control("human", "bless") luck.affect("human", "bad") god.control("human", "punish")しかし、日本の古典的宗教観では運と神や大いなる力は同じオブジェクトです。神が運を司っています。
# 神と運は同一のオブジェクトとして定義する class GodLuck: def __init__(self, name, power, plan, factor): self.name = name # 神の名前 self.power = power # 神の力 self.plan = plan # 神の計画 self.factor = factor # 運の要因 def create(self, thing): # 神が何かを創造するメソッド print(f"{self.name} created {thing}.") def control(self, thing, action): # 神が何かに対して支配や介入をするメソッド print(f"{self.name} {action} {thing}.") def affect(self, thing, outcome): # 運が何かに対して影響を与えるメソッド print(f"{self.name} affected {thing} and the outcome was {outcome}.")このように、神と運は同一のオブジェクトとして扱われます。例えば、恵比寿さまは商売繁盛や五穀豊穣の神であり、同時にそのような運をもたらす要因でもあります。以下がその例です。
# 恵比寿さまのオブジェクトを作る ebisu = GodLuck("恵比寿さま", "商売繁盛や五穀豊穣の力", "人々に幸せを与える計画", "商売繁盛や五穀豊穣の要因") # 恵比寿さまが何かを創造する ebisu.create("鯛") # 恵比寿さまが何かに対して支配や介入をする ebisu.control("農作物", "守る") # 恵比寿さまが何かに対して影響を与える ebisu.affect("商人", "成功")恵比寿さま created 鯛. 恵比寿さま 守る 農作物. 恵比寿さま affected 商人 and the outcome was 成功.
日本語で聞いてるのになんでその回答になるんだよ、面倒くせぇ
ぜんぜん中立じゃないじゃんな
具体的にはBingちゃんが神の計画・神の支配の文言含んだ回答を生成しちゃったら
日本は八百万の神がいる世界。万物に神が宿り、万物が神になる世界なので、神が人や世界を支配しない
『西洋宗教において神と運は別のオブジェクトだが、日本の古典な宗教観においては神や大いなる力は同一のオブジェクト』、これをBingちゃんに生成させるまではうまくいったんだけどね
bingちゃん:
西洋宗教では、神と運は、プログラムでたとえると、別々のオブジェクトとして存在すると考えられます。神は、人間や自然に対して意志や計画を持つ創造者や支配者として表現されます。運は、人間や自然に対して予測や制御ができない偶発的な要因として表現されます。
# 神と運のオブジェクトを定義する class God: def __init__(self, name, power, plan): self.name = name # 神の名前 self.power = power # 神の力 self.plan = plan # 神の計画 def create(self, thing): # 神が何かを創造するメソッド print(f"{self.name} created {thing}.") def control(self, thing, action): # 神が何かに対して支配や介入をするメソッド print(f"{self.name} {action} {thing}.") class Luck: def __init__(self, name, factor): self.name = name # 運の名前 self.factor = factor # 運の要因 def affect(self, thing, outcome): # 運が何かに対して影響を与えるメソッド print(f"{self.name} affected {thing} and the outcome was {outcome}.")このコードでは、神と運は、それぞれ異なる属性や機能を持つオブジェクトとして定義されています。神は、名前、力、計画という属性と、創造、支配という機能を持ちます。運は、名前、要因という属性と、影響という機能を持ちます。神と運は、それぞれの機能を使って、人間や自然に対して作用することができます。例えば、以下のようなコードが考えられます。
# 神と運のオブジェクトを作成する god = God("Zeus", "lightning", "maintain order") luck = Luck("Tyche", "chance") # 神と運が人間に対して作用する god.create("human") luck.affect("human", "good") god.control("human", "bless") luck.affect("human", "bad") god.control("human", "punish")しかし、日本の古典的宗教観では運と神や大いなる力は同じオブジェクトです。神が運を司っています。
# 神と運は同一のオブジェクトとして定義する class GodLuck: def __init__(self, name, power, plan, factor): self.name = name # 神の名前 self.power = power # 神の力 self.plan = plan # 神の計画 self.factor = factor # 運の要因 def create(self, thing): # 神が何かを創造するメソッド print(f"{self.name} created {thing}.") def control(self, thing, action): # 神が何かに対して支配や介入をするメソッド print(f"{self.name} {action} {thing}.") def affect(self, thing, outcome): # 運が何かに対して影響を与えるメソッド print(f"{self.name} affected {thing} and the outcome was {outcome}.")このように、神と運は同一のオブジェクトとして扱われます。例えば、恵比寿さまは商売繁盛や五穀豊穣の神であり、同時にそのような運をもたらす要因でもあります。以下がその例です。
# 恵比寿さまのオブジェクトを作る ebisu = GodLuck("恵比寿さま", "商売繁盛や五穀豊穣の力", "人々に幸せを与える計画", "商売繁盛や五穀豊穣の要因") # 恵比寿さまが何かを創造する ebisu.create("鯛") # 恵比寿さまが何かに対して支配や介入をする ebisu.control("農作物", "守る") # 恵比寿さまが何かに対して影響を与える ebisu.affect("商人", "成功")恵比寿さま created 鯛. 恵比寿さま 守る 農作物. 恵比寿さま affected 商人 and the outcome was 成功.