はてなキーワード: classとは
*
*
「お前が呑気に実家暮らしの女学生の身分で音楽などやっていられるのは誰のお陰だ」
という言葉は、学費と生活費を人質にとった恫喝だとも思った。口喧嘩なんかしたくもないから細心の注意をはらって生きてたのに。
大学を休学し、女子大生というアドバンテージを使って水商売で働けば一人暮らしの生活費と、あと1年分の学費を貯めることなどチョロいだろう、そう思っていたが、その見通しは甘かった。
そもそもコロナ禍で飲食業は店を閉め、風俗業も同様で客足が途絶えていた。そして少ない客を奪い合っていたからか、働き始めたキャバクラでは現実の厳しさを味わっていた。
売上No.1の嬢は女王様として君臨し、それに付き従う子分の女がいて、悪口、陰口、ちょっとした意地悪、接客の妨害といった小さな棘のような攻撃を女王様と子分からチマチマと食らうのに辟易していて、周りの女たちも庇ってくれることはなかった。
常連客の威張り散らして自慢話ばかりの禿げた社長に「寂しいから会いに来て」とLINEするのもアホらしくてやってられず、旅館の娘なのにサービス業がまったく向いていなかった。そもそもそれほど器量が良い方ではないということも改めて思い知らされた。
結局、職場と住処を幾つか変わり、大阪、東大阪のスナックでカウンターレディとして働いていた頃には大学を休学し実家を飛び出してからニ年ほどが過ぎていた。それでも大学に戻るつもりではいたから、何度失ったって取り返してみせるよ、と思っていたし、偉そうな社長が高級腕時計を見せびらかしながら話すねちっこいエロ話より工場労働者の陽気なシモネタの方が笑えて楽しかった。アパートから近鉄電車で二つ向こうの駅には司馬遼太郎記念館もあった。
京都時代は実名で活動していて、雑にピックアップを埋め込んだアコギを掻き鳴らして電子的に変調した爆音ギターにのせてフォークを歌うというスタイルだったが、休学して一人暮らしを始めてからは音楽どころではなかった。
一度、東京のハードコアバンドにVoで誘われたこともあったが、パンクというものは中央にいてはならぬ、周縁にいて少数派として生きねばならぬ、と頑なに思っていたのでそれも断ったのだ。
だが、遂には名前を変え「東大阪半日夢想沿線」という名で電子楽器によって幻想的で悪意のこもった電子雑音を奏でるスタイルで活動を再開した。激しいライブアクションのせいで機材はすぐに壊れてしまうから楽器は日本橋の中古屋で安物ばかりを揃えた。
再開した音楽活動は客こそ少なかったが手応えはあった。しかし名前を名乗るとギョッとする者もおり、また年配の人物に「極左テロリストの名前などを元ネタにして、被害を受けた人や家族が知ったらどう思うのか」と指摘され、己の軽率さを悔い、この名前を名乗ることも音楽活動も中断してしまったのだった。
そんな折に近鉄布施駅の近くで垢じみてうずくまっている女がいるのを見掛け、若いのにホームレスだろうかと目が釘付けになっていると、その女がこちらを見つけて「金を貸して欲しい」と近付いてきた。よく見ると女は女王様に金魚のフンのようにくっついていた子分の女、ジュリだった。
話を聞くと、女王様は客だった起業家と名乗る男に入れあげてしまって、男が何をしでかしたのかフィリピンに逃亡すると女王様も後を追って行ってしまったのだという。女王様がいなくなるとジュリはたちまち他の嬢からいじめられるようになり、店を辞め、あれやこれやがあって住む家もなくなってしまったのだった。
散々意地悪された女だったが、彼女が弱さゆえに強い者に媚び付き従っていたことや、色んなことを我慢している女は強くて奔放な女に憧れてしまうことをアキコは薄々知っていたから哀れに思い、数日なら部屋に居てもよいと伝えた。そういう女は痛みにとっても弱いから。ジュリは泣きながら今まで自分がしてきたことを侘びた。
ジュリは意外と生真面目で、アキコが仕事から帰るときちんと部屋を掃除してくれていて、冷蔵庫にあるもので食事なども用意してくれた。そしてある日、部屋に帰るとジュリは開け放った窓に向かってアキコのギターを爪弾いていて、それはラジオからよく流れてくるOfficail髭男dismの曲だった。
アキコは脳内で火花が散って、ジュリにバンド結成を持ちかけた。バンドをやるならまだ部屋にいてもいいと交換条件もつけた。ジュリは喜んで同意し、よくよく話を聞くと中学時代は軽音楽部であったらしい。そして中学を卒業してから家を出て働き始め、ひょんなことから女王様と知り合い水商売で働くようになったのだという。隠し事だらけ継ぎ接ぎだらけの一人で心細く生きていた女が筋の悪い人物をメンターだと思い込むことはよくあることだ。そして年上だとばかり思っていたが、ひとつ年下だということもようやく知ったのだった。
早速近所のハードオフに行ってエレキギターとベースを見繕って一番安い激安の物を購入した。ジュリがヒゲダンを爪弾いていたことから、今度はポップなものをやってやろうと思い、それらしい曲を捻り出したが、アキコはベース初心者でジュリもギターはブランクがあり、リズムは安物の電子楽器だったので、劣化したビッグ・ブラック、初期の少年ナイフからも百万光年離れているような、やさぐれパンク以下の酷い感じにしかならなかったが、それは初期衝動ゆえであると宣言することで自分たちを納得させた。バンド名もOfficial髭男dismの名前を反転したような、公式に対して無法、髭に対して女の装飾の象徴である爪、そしてダンディズムという一流の男に対して二流や二等、二級品という意味を冠して、Lawless爪Second-Classと名付けた。何事もうまくいっていない自分たちにはお似合いの名前だと二人で笑いあった。
数曲をでっちあげ、今度はPOPなロックをやるのだと意気込んで、アングラ凶悪バンドが演奏しないような阿倍野にあった小洒落たライブハウスのオーディションを受けた。
「まあええんちゃう?」という曖昧な判定だったが、出演はさせてもらえることになった。
阿倍野のライブハウスに出入りするようになると、女二人だと色んな男が声をかけてくる。なぜならカワイイ系のアクションがジュリはとてつもなく上手かったから。でも音楽好きやバンド仲間だと思えば話も弾むが口説かれたりするのは面倒だった。しかしこっちはキャバで修行した身だ。うまくかわしていたし、ジュリはその辺りの身のこなしも上手かった。それでも面倒くさい人物もいた。
そのライブハウスに出入りするベテランのブルースマンで、最初は何かと世話を焼いてくれる風に近付いてきたが、だんだんと遠慮がなくなってきて、あれやこれやと説教をするようになっていった。相手をしているとイライラしてくる。なぜこうなのか。ワガママ放題大人たち。どうして若い女は何も知らないと思っているのか。
ある日、演奏を終えて楽屋に戻ると、当日は出演者でもないのに例のブルースマンが楽屋でくつろいでいて、アキコとジュリの楽器を値踏みし
「もっと良い楽器を使わないとだめだ」みたいなことを言い出す。そしてなぜか自分の黒いギターを持ってきていて、それを引っ張り出し
「50sのフェンダー・ストラトキャスター、クラプトンもこのモデルを使っている」などとウンチクをたれ始めた。
もう鬱陶しくて堪らなかった。怒りがふつふつと湧き起こってアキコはそれを抑えきれなくなり、そのストラトを奪い取るとネックを持って大きく振りかぶり思い切り壁に叩きつけてやった。その場にいた他の人間も唖然として誰も声を出せず、壁の石膏ボードには大きな穴があき、ストラトのネックは折れて弦だけがブラブラしている。アキコも放心状態で、これは殴られるなと覚悟した。
しかしジュリが咄嗟にアキコの腕を掴んで強引に引っ張りそのまま駆け出した。そしてそのまま店を出て走って、ずっとずっと走り続けて、ひた走る道路にはもう街灯さえないけれど、新今宮の駅の辺りまで走り続けて、やっともういいだろうと立ち止まって、息が切れて苦しかったけれど二人で顔を見合わせて死ぬほど笑った。嘘じゃない泥だらけの笑顔。ギターもベースも置きっぱなしだったけれど取りに行くつもりもなかったし、大して惜しくもなかった。
その後ブルースマンはアキコを訴えて、結局アキコは和解を受け入れた。調停の場でブルースマンの代理人弁護士に
「無法なんて名乗っているけれど法は法なので、賠償金の支払いはお願いしますよ」
と嫌味を言われたのが忘れられない。アキコは感情のないアイムソーリーだけを告げた。
もう大学に戻ることはないと薄っすら思っていたが、なんだか心の拠り所のようではあったので貯金はしていた。けれど、破壊したビンテージギターのせいで全てが消え失せてしまった。
しかし、やがてその話は噂になって、どうやら凶悪な女パンクのバンドがいるらしい、他人の高価なビンテージギターをぶち壊して平然としているような奴らしい、以前「東大阪半日夢想沿線」という不埒な名前でやっていた話の通じない女らしい、とその他あることないこと尾ひれ背びれもついて伝わっていった。まるで魔法のように簡単に広まってく噂話。お陰で奇特な人やバンドから少しばかり対バンの話も貰えるようになった。
アキコは今も近鉄電車の傍のアパートに住んでいて、ジュリも未だにアキコの部屋に居候している。貯金もなくなり、もう大学に戻ることはないだろうし、カウンターレデイの仕事は先の見通しもなく、何も状況は変わっていなかったが、それでも二級品なりになんとかやっていくしかないとアキコは思っていた。
皆さんは、official髭男dismってバンドをどう思ってます?
わたしは彼らの楽曲は好きなんですよね。ラジオからもよく流れてきて耳馴染みもあるし演奏も良いと思う。楽曲も意外と凝っていて、容姿も清潔感が良いですよね。ファンだと公言するほどではないにしても結構好き。
でもね、わたしにはバンド名が格好良いと思えないんです。「official」「髭」「ダンディズム」どれも格好良くて渋いイメージの言葉で構成されているけれど「ネガティブの何が悪いんですか?」という価値観の自分には、バンド名だけが受け入れられないんです。
じゃあ、このバンド名を徹底的に反転してみるとしたらどうなるんだろうと対義語辞典などで調べてみました。
officialの対義語はunofficialだけど、「公式」に対して「非公式」っていうのはただ否定してるだけであまり面白くないし語呂も悪い。対義語辞典で提示された単語の中では「special」が語感的には良いけれど、この言葉のイメージって「特別に(良い)」という感じでしょう?今の時代は「改革」とか「維新」なんて良いイメージの言葉を使ってそれとは逆のことをする人たちが多いからそういうのはやりたくない。むしろネガティブだと思われている言葉を使って逆に反転してやりたい。「Damned」なんて辞書でひけば「ひどい」とか「罰あたり」だけどバンドとしては最高じゃない?
続けて対義語を検討していくと「lawless」が語呂としては良いかも知れない。無法という意味。official、公的、公式であることは法によって支えられているのに、いきなり無法なんて俄然やる気になってきますね。
髭ねえ、男だけにあるもの。逆に女だけにあるものと言えばおっぱいと子宮かなあ。でも後者はちんこの対義語だから却下。「ひげ」という語感に近いものにするとすればおっぱいを「むね」に変換かなあ。などと思っていたら「つめ」というものを思い付いた。爪を綺麗に飾るのって今の時代は女がメインだからそれでいいかもしれない。じゃ次。
「男」を「だん」と読ませているわけだけれど「女」の読みは「じょ」「にょ」「め」と音的に優しいし少し弱い。最初が「lawless」に決定したのにそれではいただけない。「dandyism」として対義語辞書をひいても「poor」「terrible」「lousy」みたいなのしか出てこない。格好良い男に対して格好悪い男は英語でも「貧しい」とか「怠け者」みたいになるんですね。貧しい男は男らしくないってことか。男も大変だ。
酷い女みたいな意味を一言で表すのに「bitch」がよく使われる印象だけれどこれは語呂が悪い。でもダンディの対義語候補の中に「second-class」というのがあった。二流、二級品みたいな意味ですね。二流の男は男らしくないのか。でも確かに、男たちからブスと言われる女は彼らにとって二級品だ。いいじゃない。やってやろうじゃない。
ということでバンド名は『Lawless爪Second-class』に決定しました。ヒゲダンのバンド名も反転できてる気がする。
「オフィシャル・ヒゲ・ダンディズム」に対して「ロウレス・ツメ・セカンドクラス」は語呂的にもまあまあの線だと思う。でも反転だとかなんだとか言ってるけどヒゲダンのことはまあまあ好きだからね。そこんとこ夜露死苦。
ヒゲダンは島根大学での結成ということでツメセカも地方出身かな。当然ガールズ・バンドで、ヒゲダンの楽曲には似ても似つかないやさぐれpunk。なんだか妄想が広がりますね。
chatgptで
「sqlite3でtwitterみたいなサイトのテーブル設計をして。
上記のTwitterのようなサイトで特定のユーザーのタイムラインを表示するクエリの例を教えて」
って聞くと、こういうの表示されるけど、こんなの絶対パッと思いつかんやろ!!
特にJOIN2回使うのが全然分からん。なんならJOIN1回の部分も分からん
っていうか、hatena君、sqlのシンタックスハイライトするとインターナルサーバーエラー返してくるんだが...
class Foo def bar'baz' # return baz end end
sqlだけっぽい......
CREATE TABLE users ( id INTEGER PRIMARY KEY AUTOINCREMENT, username TEXT NOT NULL, email TEXT NOT NULL UNIQUE, password TEXT NOT NULL, created_at DATETIME DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE tweets ( id INTEGER PRIMARY KEY AUTOINCREMENT, user_id INTEGER NOT NULL, body TEXT NOT NULL, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (user_id) REFERENCES users (id) ); CREATE TABLE follows ( follower_id INTEGER NOT NULL, followed_id INTEGER NOT NULL, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (follower_id, followed_id), FOREIGN KEY (follower_id) REFERENCES users (id), FOREIGN KEY (followed_id) REFERENCES users (id) ); SELECT tweets.id, tweets.body, tweets.created_at, users.username FROM tweets JOIN follows ON tweets.user_id = follows.followed_id JOIN users ON tweets.user_id = users.id WHERE follows.follower_id = [特定のユーザーID] ORDER BY tweets.created_at DESC;
自動で安価をつけて返信するプログラムでもこんなに長く複雑になる(一部抜粋)
/**************************************
以下の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
class Onanie { ... }
今やもうFANZAとなっているが、DMMの時代からライブチャットにはお世話になっている。
お気に入りパフォーマーはどんどん消えていく中、10年くらい前からノンアダ一本でやっている人もいる。
そんなFANZAライブチャットだが、マダムフロアがとてもじゃないがゲテモノ揃いだ。見るも悍ましいサムネが並んでいる。吐き気すら覚える。
フィルタは「すべての女の子」「お気に入り」「新人」「巨乳 顔出し」しかなく使い勝手がくそ悪い。
「アダルト」と「ノンアダルト」しか見たくない。マダムとかいうあんなゲテモノカテゴリを非表示にしたい。
加えてアダルト、ノンアダルトにいるゲテモノや不快なサムネの奴らを一掃したい。
意見を送ったところで実装はされないので自力で何とかしてみようと思った。
まず、昔?ニコニコ動画でマリオメーカーだかの動画を除外する拡張機能+スクリプトがあったがあれに似たものはないかと探したがなかった。
色々試したが、「はちまバスター」という拡張機能。これが素晴らしかった。
もともとはまとめサイトをぶち消すものだが、キーワードやURLで非表示にすることが可能だ。
元からこの拡張機能は渡辺直美、フワちゃんをはじめとする各種ゲテモノ、ウーマン本村、ラサール石井、立花孝志などの目に入れたくないものを排除するために入れていたのだがこれが使えた。
ライブチャットでの使い方は簡単だ。ゲテモノを右クリックしてはちまバスターに追加(URLでの追加)これだけでどんどん快適になっていく。
が、マダムは9割ゲテモノだ。追加しようにも追いつかない。溢れかえるゲテモノ。追加されるゲテモノ。
これには悩んだ。
はちまバスターで追加したものは非表示ではなく「censored」となるためこういった一覧での表示では見栄えも悪い。
キーワードで指定しようにもパフォーマーのIDはランダム。アダルトは01***とかではない。
そして次に目を付けたのが内部ソース。
パフォーマーIDに規則性はない、が表示ではアダルトやらノンアダルトでカテゴライズされているので何かしらあるはず。と覗いた。
そして発見する「listbox madam」
だが今回ははちまバスターではない。先述の通り除外したところで「censored」となる。今度は非表示にしたい。
追加は簡単だ。
##li[class="listbox madam"]
とぶち込んでやればいい。
だが気を付けてほしい。listboxとmadamの間は半角2つだ。拡張機能によっては半角2個が1個とされてしまうものもあるので注意してほしい。
これだけであのゲテモノカテゴリが非表示となるのだ。そしてアダルト、ノンアダルトのパフォーマーだけが表示されるのだ。
これで当初の目的の8割は達成できた。これだけでもかなり快適になった。
アダルトだろうとノンアダルトだろうとスマホからインしてるやつのゲテモノ率は8割くらいある。
「span class="smartphone"」があるのは見つけているがこれを含んだやつを排除すればいいはずなのだが…
あとは写真が反対になってるやつとか私が不快と思う顔をAIかなんかで自動で非表示にしてくれたら…と思う。
あ。パフォーマーが動画販売できるやつを終了させたのは英断だと思います。ほぼほぼクリーチャーだったし、ほぼ毎日出してたSMおばさんも不快だったので。
関数型プログラミングが『銀の弾丸』であるという非常識な常識2022のなにがダメなのかわからない人が多いようなので、個人攻撃をまったくせずにダメ出しする。
まず言っておくが、私はあの記事をほとんど読んでいない。しかし、簡単にダメ出しできる。
記事内を「末尾再帰」で検索してみよう。1か所もヒットしない。「末尾」でも1か所もヒットしない。そう、あの記事はめちゃくちゃ長いのに末尾再帰に触れていないのである。では「再帰」ならどうだろう。11か所ヒットした。しかし、具体的な再帰のコードはまったくない。長い記事内にあれだけ多数のコードを書いているにも関わらずである。
「末尾再帰って何?」とか「再帰ってそんな重要なの?」と思う読者も多いだろうから、末尾再帰の重要さだけ説明しよう。
あの記事は、forやwhileを使わないプログラミング手法を前提に書かれている。記事内を「制御」とかで検索すればわかる。
末尾再帰はforやwhileの代わりになるもので、そういったプログラミング手法には欠かせない。forもwhileも末尾再帰も使わないとなると、ツリー探索などのアルゴリズムを書くことが困難になる。(こういったことが苦手な私に思いつく他の方法は、setIntervalを無理やりforループの代わりにするくらい)
そもそも、ほとんどのJavaScript実行環境は、末尾再帰をサポートしていない。つまり、JavaScriptはforやwhileを使わずに込み入ったプログラムをまともに書けるような言語ではない。あの記事に書いてあるようなことをする言語ではないのである。私は別にそれでもいいのでTypeScript使いまくってるけど。classとか好きだし。
あの記事がJavaScriptを使っている理由は、JavaScriptが人気だからだろうか?もしそうだとしてもダメである。あの記事は「JavaScriptは、ほどんどの実行環境が末尾再帰をサポートしていない、このプログラミング手法に適していない言語である」といったこと自体に触れていない。人気のある言語を使いたいなら、他の末尾再帰をサポートしている人気言語を使えばいい。
ろくに読まなくても、他にもダメ出しできる。
関数型プログラミングで気になるのは、言語にもよるが実行速度やコンパイルにかかる時間である。銀の弾丸と言うからには、C言語を使うような場面でも銀の弾丸でなければならない。(Haskellの実行速度はC並に早くできるそうだが)
記事内を「パフォーマンス」で検索したところ、実行速度に関する箇所がヒットした。
記事の実行速度関連の内容を要約すると「最近はAWS・Azure・GoolgeCloudPlatformなどを使って並列計算するので、昔ながらの命令型の順次実行は不適切である」となる。私が嘘を言っていると思うなら、記事内を「パフォーマンス」とか「AWS」で検索してヒットした箇所の前後を読んで欲しい。そんなに長くはない。
【1.事実】
今日2021/10/31、Fordham Universityのサイトで卒業生リストclass of 2021 graduatesを閲覧し、新婚の夫君の名前を入力して検索した。
結果を言うと、夫君は卒業生の中に出てこない。これは誰でも確認可能なので、疑う人は試してみることを推奨する。下記のリンクから確認可能なはずである。
https://nc-vc-ceremonies.s3.amazonaws.com/s/fardham/index.html?
===
【2.推論】
悪意を排した上で、有り得そうな事を推論すれば、以下のようになる。
「7月に弁護士資格試験が行われた時には、受験の条件である卒業生の扱いであり、本人もそう思っていた。
しかし、その後、卒業生としての資格を満たしていない何らかの理由(例:単位不足など)が判明し、そのために卒業生名簿から大学側もいったん除外した。現在閲覧が可能な卒業生リストに名前が見当たらないのは、そのためである。
卒業生の条件を満たしていない情報が、弁護士資格試験の運営者へと伝えられたのは、弁護士資格試験の終了した後であった。
これならば、一応の辻褄が合う。日本でも時々、事務方のミスなどで単位不足が後から判明したという話を見聞することはある。
===
【3.展望】
次回2月に行われる弁護士資格試験に向けて、これから頑張るのであれば、まずはFordham Univ.から卒業生として承認・公表される卒業資格を取得する必要がある。
本人は、卒業生名簿に自分の名前が無いことを知っているのか否かについて。もしも知らなければ、2月に試験会場へ赴いた時、門前払いを受ける可能性が有る。普通ならば判明した時点で、大学から本人に対して「単位が不足している」とか何とか連絡しているはずである。だから、流石に本人が知らないことはないだろう。問題は、いつそれを知ったのかである。
義理の父親に「大丈夫か?」と訊ねられて「大丈夫です」と答えたと報じられたところを見ると、その時点では本人も自分は卒業していると認識していたのであろう。おそらく、不合格通知のメールが来るまで、本人も知らなかったのではないだろうか。漫画『とどろけ一番』でも、自分は小学6年生と思っていた主人公が中学受験に挑んだら、実は小学5年生だった事実が発覚して不合格になるというエピソードがあった。あれは主人公の母親のミスだった。それと似たような話であろう。