魂の生命の領域

AWS とか Python とか本読んだ感想とか哲学とか書きます

異常論文 を読んだ

以前の記事でもボロクソ言ってたのですが、ようやく読み終わりました。

kesumita.hatenablog.com

いまから感想を書きます。

ネタバレは特にしないと思います。というよりネタも何もないようなものなので…

結論だけ言うと、「自分には合わなかった」です。

どんな本か

国内のSF界隈によるアンソロジー?です。

「異常論文」になにかルールが設けてあるわけではなく、「異常論文と聞いて各人がイメージしたもの」ぐらいな感じに見えます。

だから論文の体を成していないとかそういう角度からのいちゃもんもつけられるのかもしれませんが、逆にバリエーションに富んでいて読んでて飽きなかったです。

ただ、「だとしてもこれはどうなのよ」ってのもあり、「いや、その辺りが『異常』ってことなんだよw」とドヤ顔で言ってきそうなところも含めてちょっとイラッとする面も否定できないです。

700ページ弱の大ボリュームなので、以降はいくつかピックアップして感想というか気持ちの整理をさせてもらおうと思います。

感想

全体を通して、個人的に面白いと思ったものはほとんど前半に固まっていたなぁと思います。

各作品の並び順に対するなんらか編者の意図のようなものは感じられたので、多分「前半におきたいもの」までが自分に刺さり「後半におきたいもの」は肌に合わなかったという感じなのかもしれないです。

あと、各著者の紹介でいちいち学歴を書いてたのはキモかったです。知らねーよ、と思いました。論文という体だからか?と一瞬思いましたが論文は執筆時点の所属機関までしか書かんしなぁ…。

気に入ったもの

まずは気に入ったものをピックアップします。

先ほども書いた通り、ほとんど前半の収録作品です。

決定論的自由意志利用改変攻撃について / 円城塔

冒頭に載っているやつで、どこかの宇宙のどこかの時代に起きた不可解な現象を考察した論文、という設定の作品です。 一番論文っぽく、ここだけを立ち読みして面白そうじゃんと買ってしまったんですよね。

論文っぽいと言ったのは、私が知ってる「論文」が理論物理に偏っている前提に立っての発言で、他の人がどう思うかは分かりません。

それっぽい数式が出てくるのが個人的に一番面白かったです。

式変形含め一応追えるんですが、それが何か新しい事実を提供しているわけではない、でもそこに対する物理的な考察がちょっとそれっぽくて楽しい、そんなやつです。

ただし慣れていないと本当にただの記号の羅列にしか見えないと思いますし、わからないひとは「何となくすげぇ」って楽しみ方になるんでしょうか?(単純にわからない)

掃除と掃除用具の人類史 / 松崎有理

文明を維持する上で避けられない「ゴミとの闘い」を文明の進歩とともに考察する小論文的なお話です。

古代のお話から近代、現代の自動掃除ロボットの話を淡々と説明しますが、文がとても良く、いかにも論文調でドライながらも時々想像したら笑ってしまうような状況説明があり、ニヤニヤしながら読めます。

世界の真理を表す五枚のスライドとその解説、および注釈 / 草野原々

タイトルの通りスライドが5枚あり、右ページにスライドの画像、左ページにその説明といった構成で、そこだけを見ると非常にコンパクトに読める気がします。

ですが、その説明内で未知の概念を大量に導入しているためそれを読んでも何も理解できず、ひたすら論文?の後ろにある脚注と本文の間を反復横跳びをすることになります。

その脚注もさらに脚注を必要としていたりと大半はそこを読むことに費やされます。

それが結構楽しい、という作品です。

アカシック・レコード / 柞刈湯葉

アカシック・レコードの逆ということで「この世界のすべての嘘が収録されている」という謎の実体の調査レポート、の体をとった作品です。

これも文が良くて読みやすいですし、知的な笑いがあるので良いです。

オタクの手垢に塗れたSCPとかいうプラットフォームに染まっていなくて本当によかったです。

解説−最後のレナディアン語通訳 / 伴名練

レナディアン語という架空言語で記されたアンソロジーの解説、という体の作品です。(もちろん本作品は日本語で書かれています)

最初はいかにも架空のアンソロジーの解説を(当然本文の方は載ってない)やたらに高い解像度で紹介している、という感じでその解説の中で「レナディアン語」なるものの紹介やそれを創始した日本人作家の紹介なんぞをしていきます。

ただ、途中から雲行きが怪しくなっていき最終的にはホラー?になっています。

他の作品が割と「異常さ」を前面に押し出しているためか読後感なんてないに等しいのですが、この作品だけはちゃんと読んだ後「あー…」と考え込む系の読後感があります。

この作品のあとにも「本来の(異常論文という作品に対する)解説」が別の作家によって書かれているのですが、この作品自体も巻末にある「解説」の体で書かれており、まずそれが面白いですよね。

気に入らなかったもの

ここからはただ罵倒するだけになるので、見たくない人は見ない方が良いですし、「なんてこと言うんだ!撤回しろ!」と言われても知りません。

SF作家の倒し方 / 小川哲

オタクの馴れ合い。

ここで初めて自分はこのアンソロジーがそもそもどう言った文脈のもとに存在しているか、つまり誰に向けたものかを理解しました。

実在の ”身内のSF作家仲間” を「裏SF界のメンバー」という設定にして、彼らの創作スタイルを説明しながらそこから「倒し方」を考察している作品です。

個人的な親交のエピソードであろう内容も含まれていて、本当にただの馴れ合いって感じでキツかったです。

これが先ほど紹介した「気に入ったもの」の多い作品パートが終わってだんだん作風に違和感を覚え始めたあたりに収録されているので、「あ〜違和感の正体はこれかぁ」となりました。

まぁ要するに自分はこの ”界隈” の身内でもファンでもなかったので、最初から読むべきではなかった、ということですね。失礼しました。

ベケット講解 / 保坂和志

これ、論文じゃないでしょと思いました。

なんか「ベケット」という人?の作品をの凄さを俺の優れた感性によってこんな特殊な見方で絶賛しちゃうぜ〜wっていう作品です。

ダラダラと手癖だけで書いたような鼻息の荒い文章は、ちょうど食べログでたまにある「ラーメン屋のイタいレビュー」みたいな感じです。

また、普通に「ベケット」って架空の話かと思っていたのですが、実在の作家さんなんですね。

知らなかったです。そんな感じでどこまでが事実でどこからが虚構なのか分かりづらいので、どのぐらい真剣に読めばいいのか分かりにくいです。

てっきり「存在しない作家の存在しない文学作品に対する自分(著者と別人格という意味ではこれも存在しない人間)の感想文」みたいなものと思っていました。 逆に本当にそうだったらもう少し面白く感じたかもしれない、とも思いました。

いや、最初はむしろ全部架空の話だと思って読んでたのですがどうやら実在の人物に対する内容らしいと知ってから、「本当にただのブログ」を読ませられている感覚になりとてもキツかったです。

場所(Spaces) / 笠井康平・樋口恭介

樋口恭介氏はこのアンソロジーの編者です。

なんか作家友達二人によるアイデア出し?みたいな会話を美化してポエムみたいにした作品?なんでしょうか。

端的に言ってなぜ掲載されているのかわからないです。論文じゃなくないですか?

彼らの思うSF小説風の文のスクラップをひたすら手癖で繋げてドン!と載せた感じです。とにかく文体がポエム調で自分に酔ってる感じが読んでてキツかったです。

無断と土 / 鈴木一平+山本浩貴

先ほども書いたように後半がかなり苦痛だったので読むのを諦めかけていたのですが、いろんなところで評判を見るとこの最終盤の「無断と土」が一番面白かった、とあり頑張って読みました。

編者による紹介文に「ボルヘスもゆうに超えていると言っても過言ではない」とまで言ってるのでさぞ凄いんだろうと思って読んでみました。

個人的な感想としては、「何言いたいのかわからなかった」です。みなさん頭いいんですね〜。

多分、最初に書いた文章に後から少しずつ難しめの語彙や言い回しに直したり、あえて遠い表現を使った比喩を途中途中にねじ込んだりする形で書いてると思います。想像ですが。

なので後から細工した感じが強く、ねじ込まれたであろう文節では(そこだけ浮いて見えて)目が滑りますし、細工されていないであろう箇所の文体や語彙は妙にカジュアルで違和感がすごいんですよね。

それも狙って書いてるってことですかね?これも例に漏れず「いや、あえてこう書いてるんですよw」っていう作者のドヤ顔が浮かんでくる系の構成で、読んでてキツかったです。

あえて何言ってるのかわからない奇妙な「論文」(?)を書きたかったのか、ちゃんと言いたいことや中身のストーリーはあるけど私の読解力が低すぎて理解できなかったのか、果たしてどっちだったのだろう。

あと、ちょくちょくイデオロギーを感じる記述があるのはなんなんですかね?

読む側としては特定のスタンスに立って読んでいるわけではないので、急にそのあたりの話題を持って来られると変に身構えてしまいますよね。

そして下手に評価すると場外乱闘に巻き込まれそうな気がして怖い。

その他感想

思ったのですが、やっぱりこの手の作品ではウィトゲンシュタインをやたら引き合いに出す人が多いですね。 まぁそれは良いと思うのですが、みんな例外なく論理哲学論考を意識したことしか言わないです。哲学探究の方もカバーすれば「みんなとは違うぜ」感が演出できるかもしれません。(「言語ゲーム」って単語を入れ込む人はいるかもしれない)

あとボルヘスの名前を出したり匂わせたりするのも定番ですね。

まとめ

今後、日本のSF小説をどういう目で見れば良いか、いろいろ考えるきっかけになりました。

おわり。

資格を取る

この1年ほどでまた資格を取るようになりました。

www.credly.com

まずはこの初期(3年半前)の記事を見てください。

kesumita.hatenablog.com

完全に調子に乗ってますよね。

特にここ。

あとは Solution Architect Professional と DevOps Professional を取得すれば今年の資格目標は達成ということにしたいと思います。応用情報(10月)も取得できればそのあとのスペシャリスト系が取得しやすくなるのでやりたいなぁと思っていますが、とりあえず先に挙げた二つに専念したいと思います。

これ、ちょっとあとに Solution Architect Professional (SAPro) に3連敗して、完全に嫌になっていますからね。

その上、自分が好きなのはインフラではなくアプリケーション(とサーバーレスアーキテクチャ)なのだと自覚するに至り、SAPro は関係ないと適当に言い訳して逃げてました。

ですが、AWSの資格の3年更新ルールもあっていよいよ逃げられなくなり、再度勉強してリベンジしました。(といっても去年の話)

それと合わせて、DevOps Engineer Professional も取得し、勢いそのままに Security Specialty も取得します。

そこからまた資格取得からは遠ざかっていたのですが、IPA の方にも取り組もうと応用情報を受験して(詳細は省きますが)なぜか合格してしまいました。

そして Database Specialty を取りました。

なので直近はこんな戦績です。

  • 2022年2月 AWS Certified Solution Architect Professional
  • 2022年3月 AWS Certified DevOps Engineer Professional
  • 2022年4月 AWS Certified Security Specialty
  • 2022年10月 応用情報技術者
  • 2023年2月 AWS Certified Database Specialty

会社には「今年は AWS の資格を2つ以上取る」と宣言していたので、これで一旦達成です。

最近、開発の仕事がメインになり AWS に若干飽きていたところがありましたが、今回の試験対策を経てまた久しぶりに AWS のことを真剣に考えました。

やっぱり楽しいところはありますよね。

以上。オチはありません。ただ嬉しくて自慢したかっただけなので…

Amazonの綺麗なURLを取得したい 【Chrome拡張版】

ブックマークレット版はすでに紹介しましたが、もともとは Chrome 拡張として作りたいと思っていました。

kesumita.hatenablog.com

とりあえず動くものはできたので紹介します。

先に成果物

github.com

初期案

動かし方のイメージとしては、疑惑のリンクを右クリックしたときにコンテキストメニュー(右クリックで出てくるメニュー)の中にその「綺麗なURLを別タブで開く」ボタンが選択できる形式です。

なので、選択されたURLに対して GET メソッドの HTTP リクエストをしないといけないわけですが、使ったのが fetch API です。

こんな感じで、 res オブジェクトの url 属性には最終的なリダイレクト先のURLが入ってきます。

fetch(srcUrl).then(res => {
    if (!res.ok) {
        return Promise.reject(new Error(`${res.status}: ${res.statusText}`));
    } else {
        return res.url;
    }
});

developer.mozilla.org

ちなみに Promise とか async / await のあたりを全く知らなかったので一から勉強しました。

jsprimer.net

このページがおすすめです。

話を戻しまして、これで取得したURLを加工して余計な文字列を排除すればOKということで作ってみたのですが、URLの加工のパターンを考慮漏れがない形で実装するのが面倒だと思いました。

例えばこちらですが、

www.amazon.co.jp

URLをそのままコピペすると

https://www.amazon.co.jp/%E8%B3%83%E5%8A%B4%E5%83%8D%E3%81%A8%E8%B3%87%E6%9C%AC-%E5%B2%A9%E6%B3%A2%E6%96%87%E5%BA%AB-%E3%82%AB%E3%83%BC%E3%83%AB-%E3%83%9E%E3%83%AB%E3%82%AF%E3%82%B9/dp/400341246X/?_encoding=UTF8&pd_rd_w=umEiV&content-id=amzn1.sym.1a81fc55-56fb-47c1-b953-191894c78d90&pf_rd_p=1a81fc55-56fb-47c1-b953-191894c78d90&pf_rd_r=ZGNPH0H3JVV4WQPXT1PS&pd_rd_wg=w7ctw&pd_rd_r=d4bb6a84-0fcb-488a-998d-16b42e401c84&ref_=pd_gw_ci_mcx_mi

のようになります。これを省略したいとします。

まずクエリストリングは全部除去できます。(なおかつ ? より後ろを無条件にカットするだけなので簡単)

https://www.amazon.co.jp/%E8%B3%83%E5%8A%B4%E5%83%8D%E3%81%A8%E8%B3%87%E6%9C%AC-%E5%B2%A9%E6%B3%A2%E6%96%87%E5%BA%AB-%E3%82%AB%E3%83%BC%E3%83%AB-%E3%83%9E%E3%83%AB%E3%82%AF%E3%82%B9/dp/400341246X

その上で日本語の商品名がURLエンコーディングされたこの文字列を削除します。

%E8%B3%83%E5%8A%B4%E5%83%8D%E3%81%A8%E8%B3%87%E6%9C%AC-%E5%B2%A9%E6%B3%A2%E6%96%87%E5%BA%AB-%E3%82%AB%E3%83%BC%E3%83%AB-%E3%83%9E%E3%83%AB%E3%82%AF%E3%82%B9

最終的には以下が求まります。

https://www.amazon.co.jp/dp/400341246X

この dp の後ろの文字列は、ブックマークレット編 でも述べた通り ASIN と呼ばれる商品コードで、各ページに記載されているものになります。

ただ、毎回このロジックで取れるわけではなく例外もあります。そしてその例外がどれぐらいあのかもよくわかっていない。

DOM から ASIN を読み取る編

ググったところ、以下のように id = 'ASIN' の要素を見れば値が取れるようです。

let asin = document.getElementById('ASIN').value

これを開いたページ内で実行するのが、前回のブックマークレット編でした。

gist.github.com

が、自分はブックマークバーを表示しない派(画面を広くしたい)であり、 Chrome 拡張としてのアウトプットもほしいので別の方法を考えます。

manifest v3 では service_worker は DOM にアクセスできない

一番苦労したのはここです。

Chrome 拡張では、 manifest.json というファイルに「どのスクリプトを実行するのか」や「どんなアクションをこの拡張に許可するのか」を定義します。 で、この manifest.json ですが、今は V3 が最新になっています。

developer.chrome.com

この V3 ですが、 V2 と比べて色々変更されたらしく、ググって出てきた V2 時代のやり方を適用しようにも根本的に適用できないパターンがありました。 それがこの service_worker では DOM にアクセスできないという話です。

なので、コンテキストメニューでクリックされたときにページのDOMを読み込んで、先ほどの ASIN を取得して…というのができないです。

問題点を整理

今の問題点を一旦整理します。

  • ASIN をURLから確実に取得する方法がわからない
    • A-1. 該当ページのDOMが取得できれば、そこから ASIN を取得できるので確実
    • A-2. 正規表現で頑張る
  • Chrome 拡張の service_worker では DOM を取得できない → そのままでは A-1. が使えない
    • B-1. 外部スクリプトを呼び出して A-1. を実行する
    • B-2. fetch API で取得した URL から A-2. を実行する(できる?できそう)
    • B-3. fetch API で取得した URL からその先の DOM を取得し、 A-1. を実行する(できる?)

そして A-1. 単体が前回のブックマークレットというわけですね。

本題

いくつか方法はありそうでしたが、 B-1. の外部のスクリプトで実行するようにしました。 こんな感じです。

  • backgroud.js
// 外部スクリプトを実行
const res = await chrome.scripting.executeScript({
    target: {tabId: tab.id},
    files: ['./content.js'],
});

// 外部スクリプトからの戻り値
const url = res[0].result;
if (url) {
    chrome.tabs.update({url: url});
};
  • content.js
// DOM にアクセスする
(() => {
  try {
    const baseUrl = 'https://www.amazon.co.jp/dp/';
    const asin = document.getElementById('ASIN');
    if (asin) {
      return baseUrl + asin.value;
    };
  } catch (err) {
    console.error(`エラーが発生しました (${err})`);
  }
})();

全体

何がベストかを語れるレベルはないので、コア部分をそのまま載せておきます。

backgroud.js

  • AmazonのURLかどうかを判定する(ガバガバ)
function isAmazonUrl(pageUrl) {
  const pattern = 'https://www.amazon.co.jp';
  return pageUrl.includes(pattern);
}
  • 右クリックメニューを追加する
chrome.runtime.onInstalled.addListener(function() {
  chrome.contextMenus.create({
    id: 'open-good-amazon-url',
    type: 'normal',
    title: 'Amazonの綺麗なURLを開く',
    contexts: ['page']
  });
});
  • 右クリック時の挙動を定義する
chrome.contextMenus.onClicked.addListener(async (info, tab) => {
  try {
    const pageUrl = info.pageUrl;
    if (!isAmazonUrl(pageUrl)) {
      console.log('Amazon のリンクではありません')
      return
    };

    const res = await chrome.scripting.executeScript({
      target: {tabId: tab.id},
      files: ['./content.js'],
    });

    const url = res[0].result;
    if (url) {
      chrome.tabs.update({url: url});
    };
  } catch (err) {
    console.error(`エラーが発生しました (${err})`);
  }
});

content.js

(再掲)

// DOM にアクセスする
(() => {
  try {
    const baseUrl = 'https://www.amazon.co.jp/dp/';
    const asin = document.getElementById('ASIN');
    if (asin) {
      return baseUrl + asin.value;
    };
  } catch (err) {
    console.error(`エラーが発生しました (${err})`);
  }
})();

まとめ

途中であげた問題点を再掲します。

  • ASIN をURLから確実に取得する方法がわからない
    • A-1. 該当ページのDOMが取得できれば、そこから ASIN を取得できるので確実
    • A-2. 正規表現で頑張る
  • Chrome 拡張の service_worker では DOM を取得できない → そのままでは A-1. が使えない
    • B-1. 外部スクリプトを呼び出して A-1. を実行する
    • B-2. fetch API で取得した URL から A-2. を実行する(できる?できそう)
    • B-3. fetch API で取得した URL からその先の DOM を取得し、 A-1. を実行する(できる?)

今回できたのは、 A-1.B-1. でした。

本当は初期案のように、該当ページを開く前に綺麗なURLを取得して右クリックで開けるようにしたかったです。 なので、次に無難そうな B-2. をやるかもしくは(出来るかどうかそもそも知らないのですが) B-3. も挑戦したいです。

というより B-3. でなんとかできないか、という方向で頑張ってたんですが、結局何がうまくいってないかのかわからなくなって諦めた感じです。リベンジしたい。

得たもの

  • JavaScript ちょっとだけわかった
  • JavaScript と Promise, async, await について学ぶことができた
  • Chrome 拡張を作ることができた

参考ドキュメント

developer.chrome.com

developer.chrome.com

developer.chrome.com