はてなキーワード: 数字とは
最近DALL・E2やmidjourneyなどの高性能お絵描きAIが一般公開されて「AIと創作」というトピックがかなりTLを賑わせている。
一方ニコニコでは、去年の暮れ頃から「AI拓也」という淫夢派生のコンテンツが安定した人気を得ている。
扱っている題材がガチで倫理的に終わっているので気になる人は勝手に調べてくれって感じだが、簡単に言うとAIのべりすとを活用して、拓也というAV男優のブログの特徴的な文体を模倣しつつ様々な短編を生成するコンテンツだ。
この最悪なコンテンツは「AIと創作」というトピックに関してそこそこの知見を与えてくれるような気がするので、現在AI拓也界隈で使われている手法について簡単にだがまとめてみる。
なお、俺はAI技術に関しては完全に門外漢なので技術のところは信用しないで欲しい。
AIが参照する学習データを偏らせることで、文体を模倣することが出来る。
これはAIのべりすとではMOD機能として実装されており、太宰治や村上春樹などがプリセットとして用意されている。
お絵描きAIでも「油画風」とすればそれっぽいのが出てくる。AI拓也ではブログを大量に学習させたMODを使用することが半ばデファクトスタンダードになっている。
AIの文章生成は、多分人間が理解している意味内容からの推論ではないのだと思う。そのため、突飛な表現が頻出する。これは多分緊張と緩和みたいな話?(よく知らん)
文章の意味は理解できるが内容の意味がわからんという齟齬が面白いんだと思う。
AIのべりすとは数字が本当に苦手らしい。そのため、〜なもの3選!とか言って平気で4とか5とか続けてくる。
これと突飛な表現を掛け合わせることで意味は分かるが脈絡のない項目が無限に生成できる。これはAI拓也界隈では「松本人志現象」という謎の名称が当てられていてかなりウケている。
AIが望み通りの結果を出力してくれることは稀である。そのために数をこなすことで望みの結果を得ようとしている。恐らくAI拓也もバズってるAIイラストもそれなりの試行回数を重ねた上でのものだと思う。
また、リセマラの過程自体が突飛で面白いものもある。何度やっても主人公が死ぬ結末になる天丼ネタなど、不謹慎ではあるが面白い。
そこで、より望みの結果を出力するためにAIに与える情報を上手くコントロールすることでより望みの結果に近づける確率が上がる。
AI拓也界隈では、語尾の設定を霧雨魔理沙にすることで元ブログに特有の〜だぜ口調を導入するとか、「Wikipediaより」と記入することで地の文を真面目にしつつ内容を突飛なものにすることでより面白い文章を生成している。
また、適宜人力による修正を加えることで方向性を調整することもある。(更には、人力による修正をAIのボケに対するツッコミと捉えて1つのウケに昇華しているものもある。こういう発想できる人がAIを使うのが上手い人だと思う)
先日「AAAゲームのスクショの方が母数が多いからそっち指定した方がより雰囲気似るよね」という趣旨のツイートがバズってたが、多分仕組みとしては同じ。
AI生成コンテンツはここが1番作者のセンスによる部分が大きい。黎明期である現在では、小技は知見として広く共有されているが、時代が下るにつれ属人性が高まったり、小技の価値が高まって情報商材としてやりとりされたりするんじゃないかなと思ってる。
ここも作者の手による部分がかなり大きい。
AI拓也は画面には基本的に文字しか表示されない。そのため、視聴者は読み上げボイスを無視して先を読むことが出来る。
適当な作者は生成した文章をそのまま貼り付けて音声をあてて投稿していることが多いが、再生数の多い動画では笑いどころとなる部分を意図的に表示させなかったり、読み上げ直前で文章を変えるなど、見せ方に創意工夫が見られる。
お絵描き界隈にはまだ見られないが、展示とかインスタレーションみたいなより規模がでかい話になるとこの辺の話も大事になってきそう。
未だにニコニコで淫夢動画を見ているやつなんて本当にひと握りなので、コミュニティがかなりクローズドなものになっている。
そして投稿される動画はさらに少ないので、伸びてる動画はみんな見ているのが前提になっている。
そのため、動画Aでの面白要素が別の投稿者による動画Bでも参照されることが多々ある。「松本人志現象」のような語録の形成はまさにコミュニティの形成によるものだ。
コンテンツの多様化みたいな話があるが、AIは無限にコンテンツを作ってくれるのでさらに多様化が進むと思う。例えばマイナーCPのBL創作界隈とかで、界隈の小説を参照させることで理論上は無限の供給が可能になる。お絵描きAIでも、特定のモチーフによるコミュニティが形成されたりするかもしれない。
以上簡単に述べた。多分もうちょっと丁寧に検討したらよりAI創作一般に拡張できる理論みたいなものが見えてくるのかもしれないが、俺にその能力は無いので誰かに任せる。
が衝撃的な感じで話題にされてたけど、個人的には妥当な数字の気がする。
逆に7割デート経験があるって結果だったら、みんなそんなリア充だったの?彼女いないで男とばかり連んでたのは俺の周囲だけ?って感じになるわ。
アルファオス、ベータオスのn=1、女から見た恋愛経験がネット上に記載
(https://anond.hatelabo.jp/20220805003819 など)される
↓
と突き放すことによって精神的安定を得ようとする。
なぜなら、非モテ男が非モテである理由が公正でないとストレスを感じてしまうため。
いわゆる公正世界仮説ですね。
恋愛経験談を見る度に条件反射で非モテ男を叩くようになっていく。
そう、PUAですね。
こんなにバズる予定じゃなかった
この努力の方向性は合ってるし言語化も腑に落ちるけど「[…]付き合うまでセックスはさせない女は、自己中気質だったり[…]」が引っかかる。女への恋愛指南としては「付き合うまで突き合うな」が鉄則だったりするし。
流石に文脈を端折りすぎたので追記。要はホテル行きますか?と打診して部屋までついてきておいて、お互いのために付き合うまでしません!と断る人をさしています。
打診しているときにこちらの性欲ギンギンなのは否定しませんが、嫌なら嫌と断るべきですし、断れずについてきてしまった人のテンションくらいは慮れますよ
増田は服を脱がすタイミングとか、オーラルとか、ノンバーバルのコミュニケーション全て含めてセックスだと思っているので、エロいこと全否定ではなくABCのここまではいいよと互いに歩み寄るコミュニケーションもできるのではないかな?と思うだけです。
特にパートナーとはいえ赤の他人にマイルールを遵守させようとする姿勢は、ことある意思決定のたびに突きつけてきそうだなと予感させるに十分かと思います。
互いにある程度の信頼関係があるうえで、ワンナイトをしてくれる女性は難しい文脈も汲み取ってくれる女の子が多い印象を持っている
ただセックスって互いの素を知るチャンスでもあると思っていて、オーガズムに達することが目的ではないと思います。
尋常じゃないくらい床上手なんだけどこの子昔苦労したのかしら?あるいは彼氏さんのことめちゃくちゃ好きだったのかな、好きな人にこれだけ尽くせるって素敵だなとか。
あるいはおとなしい子かと思ったら結構感情が激しそうなので、不満を溜め込むタイプに見えるから定期的にガス抜きが必要そうだな、とか。
逆に増田も若かりし頃今思えばセックス中の立ち回りを相手に吟味されていたんだなと思う経験があり、なんて大人な恋愛なんだと憧れて真似しています。
ドがつくほどの偏見ですね
これは増田の好みですが、性的な接触に頼らず素を開示しようとする姿勢が見えると大人の女性だなと思いますし、体に頼らずコミュニケーションを取りたくなります。
自分がどう思っているかをそれとなく伝えてくれたり、頑固だよとか、こう言う喧嘩したことあるよとか伝えてくれると信頼を感じます。
増田のようなアスペ人は対人関係に怯えています。あなたと会話をすることは苦じゃありません、嬉しいです。を伝えてくれるだけで救われるちょろい存在です。
言葉の端々にまだ女見下してるフシあってクズいけどもっと酷い輩がネットには多いので進歩として許容する感じで褒める人も出るんだと思う。1年持たずに飽きて捨てるか捨てられた後で今のクズさを自覚するの繰り返し
同様に増田ことアスペは対人関係に怯えているので、今思えば防衛行動として妬みや見下しをすることで心を守っていたのかなと思います。
正直増田も昔はドがつくほどの味噌だったのは否定しませんし、多くの人に指摘されている点は正しいです。クラッシャーしてきた人々への申し訳なさは一生残ります。
ただきちんと自分が好きになれる人ができると、そういう防御衝動は減るもんだと思います。世の苦しんでいる人々はみんなパートナー作ろう。頑張って
決して短くも楽しくもない努力の果てに孤独から脱却することができたので、色々思い出しながら書いていく。
当然のごとく彼女いない歴=ほぼ年齢
地方の貧乏家庭出身で単身上京、金も人脈もない0からのスタート
彼女ができるまでの期間はおおよそ5年
彼女ができるまでに告白した人数多分20くらい、出会った数40くらい
ファッションの改善(服装、髪型、眉)をしてカッコよくなることへの恐怖から脱却すること
恋愛関係抜きで女性と交流する機会を設ける(趣味など)ことで女性の解像度を上げること
マッチングアプリや街コンでいろんな女性と出会うことで意中のタイプを言語化
女に自分の価値を認めさせられれば、どれだけのマイナスがあっても一定の理解はしてくれる。
増田はいわゆる加害性の塊である。とにかく彼女が欲しかったのでひたすらアタックし続けた。
既存のコミュニティを破壊しまくったし、こちらに敵意がなければほぼ全ての知り合いの女に特攻した
自分がモテないのはダサくて出会う試行回数が少ないからだ=ファッションを磨いてアタックしまくればいつかは付き合えると思っていた
増田のようなアスペアタッカーではなかなか上手くいかないのはわかっていたけど、それでも孤独に耐えられるわけではないし、試行回数理論を信じるしかなかった。
でもちょっとくらいは、いつか理解のある彼女ちゃんが現れて救ってくれるんじゃないかと期待していた。
非モテのほとんどが肌で感じていると思うけど、我々男のそばに理解のある彼女ちゃんは絶対100%確実に生えてこない
不細工とか金がないとかトークが面白くないとかそれらしい理由は色々思いつくと思うんだけど、
女は「女性の解像度が低い人間に愛情を持たない」のに対し、男は「ヤレる女に愛情を持つことがある」というのが増田の考え
うざい言い回しをすると女は心でセックスをし、男は体でセックスをする。
女の発達障害持ちは穴モテの果てに男が愛情を持ってくれることはある。男は女体さえあればセックスができるし、好きでもない女にも勃つ。
一方で女は、女をわかってない男を嫌悪の対象としてそもそも近づいてこない。
AV女優の深田えいみも言っているけど、女がセックスをするときには体の快楽よりも目線や献身の気持ちに興奮する。
女性の解像度が低い非モテはセックスができない(=互いに理解し合うコミュニケーションを取れない)と判断され、そもそもパーソナルスペースに入ってこない・
というのが理解のある彼女ちゃんが存在しない仕組みなんじゃないかなと思っている
実際彼女ちゃんとセックスをしていて思うのだが、セックスってただ肉欲をぶつけるだけじゃない
無言の中でお互いに何をしてほしいか探り合う献身のコミュニケーションは確かにある。
そんなにカッコよくもセンス良くもないのに彼女が尽きない男を嫌というほど見てきたけど、そういう連中はとにかく女性のことをよく知っている。
ポジティブな方向だと、女の子にどういうことをすれば喜ぶかを常に考える。自分の性格が刺さるタイプの女の子を絞って口説いている。一言で言うとキザを通す立ち回りでモテてる男。この立ち回りは自己肯定感が低い女の子には良く刺さるけど、容姿の整った女の子相手の場合はある程度自分の容姿も整っていないといけない印象がある。
ネガティヴな方向だと、ドロドロした人間関係を把握してコミュニティの解像度を上げる、それこそ男や女のタイプを即時に把握して会話のネタにできる力。相対的に自分に力があるように見せる(マイナスを見せない)ような立ち回り。いわゆるノンバーバルが強いアルファ気質の男がよくやってる。自分の価値をわかってる若い女の子やモテる女の子はこのタイプの口説きにめっぽう弱い印象がある。一方で陰キャ寄りの子や真面目な子は恐怖して近寄りにくい気がする。
ともあれ、こうした自分の強みを理解して、うまく特攻の効く女性を口説けている男は諸々見た目や金銭で劣っていてもそれなりに理解のある彼女ちゃんを持っている。
だけど自分の素の性格が刺さる層、自分が本気になれる女性のタイプを全く見極めていなかったので、いつも2、3回目のデートで見限られていた。
大事なのは天性の身長とか、顔面偏差値といった部分ではなくて、後天的な努力の部分だと思っている。
カッコよくなろうとする男は得てして自信があるように見える。
ダサい格好から抜け出せないのは、自分がカッコよくなることに自信がないことがほとんどなんじゃないかなと思っている。
以前の増田含め多くの男性が気づいていないことだけど、女性は生きていく上で強制的に可愛くならなくてはならないという社会要請を受ける。
高校生や遅くとも大学生頃には化粧や服装をそれなりにしないと女社会から爪弾きにされる
我々男は髪の毛のセットなんてできなくても社会人になれるが、女性はある程度の化粧ができることが前提の社会に生きている。
これは経験則だけど、だから女性はカッコよくなろうとする男性に共感しやすいのではないかな。
よくいう清潔感なる意味不明ワードは、男性が自分達と同様に垢抜ける努力をしてきているかどうか、その大変さや楽しさを共感できるかどうかをはかる言葉なんじゃないかなと思っている
なので非モテはとにかくカッコよくなろう。
youtuberの紹介する大学生っぽいファッションでいいからとにかくそれっぽい服を着てみて恥ずかしさをなくす。
例えば増田は短足なので最初は黒スキニーが恥ずかしくて履けなかったけど、それに合う大きめのトップを着ることで意外とバランスが良くなることに気づき、恐怖を克服した。
そうするうちに自分って意外とかっこいい服が着れるな?と気づき出して、ちょっとずつ幅を広げていくことができた。
おすすめはwearで自分の体格と同じ人のファッションをマネキン買いすること。大体の服はゾゾかユニクロで買える
自分と同じ体格の人をフォローしてその人を真似し続けるのが一番楽
大事なのはそれっぽいシルエットを作ることで、必ずしもオタクになる必要はない。もちろんブランドを覚え出すと面白くはなるけどね
髪の毛はちょっと高い美容院に行って相談する。増田は全く知識がなかったのでオリジナルのシャンプーを売っているような大手の美容院に行ってかっこいい髪型やセットの仕方をとにかく教えてもらった。
たいていの美容師さんはカッコよくなることを応援してくれるので、インスタでセルフセットの写真を送ればアドバイスしてくれたりする。
増田はとにかく自分のコミュニティさえも破壊しまくってアタックをし続けたけど、自分がどういう女性が好きなのかという一番肝心な部分がなかった
正直女なんてヤれればいいと思ってたし、化粧をした女の顔なんて全部同じだと思っていた。
だから自分でもやれそうな女の子、自分が話しかけても楽しそうにしてくれる女の子にひたすらアタックして玉砕してきた。
増田は極端に女を遠ざけて生きてきたので、もっと軽いところから女性を理解するべくリハビリをした。
もちろんナンパはせずに、純粋にゲームを楽しむことに専念した。
この手のトークゲームはルール上女性もコミュニケーションを積極的に取ってくれる。
また終わった後に感想戦を通して仲良くなりやすいので、とにかく女性の知り合いを増やしてSNSなどでたくさん交流した。
ここで変な気を起こしてナンパをしては下の木阿弥である。この人は増田のことが好きなのかな?とよぎる瞬間があっても絶対に色恋はせずにゲーム友達の距離感を守って修行した
この交流を通しておしゃれそうな女でも男で言うチー牛みたいなメンタルの人がいるとか、発達障害気味でコミュニケーションに難がある人がいることを知った。
女はみんな恋愛経験が豊富で、男よりも高次なコミュニケーションをしていると勝手に思い込んでいたけど、意外と自分の性別を反転させたような女の子もいるんだなと気づいたのであった。
どうしてかアスペアタッカー時代はとんでもないブスでも彼氏が過去10人いたとかいう隠れモテ(姫?)にしか会ったことがなかったので、こんなに可愛いのに彼氏いない人もいるんだと驚いた。
女性が好む日常会話の温度感とかノリを知れたのも大きかった。ちょっと小ボケを挟むとか、馴れ馴れしいくらいのノリのほうが意外と受け入れてくれる(下心が見えてるとキモがられるけど)
それなりにSNSで女性の知り合いができるようになると、日常のコミュニティでも女性の友達ができるようになってきた。
やっぱり女の子と日常会話ができるのは大きい。些細な考え方とか、女性特有の視点に理解を持っているだけで、今までと比べて格段に信用されやすくなった。
ここまでくるのに数年かかった。並行して進めていたマッチングアプリでワンナイトも経験できるようになった。
ワンナイトは狙ってやったと言うよりも、流れで数回やった。この人は帰りたくないのかな?とか、めちゃくちゃ好感度が高い今押さないといけなさそうだと感じた時に誘った。
好んでナンパやワンナイトをしたいとは思わないけど、人生経験としてやっておいて良かった気がする。
互いにある程度の信頼関係があるうえで、ワンナイトをしてくれる女性は難しい文脈も汲み取ってくれる女の子が多い印象を持っている
逆に思わせぶりな態度をとっておきながら付き合うまでセックスはさせない女は、自己中気質だったり互いに譲り合うコミュニケーションが取れないことが多いので避けるようになった。
ただ肉体のセックスができても、長期関係にはなかなか結びつかない。
ここにきて、自分はモテやすい体面を取り繕って素の自分を見せていないことに気づいた。ヤレそうな女にモテる男のよくやる立ち回りを見よう見まねで通すことだけは上手くなっていた。
なので一度自分が本気で好きになれる女性を厳選した。自分のNGをどんどん出してそれに合わない女性にいいねを送らないようにした。
ある程度写真が盛れていて、女性が好む文面やコミュニケーションが取れそうな雰囲気を出せていれば、いいねは返してくれるようになっていた。この時点で自分がほんの少しモテるようになったことを自覚した。
同時に電話を重視し始めた。相手からは自分の素に減点要素がないか、自分視点では話した時の雰囲気とか、相手の気遣いが感じられるかどうか、価値観が賛同できるかを見るようにした。
結局女の子は自分が好意を持っている男性から好意を持たれることに弱い。自分のレベルを上げてきたので、あとは自分が本気になれる子にアタックするだけだった。
電話はいい。お金がかからないというメリットももちろんあるんだけど、遅くても遠くてもコミュニケーションが取れるのが大きい。
正直電話だけでいいとさえ思っている。何度も電話して、最後に告白をする手前で1、2回会うだけでいい。しっかりと信頼関係を構築できていればプロフに書かれた数字なんてそれほど重要じゃなくなってくる。逆に女の子の外見にしても、最初から好みじゃない女の子にはいいねを送らないので可愛さが担保されている。
それに気づいた時、やっぱり男は見た目じゃなくて人間性の高さとか、女性の解像度の高さの方が重要なんだなと思った。
電話で互いに知った仲になった後は驚くくらいスムーズだった。1回目のデートはとりあえず飲んで、後日デートをして、素の自分を隠さずともケラケラ笑い合って。いつまでもこの子を幸せにしたいという気持ちが強くなった。
そうこうあって彼女ができた。
恋愛って運命的に落ちるものではなくて、互いの価値観を擦り合わせていく作業だと気づいた。
日本はコロナ前からCOPD(肺塞栓症候群)への対応がめちゃととのってる国なんだよ。
COPDを永らえさせるのは長期戦。
日本人のおじいさん、よくカートにのせたボンベから鼻に入れた細い管で酸素吸って歩いてる人いる。たとえばそこそこ都会の大型ショッピングセンターの車いすマーク駐車場で、車からよろよろ降りてくるのけっこう見るよ。アメリカはもうそこまでいったらすぐダメなんだろうな。肥満度も高いし。
知り合いはこれを20年やって健康保険も年金もたくさんつかってるけどそろそろダメになってきた。
トイレ行くにも息切れするし無理して体うごかすと酸欠失禁しておしっこもらす。
そういうときのSO2はコロナぶっちぎりの65%だからコロナにかかったら即おわる。
ピリピリして家族もどこにもいけない。20年間ずっとだけど最近はもっと迷惑かけてる。
ちなみに毎日奥さんに「なんでタバコなんか吸った」ってせめられてる時期あった。
寿命ではなくQOL(人生の品質)を高めるのならやっぱりタバコはあかん。
結論を先に書く、
「健康で長生きしたければタバコを吸え、統計的に実証されました」
今すぐコンビニに走りタバコを買ってこい、素人はメンソールの軽いやつから始めろ。
最初はムセたり不快感があるが、2,3日頑張ってみろ。すぐに慣れる。
良薬口に苦しだ。
国家統計から導き出された事実だから仕方がない、諦めろ。抵抗は無意味だ。
以下、信じられないバカのために論じるが長文なので読む必要は無い、結論は上の一行で終わってる。
よく見るセンテンス、人は権威っぽい数字を出されると簡単に騙される。
禁煙したら、あるいは喫煙習慣が無ければ寿命が10年伸びる(喫煙者は10年縮む)と仮定するなら。
50年後に喫煙率が20%まで下がりました、
平均寿命は何年になるでしょうか。
(他の要因は無視するとして)
喫煙率80%の時は
つまり
0.8*63 + 0.2*73 = 65
では
その後8割の喫煙者のうち6割が禁煙に成功し10年長寿グループに移動したとする。
0.2*63 + 0.8*73 = 71
全体の平均寿命は6歳伸びることになる。
計算を続ける。
女性の喫煙率は50年で2割から1割に変化したと仮定する、平均寿命は70歳スタート
0.2*62 + 0.8*72 = 70
これが50年経って
0.1*62 + 0.9*72 = 71
というか、50年前の男女の平均寿命の差は 65歳と70歳で5年の差があったのに
50年の喫煙率の変化で寿命差がなくなった事になる、どちらも71歳。
ここまではわかるかな?
上の計算はわかりやすく数字を丸めたもの、ほぼ現実社会の数字なんだが
疑り深いキミのため、実際の数字で見てみよう
ちなみに同じ日本人の男女だから自然環境、社会環境、医療制度は同じであることを先に書いておく。
1970年→2020年
女 74.66歳 → 87.45歳 「+12.79」
男 69.31歳 → 81.41歳 「+12.10」
1970年→2020年
女15.4% → 7.6%
男78.5% → 27.1%
男女の寿命の差は半世紀で変化が無い。
喫煙率は大きく変わったのに。
あれれ?計算合わないよね
それはどこに消えたの?
喫煙で10年寿命が縮むという条件モデルで辻褄の合う方程式を出してくれ。
無理だろ?
無理なんです。
どんな係数を入れても計算の辻褄が合わない。
つまり10年縮むはファクト。嘘でした。そんな結果になってません。
現実の数字から推察されるのは、喫煙はむしろ健康に有益という結果にしかならない。
意味わかる?
バカにはわかんないよね。
女は平均寿命が12.79年伸びた
男は12.10年しか伸びてない。
0.69年の差はどこから出てくるのか。
喫煙率低下が寿命に対してより大きくネガティブな影響を与えたことになる。
つまり男女とも喫煙率が50年で変化が無ければ寿命の差にも変化が生じなかったと仮定するなら
現実はネガティブ側に振っているのだから、逆に考えると喫煙が有益であったと推定される。
バカは
他の要因がぁ
と反論するだろう。
そうなの、人の死なんて無数の要因がある
俺が言いたいのはそれ。
健康に良い習慣や食事を取り入れて長寿を目指す。そりゃ悪いことではない。
アレが悪いらしい、ならば避けよう
コレが良いらしい、ならば取り入れよう
悪いものを捨て、良いものを取り入れれば結果は良くなるに決まってる。
ならねぇのよ。
社会や人体はそんな単純で直線的な方程式で解けるものではない。
良いと思ってたものを取り入れても相互干渉で副作用を起こすこともある。
単純なハナシ、結果だけ見りゃいいの
一方でヒステリックな禁煙正義を振り回してきた健康ヲタクアメリカ。
平均寿命を見てみようか
フランス 82.5(11位)
アメリカ 78.5(40位)
あれ?
でも、アレもダメこれもダメで許さえる快楽が脂肪か糖分しか残ってなけりゃ肥満大国になる。
それも全部ひっくるめて社会が作られてる、喫煙が与える影響なんて微々たるものだし、プラスかマイナスかもわからない。
それなのに
マクロな観察で見える有害をヒステリックに排除する社会が個々人の健康にポジティブな影響を残すのか。
そりゃ否定せんよ、でもね、
タバコを毛嫌うキミは人畜無害な生活をしてパーソナルで完結する趣味しかないかもしれない
例えば漫画、アメリカでは社会的抑圧で大人が嗜むことは憚れる。
漫画なんて他人に迷惑もなけりゃプライベートなのに、なんとなく許されない。
俺がタバコを完全に取り上げられたら、俺は八つ当たりで他人の趣味、生活習慣に難癖つけて迫害に回るぜ。
それっぽい正義を振り回してやんよ。どんなものにも理由付けはできる。
ちなみに俺は漫画は読まん。
とりあえず一服して考えてみ
Vtuberのファンになってわかる嫌なところとしては数字でのマウントの取り合いが激しいところ
同時接続数、再生数、チャンネル登録者数、スパチャ額などなど、数字がはっきり出る分 、それで勝った負けたオワコンになったと常に争い続けてる連中がいる
目に入るとうんざりする
自動で安価をつけて返信するプログラムでもこんなに長く複雑になる(一部抜粋)
/**************************************
以下の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 = new TextCsvCursors(
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 = new LoopStatuses(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
* @param {string} postMail メール
*/
serverName,
postMail,
_MyText,
retryTimes = 0,
) {
const r =
retryTimes === 0
? new ValuesOfPost(serverName, _MyPosterName, postMail, _MyText).post(
postTo5chTread,
)
serverName,
postMail,
_MyText,
).postSubstring(retryTimes, postTo5chTread, postConfirm);
if (r) {
back();
return;
}
wait(7);
const error = 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以上で。',
);
}
}
/**
* 入力フォームを表示して入力されたスレのURLを受け取る。
*/
function openPromptThreadUrl() {
const url = prompt('スレURLを入力');
}
/**
* 開いてるスレのレス全て読み取ってPostListインスタンスを作って返す。
* 重すぎるので使うのやめ。どうやらインスタンスの大量生成が原因な模様。
*/
const posts = window.document.getElementsByClassName('post');
return new PostList(Array.from(posts).map((e) => new Post(e)));
}
/**
* 開いてるスレのレス全て取得してPostDOMListに格納して返す。
* @returns
*/
function createPostDOMList() {
const posts = window.document.getElementsByClassName('post');
for (let index = 0; index < posts.length; index++) {
//HTMLCollectionからElementを1つずつ抽出して配列に。
arrPostDOMList.push(posts.item(index));
}
return new PostDOMList(arrPostDOMList);
}
/**
* 開いてる投稿結果画面に表示されてるエラーを読み取ってPostErrorMessageインスタンスを作って返す。
*/
function createPostErrorMessage() {
window.document