魂の生命の領域

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

資格を取る

この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

直近読んだ本とかまとめ

一冊につき1記事書くのは辛いので、読んだけど永遠に下書きに格納されている「本読んだ」系の記事をここに合体させます。

適当なことを言うとただの嘘になってしまうので、本当はちゃんと引用しつつ書きたいのですが、そうなると永遠に進まないので辛い。

驚異の量子コンピュータ 宇宙最強マシンへの挑戦 / 藤井啓祐

驚異の量子コンピュータ 宇宙最強マシンへの挑戦

多分2020年ごろに読んだと思います。

Google量子コンピュータで量子超越性を示した!みたいな査読付きの論文を出して話題になっていた頃に出た本です。

数式は出てこないですが、深いところまで書かれているのでオススメです。

俺はマヨラナ準粒子の非可換統計を使ったトポロジカル量子計算をずっと待っている。

共産党宣言 / マルクス エンゲルス

たしか2021年の夏〜秋ごろに読みました。

岩波書店の厳つい本を自宅の本棚に置くという夢があり、その入門編としてまず薄い本を読もうというわけで読みました。

ちなみに Kindle で無料のやつ があったのでとりあえず買ってみたのですが、訳が古くて漢字が読めなかったのですぐ諦めました。 とはいえ堺利彦幸徳秋水の訳なので史料みたいな感覚で頑張って読み通す価値はあると思います。

岩波の方 は(これも Kindle 版あるんですが)読みやすい訳となっています。

ちなみに蟹工船の感想書いた時も言いましたが私は共産主義者じゃないです。

kesumita.hatenablog.com

論理哲学論考/ 古田徹也

2021年〜2022年にかけての年末年始に読みました。

みんな大好きウィトゲンシュタインの主著の解説本です。

岩波の和訳 ではなく解説本 の方を読みました。

岩波の和訳の方も持っていますよ。

本文を内容に沿って章に分けた上で重要な部分(と著者が判断した)を抜き出し、それをわかりやすい例を用いながら噛み砕いていく流れです。

オリジナルの方は数理論理学もターゲットに入っているので、ときどき数式も出てくるのですが、その辺はバッサリ省いてあります。

論理を極限まで静的?な枠組みとして捉えることでできること/できないこと(語りうる/語り得ない)の境界を探っていく流れだと思います。

超解読!はじめてのフッサール現象学の理念』 / 竹田青嗣

これは2021年の年末から2022年の5月ごろまで読んでました。

超解読!はじめてのフッサール『現象学の理念』

本屋で偶然「現象学」という文字を見つけてなんか心惹かれて買いました。

「主観は客観に一致するか?」って話あるじゃないですか。

オタクが好きなところで言えば「この世界が実は5分前に誕生してそれ以前の我々の記憶や歴史的事実と思っているものは全部意識に刷り込まれた幻想に過ぎないんだよ(そう言われて反論できるかな?)」的な、要するに「全ては主観に過ぎないのでは?」ってやつです。

それに対してあのデカルトが「でもそう疑うことができているということは自分の意識自体はあるってことだよね」という「我思う故に我あり」って言ったわけです。

で、そこからさらに進むにはどうすれば良いかですが、ヘタをすると「それってあなたの主観ですよね?」って言われてしまいます。

そこで「これは疑っても何も始まらないこと」、例えば「あのリンゴ赤いね〜」って思った時に、「本当にリンゴなのか?」とか「赤はみんなそう思ってるのか?」とかその辺りは疑う意味はあるかもしれませんが「『あのリンゴ赤いね〜』って思ったこと自体がもう幻想なのでは?」までいくと何もできないですよね。 なのでそこはもうどうやっても疑いようのない主観として受け入れても良いはずです。 もっと言うとこの自分の主観を他の人も持っているのであれば、じゃあそれを(でもそれって主観じゃん!って言うこと自体はできるけど)客観的事実ってことにしても良くない?って思えてきます。 さらにもっと言うと、「周りの人の主観」という自分の主観の外にあるものを急に持ち出すのはズルいって言われそうですが、結局問題になっているのは「周りの人の主観もこうでしょ」という確信があるかないかになってきます。

そんな感じで、主観の枠を超えて客体をバチッと認識する(できる)と考えるのではなく主観の範囲から疑いようがない・疑うと何も進まなくなるような確信を見つけて、それを積み上げて考えていくのが現象学だぜ、みたいなことを言ってる本だった気がします。

多分ね。

共産主義の系譜 / 猪木正道

2022年の5月ごろから8月ごろまで読んでました。

共産主義の系譜

これはねぇ、面白いですよ。

初版が1949年に出てるので、まだ戦後間もないころ、特にソ連スターリンが現役だった頃です。

共産主義の始まりから今(出版当時)までのキーパーソンを生い立ちから思想までを分析している本です。

この本を読むまでフォイエルバッハとかラッサールとか知らなかったです。

マルクスヘーゲルを批判的に受け継いで史的唯物論を打ち立てた、という話は有名ですが、実はヘーゲルマルクスという流れではなくヘーゲルフォイエルバッハマルクスという流れだったらしいです。

対してラッサールについてはヘーゲル→ラッサールという流れだったらしく、その点でヘーゲルの域から出られていない、という感じらしいです。

そんなわけで前半は「共産主義」という思想が帝政ロシアに輸入されて、ロシア革命を経て世界初の共産主義国家として成立するまでの流れが楽しめます。

共産党宣言を読むと「資本主義(主に重工業)が発展し尽くすと社会主義になり、その最終形態が共産主義である」である、みたいな話だと理解できるんですが、実際は帝政ロシアや中国をはじめ資本主義すらまともに成熟していない国家で軒並み社会主義革命が起きているわけです。

工業化すらできていない後進国で成立した”社会主義”について、その歪みや異常さについて鋭く指摘しています。

昔の本ですが文は平易で無駄がない表現なのですらすら読めて気持ちいいです。

めっちゃアホみたいな感想だな

超解読! はじめてのヘーゲル精神現象学』 / 竹田青嗣西研

2022年の5月ごろから2023年の1月下旬ぐらいまで読んでました。

超解読! はじめてのヘーゲル『精神現象学』

一度は読みたいですよね。

でもまずは解説本を読んでみました。

基本的には弁証法として知られる、二項対立の構図からそれら両方を取り込んだ一つ上の段階に至るというモチーフを駆使して人間の精神と人間同士の集まり(社会)全体の”精神”の発達を語っています。 なので、何かのテーマに対する素朴な考え方とそれに対する反論が出てきて、それらが歩み寄るかもっと上で考えが出ることで話が進む、という感じになります。

人間の意識の成長過程を社会の発達に対応させていく流れはだいぶ「なるほどなぁ〜〜〜〜〜〜〜」って感じでした。

まとめ

なんか、1年ちょっと前ぐらいからやたら哲学の本を読むようになりました。

元々憧れはありましたからね。