はてなキーワード: DOMとは
いやこれ凄いな
未履修からのロースクール入学で司法試験1位合格って相当優秀だろうに(しかも社会人経験もばっちり有りなので勉強しか出来ないガリ勉って訳でもない)
それでも裁判官検察、大手どころか中堅の法律事務所も全部落とされるのか…
最近は社会人からの予備試験ルートの司法試験合格も盛んに宣伝されているけれど
実際に受かったとしても年齢が高ければ門前払いだって事がよーーく分かった。
そりゃあ戸籍を偽造してでも若く偽りたいと思う人が出てくるのも無理もない。
だってどれだけ苦労して実績を上げるよりも、戸籍の生年月日を若返らせる方が有効なんだから。
『ITコンサルから転身、32歳入学で司法試験1位合格 ロースクール1期生・伊藤弁護士が語る「キャリアの多様性」』
「裁判所や検察庁、大手法律事務所は、若い合格者を優遇して採用しようとします。自分も司法試験後に大手・中堅法律事務所に応募しましたが、ことごとく落とされましたから(笑)。学生がそこで活躍したいと思ったら『若いうちに合格するしかない』となってしまうのも無理ありません」
シェアウェア(という表現はおいておいてのやつ。https://anond.hatelabo.jp/20230124045812)の記事が面白かったので、自分の得意分野の領域でいろいろ紹介します。
基本的に、SaaSのサービスは便利だけど、あれもこれもと契約していったらサブスク破産するので、
もともとownCloudっていうDropbox代替があったんだけど、そこから分派して今も機能開発が続いている。
興味深いのはLAMP構成なので、VPSや自宅サーバーじゃなくても、レンサバで動くのがいいよね。
データ保存領域はオブジェクトストレージ(S3互換)も利用できるので、例えばWasabiなんかと契約してお安く済ませてしまうのも全然アリかと。
最近はカンバンシステムって、単体で使うんじゃなくていろんなアプリの中で使われる印象なので、今更Trelloだけ使いたい、なんてニーズはないかもだけど、
そこまで複雑でなく小規模なプロジェクトとかだと、意外とTrelloだけでいいよね、みたいなこともあるかな。
そういう時は、これを使うといいかも。
ちょっとUIの雰囲気が違うだけで、まんまSlackです。絵文字の追加もできるし、APIもあるし。人によって好き嫌い分かれるスレッド機能も、まあ、あのスレッド機能のまま。
n8nと書いてnodemationと読ませるらしい。初見殺しすぎんだろ。
ZapierやIFTTT、無料枠あるけど、あれもこれもやり出すとすぐ無料枠埋まっちゃうので、これ結構いいと思うんだけどな。
kintone使ってる会社増えてると思うんだけど、まだまだ1ユーザー1500円ってのは高いので、零細企業は導入し辛いと思う。
で、それの代替になるのがExment。UIがkintoneとは少し違うので代替と言い切れないかもしれないが、
やれることはkintoneのソレと全く同じなので、用途代替はできる。
開発も日本企業なので、UIも日本語化されている。LAMP構成なので、レンサバでも動くよ!
そもそもAirtableって何やねんって人もいるかもしれないけど、kintoneとGoogleスプレッドシートをいいとこ取りして、Trelloとガントチャートを足した感じ。
これもまあまあいい感じでZoom再現してます。Zoomの方が新機能の追加早いけど、Jitsiも頑張って追いついている感じです。
ただ、やる内容が複数人でのリアルタイム動画配信なので、サーバースペック・回線スペックはまあまあ必要なので要注意。
こちらは使ったことないんだけど、よりオンライン授業向けらしい。
最近よく見かけるようになった、オンラインミーティングとかの予定をブッキングさせるSaaS。
あれのはしりがCalendlyで、日本でもいくつかそれのSaaSができてますね。
あれらも無料枠だと1カレンダーだけしかできなかったりするんだけど、これなら好きなだけブッキングさせられます。
ECサイトとか、Webマーケティングを重視してるサイトによくある、画面右下に吹き出しアイコンがあって、チャットウインドウがぴょこっと出てくるやつ。
日本ではWeb接客とか言われてるけど、あれの代表的なSaaSがIntercom。Zendeskは、どちらかというと内部ツール向きかな。
これのOSS版がChatwootとPapercups。自社サイトにWeb接客入れたいけど、費用抑えたい、って時にどうぞ。
この手のツールがないと仕事にならないという人も多いと思います。
これまでだとRedmineがそれのOSS版的立ち位置でしたが、さすがにイマドキあのUIはないなぁ、と。
OpenProjectは、Microsoft Projectの代替をイメージしてるみたいですが、
ガントチャートにカンバンがデフォルトで使えるので、BacklogやAsanaの代替にはちょうど良いでしょう。
ただ、そんな高度なことしてるわけではないのに、サーバーの要求スペックはちょっと高めなのでご注意を。
UA廃止でGA離れが始まってるとも聞きますが、疎開先として有名。
PHPで動くので、PHPやWordPressでできたサイトに一緒に入れちゃってもいいと思う。
HeadlessCMSは、データ表示を持たず、フロントエンドへAPIを通じてデータを渡すタイプのCMSのこと。
このジャンルでは、SaaSだとContentfulが有名だけど、OSSでもいろいろある。
Node.js製。歴史があるので、結構いろんなことができる。
WordPressのGutenbergエディターを取り込んだプラグインなんかもある。
User認証も持ってるので、CGM的なサイトを作ろうと思ったらできなくもない。
これもNode.js製。利用できるDBが幅広く、既存のデータベースも活用できる。
なので、既にPostgresSQLとかでデータを持ってるんだけど、
非エンジニアにもデータを触らせるためのフロントエンドが欲しい、ってニーズに良いかも。
PHP製。SQLiteとMongoDBで利用可能。MySQL/PostgreSQL使えないのがちょっと残念。
近年、本腰入れて自社ECサイトをやろうと思うと必ず選択肢に上がるShopify。
インテグレートパートナー向けのエコシステムも充実してるので、取り組み始めるエンジニアやシステム会社も多い。
ヘッドレスコマースや越境ECには向いているものの、これをセルフホストしたい、というニーズに応えたのがmedusa.js。
ざっと見てみただけだけど、モダンな構成で、今時のフロントとバックエンドを分けた構成でやりたい、というのには向いている。
プラグインにmedusa-marketplace.jsというのもあり、Amazon的なマーケットプレイスも実現可能。
昨年、Adobeに買収され、デザイナーたちを驚愕させたFigma。
先日はAdobe XDが終了のお知らせとなり、UIデザイナーたちの不安は募るばかり。
そんな提供企業に振り回されたくないなら、このPenpotでUIデザインしよう。
Figmaほど機能実装はされていないが、まあまあ一通りのことはできる。
Figma代が嵩むとお嘆きの制作会社なんかは、一考の余地あるんじゃなかろうか。
企業によっては、コンタクトフォームをたくさん作りたいという会社もある。
人材採用のフォームを職種別に細かく分けたい(しかも頻繁に募集職種が変わるとか)
Google Formで大体解決しそうだけど、それをGoogleに頼りたくないならこちら。
まあまあ機能豊富なので、人によってはGoogleFormよりもこちらを好むかも。
DockerベースのWebメールUI。送受信に必要なものを、丸っとDockerで用意してくれているので便利。
HubSpotは、いわゆるMarketing AutomationとCRMを一体にしたツール。無料枠もあるが、かなり限定されている。
MauticはMarketing Automationよりの機能が多く、ユーザーのサイト上での回遊をビジュアル化してくれたりする。
SuiteCRMはザ・CRMという感じ。SalesForceをデフォルトで使う感じに近い。
ツールが分かれてしまうのは辛いところだけど、それぞれにAPIがあるので、うまく繋げられると強力なツールになってくれるはず。
Webサービス作ってると、メールの通知や一斉配信などがあると思う。
通常これらはSendGridや、AWS SESなどで処理すると思うが、これらにもOSS代替がある。
PostalはDockerでメール周りのもの全部用意してくれているので、かなり楽。
WordPressをモダンにしたような感じで、EC機能もデフォルトでついてる。マルチサイトも標準。
Jimdo/Wix代替と書いたが、もちろん自分のサイトをMicroweberで作ってもいいが、
自前ホスティングして、JimdoやWixのようなサービスを始めることもできる。
テンプレートをいくつか作っておいて、Stripeを仕込んでおけば、今日からあなたもJimdo/Wixのような事業を始められるわけだ。
JImdo/WixとSTUDIO/Webflowは一緒くたに語られがちだが、明確な違いがある。
前者はプリディファインドなブロックをGUIで構成するのに対し、後者はDOM要素ベースで構築していく。
つまりよりHTML/CSSによる細かなデザインコントロールがしやすく、Webデザイナーが親しみやすい。
それのOSS版がWebstudio。まだアルファ版だが、フロントエンドはそれなりによくできているので、
バックエンドを自前で用意してStripeを仕込んでおけば、今日からあなたも(以下略
Facebookなんか使わねーよ、っていう人も多いかもしれないが、
特定のコミュニティの中でコミュニケーション取るには、FacebookのUIと機能は優れていると思う。
なので、サークルとか同窓会、あと自治会とかPTAなんかにもいいんじゃないだろうか。
Netflixの代替って、Amazon Primeとかじゃねーの、と思われるのかもしれないが、そうではなくて、
あなたがNetflixみたいな商売したいならこれを使うといいよ、というのがJellyfin。
いや、そんな商売しないよ、と思うかもしれないが、
使いようによっては、おじいちゃんおばあちゃん向けの子供動画配信サービスとして構築するとか、
Stripeと連携して、劇団やバンドのオリジナルの配信サイトを構築するなんかも面白いと思う。
今更誰もYouTubeやVimeoの後追いをしようとはしないでしょうが、
複数のユーザーから動画のアップを受け付けて、それを閲覧したい用途もあると思う。
例えば、軽音部で複数のバンドが練習風景を録画したのを定期的にアップしたりとか。
学習塾で、授業の録画を授業ごとにアップしていったりとか。
ZoomやGoogle Meetのような双方向ではなく、一対多の一方通行配信。
個人的には、企業のウェビナーツールとしての可能性を感じる。(Zoomのウェビナープランとか高いもん)
1つのメールアドレスを複数人で運用したい時のツールがメールワイズとRe:lationどちらも日本のSaaS。
FreeScoutはOSSだけど、海外製。一応日本語化もされてるっぽい。
ECサイトの顧客問い合わせや、営業チームのプライマリー対応なんかに良いと思う。
Bubbleってなんぞ? という人のためにお伝えしておくと、ノーコードベースのWebアプリ開発ツール。
データエンティティを設計したら、自動的にCRUDを作ってくれて、フォームを配置するというような感じ。
Bubbleはそれ系の老舗で、歴史が長い分ノウハウも溜まっており、連携できるサービスも多い。
ただ、ベンダーロックインされるし、季節的なキャンペーンとかでは、アプリを使用しない期間もサブスク費用がかかる。
Budibaseは、Bubbleの思想に一番近い感じ。凝ったUIが必要なければ、ざっくりコレでなんでも作れちゃう。
AppSmithも同じような感じだが、これはDBをあらかじめスキーマ定義しておかないといけないところが若干不便かな。
ToolJetはルーティングURLの概念がなく、本格使用を諦めたんだけど、最近アップデートしたらしいので、そこのところどうなってるかまた確認しときたい。
他にもこの手のやつあったら、いろいろ教えて欲しい。単純に好きなので。
勝手に tampermonkey とかに突っ込んで使ってヨロ
スクリプト保守とかするつもりないから、保守とかするつもりのあるパワーの溢れた人が
これ参考とかにしてもっとかっちょよくしたのを greasy fork あたりに公開してくれ
そしたら俺もそれ使う
localStorage.hatebu_ng_word_list に非表示のトリガーになる文字列を|区切りで登録する。
localStorage.hatebu_ng_word_list = "池田信夫|フェミ|弱者男性|やまもといちろう"
大なり小なり(>)が実体参照で表示されるのはよくわからん。使う人で適宜コードを直してくれ。
// ==UserScript== // @name はてブの一覧NG記事非表示 // @namespace http://tampermonkey.net/ // @version 0.1 // @description try to take over the world! // @author masuda // @match https://b.hatena.ne.jp/* // @icon https://www.google.com/s2/favicons?sz=64&domain=hatena.ne.jp // @grant none // ==/UserScript== (function() { 'use strict'; if (!localStorage.hatebu_ng_word_list) { return; } console.log("はてブの一覧NG記事非表示", localStorage.hatebu_ng_word_list); /* * 例: * localStorage.hatebu_ng_word_list = * "池田信夫|フェミ|弱者男性|やまもといちろう|togetter.com"; */ let words = localStorage.hatebu_ng_word_list.split('|').map(w => new RegExp(w)); function entryDelete(els) { els.forEach(el => { let hit = false; words.forEach(w => { hit = hit|| w.test(el.textContent); }); if (hit) { el.remove(); } }); } // entrylist-header-main li 1つ目のアイテム entryDelete(document.querySelectorAll('.entrylist-header-main > li')); // 2つ目以降の li アイテム entryDelete(document.querySelectorAll('.entrylist-item > li')); })();
自動で安価をつけて返信するプログラムでもこんなに長く複雑になる(一部抜粋)
/**************************************
以下の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
session.cookieって書かれると「sessionのcookie」とは違うものを表そうとしているのではないかという可能性を否定できないんだよね
たとえば元増がdocument.cookieという例を挙げてるけど、これはブラウザが提供するDOMインタフェースには必ずdocumentというグローバルオブジェクトが含まれると仕様上決まっており、このオブジェクトは必ずプロパティcookieを持つ、という前提があるからこそこれだけで通じるわけで
同じルールでsession.cookieとか書かれると、「ん?sessionなんていうグローバルオブジェクトあるの?聞いたことないけど…」と混乱する
https://twitter.com/kakedashi_chan/status/1495050350629322752
私はエンジニアちゃんの立場なのだが、同じような経験をしたことがあったので悲しいなあと思った。
以前ともだちと旅行した際にプログラミングの話題になった。わたしは当時から自分でウェブアプリを開発したり、ネイティブアプリを開発したりするのが趣味だったので、プログラミングスクール (Zeroplusというところだった)に通っている友達の話を興味深く聞いた。
そこで教えていたのは、たとえばJSであればもう誰も使っていないgulpであったりとかscssであったりといった時代遅れの技術で、とにかく顧客を捕まえて案件をゲットしようという内容だった。
わたしはネイティブアプリの開発者なのでウェブは門外漢だが、それでもウェブ開発という観点からはあまりに頓珍漢で時代遅れなことを教えていて面食らった。
わたしはともだちに「営業をやりたいのだったら良いスタートアップがあるから紹介するよ」といったが、ともだちはフリーランスエンジニアになりたいの一点張りだった。
「ウェブアプリ開発をやりたいのだったら、無料で良いチュートリアルがあるよ。お金を払うんだったらudemyとかの動画にしなよ。」
「HTMLとJavaScriptの関係はわかっている?今はReactやVueといった仮想DOMでの開発が主流だよ」
「HTTPサーバーというのが何を指しているのかわかっている?」
嫌味にならないように遠回しに「メガベンチャーに入れる」レベルの開発経験の積み方を話した。ともだちは残念なことにGoogle・Indeedなどに入れるような地頭の良さはないので、アルゴリズムよりも開発経験を積むように勧めた。
フリーランスエンジニアになるにしたって、誰がまともな開発をできない人に頼むのだろう。少なくともわたしの知り合いに業界経験が全くなくて、フリーランスエンジニアとして活躍できている人は一人もいないと伝えた。
ココナラやクラウドソーシングサイトで請け負う低単価の案件はいくらやっても、そもそも全く稼げないし、キャリアとして意味がないことも伝えた。
今ではWFHはどの会社でも当たり前だし、週4日勤務のような自由度の高い働き方がしたいのならマイクロソフトなんかがそういう取り組みをしていることも伝えた。
とにかく、エンジニアになると決めたのならちゃんと開発経験を積んで一般就職をいちど目指そうと伝えた。
1年後。
ともだちはその場では「ありがとう教えてくれて!やってみるね!」と話していたが、その後Twitterでは「らくして稼ごうウェブ制作!」といった標語を抱えている詐欺師のツイートを積極的にRTし、初心者コミュニティで自己啓発めいたことを1年間言い続けていた。
ともだちはその後事務員としてどこかの会社に就職したらしいが、音信不通になってしまってなにもれんらくがとれない状態になった。
https://d.potato4d.me/entry/20220405-nodejs/
が話題になっているけど、本来人類に必要なのはクロスプラットフォームな実行環境であってNodeじゃない。
TSが流行ったのはJSがクソだから。BabelしなきゃいけないのもJSにトランスパイルしなきゃいけないからであって、必要なのはJVMやCLRのような言語実行環境。
Reactが流行ったのはshadow domだけど、必要なのはDOMじゃなくてちゃんとした「アプリ」開発用のイベントモデルとレイアウトマネージャ含むGUI環境。
フロント界隈の流行廃りって本質的な改善ってよりもほかの良い技術をいかにブラウザ/Electron等JSエンジンという限られた環境に持ち込んで幸せになるかがメインに見えるので地獄に見える。
「アプリ」書くのになんでドキュメント記述用のHTMLに今ものっかってんだよと。
MavenやらGemsができて依存管理楽になったとか、RailsがでたときのようなCoC良いねとか開発の考え方を変えるフレームワーク、 rspec/Cucumberがでてテスト最高とか、c10kも怖くない非同期I/Oとか、好きな言語が使えるJVM/CLRそもサーバーならrustでもgoでも好きなものが動くとかとか本来の開発を楽にするという意味のブレークスルーってあんまりみられない気がしている。なんでフロント界隈の新技術ってあんまりわくわくしない。
逆にちゃんとしたクロスプラットフォーム実行環境がブラウザしかないということなんだけど、ブラウザなかなか進化しないし RIA は Apple 様が切り捨てるからなぁ。
ということですべてはブラウザが悪い。JavaScript 以外がちゃんと動くクロスプラットフォームのGUI環境が必要。でもプリインでモバイルでも動いてOSから独立して協調して作られていて、Webという既存の大量の資源にアクセスしやすいものは現時点で実質ブラウザ一択。つまりWASM に期待。次にHTMLであるべき文書はともかくSPAなんてもう「アプリ」なんだからHTML手書き文化もうやめてネイティブアプリ並みの GUI 作成環境も復権しよう。
するとクライアントでも好きな言語が使える。そして同じ言語がいいとサーバサイドで Node.js を使う必要もなくなりへっぽこプログラマが Node のイベントモデルを理解せずに使うこともなくなる。
そしてそれらができたときに Node というか JS/HTML の呪いから解放され人類に平和が訪れるのだ。君はその後も Node.js を使っても良いし使わなくてもいい。
ちるちるBLアワードとは、商業BL情報サイト「ちるちる」主催のイベント。前年に発売されたBL作品のなかで、ちるちるのレビューページの得点が200点以上の作品からノミネートされる。そして1月にちるちるユーザーの投票がなされて、4月に結果が発表される。
推し作品がノミネートすらされなかったのでやさぐれてしまい、私は投票を完遂できなかったのだけど。BESTコミック部門とBEST小説部門の結果は一部予想通りだった。
BESTコミック部門第1位は『夜明けの唄』(ユノイチカ)。これは納得。私はあまり好きじゃないんだけど、皆好きだよねーこれ。あまりにも爆発的に流行っていたので、これしか1位はないだろうなと思った。
2位は知らんからわからん。3位の『神様なんか信じない僕らのエデン』(一ノ瀬ゆま)は読んだけどかなり面白かった。オメガバース作品なので、設定だけで嫌がられたり過剰に求められたりだと思うが、最近はオメガバースも下火なので、逆境を潜り抜けて3位に輝いた感ある。
そしてBEST小説部門。これは私の予想は「魔道祖師は絶対に1位を取れない」だったんだけど、大当たり。「このBLがヤバい2022」では2位と大差を着けて圧倒的1位に輝いたという『魔道祖師』(墨香銅臭)が何故ちるちるBLアワードでは1位を取れないと思ったのか? それは、このBLがヤバいの方は一般の読者も投票するし有識者の意見も入るらしいんだけど、ちるちるBLアワードの場合はちるちるユーザーだけが投票する(つまり極めつきに商業BLにのめっている人間ばかりが投票する)から。それと、ネットで『魔道祖師』の情報を漁ったところ、「買ったはいいが積んでいる」という人がかなり多かったので、「魔道祖師の人気=原作小説の人気」ではないと思った。
商業BL小説の読者層というのはかなり独特な感性をお持ちで、その他ジャンルの小説を読み漁る、本の虫タイプの読書家の常識では計り知れないところがある。だから、ただの小説として、もっと狭い意味でライトノベルとして、圧倒的な高クオリティの『魔道祖師』はだからといってマジもんの商業BL小説系腐女子には受け入れられはしないんじゃないかなと。単純に売上だけはすごくいいんだろうけどね。しかしそれでも2位だったのはかなりの健闘ぶりだ。たぶんこれ、ドラマとアニメの人気だと思うけど。実は買ったものの積んでいるけど、アニメとドラマ好きだし他の作品は読んでないから取り敢えず投票したって人(商業BL小説読まない民)、多そう。
予想外だったのは、BEST小説部門1位を取ったのが『Interlude 美しい彼番外編集』だったこと。私これ持ってるしすごく面白くて好きだけどマ!? 番外編だぜ!?!?!? うわぁー、さすがに商業BL小説史上に残るレベルの人気シリーズ。番外編集の半分は購入特典などの再録本なので、コアなファンは買って得するようなもんじゃないというのに、すごい。
作者の凪良ゆう先生の書く文章はとても平易で分かりやすい。一方、2位だった『魔道祖師』は「漢字が多くて読めない~」(振仮名ふってあるやんけ)とか、「古代中国の文化なんかわからない~」(脚注あるやんけ)とか言われて敬遠されまくっていた。分かりやすいって大事だなと思いつつ、薄々思っていたけど商業BL小説ばかり読む人ってやっぱり【自主規制】いんだなと思った。
BESTシリーズ部門1位は『囀ずる鳥ははばたかない』(ヨネダコウ)まあねまあね、皆好きだよねー(私は読む気もしないけど)。
『オールドファッションカップケーキ with カプチーノ』(佐岸左岸)は去年のBLアワードのBESTコミック部門ぶっちぎりの第1位作品の続編なのだが、やはり1位は取れなかった。予想通りである。「名言製造機になった」「野末さんがあざとすぎる」など、ボロカス言われてたからなあ。私は好きだけど。人気があるからといって続編を作ったらコケてしまったパターンかもしれない。でも本作も漫画としてのクオリティの高さ半端ないので、むしろ商業BLの民よりも薄く広く漫画を読む人におすすめだ。
あれっ、ノミネート作品のなかでは私の最推しだった『秋山くん』(のばらあいこ)がどこにもランクインしていない。でもまあしょうがないか。ただでさえ複数巻のものは腐女子にはあまり支持されないうえに、『秋山くん』の場合は完結までに12年もの歳月を要したのだ。その間に腐界の雰囲気も変わったらしく、あの衝撃の第1話がまず受け入れられないといって読むのを止めてしまう人が多いようなので。でも最終的には大団円で終わったので、未読だが興味あるけど試し読みしたら怖かったって人は安心して読むがいいさ! 秋山くんにはBEST受け部門にランクインして欲しかったなあ(投票した)。攻めの柴くんはあのBEST攻め部門の錚々たる面子の中にとりつく島はないのはわかる。(ひどい)
やっぱりスクカー底辺男は攻め様ランキングには食い込めないのかなと思いきや! BEST攻め部門第1位を『美しい彼』の平良(ひら)が取っていて笑った。さすが平良! でもこの人の底辺ぶりはあくまでも自己評価でしかない。無自覚ハイスペックニュータイプ亭主関白俺様攻めだから、平良は。
アワードについてはこれでおしまい。次は最近読んだBL。(ネタバレあり)
2018年2月のある日、体育の授業中に突然ヒートを起こした西央(にしお)につられて発情してしまった喬(たかい)。二人は体育館倉庫に転がり込み交わったが、西央の体調は改善せず、倉庫から出られなくなってしまう。喬は一人で倉庫を出て食料や生活用品をかき集め、西央の籠城生活の環境を整え、同時に自分達の体に何が起きたのかを考察する。
籠城三日目、どうやら西央のヒートの峠が過ぎたらしい。あと数日で西央を家に帰せるという見通しをたてた喬だったが、それに一抹の淋しさを感じた時、彼の本能があらぶり始め……。
オメガバース作品で、『旧約聖書』の1節からスタートする本作。人類史上初めてのαとΩの誕生という大事件が、高校の体育館倉庫という狭い密室でひっそりと起きていたという、壮大にしてミニマムなお話。
そもそもオメガバースとはなんぞや? というと、ググった方が早いんだがざっくりいうと欧米発祥の特殊設定。ヒトに男女の性別のほかに「バース性」という性別がある。すなわち、支配者の性α、凡人のβ、産む性(隷属の性)のΩ。それらのバース性のいずれかが男女それぞれについてくる。男性α、女性α、男性β、女性β、男性Ω、女性Ωの六つの性別があるということ。
本作は人類史上初のαとΩの物語なので、主人公の喬(α)は自分とΩの西央が一体何であるのかを知らない。喬はせっせと文献を調べ考察していくうちに、自分達の生態が狼の生態に近いことに気づく。そして自分と西央が異様に盛る様に「発情(ヒート)」という名をつける。
下巻はもっぱら喬がαとしての本能のダークな面をなんとか抑えつけようと奮闘しつつ、αらしい一途さで西央を守ろうとする話。そして喬と西央は互いに相手とは本能抜きではどういう関係なのか? と疑問を懐く。
商業BLではあまり見られない、深いところまでつっこんでるストーリー。オメガバース設定のBLというのは社会問題やジェンダー問題に切り込むものが他にもいくらかある。『リバース』( 麻生ミツ晃)、『シマちゃん家の番事情』(三日ミタ)、『嘘つきな愛を買う』(ポケラふじ子)とか。でも、数年前に二次創作の世界で初めてオメガバース設定を見た時には、社会問題提起系というよりは、SMっぽいというか虐待描写メインの特殊性癖っていう印象だった。今となってはBLでポリコレの影響を最も受けていそうなジャンルのような?
『僕エデ』はジェンダー問題以上に生命の不思議にウエイトが置かれている感じで、昨今流行り? の反出生主義に疲れたハートには心地よかった。終盤、自身と西央が新しいタイプの進化した人類だと悟った喬が、「自分達が多数派になる日が来るまで潜伏する(誰にも内緒にする)」と決断したことろは、ベタでありつつ(漫画の登場人物って変な生き物を発見すると、政府や研究機関に取られるのを恐れてとりあえず隠そうとするよね。)老子っぽくてよかった。
『シマちゃん家の番事情』を読んだ時も思ったけど、今っぽいニュータイプのオメガバースっていいなと思いつつ、しかし以前のもはや男女カプでは容易に描けなくなった禁忌なネタの駆け込み寺的なジャンルが浄化されてしまったようで、それはそれでどうなんだという気がする。でも最近はまたしても欧米渡来の因業設定「Dom/subユニバース」が定着したので、アングラエログロの行着く先はそこかな? いずれそれも浄化されそうだが。
※「Dom/subユニバース」とは……ググった方が早いがざっくり説明すると、ヒトの性別に男女の他にDomとsubという性があるという設定。Domは支配者でsubは被支配者である。Domはsubと二人で決めたワードをsubが言うまでsubを虐めることが出来る。要はSMだな。
真理(まさみち)は美貌の男・佐藤と同居中。というのは、ある夕方にカフェで真理がうっかり通りすがりの佐藤のコートにコーヒーをぶちまけてしまったから。コートのお値段、なんと86万円。怒った佐藤は86万円ぶん真理の家に居座ってやると宣言。以来、奇妙な同居生活が始まった。
佐藤の言うことを何でも受け入れてしまう真理。「マリちゃん」呼びから始まって、ただいまのキスやらなんやら、佐藤の無茶ぶりは次第にエスカレートしていき……。
あんまりレビューが良くないが絵が物凄く綺麗なので、これは絵以外に良いところ無し系の漫画なのかとビビりながらも、試し読みしてみて冒頭一ページに惹かれたので購入。思いの外よかった。
美貌の変人佐藤に常識人陰キャのマリが振り回される系かと思いきや、マリが愛すべき変な生き物って感じで、何が起きても動じないマリに佐藤が戸惑うという話だった。
途中で佐藤の元カノの登場。すごく重要人物という訳でもなくカッコいい姐御でもなく身内でもない女がさらっと登場するのは、BL読者にはあまり喜ばれないところ。だが佐藤と元カノの会話の様子から、もしかして佐藤って実は心から他人を好きになったことがないんじゃない?(だから別れた相手と屈託なく喋れるのでは)という疑念がうっすらと湧いてくる。もしかしてこれはタイトルの伏線回収なのではないだろうか。つまり、86万円がきっかけで初恋をしたのは陰キャのマリだけでなく美貌のコミュ強佐藤もまたそうなのだという。
マリの歳上すぎる友人の件以外、派手な事件は起こらない話だけれど、心情的な揺さぶりやどんでん返しがあり、退屈しない。が、例えばジャンプ漫画みたいにハッキリと事件事故が起きて悲喜劇にならなければ漫画とは認めないような人には、向いていないだろうな、と思う。
表紙がとても綺麗で、中身の絵もとても綺麗。短文モノローグがしばしば挟まるのだが、それらが独特のリズム感を生んでる気がする。
レーベル的にエロがすごく多いのかと思ったら、わりと落ち着きのある感じのエロ配分(オカズ系というよりは人類の一習性レベル)だった。
今日はこれまで。
1ページ漫画。本編で間宮のことを好みのタイプじゃないとバッサリ言い切った佐田に、間宮が「じゃあどういうのが好みなんだ?」と聞く。佐田の答えは……。
好みのタイプについて考えているうちに、じわじわ恋心を自覚しちゃって「ドキドキしてきた」という佐田がとてもかわいい!! こんな30歳は反則……かわいい、嗚呼、かわいい……。間宮には気の毒だけど。
この場面に限らず、佐田の、非の打ち所のないイケメンなのに応答がもっさりとしていてノロい所が好き。
次は観たBL。
高校最後の夏休み到来。夏休みは平良にとって、教室の息苦しさから解放される貴重な一時だった。だが、清居を好きになってしまった今となっては、清居と同じ空間に居られない夏休みなんかクソと思う平良だった。ところが、清居のグループの面々が夏休みをどこで何をして遊ぶか決めようとした時、清居が「平良の家に行く」と口を挟む。いつものメンバーに女子まで加わり、平良家で宿題をやったり花火をしたりすることになったが……。
原作では花火大会にお出かけする話だったのが、ドラマではスケールが小さくなって、おうち花火に。作中世界は疫病のご時世ではなさそうなのに、ステイホーム花火とは。低予算を努力でカバーしたにおいぷんぷんだが、これはこれで面白かった。スクカー最上位グループの皆にこき遣われている平良の表情がよく見えていい。動きはあくまでも従順。だが皆の視線が他に逸れている時に顔全面に「ふざけんなよ……」的な内心駄々漏れの表情を浮かべる平良。無自覚俺様ぶりが滲み出ている。表面的にはおどおどしているけれど、芯の一本通った性格がよく表現されている。
家に独りでいる時は素直に感情をさらけ出し、集団内では沈黙を通し、しかし清居を見詰める視線には情熱の炎が宿る。萩原利久の平良再現度が半端ない。萩原利久、おそろしい子……!
清居が平良に対して興味津々で、平良への絡み方が時々ちょっとワンコっぽいのも良い。見た目孤高のキングだけど、実は淋しがりやな性格が出ている。清居役の八木勇征もなかなかの演技派だなぁ。
小説投稿サイトのアルファポリスで毎年11月に行われている。10月1日~31日がエントリー期間で、11月1日~30日が開催期間。今年で9回目。
出品資格はオリジナル創作BL小説であること。そして受賞のあかつきにはアルファポリスに出版権を握らすことに同意することである。参加前に出版契約書のテンプレをよく読んでおくべし。
受賞作品は、読者ランキング上位からアルファポリス編集部が選ぶ模様。
読者(大会にエントリーした人も含む)には持ち票が3票与えられる。読者は投票することで好きな作品を応援することができる。
去年までは、オリジナルBL小説なら何でもよかったんだけど、今年は18歳未満の子供であることが明らかな人物の性描写がある作品は選外というルールが追加されていた。
けど、参加作品の作品紹介文をざっと見て回ったところ、募集要項をちゃんと読まなかったらしき人がけっこういた。
箇条書きで。
400位台前半。思ったよりはよかった。