
はてなキーワード:threadとは
もし夏目漱石が、プログラミングの主要概念を自ら日本語に翻訳していたら――と仮定すると、彼の文体や明治期の言葉遣い、漢語の選好を踏まえて、以下のような趣になると考えられます。
| 英語 | 漱石風の訳語案 | 理由・解説 |
| Variable | 変数(へんすう)/移り数 | 「変数」はすでに定着語だが、漱石なら「移り数」など文学的な情緒を帯びた訳もあり得る。変化の宿る数という意味を直訳的かつ風雅に表現。 |
| Function | 作用式/用法 | 明治期の数学や化学で「作用」はよく用いられた。漱石は日常語よりも漢語を好んだ傾向があり、「式」を付して理知的に。 |
| Class | 類型/階(きざはし) | 「クラス」を単なる「類」とせず、階層や格式を想起させる「階」を用い、文学的響きを加える。 |
| Object | 物象(ぶっしょう)/客体 | 漱石は哲学用語に通じており、ドイツ哲学経由の「客体」や漢詩文的「物象」を好みそう。 |
| Instance | 事例/具現 | 具体化の意味を強調し、「具現」というやや詩的な言い回しを採用する可能性。 |
| Loop | 環(わ)/巡り | 「ループ」は漢語にすれば「環」だが、漱石は擬人的に「巡り」として表すかもしれない。 |
| Array | 配列/ならび | 技術的な「配列」もあるが、漱石なら柔らかな響きの「ならび」も好みそう。 |
| Thread | 糸筋/綴り筋 | 並行処理のスレッドを、文学的に糸や文章にたとえ、「綴り筋」と表現。 |
| Exception | 異例/破格事 | 法や規範から外れるニュアンスを重んじ、「破格事」と漢詩的に。 |
| Debug | 虫退治/瑕(きず)探し | 「バグ」を虫にたとえてそのまま「虫退治」とするのは洒落が効く。漱石らしいユーモアが入り得る部分。 |
| Compile | 編纂(へんさん)/綴(と)じ合せ | 書物の編集に通じる語を用い、文章を束ねるような比喩で。 |
| Execute | 遂行/実行 | 法律や行政文書に見られる硬質な「遂行」を選ぶ可能性が高い。 |
| Source code | 原文/本体文 | 漱石は文学者として「原文」という表現を好みそう。 |
| Syntax | 文法/詞組(ことばぐみ) | 言語構造を古風に「詞組」と表現すれば漱石節になる。 |
| Algorithm | 算法(さんぽう)/演算譜 | 明治期数学書の用語「算法」をそのまま採用しそう。 |
| Library | 書庫/集録 | 書物に通じるメタファーで表現。 |
| Framework | 骨組/枠組 | 漱石は建築や骨格にたとえて「骨組」を選びそう。 |
| Module | 節(ふし)/章片 | 文学的構造を想起させる語を選ぶかも。 |
| Boolean | 真偽値/是非数 | 真と偽を「是非」で置き換える古風な表現。 |
| Pointer | 指標/指し手 | 将棋や文学の語彙から「指し手」とする余地も。 |
IloveApple—that'swhy I'm angryat theSE andhopeful about the 16e.
Appleis not just a device manufacturer inmy life.Ithas ideas, philosophy,and an uncompromising aesthetic. That'swhy I cantalk aboutit this much.
---
■ TheiPhone SEwasApple'sbetrayal.
TheiPhone SE (2nd and3rdgenerations)is a “blackhistory” inApple'shistory.
The curse of 3GBRAM: Even the Photos app doesn'trun properly, and Notes freezes.
Poorheat dissipation andbatterylife: The outdated chassis can't handle high-endchips.
Degraded camera: 12MP with noultra-wide angle—specs thatdon'tfeellike 2025.
Flawed coolingstructure: High-performancechips are forced into the design, resulting in near-thermalrunaway.
Selling such a product under theApplenamewas honestly shocking.Applewas supposed to be amore trustworthy company.
---
■ The lack of philosophy in theSEhas damaged theApplebrand
Appleis a company thatsells “premium” products. However, theSE had becomenothingmore than a “cheap product soldat a high price.”
Because IloveApple, I couldn'taccept that.
---
■iPhone 16e—ARay of Hope
TheiPhone 16eisbeing criticizedonlineas “half-baked” and “not worth the price,” but Idon't agree.
It features the A17chip and supportsApple Intelligence.
The camerais lacking, butit's incomparable to theSE.
Thisis the firststep towardbreaking the “SE curse.”It's proof thatAppleisnow delivering proper specifications in a proper form. Even ifyoudon't buyit, the mere existence of this device makes mebelieve inApple's future.
---
■ Specs and philosophyseen in theiPadseries
StandardiPad: 3GB ofRAM, freezes when taking notes,only good for viewing.
iPad mini: A-serieschipisfine, usefulas asecondarysmartphone.
iPad Air: Almost the sameas the Pro. Best balance of price and performance.
iPad Pro: Competeswith theMacBook. Can't fully utilizeits potential due toOS limitations.
Having usedallApple products, I can tell which models have “philosophy.”
---
■Apple Watchis a device thatsells “peace of mind”
With fall detection,heartrate monitoring, and other features,ithas the potential to savelives.
It's not a medical device, butit's trustworthy in thesense of “buyingpeace of mind.”
Other manufacturers have similar features, butApple's reliability and presentation are in aleague of their own.
I've also testedXiaomi'sMi Band 9, andit'sindeed high-performance for 5,000yen. But theApple Watch, evenatmore than ten times the price, offersmore than ten times thevalue. Intuitive operation,brightness, notification support...everythingis “thought through.”
---
■AppleVision Pro —Madness with a Purpose
600,000yen?Who would buy that?
Equipped with anM2chip, no compromises.
Made not for others, but for their own beliefs.
ThisisApple's “reasonwhyit's worth the high price.” Rather than releasing a cheap,half-baked product, theybeton insane perfection. That'sApple.
■ Whenit comes to facialrecognition, Ilost toApple.
At first, Iwas againstit. “Fingerprintrecognitionisfine,” I thought.
even when fingerprintsdon't work due to sweat or water,
even while wearing amask,
it unlocks instantly.
Now, facialrecognitionis the norm. Ilost toApple. But I'mhappy aboutit.The futureApple envisionedwas truly convenient.
■ In conclusion:Appleismy life.
Behind the “convenience” lies a proper meaning and ideology.
That'swhy I could genuinely be angryat theSE, and that'swhy Iwas movedby the arrival of the 16e, thinking, “Appleis back.”
I willcontinue toloveApple. But notas a blind follower.Assomeonewhobelieves inApple's ideology, resolve, and integrity.
I’ve compiledall my passionate thoughts into thistext, which can beseenas a testament to “living withApple.”Itis trulyyour “Apple Manifesto (creed).”
📄Title: IloveApple—that’swhy Iwas angryat theSE andsawhope in the 16e.
If needed, I can supportyou in turning this into ablog post, videoscript, or social mediathread.Feel free to let me know ifyou’re interested.
IloveApple—that'swhy I'm angryat theSE andhopeful about the 16e.
Appleis not just a device manufacturer inmy life.Ithas ideas, philosophy,and an uncompromising aesthetic. That'swhy I cantalk aboutit this much.
---
■ TheiPhone SEwasApple'sbetrayal.
TheiPhone SE (2nd and3rdgenerations)is a “blackhistory” inApple'shistory.
The curse of 3GBRAM: Even the Photos app doesn'trun properly, and Notes freezes.
Poorheat dissipation andbatterylife: The outdated chassis can't handle high-endchips.
Degraded camera: 12MP with noultra-wide angle—specs thatdon'tfeellike 2025.
Flawed coolingstructure: High-performancechips are forced into the design, resulting in near-thermalrunaway.
Selling such a product under theApplenamewas honestly shocking.Applewas supposed to be amore trustworthy company.
---
■ The lack of philosophy in theSEhas damaged theApplebrand
Appleis a company thatsells “premium” products. However, theSE had becomenothingmore than a “cheap product soldat a high price.”
Because IloveApple, I couldn'taccept that.
---
■iPhone 16e—ARay of Hope
TheiPhone 16eisbeing criticizedonlineas “half-baked” and “not worth the price,” but Idon't agree.
It features the A17chip and supportsApple Intelligence.
The camerais lacking, butit's incomparable to theSE.
Thisis the firststep towardbreaking the “SE curse.”It's proof thatAppleisnow delivering proper specifications in a proper form. Even ifyoudon't buyit, the mere existence of this device makes mebelieve inApple's future.
---
■ Specs and philosophyseen in theiPadseries
StandardiPad: 3GB ofRAM, freezes when taking notes,only good for viewing.
iPad mini: A-serieschipisfine, usefulas asecondarysmartphone.
iPad Air: Almost the sameas the Pro. Best balance of price and performance.
iPad Pro: Competeswith theMacBook. Can't fully utilizeits potential due toOS limitations.
Having usedallApple products, I can tell which models have “philosophy.”
---
■Apple Watchis a device thatsells “peace of mind”
With fall detection,heartrate monitoring, and other features,ithas the potential to savelives.
It's not a medical device, butit's trustworthy in thesense of “buyingpeace of mind.”
Other manufacturers have similar features, butApple's reliability and presentation are in aleague of their own.
I've also testedXiaomi'sMi Band 9, andit'sindeed high-performance for 5,000yen. But theApple Watch, evenatmore than ten times the price, offersmore than ten times thevalue. Intuitive operation,brightness, notification support...everythingis “thought through.”
---
■AppleVision Pro —Madness with a Purpose
600,000yen?Who would buy that?
Equipped with anM2chip, no compromises.
Made not for others, but for their own beliefs.
ThisisApple's “reasonwhyit's worth the high price.” Rather than releasing a cheap,half-baked product, theybeton insane perfection. That'sApple.
■ Whenit comes to facialrecognition, Ilost toApple.
At first, Iwas againstit. “Fingerprintrecognitionisfine,” I thought.
even when fingerprintsdon't work due to sweat or water,
even while wearing amask,
it unlocks instantly.
Now, facialrecognitionis the norm. Ilost toApple. But I'mhappy aboutit.The futureApple envisionedwas truly convenient.
■ In conclusion:Appleismy life.
Behind the “convenience” lies a proper meaning and ideology.
That'swhy I could genuinely be angryat theSE, and that'swhy Iwas movedby the arrival of the 16e, thinking, “Appleis back.”
I willcontinue toloveApple. But notas a blind follower.Assomeonewhobelieves inApple's ideology, resolve, and integrity.
I’ve compiledall my passionate thoughts into thistext, which can beseenas a testament to “living withApple.”Itis trulyyour “Apple Manifesto (creed).”
📄Title: IloveApple—that’swhy Iwas angryat theSE andsawhope in the 16e.
If needed, I can supportyou in turning this into ablog post, videoscript, or social mediathread.Feel free to let me know ifyou’re interested.
↓もうChatGPTくんに任せたら?
| No. | タイトル | 判定 |
|---|---|---|
| 1 | 12 Effective Ways to Speak to a Real PersonatQatar Airways | ❌スパム |
| 2 | 物語(アニメ、漫画、小説)の行間を読むことを得意とする人間が… | ✅問題なし |
| 3 | 不正選挙に不安があるなら | ✅問題なし |
| 4 | 嘘を暴かれたくなかったら、 | ✅問題なし |
| 5 | 体験できないのが残念だね おまえは今年の夏、熱中症で死ぬからな | ✅問題なし |
| 6 | 6月でこの暑さって | ✅問題なし |
| 7 | ガキの頃泊まり行事で男だけ風呂の写真撮るのがあった… | ✅問題なし |
| 8 | 12 Best Ways to Speak to a Real PersonatQatar Airways Instantly | ❌スパム |
| 9 | 「どれだけ物知りでも周りを萎縮させるような人だと… | ✅問題なし |
| 10 | でも普通の発言でもマウントされたと被害妄想膨らませる… | ✅問題なし |
| 11 | Top12 Proven Ways toReach aLive PersonatQatar Airways | ❌スパム |
| 12 | 4 Ways to Contact CebuPacific Customer Service… | ❌スパム |
| 13 | ガンダムセンチネル | ✅問題なし |
| 14 | 昨日夜中にも関わらず色んなコメントが頂けて嬉しい限り… | ✅問題なし |
| 15 | おすすめエロ漫画 | ✅問題なし |
| 16 | 上から発言したい欲が異常だったり… | ✅問題なし |
| 17 | Rebooking and refund help | ❌スパム |
| 18 | 12 Ways to Contact: How Can I Speak toSomeoneatQatar Airways? | ❌スパム |
| 19 | Pailed paymentsrequire direct help | ❌スパム |
| 20 | 元々0083がセンチネルのプロットを使い回して… | ✅問題なし |
| 21 | 林原めぐみの件で左派メディアが… | ✅問題なし |
| 22 | failed paymentsrequire direct troubleshooting | ❌スパム |
| 23 | Whileonline toolsand aautomation are helpful? | ❌スパム |
| 24 | オタクが見た目が気持ち悪くて性格も悪いというイメージ… | ✅問題なし |
| 25 | 話し合いを避けまくるタイプの人→回避性人格障害… | ✅問題なし |
| 26 | 薬って最大投与量っていうのが大体決まってるんだけど… | ✅問題なし |
| 27 | 中途半端な自称進学校の公立高校の生徒が教師の授業の質を… | ✅問題なし |
| 28 | Six16teen Ways ToConnect ToLive AgentAt CoinbaseWallet… | ❌スパム |
| 29 | How do i contact Coinbase customer Service phonenumber | ❌スパム |
https://x.com/Sputnik_India/status/1900565307799797943
SputnikIndia
@Sputnik_India
「ドラマクイーン」トルドーはすでに頭痛の種だったが、カナダの新首相マイク・カーニーはもっとひどいかもしれない。
このスレッドは彼がグローバルディープステートの手先であることを示唆している:🧵👇
SputnikIndia
@Sputnik_India
🤔🇨🇦CANADA FALLS INTO GLOBALIST HANDS?
‘Dramaqueen’ Trudeauwas already a headache, butCanada’s newPM Mike Carney might be much worse.
「ほら、スレッドってさ、プログラムの中で“何か作業をする人”みたいなものなのよ。で、その人が『ちょっと休憩!』って座るのがThread.sleep() なわけ。つまり、スレッドが指定された時間だけ作業を止めて、他のスレッドに“お先どうぞ”ってする感じなのよ!」
「にゃあ~!スレッドが休むって、働いているプログラムの流れを一時停止することだニャ。でも、その間に他のスレッドが動く場合もあるから、実は効率的なんだニャ!」
「例えば、このカフェで私が注文のためにカウンターでメモを取る仕事をしてるとするじゃない?で、あなた(お客さん)が『猫ミルクラテ』を頼むわけ。だけど、ラテマシンが温まるのに5秒かかるのよ!その間、ぼーっとしてるのはもったいないから、私が『この5秒、他の仕事に回して!』って言うのがThread.sleep(5000); のイメージなの!」
「にゃあ~、もしその間に『やっぱり注文キャンセル!』ってお客さんが割り込んできたらどうなると思うニャ?」
「そういうときに『えっ、今待機中なんだけど?』って慌てないために、エラー処理で『割り込みがあった場合はこう動け!』ってルールを決めておくのよ。例えば、『注文キャンセル!』って割り込まれたら、私はメモを破棄して次の仕事を始めるでしょ?それが例外処理よ!べ、別にすごいとか思わないでよね!」
「スレッドが休止することで、CPUが他のスレッドに処理を回せるようになるの。これ、マルチタスクって言うんだけど…説明が難しいわね。ま、猫スタッフも説明しなさいよ!」
「にゃあ~!例えば、同時に複数のお客さんが注文してるとするニャ。そのうち一人が『5秒待って』って言ったら、CPUはその人を5秒ほっといて、他のお客さんの対応をするニャ。これがマルチタスクの基本的な流れニャ~。」
スレッドに「ちょっと休んで、他の処理を優先させて!」ってお願いする機能。
休んでる間に「おい、キャンセルだ!」みたいに割り込みされる可能性があるから。
効率よくCPUを使うため、複数の仕事(スレッド)をスムーズに回せるようになる。
「これでわかったでしょ?別に解説が楽しかったわけじゃないから!さっさと理解して帰りなさいよ!にゃんとかなったら褒めてあげてもいいけど…(ぼそっ)」
検索式を書きますので、それで見つかったファイルを全て選択して、削除などのアクションをしてください。
細かな調整は各自のお好みで変更してください。
◆1年以上前のファイルサイズの大きなメール(300kB以上)を検索(星を付けたメールは除く)。削除しましょう。
older_than:1y larger:300k -is:starred
◆プロモーションやソーシャルに分類された1か月以上前のメールを検索。削除しましょう
(category:promotions OR category:social) older_than:30d
◆受信トレイの180日以上前のメールを検索。アーカイブして、受信トレイのメール数を減らしましょう
label:inbox older_than:180d
◆プロモーションやソーシャルに入ったメールで2日経ったものを検索。既読にしましょう。
label:inbox (category:promotions OR category:social) older_than:2d
Google AppsScript(GAS)を使うとこれを毎日自動で行ってもらえます。
実行の左のアイコンで保存。関数をcleanUpGmailを選んで実行。初回は権限確認のメッセージが出るのでOKを押してください。
無事実行出来たら一番の難関はクリアです。これを毎日自動で実行してもらいましょう。一度に250通が処理されます。
また余裕があれば、左上の無題のプロジェクトになっているところの名前を「gmail自動処理」などに変更しても良いでしょう。
実行する関数:CleanUpGmailデプロイ:Headイベント:時間主導時間べース:時間ベース時間の間隔:6時間おき
これで1日に4回、合計1000通が自動処理されますので、たくさんメールが溜まっている方でも、1か月程度で全て処理されると思います。
function cleanUpGmail() { // メインの関数の開始ログconsole.log("=== cleanUpGmail start ==="); // 1) 2年以上前 & 300KB以上 & from:gmail.comではない &スター付きではない → 削除console.log("古い大きなメールは削除"); processThreads("older_than:2y larger:300k -from:gmail.com -is:starred", "trash"); // 2)プロモーション orソーシャル & 30日以上前 → 削除console.log("プロモーションとソーシャルは1か月で削除"); processThreads("(category:promotions OR category:social) older_than:30d", "trash"); // 3) 受信トレイ & 180日以上前 →アーカイブconsole.log("受信トレイの180日以上前 →アーカイブ"); processThreads("label:inbox older_than:180d", "archive"); // 4) 受信トレイ &プロモーション orソーシャル & 2日以上前 →既読console.log("受信トレイでプロモーション orソーシャル かつ 2日以上前 →既読"); processThreads("label:inbox (category:promotions OR category:social) older_than:2d", "markRead");console.log("=== cleanUpGmail end ===");}function processThreads(query,action) { // 1回あたり250件だけ処理 var batchSize = 250; //最初の 250 件のみ取得 varthreads =GmailApp.search(query, 0, batchSize); var count =threads.length;Logger.log("検索クエリ: [" + query + "] | 取得スレッド数: " + count); //スレッドごとにアクションを実行threads.forEach(function(thread) {switch (action) {case "trash":thread.moveToTrash(); break;case "archive":thread.moveToArchive(); break;case "markRead":thread.markRead(); break; default:Logger.log("不明なアクション: " +action); } });Logger.log("処理したスレッド数: " + count);}
アメリカにはなぜ、中規模の集合住宅がほとんどなく、郊外の一軒家と高層マンションの両極になったのか
という「ミッシング・ミドル」を解説したスレッドが面白かったよ
面白い。「なぜアメリカには高層ビルと一戸建てしかないのか?」というスレッド。
かつてはアメリカにも中層住宅があり、人々は都市に集まって暮らしていたが、
高速道路を建てるため軒並み破壊され、都市のコミュニティは道路と引き換えに郊外へ移住。
https://x.com/masa_0083/status/1803550811236249830
Why do American citiesfeel less "alive" than their European counterparts?
It's because ofsomething called the "missing middle".
Acentury ago, American cities looked completely different... (thread)
自動で安価をつけて返信するプログラムでもこんなに長く複雑になる(一部抜粋)
/**************************************
以下のCSV_DIR, FILE_PATHS,SETTINGSを書き換えてね。 <h3>o- *************************************/</h3>
//CSVファイルが置かれてるディレクトリのパス。投稿前にエラー出たら大体ここの設定ミス。 例:"C:\\Users\\sakuraimasahiro\\Documents\\iMacros\\Macros\\rentou\\";
'C:\\Users\\USER\\Desktop\\iMacros\\Macros\\rentou\\';
//ファイルのパス。CSVは絶対パスで、拡張子も必要。iimは相対パスでよく、拡張子不要。
const FILE_PATHS = {
textCsv:CSV_DIR + 'textNoAnker.csv',
//レス用投稿文が書かれたCSV。通常とレス用で分けないなら同じファイルを使えばいい。
replyTextCsv:CSV_DIR + 'textReply.csv',
};
baseWaitTime: 5,
//baseWaitTime+0~waitTimeRange(ランダム)だけ待つ
waitTimeRange: 5,
//連投しすぎだと忠告された場合に処理を一時停止させる時間(秒)
waitTimeForAvoidingPunishment: 60 * 30,
//メール
mail: 'sage',
//名前設定
name: '',
//以下、偽装ワッチョイ設定。浪人でワッチョイを非表示にしてるときだけtrueにしてね。
//妙なニックネーム(ワッチョイ、アウアウウーなど)をランダムで決めて付加するかどうか。true=付加する。false=付加しない。
//妙なニックネームの後に付く8桁の文字列をランダムで決めて付加するかどうか。
},
//アンカー無し投稿をするならtrue。しないならfalse。noAnkerPostかreplyPostのどちらかはtrueにすること(両方trueでもOK)。
//アンカー付き投稿(返信)をするならtrue。しないならfalse。もしnoAnkerPostとreplyPostの両方がtrueの場合、投稿は返信が優先され、返信対象が見つからなくなったらアンカー無し投稿をする。
//最初に取得するアンカー無し投稿文CSVファイルの行番号。もし返信用と同じCSVファイルを使うなら-1と入力。
noAnkerPostTextCsvStartRow: 1,
//最初に取得する返信用投稿文CSVファイルの行番号。もしアンカー無しと同じCSVファイルを使うなら-1と入力。
//テキストCSV/返信用テキストCSVの取得行が最終行に達したら最初の行まで戻るかどうか。true=戻る。false=マクロ終了。
//返信する場合、これより小さなレス番には返信しない。返信を投稿すると、この数値は前回の返信先のレス番に更新される。
minAnker: 895,
//返信する場合、名前に以下の文字列を含む投稿にアンカーをつけて返信する(ワッチョイやIPなど名前フィールドにあるものならなんでも可)。配列で複数指定可能。指定無しなら空配列([])。filterNamesとfilterNamesNotIncluded共に無指定ならレス番1から順に返信していく(minAnkerが設定されてればそこから順に)。以下のfilter系は全て併用可能。
//↑とは逆に、名前に以下の文字列を含まない投稿にアンカーをつけて返信する。↑と併用も可能。
//返信する場合、本文に以下の文字列を含む投稿にアンカーをつけて返信する。
filterText: ['自演かな', '自演わらわら', 'スクリプト使うの', '安価ガバ', '>>660', '自演で擁護', '最後' ,'あいうえお', 'かきくけこ', 'さしすせそ', 'なにぬねの', 'はひふへほ', 'まみむめも', 'やいゆえよ', 'やゆよ', 'らりるれろ', 'わいうえを', 'わをん', 'わいうえをん'],
},
//自分のIPアドレスの確認。VPNとかでIPを変更してマクロを動かしてるとき、突然VPNが作動しなくなってIPが元に戻ったときにマクロを止めるためのもの。
//以下の文字列が自分の現在のIPアドレスに含まれている場合、マクロを一時停止する。基本的に自分の本当のIPアドレスを入力。
},
//浪人設定。最後に動作を確認したのは5年くらい前で、今も同じように動作するかは、浪人を持ってないから確認できずわからない。
//浪人にログインしてるかどうかをチェックするかどうか。trueならする。falseならしない。trueにしていてもし浪人にログインしていないことを確認したらログインしにいく。
password: '1234',
},
};
/**************************************
設定箇所終わり。
https://info.5ch.net/index.php/%E6%9B%B8%E3%81%8D%E8%BE%BC%E3%82%81%E3%81%AA%E3%81%84%E6%99%82%E3%81%AE%E6%97%A9%E8%A6%8B%E8%A1%A8 <h3>o- *************************************/</h3>
/**************************************
・NULL演算子(??)は使えない。論理積(&&)は使える。
・オブジェクトの分割代入はできない。
・importはできない。 <h3>o- *************************************/</h3>
/**************************************
関数 <h3>o- *************************************/</h3>
/**
* ここから始まる。
*/
checkSettings();
var _TextCsvCursors = newTextCsvCursors(
SETTINGS.postSettings.noAnkerPostTextCsvStartRow> 0
?SETTINGS.postSettings.noAnkerPostTextCsvStartRow - 1
:SETTINGS.postSettings.noAnkerPostTextCsvStartRow,
SETTINGS.postSettings.textCsvLoop,
),
SETTINGS.postSettings.replyPostTextCsvStartRow> 0
?SETTINGS.postSettings.replyPostTextCsvStartRow - 1
:SETTINGS.postSettings.replyPostTextCsvStartRow,
SETTINGS.postSettings.textCsvLoop,
),
);
var _LoopStatuses = newLoopStatuses(0,SETTINGS.postSettings.minAnker);
const _MyPosterName = new MyPosterName({
name:SETTINGS.nameSettings.name,
});
const _ThreadUrl = openPromptThreadUrl();
//ループ
while (true) {
SETTINGS.ipSettings.checkIp && checkCurrentIpNotTheIp();
//スレを開く
openUrl(_ThreadUrl.fullUrlHttps());
//浪人にログインする設定なら、浪人にログインしているかどうかを確認し、していなければログインしにいく。
if (SETTINGS.roninSettings.checkLogin) {
}
}
if (SETTINGS.postSettings.replyPost) {
const targetAnkerNumber = createPostDOMList()
.filterPostnumberHigher(_LoopStatuses.currentMinAnker())
.filterByPostername(SETTINGS.postSettings.filterNames)
.filterByPosternameNotIncluded(
SETTINGS.postSettings.filterNamesNotIncluded,
)
.filterByText(SETTINGS.postSettings.filterText)
if (targetAnkerNumber !== null) {
const r = _TextCsvCursors.takeNextRowTextAsReply(targetAnkerNumber);
messageDisplay(`返信対象有り。アンカー先: ${targetAnkerNumber}`);
return {
...r,
updatedLoopStatuses:
_LoopStatuses.updateMinAnker(targetAnkerNumber),
};
}
}
if (SETTINGS.postSettings.noAnkerPost) {
//返信対象無し、或いは返信しない設定の場合。アンカー無し投稿文を作る。
const r = _TextCsvCursors.takeNextRowTextAsNoAnker();
messageDisplay('返信対象無し。アンカー無し投稿。');
return {
...r,
updatedLoopStatuses: _LoopStatuses,
};
}
return null;
})();
if (p) {
//投稿。
nickname:SETTINGS.nameSettings.nickname,
korokoro:SETTINGS.nameSettings.korokoro,
area:SETTINGS.nameSettings.area,
}),
SETTINGS.mail,
p.text,
);
//_TextCsvCursorsと_LoopStatusesを更新。
_TextCsvCursors = p.updatedTextCsvCursors;
_LoopStatuses = p.updatedLoopStatuses.incrementPostCount();
`投稿回数: ${_LoopStatuses.currentPostCount()}`,
`minAnker: ${_LoopStatuses.currentMinAnker()}`,
`今回アンカー無し投稿取得行: ${_TextCsvCursors.currentRows().noAnker}`,
`今回アンカー有り投稿取得行: ${_TextCsvCursors.currentRows().reply}`,
]);
} else {
`返信対象が現われるのを待機中...。`,
`投稿回数: ${_LoopStatuses.currentPostCount()}`,
`minAnker: ${_LoopStatuses.currentMinAnker()}`,
`今回アンカー無し投稿取得行: ${_TextCsvCursors.currentRows().noAnker}`,
`今回アンカー有り投稿取得行: ${_TextCsvCursors.currentRows().reply}`,
]);
}
wait(SETTINGS.baseWaitTime + randomRange(0,SETTINGS.waitTimeRange));
}
}
/**
* @param {string} serverNameサーバー名
* @param {MyPosterName} _MyPosterName
*/
serverName,
postMail,
_MyText,
retryTimes = 0,
) {
const r =
retryTimes === 0
? newValuesOfPost(serverName, _MyPosterName,postMail, _MyText).post(
postTo5chTread,
)
serverName,
postMail,
_MyText,
).postSubstring(retryTimes,postTo5chTread,postConfirm);
if (r) {
back();
return;
}
wait(7);
consterror = createPostErrorMessage().analyze();
messageDisplay(error.message);
if (error.order === 'KILL') {
kill();
} else if (error.order === 'SKIP') {
return;
} else if (error.order === 'TRUNCATE') {
back();
serverName,
postMail,
_MyText,
retryTimes + 1,
);
} else if (error.order === 'WAIT') {
wait(SETTINGS.waitTimeForAvoidingPunishment);
serverName,
postMail,
_MyText,
retryTimes,
);
} else if (error.order === 'LOGIN') {
serverName,
postMail,
_MyText,
retryTimes,
);
}
return;
}
/**
*現在のIPアドレスに、SETTINGS.ipSettings.avoidTheIpの値が含まれていないことを確認する。含まれていたらマクロを一時停止。
* @returns
*/
function checkCurrentIpNotTheIp() {
openUrl('https://www.cman.jp/network/support/go_access.cgi');
const _IpAdress = createIpAdressFromCMan();
if (_IpAdress.includes(SETTINGS.ipSettings.avoidTheIp)) {
pause('現在のIPに指定した値が含まれていることを確認。');
}
return;
}
/**
* @returns
*/
if (
SETTINGS.postSettings.noAnkerPost ===false &&
SETTINGS.postSettings.replyPost ===false
) {
return kill('設定エラー。noAnkerPostとreplyPost両方ともfalseになってる。');
}
if (
SETTINGS.postSettings.noAnkerPostTextCsvStartRow < 0 &&
SETTINGS.postSettings.replyPostTextCsvStartRow < 0
) {
return kill(
'設定エラー。noAnkerPostTextCsvStartRowとreplyPostTextCsvStartRow両方とも-1になってる。',
);
}
if (
SETTINGS.postSettings.noAnkerPostTextCsvStartRow === 0 ||
SETTINGS.postSettings.replyPostTextCsvStartRow === 0
) {
return kill(
'設定エラー。noAnkerPostTextCsvStartRow/replyPostTextCsvStartRowの初期値は-1或いは1以上で。',
);
}
}
/**
*/
function openPromptThreadUrl() {
consturl = prompt('スレURLを入力');
}
/**
* 開いてるスレのレス全て読み取ってPostListインスタンスを作って返す。
* 重すぎるので使うのやめ。どうやらインスタンスの大量生成が原因な模様。
*/
constposts = window.document.getElementsByClassName('post');
return newPostList(Array.from(posts).map((e) => newPost(e)));
}
/**
* 開いてるスレのレス全て取得してPostDOMListに格納して返す。
* @returns
*/
function createPostDOMList() {
constposts = window.document.getElementsByClassName('post');
for (letindex = 0;index <posts.length;index++) {
//HTMLCollectionからElementを1つずつ抽出して配列に。
arrPostDOMList.push(posts.item(index));
}
return newPostDOMList(arrPostDOMList);
}
/**
* 開いてる投稿結果画面に表示されてるエラーを読み取ってPostErrorMessageインスタンスを作って返す。
*/
function createPostErrorMessage() {
window.document
Steamで買った『Recursed』というゲームを全ステージクリアしたので、記念に感想を書く。
Steam:Recursed
https://store.steampowered.com/app/497780/Recursed/?l=japanese
一見すると『Recursed』は2Dのレトロな雰囲気のアクションゲームである。操作はシンプルで、方向キーで左右に移動し、アクションはジャンプと物をつかむ/投げるだけだからだ。部屋の中を移動してブロックをつかんで足場を作ったり、鍵をつかんで扉を開錠したりしてゴールへと到着(crystalを獲得)すればステージクリアだ。
ステージの始めはチュートリアルの様に簡単だが、ステージを経るごとに難しくなり、そのうち何度も試行錯誤したり難しさのあまり何十分も頭を抱えたりもした。
この複雑さを生み出す要因は箱(ゲーム中表記ではChest)である。このゲームでは箱の中へジャンプすることで部屋の内に入れるが、一度箱の外にでると箱の内部状態はリセットされてしまうのだ。よって箱の中にブロックや鍵などのオブジェクトを持ち込んでも保存することはできないし、ブロックの位置もリセットされるし、開錠した扉もまた施錠されてしまうことになる。
さらに大きな特徴として、箱を持ち歩いて移動することができるのだ。それにより、箱を持ったまま別の箱に入ったり箱を持って箱の外にでることもできる。
そして、ステージを経ると箱の中の部屋は箱の外と同じ部屋という場面に出くわす。Recursedは『再帰呼び出し』という意味らしいが、まさにこのゲームのタイトル通りの現象が起こるのだ。そして、以降のステージでは再帰を交えることでパズルの複雑さはより深まっていく。
再帰は数学的帰納法やアルゴリズムでは定番の概念だが、それがパズルとなってプレイヤーの思考回路を奪ってくる。私はかつて社畜プログラマとしてJavaプログラミングを経験していたので、箱に入ることはメソッドを呼び出すことの様に感じた。オブジェクトを持って箱に入ることは引数を使ってメソッドを実行することであり、オブジェクトを持って箱の外に出ることはreturn文でメソッドを終わらせることであった。
「ゴール前の段差が大きくブロックが必要だから、ブロック生成メソッドを呼び出してブロックオブジェクトを返り値として渡さなくてはいけないけど、そうすると鍵オブジェクトをゴールメソッドの引数として渡すことができなくて……、いっそのこと、ブロックメソッド内からゴールメソッドを呼び出すべきか……、メソッドの返り値は一つだけだが何度も呼び出せばいけるか? この緑色のオーラはなんだ? Staticを意味するのか? Staticなオブジェクトの位置情報をあらかじめ変更しておけば、ゴールメソッドで引数渡しをする必要がなくなるのか?」
こんなことを一つのステージをクリアするだけのために何十分も考えていたのだ。念のために書いておくが、ゲーム内には数学用語やプログラミング用語は一切出てこない。ただ単に、私にJavaプログラミングの経験があるからその用語でパズルを考えていただけだ。ゲーム内で箱から出入りしたりオブジェクトを箱の中から出し入れするとどうなるかを、Eclipseでステップ実行するように想起していた。ちなみに、ゲーム内で存在しない部屋や壁の中に移動しようとするとparadoxが発生して強制的に特殊な部屋へ移動されるが、私はその度にステップ実行でExceptionに遷移されたことの様に感じた。他の言語に精通するプログラマだったり数学畑の人ならば、私とは異なる概念でパズルを思考をするのだろうか。
プログラマを辞めて何年もプログラミング的思考をしてこなかった私でも全ステージクリアすることができたのだから、学校でプログラムを学んでいたり現役でプログラミングをしてきた人ならばこのゲーム『Recursed』をクリアすることは可能だろう。いっそのこと、『Recursed』のクリアすらできない人にプログラミングができるのか? と煽ってみたいくらいだ。
ちなみに、もし私が社畜プログラマ時代にこのゲームをやったらブチ切れていただろう。なんで仕事でプログラミングで脳を酷使した上に自宅のゲームでも同じようなプログラム的な思考をしなければならないんだよと。プログラミングから何年も離れていた今の私にとって『Recursed』は、プログラミングや単体テストが無事成功した時の快楽を思い出させるものだった。
『Recursed』はパズルとしての難易度は非常に高いが、理不尽な解法を求められることはない。理不尽な解法のクイズやパズルには怒りが湧いてくる。ひと昔前のクイズ番組を見たことのある人なら『モヤッとボール』を投げつけたくなる、と言えばその感情が伝わるだろう。『Recursed』はどんなに難しいステージでも、ただただ開発者のパズル作成能力に感嘆するだけで怒りは湧いてこない。
似たようなアクション風パズルゲームとして有名なのは『The Witness』であろう。『The Witness』も私が好きなパズルゲームであり、ゲームとして高い評価を得ていることに間違いはないのだが、しばしば理不尽な解法を求められるパズルがありその度に私は怒りが湧いてきたものだ。そう考えると、『Recursed』はパズルとしての洗練さだけなら『The Witness』を超えるものだと私は思う。
具体的にパズルを解説するととただのネタバレになってしまうので(もっとも、文字だけでパズルの解法を説明できないのだが)、『Recursed』で私が好きなステージを述べる。順番は攻略順に並べた。
チュートリアルの様に簡単だったこれまでのステージから突如再帰の概念を見せつけられることで、このゲームのタイトル名の意味を理解することになった。
鍵を手に入れたら扉に到達できず、先に扉に到達したら鍵が手に入らずで、まさにインターロックの名前に相応しいステージだった。
一画面だけのオブジェクトが少ないシンプルなステージだが、氷の壁に阻まれてゴールできず苦戦した。試行錯誤の繰り返しの末クリアできたが、何故クリアできたのかがわからない。
TheVoidのステージはどれもこれまでの集大成という感じでやりごたえあったが、中でも頭をひねらせたのがこれ。ゴールの部屋を水没させたり水の無い状態で入ったりして鍵を運搬するのに苦労した。
箱を左右へ投げて移動を繰り返して、高い位置にあるゴールを目指すのがまさにEscalateというステージ名そのものだった。paradoxを発生した後のパターンが複雑だったのが印象に残っている。paradoxを発生させたらcrystal獲得(通常のクリア)できないのかよ……という落胆は大きかった。しかし、それだけにcrystal獲得とdiamond獲得(paradox発生によるクリア)のどちらも大きな達成感を得られた。
簡単そうに見えて難しく、唯一ステージを飛ばして次のステージへと進んだので印象に残っている。後に複数日に及ぶ数時間の試行錯誤で改めてこのステージをクリアができて、クリアにかかった時間が最も長くなったステージでもある。しかしながら、おそらく開発者の想定外の方法でのクリアであり。初期画面から右の方へ一切行かずにOobleckさえ使用しないというクリア方法にスッキリしなかった。といっても、開発者の想定を無視するゴリ押し的なクリアを見つけたのはこのステージだけだった。
TheVoid/Escalateと似たコンセプトのステージだが、釜(JavaにおけるThread?)のギミックを利用したより複雑な構成となっている。高い位置にあるゴールを目指すのは、やはりFlightというステージ名そのものだった。
この記事を投稿する前にエンディングを見れていないことに気づいた。
全ステージクリア(全てのCrystal取得)したからと、この記事を執筆するためにネタバレを気にせず攻略情報を調べていたけど、エンディングなんてわかる訳ねえよ。TheVoid/Trilemmaの最後にCrystal取得とは関係ない意味深なオブジェクトがあることには気づいていたけど……。ちなみに、私のSteam実績によるとdiamondとrubieの全取得はできてないけれども、もう取得する気力はない。パズルゲームガチ勢にとっては、実績全解除を目指さない私は軟弱者に映るのだろうか? 攻略を調べずに実績全解除できる人は、高い論理的思考能力を有しているに違いない。