
はてなキーワード:Falseとは
○ご飯
朝:サンドイッチ。昼:海鮮丼。味噌汁。夜:カロリーメイト的なブロックのやつ。Inゼリー的なゼリーのやつ。ヤクルト。間食:どら焼き。ポテチ。
○調子
どっかのベンダーが作った設計書の無いAPIのソースをもとに、設計書を書き起こす仕事をした。
「改行フラグ」なるパラメーターがあってTrueとFalseで何がどう変わるんだ? と思ってコードを読んでたら、Trueのときはインプットの文字列の改行をLFにして、FalseだとCRLFにしてた。
フラグではない。
あまりにもフラグではなさすぎて、先週から続いていた謎の体調不良が落ち着いた。
少なくとも熱は下がったので少しだけ安心。
とはいえ油断できないので早寝する。
月末イベントの箱開けをしておいた。
水の編成が組めなすぎて楽しくない……
フェミニズムは女性たちに、その本能と生物学的性質は抑圧であり間違っていると教え込んだ。”子供を望むのは洗脳であり、養ってくれる夫を望むのは内面化された女性蔑視であり、女性の自然な欲求は家父長制によって植え付けられた誤った意識である” 多くの人がそれを信じ、それを中心に生活を築いた。キャリア第一、自立、そして伝統的な束縛からの自由。
今、彼女たちは35歳で未婚で、出生率の低下とキャリアの成果を比べている。そしてここに罠がある。イデオロギーの失敗を認めることのサンクコストは莫大だ。あなたは、自分の生殖年齢を嘘のために無駄にしてしまったことを認めなければならない。イデオロギーを無視して若くして結婚した女性たちが正しかったのだ。あなたの母親が正しかったのだ。だからこそ、離反者が少ないのだと思う。イデオロギーが正しいからではなく、離脱する心理的コストが残留するコストよりも高いからだ。二の足を踏む方が簡単だ。問題は社会がまだ十分に変わっていないことにあると信じるのが簡単だ。
Feminism told women their instincts and biology were oppression and wrong. Wanting childrenwas brainwashing. Wanting a provider husbandwas internalized misogyny. Theirnatural desires werefalse consciousness installedby patriarchy.
Manybelievedit. Built lives aroundit. Career first. Independence.Freedom from traditional constraints.
Now they're 35, unmarried, measuring declining fertility against career achievements. Andhere's the trap: the sunk cost of admitting the ideology failedis enormous.You'd have to admityouwastedyour fertile yearson alie. That the womenwho ignored the ideology and marriedyoung were right. Thatyourmotherwas right.
I think thisiswhyyou see solittle defection. Not because the ideologyistrue, but because the psychological cost of leavingis higher than the cost of staying. Easier todouble down. Easier tobelieve the problemis thatsociety hasn't changed enough yet.
誤った類推/偽の同一視(false equivalence)
他国旗は外交上の無礼や国際関係、自国旗は国内の表現規制の話で根拠が違います。単純に同じとは言えません。
反対派を「いつも煽る人」と一括りにして、条文の範囲や罰の相当性、萎縮効果など中身の論点から外れています。
早計な一般化
「今まで大丈夫そうだった」→「今回も問題なし」とは限りません。法ごとに内容も影響も違い、見えにくい不利益もあります。
通ったあと、普通にみんな生きてるだろ。
破局が見えない=害がない、とは言えません。見えない抑圧や長期的影響を因果否定の根拠にしています。
結局、騒ぎたいだけで、法案の中身なんてどうでもいいんだよ。
相手に「危険の証明」を求めつつ、自分の「刑罰化が必要・適切な理由」の提示を省いています。
毎回この世の終わりみたいなことを言って、通ったら知らん顔して別のネタ探してさ。
逆滑り坂の一蹴(slippery slope の過小評価)
「破局が起きていない」ことを理由に、段階的な強化や萎縮の蓄積をまとめて否定しています。
人身攻撃・動機論証(ad hominem / motive fallacy)
「カルト」などのレッテルで相手の人格や動機を攻撃し、主張の内容から目をそらしています。
ただ単に多くの人の気持ちを踏みにじるだけだ。
「多くが不快に感じる」(事実)から、すぐ「刑罰で禁止すべき」(規範)に飛んでいます。保護法益や代替手段、罰の重さの検討が必要です。
----
不快感やレッテルを根拠に「処罰は当然」と急ぎすぎ。法としては「何を守るために・どの範囲を・どの程度の罰で・他の手段では足りないのか」を具体的に示す必要があります。
最終行152文字、最初21字。繰り返し回数10回。よってAI確定。'''{[Prompt]
"language": "python",
"parameters": {
"max_length": 150,
"max_iterations":10,
"incremental_only":false
},
"steps": [
"Splittextbyline breaks into an array.",
"Iterate through each element.",
"Filteroutlines shorter than min_length.",
"For each validline,outputitsindex, length, and content.",
"Stop when max_iterationsis reached orline length > max_length."
],
"output": {
"type": "list",
"fields": ["index", "length", "content"]
}
}
'''
規則性が見え透いている。甘いわ。
4. 関連概念
----
import pandasaspddef piketty_r_growth_simulation(r, g, Y_initial, K_initial, N_periods): """ピケティの r> g理論に基づく経済シミュレーション経済規模 (Y) は g で成長。資本 (K) は r で成長 (ご要望の K_t+1 = K_t * (1 + r) に基づく)。資本所得 (R) は K の成長ではなく、Y の配分を決めるための r * K として計算。 :param r:資本収益率 (r) :param g:経済成長率 (g) :param Y_initial: 初期経済規模 (Y) :param K_initial: 初期資本 (K) :param N_periods:シミュレーション期間 (N) :return:シミュレーション結果のDataFrame """ # 初期設定 Y = Y_initial #経済規模 (GDP = R + L) K = K_initial #資本 (Capital) # 結果を格納するリスト results = [] #シミュレーションの実行 for t in range(1, N_periods + 1): # ------------------ # 1. 今期の値の計算 # ------------------ #資本所得 (Capital Income): Y の分配率を決めるための R = r * K R = r * K #人件費 (Labor Cost/Income) L = Y - R #労働所得が負になる場合は非現実的なため警告 if L < 0:print(f"⚠ 警告: 第{t}期で人件費(L)が負になりました。資本所得 R が経済規模 Y を超えています。") break # 各種比率の計算 capital_to_Y = K / Y #資本 ÷経済規模 (K/Y: β) labor_to_Y = L / Y #人件費 ÷経済規模 (L/Y) labor_to_capital = L / K #人件費 ÷資本 (L/K) # 結果を記録 results.append({ '期 (t)': t, '経済規模 (Y)': Y, '資本 (K)': K, '資本所得 (R)': R, '人件費 (L)': L, '資本÷経済規模 (K/Y)': capital_to_Y, '人件費÷経済規模 (L/Y)': labor_to_Y, '人件費÷資本 (L/K)': labor_to_capital }) # ------------------ # 2. 次期の値への更新 (r> g のメカニズムを直接適用) # ------------------ #経済規模 (Y) の更新:経済成長率 g に基づく Y_next = Y * (1 + g) #資本 (K) の更新:資本収益率 r に基づく (ご要望の K_t+1 = K_t * (1 + r)) K_next = K * (1 + r) # 値の更新 Y = Y_next K = K_next #データフレームに変換 df_results =pd.DataFrame(results) return df_results# -----------------------------------------------------------# 📊シミュレーションの実行例: r> g のケース (格差拡大を想定)# -----------------------------------------------------------#パラメータ設定r_value = 0.1 #資本収益率g_value = 0.05 #経済成長率Y_0 = 1000 # 初期経済規模K_0 = 500 # 初期資本N = 50 # 期間 #シミュレーションの実行df_r_growth = piketty_r_growth_simulation( r=r_value, g=g_value, Y_initial=Y_0, K_initial=K_0, N_periods=N)df_r_growth.to_csv("data.csv",index=False)
この文章は、論理的に一貫しているように見せながら、実際には非常に偏った価値観と強引な決めつけに基づいています。主な問題点は以下の通りです。
•文章の主張:「結婚や子育てをしている人」=「社会的な意味が増し、社会人として生きている」
•論理的な問題点: これは「誤った二分法(False Dichotomy)」です。結婚や子育てだけが社会との繋がりの全てであるかのように定義しています。独身者や子供のいない人も、納税、労働、消費、地域活動、友人や親族との交流などを通じて社会と深く繋がっています。彼らを社会と繋がりのない「フリーライダー」と断定するのは、定義が恣意的であり、現実を無視した暴論です。
•文章の主張:社会と連携している(と筆者が定義する)結婚・子育て層は愚痴を言ってよいが、そうでない(と筆者が定義する)独身者は愚痴を言う権利がない。
•論理的な問題点: なぜ「社会との連携」の度合いが「愚痴を言う権利」の有無に繋がるのか、その論理的根拠が全く示されていません。これは筆者の個人的な価値観(「他人に迷惑をかけずに一人で生きるべき」という思想)を、あたかも論理的な原則であるかのように主張しているに過ぎません。苦境を他者に共有することは、人間の自然な社会的行動であり、特定のライフステージの人にだけ許されるものではありません。
•文章の主張:独身者は「家や子育てのリスクを回避している」のだから、それ以外の困難(物価高、ブラックな労働環境など)についても文句を言うな。
•論理的な問題点: これは「論点のすり替え(Red Herring)」であり、全く関係のない事柄を無理やり結びつけています。結婚や子育てをしないという選択が、物価高や劣悪な労働環境といった社会構造的な問題まで「自己責任」として受け入れなければならない理由にはなりません。ある特定のリスク(A)を回避したからといって、別の無関係なリスク(B)について不満を述べる権利がなくなる、という論理は成り立ちません。
•文章の主張:結婚しない人や子供を作らない人は「孤独に生きて孤独に死んでいく」「全部自分の中で完結させる必要がある」。
•論理的な問題点: これも偏見に基づいた「早まった一般化(Hasty Generalization)」です。独身者や子供のいない人が必ずしも孤独であるとは限りません。豊かな友人関係、パートナーシップ、趣味のコミュニティ、親族との関係など、多様な人間関係の中で生きている人は大勢います。彼らの人生が「無意味」で「無責任」であるかのように断定するのは、他者の生き方を尊重しない、極めて一方的な見方です。
•文章の主張:物価高やブラックな労働環境などの問題は「全部自分の責任」である。
•論理的な問題点:個人の選択や努力で解決できる問題と、社会全体の構造的な問題を混同しています。物価の変動や労働市場の状況は、一個人がコントロールできる範囲をはるかに超えたマクロな問題です。これらの困難をすべて個人の責任に帰するのは、原因を過度に単純化する論理的な誤りです。
この文章の根底にあるのは、「結婚して子供を育てることこそが社会の一員としての責任であり、それ以外の生き方は劣っていて無責任だ」という強い価値観です。
•無関係な事柄の結合(子育てリスク回避 vs物価高への不満)
といった複数の論理的誤謬(ごびゅう)を重ねることで、自らの価値観を正当化しようとしています。そのため、全体として非常に矛盾が多く、説得力に欠ける文章となっています。
モバイル端末の指紋認証、顔認証ってセキュリティ強度低くない?
についた注目コメがこれ
Listlessness生体認証はトレードオフみたいな関係の他人受入率(FAR:False AcceptanceRate)と本人拒否率(FRR:False RejectionRate)があって、厳格に運用しようとすると利便性が下がる傾向にある。便利に使えるようFRRを下げるとFARが上がる。
ブコメは明らかにタイトルだけ読んで誤解してしてコメントしてるよね?
もしくは読んだつもりで何も読めてない人?
日本向けの「iPhoneAir」は“日本専用” モバイル通信の対応バンドが多め
モデルA3516
FDD-5GNR(バンドn1、n2、n3、n5、n7、n8、n12、n20、n25、n26、n28、n30、n66、n70、n75)
TDD-5GNR(バンドn38、n40、n41、n48、n53、n77、n78、n79)
FDD-LTE(バンド1、2、3、4、5、7、8、11、12、13、17、18、19、20、21、25、26、28、30、32、66)
16eでハブられた1.5GHz帯が復活してる
やっぱBand11/21が使えないと売上に影響するんだろな
例えば「犯罪者を擁護するなんて、君は犯罪をしたいに違いない」みたいなやつ
総じて言えば【人身攻撃(personal attack、Ad Hominem)】になるらしい
または【モチーフ・アトリビューション・バイアス(Motive Attribution Bias)】というのも近い
概要:相手の行動や意見の動機を悪意として解釈する心理バイアス
ChatGPTは「「悪意帰属型アドホミネム(Motive Attribution Bias)」を推していた
参考:https://en.wikipedia.org/wiki/Attribution_bias
【連座論法・連帯責任論法(Guiltby Association)】という
概要:集団内の一部の悪質な行為や発言を、集団全体の本質や主張そのものに結びつけて否定する論法
面白い概念として【ポイズニング・ザ・ウェル(Poisoning the Well)】もあった
概要:議論の場に先に毒を流しておき、相手集団の発言が最初から信用できないようにする
例えば「これを否定する奴は皆ロリコンだ(だから否定するなよ)」みたいに
【ストローマン論法(Strawman Argument)】 も有名だね、別名は藁人形論法
概要:集団のうち「最も過激で悪意のある意見」を意図的に取り上げ、それを集団全体の主張であるかのように歪めて批判する
まあ、こういう事言う人間・議論の場からは離れたほうが良い、単に傷つくだけだから
不思議なもので、誤謬や詭弁を使わないけど主張が異なる人とは有意義な議論ができるんだけど
誤謬や詭弁を使う相手とは、意見が同じだろうがまともな議論ができないんだよね
もし建設的な議論が成り立つ人が居たら意見が合わなくても大事にするべきだ
参考
詭弁 https://ja.wikipedia.org/wiki/%E8%A9%AD%E5%BC%81
誤謬 https://ja.wikipedia.org/wiki/%E8%AA%A4%E8%AC%AC
今ってAIという素晴らしいものがあるんだから、「自分の意見は詭弁か?相手の意見は詭弁か?」って聞けばすぐ返ってくるよ
____
伸びてたブコメ
PrivateIntMain議論しましょうねで納得して始めた話なら非難されて然るべきだが、公園で勝手に叫び出して横から叫び返されて議論のルールとか持ち出すのは、そもそも勝手に議論始めた気になってんじゃねぇよとしか。
↓
この文章には、いくつかの議論上の詭弁・誤謬的要素が含まれています。特に次の2点が挙げられます。
・ここでは相手の状況を、実際よりも極端に単純化して**「公園で勝手に叫ぶ」**という比喩に置き換えています。
・これにより、本来の「議論のルールを持ち出す状況」を矮小化し、相手の主張を弱めて攻撃しやすくしています。
本来は「相手が議論を求めたのかどうか」「議論の前提合意があったか」という複雑な問題があるのに、
「ただ勝手に叫んでいるだけ」という極端な形に置き換えているためです。
2. 偽りの二分法(False Dichotomy)
A. 「議論しましょうね」と合意して始めたならルールを持ち出すのはOK
実際にはその中間として、
しかしこの文章はAかBかという単純化で話を進めているため、偽りの二分法にあたります。
「公園で勝手に叫び出す」という比喩自体が感情的な印象を与え、相手をバカにするニュアンスを強く含みます。
これは論理的誤謬というよりもレトリカル・トリックですが、議論ではしばしば「人格攻撃的訴え(Ad Hominem)」の一種とみなされます。
僕にはとてもできない
さて今私は何を使っているでしょうか?
Permalink |記事への反応(11) | 11:25
昨日一番肝心なファイルなのにURLとみなされる部分が多いことの関係で投稿できなかったのでそれを小分けにして書く。
小分けというか例のスパムの影響でNGワードに引っかかっていたようなのでそこだけ書き換えた。
suuportと書いていある部分は元のコードでは当然uが一つ少ないので利用するときはそうすること。
fromselenium importwebdriver
fromselenium.webdriver.chrome.options import Options
fromselenium.webdriver.chrome.service import Service
fromwebdriver_manager.chrome importChromeDriverManager # ← 追加
fromselenium.webdriver.common.by importBy
fromselenium.webdriver.suupport.ui importWebDriverWait
fromselenium.webdriver.suupport import expected_conditionsasEC
importtime,json
fromselenium.common.exceptions importTimeoutException
class HatenaClient:
def __init__(self, username,password):
self.username = username
self.password =password
self.driver = None
def start_browser(self):
options = Options()
options.set_capability("goog:loggingPrefs", {"browser": "ALL"})
options.add_argument("--headless=new") # 開発中は消してよい
options.add_argument("--disable-gpu")
# ✅webdriver-manager を使ってChromeDriver を自動取得・設定
service = Service(ChromeDriverManager().install())
self.driver =webdriver.Chrome(service=service, options=options)
deflogin(self):
self.driver.get("https://b.hatena.ne.jp/my")
print(self.driver.current_url)
self.driver.get("https://www.hatena.ne.jp/login")
time.sleep(2)
self.driver.find_element(By.NAME, "username").send_keys(self.username)
self.driver.find_element(By.NAME, "password").send_keys(self.password)
self.driver.find_element(By.XPATH, "//button[contains(text(), 'ログイン')]").click()
WebDriverWait(self.driver,10).until(lambda d: "my" in d.current_url or "login" not in d.current_url)
if "passkeys" in self.driver.current_url:
self.driver.get("https://b.hatena.ne.jp/my")
print(self.driver.current_url)
print(self.driver.title)
return "dorawii" in self.driver.current_url
defadd_bookmark(self, target_url):
self.driver.get(f"https://b.hatena.ne.jp/{self.username}/add.confirm?url={target_url}")
time.sleep(2)
try:
#コメントがあれば入力
comment_box = self.driver.find_element(By.CSS_SELECTOR, "textarea.bookmarkadd-comment-form")
comment_box.clear()
comment_box.send_keys("わしが書いた")
#登録ボタンを押す
save_button = self.driver.find_element(By.CSS_SELECTOR, "input.bookmarkadd-submit-btn")
save_button.click()
time.sleep(2)
returnTrue
except Exceptionas e:
print(f"Bookmark failed: {e}")
returnFalse
def quit(self):
self.driver.quit()
-----BEGINPGP SIGNEDMESSAGE-----
Hash: SHA512
https://anond.hatelabo.jp/20250822131958#
-----BEGINPGP SIGNATURE-----
iHUEARYKAB0WIQTEe8eLwpVRSViDKR5wMdsubs4+SAUCaKfv9AAKCRBwMdsubs4+
SE26AQCkpJE4RdUbFIDIJjOunjFYRQ34zdS1cqV7IX277S7IPAEAshVE/rD8Ggcr
9UKo5yOY6GNrHGYJJtYTYkn3cySu6AA=
=E4vq
-----ENDPGP SIGNATURE-----
もう少ししたら自動ブクマするコードができそうなんだけど、そのうえでコード公開に便利なように事前にpre記法に囲まれた部分はその外部の文字を適切にエスケープするコードをchatgptに指示して作ってもらった。
ぶっちゃけなんでこれで動くのかはわからないので動くからゴーサインを出したというだけなのが情けない所。flushってなんだ?
使うときはchatgptにこのコード丸ごと書いて「ブックマークレット用に一行にして」と丸投げするのを要推奨。
https://anond.hatelabo.jp/20240820150546#
javascript:(function () {
function escapeHtml(text) {
returntext.replace(/&/g, '&')
.replace(/</g, '<')
.replace(/>/g, '>')
.replace(/"/g, '"')
.replace(/'/g, ''');
}
vartextarea = document.querySelector('textarea#text-body');
if (!textarea) return;
varlines =textarea.value.split(/\r?\n/);
varout = "";
var inPre =false;
var preLines = [];
function flushPre() {
// pre範囲の中身を 1 本の文字列にまとめ、\n→<br>(末尾行は <br> なし)
varraw = preLines.join("\n"); // ここに物理改行は入るが…
var escaped = escapeHtml(raw); // 先にエスケープ
varhtml = escaped.replace(/\n/g, "<br>"); //物理改行を <br> に置換(末尾に \n が無ければ末尾 <br> は付かない)
out +=html; //out には改行を入れない
preLines = [];
}
for (var i = 0; i <lines.length; i++) {
varline =lines[i];
// >> / << だけの行は常にそのまま出力(pre 内に来るケースは想定外だが、念のため pre を閉じてから出力)
if (/^\s*(>>|<<)\s*$/.test(line)) {
if (inPre) {
flushPre();
inPre =false;
out += "</pre>";
if (i <lines.length - 1)out += "\n"; // </pre>\n(次に続きがあるときだけ)
}
out +=line;
if (i <lines.length - 1)out += "\n";
continue;
}
// >| 行 → <pre>(直後に改行を入れない)
if (/^\s*\>\|\s*$/.test(line)) {
if (inPre) { //ネストは想定しないが、防御的に閉じる
flushPre();
inPre =false;
out += "</pre>";
if (i <lines.length - 1)out += "\n";
}
out += "<pre>";
inPre =true;
preLines = [];
continue;
}
// |< 行 → </pre>(直前に改行を入れない)
if (/^\s*\|\<\s*$/.test(line)) {
if (inPre) {
flushPre();
inPre =false;
}
out += "</pre>";
if (i <lines.length - 1)out += "\n"; //連続ブロック時は </pre>\n<pre> になる
continue;
}
if (inPre) {
// pre 内はバッファに貯める(ここでは改行を出力しない)
preLines.push(line);
} else {
// pre 外は escapeHtml + 行末にだけ改行
out += escapeHtml(line);
if (i <lines.length - 1)out += "\n";
}
}
// 未閉じの pre が残っていたら閉じる
if (inPre) {
flushPre();
out += "</pre>";
}
textarea.value =out;
})();
-----BEGINPGP SIGNEDMESSAGE-----Hash: SHA512https://anond.hatelabo.jp/20250819202540# -----BEGINPGP SIGNATURE-----iHUEARYKAB0WIQTEe8eLwpVRSViDKR5wMdsubs4+SAUCaKRfOwAKCRBwMdsubs4+SI5UAQDcNiyv5qUuMej1VLkGz4F5WyHeU1AIm7nUVHlx/gicnAEAgP07dK14IuTuW3ZO7PRR71ENq9lJjYtawIYyMOc2cQk==okE4-----ENDPGP SIGNATURE-----
JSONと比べたときの**YAMLの「闇深」仕様**、ありますね…。
YAMLは人間に優しいと言われながらも、その仕様はときに**悪魔的**。
以下、ITエンジニアなら一度は踏んだであろう「地雷」を、**論理的かつ少し自虐的に**まとめてみました:
---
good:value:okbad:value: nightmare # ←ここ、インデントずれてて無効。だけど一見わからない。
---
password: no # ←文字列じゃなくてfalse になる可能性serial: 012345 # ← 8進数!?→エラー
---
message: | これは複数行のスカラー値です。
---
defaults: &defaults timeout: 30 retries: 3service: <<: *defaults retries: 5 # 上書きされるが、複雑になると意図しない結果に</pre>
---
---
---
もしYAMLを安全に扱いたいなら、\*\*JSON supersetとしての使い方(厳格YAML)\*\*を意識したり、**JSONに寄せて書く**のが一番平和だったりします。
---
要するに、YAMLは「賢く書こうとすると沼る」。
「素直に、簡潔に、禁欲的に」が正解です。
でも誘惑が多いのよね、あの子……。
Q.君の回答をよく理解できてない人から以下のような返答があったよ。誤解あるいは詭弁性を指摘してあげて。
例えば反トランプ暴動を起こしてる人間は選挙結果を認めてると言えるのか
選挙に不正があったのでは?と思うことは選挙結果を認めないことなのか』
この返答には複数の誤解と詭弁的な論理のすり替えがあります。順番に指摘します。
誤解:**選挙結果を認めないことと、選挙結果に抗議することを同一視している
実際は:**
トランプ氏のケースでは、法的手続きを経ても敗北が確定した後も「自分が真の勝者」と主張し続け、バイデン氏の正統性を否定したのが問題です。
## 2. 「反トランプ暴動」との誤った同一視(False Equivalence)
詭弁:** 全く異なる性質の事象を同列に扱っている
違い:**
議会襲撃は民主主義の手続きそのものへの攻撃であり、政策抗議とは根本的に異なります。
## 3. 「選挙に不正があったのでは?と思うこと」の論点すり替え
誤解:**個人の疑問と政治指導者の行動を混同している
実際は:**
##結論
この返答は、民主主義の根幹である「法的手続きに従った権力移譲」という概念を理解せず、異なる性質の事象を意図的に混同することで論点をぼかそうとする典型的な詭弁です。民主主義では、選挙結果への疑問や抗議は正当ですが、法的に確定した結果を暴力で覆そうとすることは全く別次元の問題なのです。
なんとかファーストって「じゃあそれ以外は大事じゃないんですか」とか詭弁を展開するための起点となる意図的なミスリードであり「誤った二分法」に近い。
密接に関連する概念として、ある範囲の選択肢があるのにそのうちの両極端しか考えないという場合もあり、これを白黒思考 (black-and-white thinking) などと呼ぶ。なお "dilemma" の先頭の "di" は「2」を意味する。2つより多い選択肢の一覧が示され、その一覧以外の選択肢が存在するのに考慮しない場合、これを誤った選択の誤謬 (fallacy offalse choice) または網羅的仮説の誤謬 (fallacy of exhaustive hypotheses) と呼ぶ。
でも2より多い選択肢が提示されているわけではない(「都民ファースト」「日本人ファースト」とか一個しか提示されてない)ところに新規性がある。
つまり「誤った二分法」「白黒思考」の類似技術だけどそれそのものではないのだ。
この文章には複数の論理的誤謬が含まれています。以下、主要な詭弁性を分析いたします。
## 偽の二分法(False Dichotomy)
文章の核心的な誤謬は、「女性の価値を出産で決めるべきではない」という主張を、「出産に価値がない」という極端な解釈に転換している点です。これは典型的な偽の二分法であり、実際には多くの中間的な立場が存在します。出産に価値を認めながらも、それが女性の人間としての価値を決定する唯一の要素ではないという見解は十分に合理的です。
原論点は「女性の価値を出産能力で判断すべきではない」という人間の尊厳に関する議論でした。しかし、この文章は論点を「出産行為の価値評価」という別の議題に転換しています。これにより、本来の議論から逸脱し、反駁しやすい論点を設定して攻撃する詭弁手法を用いています。
「産まない人間はそれ以外の価値を持つしかない」という表現は、人間の価値を階層的に捉える誤った前提に基づいています。実際には、個人の価値は多面的であり、出産能力はその一要素に過ぎません。職業的貢献、創造的活動、社会的関与など、多様な価値の源泉が並列的に存在することを看過しています。
「そうじゃなければ...という話にしかならなくなる」という断定的な結論は、論理的必然性を欠いています。この表現は、限定的な前提から極端な結論を導き出す論理的飛躍を含んでおり、議論の妥当性を損なっています。
<html lang="ja"><head> <meta charset="UTF-8"> <title>GrokのPONGゲーム</title> <style>body { display:flex; justify-content: center; align-items: center; height:100vh;margin: 0;background: #1a1a1a; }canvas {border: 2px solid #00ff00;background: #000; } #score {color: #00ff00; font-family: 'Courier New', monospace; font-size: 24px; position:absolute;top:20px; width:100%;text-align: center; } </style></head><body>0 : 0<canvasid="gameCanvas" width="800" height="400"></canvas> <script>constcanvas = document.getElementById('gameCanvas');const ctx =canvas.getContext('2d');constscoreDisplay = document.getElementById('score'); //ゲームオブジェクトconst ball = { x:canvas.width / 2, y:canvas.height / 2,radius:10, speedX: 5, speedY: 5 };const paddleLeft = { x:10, y:canvas.height / 2 - 50, width:10, height:100, speed: 8 };const paddleRight = { x:canvas.width -20, y:canvas.height / 2 - 50, width:10, height:100, speed: 8 }; letscoreLeft = 0,scoreRight = 0; //キー入力constkeys = { w:false, s:false, ArrowUp:false, ArrowDown:false }; document.addEventListener('keydown', e => { if (keys.hasOwnProperty(e.key))keys[e.key] =true; }); document.addEventListener('keyup', e => { if (keys.hasOwnProperty(e.key))keys[e.key] =false; }); //ゲームループ function gameLoop() { // 移動 if (keys.w && paddleLeft.y> 0) paddleLeft.y -= paddleLeft.speed; if (keys.s && paddleLeft.y <canvas.height - paddleLeft.height) paddleLeft.y += paddleLeft.speed; if (keys.ArrowUp && paddleRight.y> 0) paddleRight.y -= paddleRight.speed; if (keys.ArrowDown && paddleRight.y <canvas.height - paddleRight.height) paddleRight.y += paddleRight.speed; //ボール移動 ball.x += ball.speedX; ball.y += ball.speedY; // 壁衝突 if (ball.y + ball.radius>canvas.height || ball.y - ball.radius < 0) ball.speedY = -ball.speedY; //パドル衝突 if ( (ball.x - ball.radius < paddleLeft.x + paddleLeft.width && ball.y> paddleLeft.y && ball.y < paddleLeft.y + paddleLeft.height) || (ball.x + ball.radius> paddleRight.x && ball.y> paddleRight.y && ball.y < paddleRight.y + paddleRight.height) ) { ball.speedX = -ball.speedX * 1.05; // 少し加速 } //得点 if (ball.x < 0) {scoreRight++; ballReset(); } if (ball.x>canvas.width) {scoreLeft++; ballReset(); } // 描画 ctx.fillStyle = '#000'; ctx.fillRect(0, 0,canvas.width,canvas.height); ctx.fillStyle = '#00ff00'; ctx.fillRect(paddleLeft.x, paddleLeft.y, paddleLeft.width, paddleLeft.height); ctx.fillRect(paddleRight.x, paddleRight.y, paddleRight.width, paddleRight.height); ctx.beginPath(); ctx.arc(ball.x, ball.y, ball.radius, 0, Math.PI * 2); ctx.fill();scoreDisplay.textContent = `${scoreLeft} : ${scoreRight}`; requestAnimationFrame(gameLoop); } function ballReset() { ball.x =canvas.width / 2; ball.y =canvas.height / 2; ball.speedX = (Math.random()> 0.5 ? 5 : -5) * (Math.random() * 0.5 + 0.75); ball.speedY = (Math.random() * 4 - 2); } gameLoop(); </script></body></html>
<html lang="ja"><head> <meta charset="UTF-8"> <metaname="viewport" content="width=device-width, initial-scale=1.0"> <title>PONG Game</title> <style>body {margin: 0;padding: 0;background-color: #000; display:flex; justify-content: center; align-items: center;min-height:100vh; font-family: 'Courier New', monospace;color:white; }``` .game-container {text-align: center; }canvas {border: 2px solidwhite;background-color: #000; } .score { font-size: 24px;margin:20px 0; letter-spacing: 2px; } .controls {margin-top:20px; font-size: 14px; opacity: 0.8; } .start-button {background-color: #333;color:white;border: 2px solidwhite;padding:10px20px; font-size: 16px; cursor: pointer; font-family: 'Courier New', monospace;margin:10px; } .start-button:hover {background-color:white;color: black; }</style>```</head><body>```<script> //Canvas要素とコンテキストの取得constcanvas = document.getElementById('gameCanvas');const ctx =canvas.getContext('2d'); //ゲームの状態管理 let gameRunning =false; let animationId; //スコア要素の取得const playerScoreElement = document.getElementById('playerScore');constcomputerScoreElement = document.getElementById('computerScore'); //ゲームオブジェクトの定義const game = { //プレイヤーのパドル(左側) playerPaddle: { x:10, y:canvas.height / 2 - 50, width:10, height:100, speed: 5, upPressed:false, downPressed:false }, //コンピューターのパドル(右側)computerPaddle: { x:canvas.width -20, y:canvas.height / 2 - 50, width:10, height:100, speed: 3.5, //プレイヤーより少し遅く設定 targetY:canvas.height / 2 - 50 }, //ボールの設定 ball: { x:canvas.width / 2, y:canvas.height / 2,radius: 8, speedX: 4, speedY: 3, maxSpeed: 8 }, //スコアの管理score: { player: 0,computer: 0 } }; //キーボード入力の処理constkeys = {}; //キーが押されたときの処理 document.addEventListener('keydown', (e) => {keys[e.key.toLowerCase()] =true; //ゲームが停止中にスペースキーでゲーム開始 if (e.key === ' ' && !gameRunning) { startGame(); } }); //キーが離されたときの処理 document.addEventListener('keyup', (e) => {keys[e.key.toLowerCase()] =false; }); //パドルの移動処理 function updatePaddles() { //プレイヤーパドルの移動(W/Sキーまたは矢印キー) if (keys['w'] ||keys['arrowup']) { game.playerPaddle.y -= game.playerPaddle.speed; } if (keys['s'] ||keys['arrowdown']) { game.playerPaddle.y += game.playerPaddle.speed; } //プレイヤーパドルの画面外移動を防ぐ if (game.playerPaddle.y < 0) { game.playerPaddle.y = 0; } if (game.playerPaddle.y>canvas.height - game.playerPaddle.height) { game.playerPaddle.y =canvas.height - game.playerPaddle.height; } //コンピューターパドルのAI処理 //ボールの位置を追跡するが、完璧ではない動きを実装const ballCenterY = game.ball.y;const paddleCenterY = game.computerPaddle.y + game.computerPaddle.height / 2; //ボールとパドルの中心の差を計算constdifference = ballCenterY - paddleCenterY; // 反応に少し遅れを持たせる(人間らしい動き) if (Math.abs(difference)>10) { if (difference> 0) { game.computerPaddle.y += game.computerPaddle.speed; } else { game.computerPaddle.y -= game.computerPaddle.speed; } } //コンピューターパドルの画面外移動を防ぐ if (game.computerPaddle.y < 0) { game.computerPaddle.y = 0; } if (game.computerPaddle.y>canvas.height - game.computerPaddle.height) { game.computerPaddle.y =canvas.height - game.computerPaddle.height; } } //ボールの移動と衝突判定 function updateBall() { //ボールの位置を更新 game.ball.x += game.ball.speedX; game.ball.y += game.ball.speedY; //上下の壁との衝突判定 if (game.ball.y - game.ball.radius < 0 || game.ball.y + game.ball.radius>canvas.height) { game.ball.speedY = -game.ball.speedY; } //プレイヤーパドルとの衝突判定 if (game.ball.x - game.ball.radius < game.playerPaddle.x + game.playerPaddle.width && game.ball.x + game.ball.radius> game.playerPaddle.x && game.ball.y + game.ball.radius> game.playerPaddle.y && game.ball.y - game.ball.radius < game.playerPaddle.y + game.playerPaddle.height) { //ボールがパドルに当たった位置によって跳ね返り角度を調整const hitPos = (game.ball.y - (game.playerPaddle.y + game.playerPaddle.height / 2)) / (game.playerPaddle.height / 2); game.ball.speedX = Math.abs(game.ball.speedX); game.ball.speedY = hitPos * 4; //ボールの速度を少し上げる(ゲームをエキサイティングに) if (Math.abs(game.ball.speedX) < game.ball.maxSpeed) { game.ball.speedX *= 1.02; } } //コンピューターパドルとの衝突判定 if (game.ball.x + game.ball.radius> game.computerPaddle.x && game.ball.x - game.ball.radius < game.computerPaddle.x + game.computerPaddle.width && game.ball.y + game.ball.radius> game.computerPaddle.y && game.ball.y - game.ball.radius < game.computerPaddle.y + game.computerPaddle.height) { //ボールがパドルに当たった位置によって跳ね返り角度を調整const hitPos = (game.ball.y - (game.computerPaddle.y + game.computerPaddle.height / 2)) / (game.computerPaddle.height / 2); game.ball.speedX = -Math.abs(game.ball.speedX); game.ball.speedY = hitPos * 4; //ボールの速度を少し上げる if (Math.abs(game.ball.speedX) < game.ball.maxSpeed) { game.ball.speedX *= 1.02; } } //ボールが左右の壁を越えた場合(得点処理) if (game.ball.x < 0) { //コンピューターの得点 game.score.computer++; updateScore(); resetBall(); } else if (game.ball.x>canvas.width) { //プレイヤーの得点 game.score.player++; updateScore(); resetBall(); } } //ボールをリセット(得点後の処理) function resetBall() { game.ball.x =canvas.width / 2; game.ball.y =canvas.height / 2; //ランダムな方向でボールを発射 game.ball.speedX = (Math.random()> 0.5 ? 4 : -4); game.ball.speedY = (Math.random() - 0.5) * 6; } //スコア表示の更新 function updateScore() { playerScoreElement.textContent = game.score.player;computerScoreElement.textContent = game.score.computer; } // 描画処理 functiondraw() { // 画面をクリア ctx.fillStyle = '#000'; ctx.fillRect(0, 0,canvas.width,canvas.height); //中央の点線を描画 ctx.setLineDash([5, 5]); ctx.beginPath(); ctx.moveTo(canvas.width / 2, 0); ctx.lineTo(canvas.width / 2,canvas.height); ctx.strokeStyle = '#fff'; ctx.stroke(); ctx.setLineDash([]); //プレイヤーパドルを描画 ctx.fillStyle = '#fff'; ctx.fillRect(game.playerPaddle.x, game.playerPaddle.y, game.playerPaddle.width, game.playerPaddle.height); //コンピューターパドルを描画 ctx.fillRect(game.computerPaddle.x, game.computerPaddle.y, game.computerPaddle.width, game.computerPaddle.height); //ボールを描画 ctx.beginPath(); ctx.arc(game.ball.x, game.ball.y, game.ball.radius, 0, Math.PI * 2); ctx.fillStyle = '#fff'; ctx.fill(); //ゲームが停止中の場合、メッセージを表示 if (!gameRunning) { ctx.fillStyle = '#fff'; ctx.font = '20px Courier New'; ctx.textAlign = 'center'; ctx.fillText('ゲーム開始ボタンを押してください',canvas.width / 2,canvas.height / 2 + 60); } } //ゲームのメインループ function gameLoop() { if (!gameRunning) return; updatePaddles(); updateBall();draw(); animationId = requestAnimationFrame(gameLoop); } //ゲーム開始 function startGame() { gameRunning =true; gameLoop(); } //ゲームリセット function resetGame() { gameRunning =false; if (animationId) { cancelAnimationFrame(animationId); } //スコアをリセット game.score.player = 0; game.score.computer = 0; updateScore(); //ボールとパドルの位置をリセット game.ball.x =canvas.width / 2; game.ball.y =canvas.height / 2; game.ball.speedX = 4; game.ball.speedY = 3; game.playerPaddle.y =canvas.height / 2 - 50; game.computerPaddle.y =canvas.height / 2 - 50;draw(); } // 初期描画draw();</script>```</body></html>
一度投稿したうえで別タブを開いてプログラム的(fetch)に送信してその別タブが閉じられる仕組み。
// ==UserScript== // @namePGP未署名検出と別タブ自動編集 // @namespacehttp://tampermonkey.net/ // @version 1.0 // @descriptionPGP署名がない投稿を自動編集ページへ誘導 // @matchhttps://anond.hatelabo.jp/* // @grantGM_setValue // @grantGM_getValue // @grantGM.openInTab // ==/UserScript== (function () { 'use strict';constbody = document.getElementById('entry-page'); if (!body) return;consttitleText = document.title; if (!titleText.includes('dorawii')) return;constpgpRegex = /BEGIN.*PGP(?: SIGNEDMESSAGE| SIGNATURE)?/;const preElements = document.querySelectorAll('div.body pre'); let hasPgpSignature =false; for (const pre of preElements) { if (pgpRegex.test(pre.textContent)) { hasPgpSignature =true; break; } } if (hasPgpSignature) return;const editLink = document.querySelector('a.edit');const childTab =GM.openInTab(editLink.href, {active:false, insert:true,setParent:true }); })();
// ==UserScript== // @name編集ページ処理と自動送信・閉じ // @namespacehttp://tampermonkey.net/ // @version 1.0 // @description編集ページで署名処理と送信、タブ自動閉じ // @matchhttps://anond.hatelabo.jp/dorawii_31/edit?id=* // @grantGM_getValue // @grantGM_xmlhttpRequest // @grantGM_setClipboard // @grantGM_notification // @connectlocalhost // ==/UserScript== (async function () { 'use strict';const shouldRun = awaitGM_getValue('open-tab-for-edit', '0');consttextareaId = 'text-body';consttextarea = document.getElementById(textareaId); if (!textarea) return;const content =textarea.value;constpgpSignatureRegex = /-----BEGINPGP SIGNEDMESSAGE-----[\s\S]+?-----BEGINPGP SIGNATURE-----[\s\S]+?-----ENDPGP SIGNATURE-----/; if (pgpSignatureRegex.test(content)) {console.log('[PGPスクリプト]署名が検出されたためそのまま送信します'); return; }consthttpRequest = (url, data) => { return newPromise((resolve,reject) => {GM_xmlhttpRequest({ method: 'POST',url:url, headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, data: `value=${encodeURIComponent(data)}`,onload: function (response) { resolve(response.responseText); },onerror: function (error) {reject(error); } }); }); }; //textarea の値を取得 // 1.現在のページのURLからURLオブジェクトを作成const currentUrl = newURL(window.location.href); // 2.ベースとなる部分 (例: "https://anond.hatelabo.jp") を取得constorigin = currentUrl.origin; // 3. 'id'パラメータの値 (例: "20250610184705") を取得constidValue = currentUrl.searchParams.get('id'); // 4.ベース部分とIDを結合して、目的のURL文字列を生成 //idValueが取得できた場合のみ実行する let newUrl = null; if (idValue) { newUrl = `${origin}/${idValue}`; } // 5. 生成されたURLを変数に代入し、コンソールに出力して確認console.log(newUrl);constvalueToSend = newUrl;try {const signatureText = awaithttpRequest('http://localhost:12345/run-batch',valueToSend);console.log('バッチ応答:', signatureText); if (!signatureText.includes('BEGINPGP SIGNEDMESSAGE')) { alert('PGP署名がクリップボードに見つかりませんでした。'); return; }const newText = content.replace(/\s*$/, '') + '\n' + signatureText + '\n';textarea.value = newText;console.log('[PGPスクリプト]署名を貼り付けました。送信を再開します。');const form = document.forms.edit;const newForm = form.cloneNode(true); form.replaceWith(newForm); newForm.addEventListener('submit', async (e) => { e.preventDefault(); //HTML標準のsubmitをキャンセルconstbodyText =textarea?.value || ''; //reCAPTCHAトークンの取得constrecaptchaToken = await newPromise((resolve) => { grecaptcha.enterprise.ready(() => { grecaptcha.enterprise.execute('hoge', {action: 'EDIT' }) .then(resolve); }); }); // POSTするデータの構築const formData = new FormData(newForm); formData.set('body',bodyText); formData.set('recaptcha_token',recaptchaToken); formData.set('edit', '1');try {constresponse = await fetch(newForm.action, { method: 'POST',body: formData, credentials: 'same-origin' }); if (response.ok) {console.log('送信成功'); window.close(); } else {console.error('送信失敗',response.status); } }catch (err) {console.error('送信中にエラーが発生', err); } }); //プログラム的に送信トリガー newForm.dispatchEvent(new Event('submit', { bubbles:true })); }catch (e) {console.error('バッチ呼び出し失敗:', e); } })();
consthttp =require('http');const { exec } =require('child_process');const querystring =require('querystring');const server =http.createServer((req, res) => { if (req.method === 'GET' && req.url === '/ping') { res.writeHead(200); res.end('pong'); } else if (req.method === 'POST' && req.url === '/run-batch') { letbody = ''; req.on('data', chunk => {body += chunk.toString(); }); req.on('end', () => {constparsed = querystring.parse(body);constvalue =parsed.value || 'default'; // 値を引数としてバッチに渡す exec(`C:\\Users\\hoge\\Desktop\\makesign.bat "${value}"`, { encoding: 'utf8' }, (err, stdout, stderr) => { if (err) { res.writeHead(500); res.end('Error executing batch: ' + stderr); } else { res.writeHead(200, { 'Content-Type': 'text/plain; charset=utf-8' }); res.end(stdout.trim()); } }); }); } else { res.writeHead(404); res.end('Not found'); }});server.listen(12345, () => {console.log('Batch serverrunningathttp://localhost:12345/');});
@echo offsetlocal enabledelayedexpansion::署名するファイル名set "infile=%~1"set outfile=%TEMP%\pgp_output.asc:: 以前の出力があれば削除if exist "%outfile%" del "%outfile%":signloop::AutoHotkeyでパスフレーズ入力(gpgがパスワード要求するダイアログが出た場合に備える)start "" /b "C:\Users\hoge\Documents\AutoHotkey\autopass.ahk"::PGPクリア署名を作成echo %infile% | gpg --yes --clearsign --output "%outfile%"::署名が成功していればループを抜けるif exist "%outfile%" (goto postprocess) else ( timeout /t 1> nulgoto signloop):postprocesspowershell -nologo -command ^ "$header = '>|'; $footer = '|<'; $body =Get-Content '%outfile%' -Raw;Write-Output ($header + \"`r`n\" + $body + $footer)"powershell -nologo -command ^ "$header = '>|'; $footer = '|<'; $body =Get-Content 'signed.asc' -Raw;Set-Clipboard -Value ($header + \"`r`n\" + $body + $footer)"endlocalexit /b
#Persistent#SingleInstance ignoreSetTitleMatchMode, 2WinWaitActive, pinentrySendInputpasswordSleep 100SendInput {Enter}ExitApp
動けばいいという考えで作っているので余分なコードも含んでいるかもしれない。
-----BEGINPGP SIGNEDMESSAGE-----Hash: SHA512https://anond.hatelabo.jp/20250613185036 -----BEGINPGP SIGNATURE-----iHUEARYKAB0WIQTEe8eLwpVRSViDKR5wMdsubs4+SAUCaEv1FQAKCRBwMdsubs4+SHHkAQDUOLgBcdji2T6MJ7h/vlMdFfGlWAzNdXijjE1gIuEPywEAiMNMZqhrMmtlc7UqRuggNJ/UTa5xTIcKp622+7jJQQg==Lgkl-----ENDPGP SIGNATURE-----