さわらブログ

さわら(@xhiroga)の技術ブログ

Contentful にコンテンツが追加されたらツイートする by IFTTT(ノーコード)

TL:DR

ContentfulでIFTTTが用意したWebhookを叩いてツイートします。 (Zapierの方が簡単ですが、個人開発ではWebhookが無料で利用できるIFTTTがオススメです)

手順

  1. IFTTTのワークフローを設定する
  2. ContentfulでWebhookを叩く

IFTTTのワークフローを設定する

特に難しいことはなく、IFTTTで Webhook → Twitterの連携を設定します。

f:id:hiroga_cc:20210207175234p:plain
If Maker Event "tweet", then Post a tweet

ツイートの文章はIFTTT側に入れないのがポイントです。
Contentful以外のサービスからもWebhook経由でツイートしたい場合があるのを見越して、ワークフローを他のサービスと共用にするためです(IFTTTの無料枠が3枠なので節約するに越したことはない)
要するに、IFTTTはあくまでTwitterに付随するWebhookとして使います。

f:id:hiroga_cc:20210207174938p:plain
webhook to tweet

2. ContentfulでWebhookを叩く

IFTTTのWebhookエンドポイントにクセがあるので注意です。 ポイントは2点。

  1. Webhookのエンドポイントはワークフローの画面ではなく、プロフィール > My Services > Webhookから確認する。
  2. ContentfulのContent Typeは application/json に設定する。
  3. ツイートの文面をContentfulのWebhook側に埋め込む。

Content Typeについて、Zapierの場合はデフォルトの "application/vnd.contentful.management.v1+json" でも受け付けてくれます。優しいですね。

ツイートの文面のPayloadはこんな感じです。
実験したところ改行コード(\n)はツイートにも反映されました。ありがたい。

{
  "value1": "{ /payload/fields/title/en-US }\n新しい記事を公開しました!"
}

それからWebhookの発火タイミングですが、ユースケース次第ではあるものの「記事が投稿された場合に発火」ならEntryの Publishだけにチェックすれば良さそうです。

f:id:hiroga_cc:20210207175633p:plain
Entry(おそらくContentの旧称)

デバッグ時には何度もコンテンツをPublishする必要がありますが、記事のステータスを Unpublish → Publish に切り替えれば何度でも投稿できます。楽ですね。

まとめ

TwitterにWebhookを生やす感覚でIFTTTを使っていこう、という話でした。

Google Apps Script GitHub アシスタント で Error [github assistant] undefined と表示される → Google Apps Script API をオンにしよう

TL;DR

Google Apps Script GitHub アシスタント で Pull に失敗し、かつ Error [github assistant] undefined を表示されている場合、Google Apps Script API がオンになっていない可能性があります。

chrome.google.com

設定からオンにしましょう。

詳細

以下の通り、エラーが表示されることがあります。

f:id:hiroga_cc:20210130174536p:plain
Error [github assistant] undefined

Developer Consoleでログを見てみると...

{
  "error": {
    "code": 403,
    "message": "User has not enabled the Apps Script API. Enable it by visiting https://script.google.com/home/usersettings then retry. If you enabled this API recently, wait a few minutes for the action to propagate to our systems and retry.",
    "status": "PERMISSION_DENIED",
    "details": [
      {
        "@type": "type.googleapis.com/google.rpc.LocalizedMessage",
        "locale": "en-US",
        "message": "User has not enabled the Apps Script API. Enable it by visiting https://script.google.com/home/usersettings then retry. If you enabled this API recently, wait a few minutes for the action to propagate to our systems and retry."
      }
    ]
  }
}

ユーザーがApps Script APIを有効にしていません。https://script.google.com/home/usersettings にアクセスして有効化し、再試行してください。最近この API を有効にした場合は、アクションが当社のシステムに伝搬するまで数分待ってから再試行してください。

ということで、APIをオンにしたら無事動きました。

Google Analytics 4 での内部トラフィックの除外

内部トラフィックの除外に関する公式ドキュメントがユニバーサルアナリティクス向けなので、Google Analytics 4向けの手順を書きました。

TL;DR

データストリーム → タグ付けの詳細設定→ 内部トラフィックの定義

手順

f:id:hiroga_cc:20210113213249p:plain
データストリームを選択

f:id:hiroga_cc:20210113213336p:plain
ウェブストームの詳細からタグ付けの詳細設定を追加

f:id:hiroga_cc:20210113213402p:plain
内部トラフィックの定義を選択

f:id:hiroga_cc:20210113213427p:plain
ルールを作成

2020年、総額20万円で購入した漫画108タイトル771冊のベスト10

2020年は外出が少なかったこともあり大量に漫画を読みました。

総額20万円、108タイトル771冊(もっとも、1/3くらいは積ん読)のベスト10を決めたので、よかったら読んでください。

108タイトルの一覧はこちら

選定基準

今後の人生に影響を与えたであろう順です。

ベスト10

1. クロスゲーム

あだち充も野球も読まずに敬遠していたけど、知人のオススメで購入。読み始めたら1日で全巻読んで最後に泣いてしまった。

ネタバレになるので感想が書けない。読んだことがある人はぜひ教えて下さい。未読の人は、絶対ネタバレなしで読むべき。

最後の二人がどんな気持ちだったのか、手持ちの語彙では表現できない。読み終わった後に知人と感想を話したことが心に残っている。

この漫画の感想をいつか適切に述べられるようになりたい。

2. BLUE GIANT

全巻読んだら1位になっていたかもしれないどストライクの漫画だけど、購入したのが先週でまだ2巻までしか読んでない。

主人公が前向きな好青年なので読んでいて元気になれる。このくらい推せる主人公って竈門炭治郎くらいかも。

Comic Spaceの漫画ランキング1位はさすがだった。高かったけど買ってよかった...

アメリカ編が連載開始したタイミングなので今度からはリアタイで楽しめる。嬉しい。

3. 極悪がんぼ

カイジに近いが、借金の返し方はギャンブルではなくグレーな労働と犯罪。ビッグになる目標がある分カイジより推せる。

法律の穴をついた話がたくさん出てきて、普段の暮らしが性善説に支えられていることを実感する。

今年の私はこの本の影響でやたらと権利を主張するようになっている気がするので、別の本で中和する必要を感じている。

4. 子供はわかってあげない / 水は海に向かって流れる / ごあいさつ

池袋のジュンク堂の特集に一目惚れして即買い。

高校生の不慣れで真っ直ぐな恋愛、不器用な大人たち、ちょっとだけSF、と好きな要素を詰め込んだ作品。

好きすぎてそのまま田島列島先生の作品を全部買った。選べないので全部同率。

田島列島先生を今後の人生で追っていけるのが幸せ。

水は海に向かって流れる コミック 1-3巻セット

水は海に向かって流れる コミック 1-3巻セット

  • 作者:田島列島
  • 発売日: 2020/09/09
  • メディア: コミック

5. メタモルフォーゼの縁側

BLを通じた女子高生とおばあちゃんの交流。

夫に先立たれたおばあちゃんが女子高生の成長をウキウキと見守る様子が読んでいて幸せ。

初めてのコミケ出店の様子、自分が技術書典に出店した時を思い出しながら読みました。

年の離れた二人の交流、というジャンルが好きだと自覚したのでどんどん開拓していきたい。

6. パルノグラフティ

BEASTERSの作者 板垣巴留先生の幼少〜現在期を綴ったエッセイ漫画。

というか、刃牙の副読本(言い過ぎ)。板垣巴留先生は刃牙板垣恵介先生の娘さんなので、エッセイにちょくちょく板垣恵介先生が登場するんだけどキャラが濃すぎる。

ちょくちょく刃牙みたいな演出入るな、と思っていたら板垣恵介先生の背中が鬼の形相になるシーンで確信犯だと気づいて笑ってしまった。

板垣巴留先生の物の見方が大好きなので30年後くらいにもう一本書いてほしい。BEASTERSの最終巻も楽しみにしています。

7. いちえふ 福島第一原子力発電所労働記

福島第一原発廃炉のためのアルバイトをする方のルポ漫画。

工事現場・建設現場のような雰囲気、原発が関わるからこその煩わしい手続きや服装、全てがリアルでうなずきながら読んだ。

完全防備という点ではコロナに備える医療現場も同じような状態なのかもしれない。現場の方のストレスが相当なものだとよく分かる。

8. 弁護士のくず

性格が終わってる弁護士の話。こういう職業モノの漫画は全部好き。

裁判がぐっと身近になった。弁護士の本が面白かったので検事や会計士、市長を題材にした漫画も購入した。

コロナ禍が終わったら傍聴に行ってみたい。

弁護士のくず 全10巻完結 セット (ビッグコミックス)

弁護士のくず 全10巻完結 セット (ビッグコミックス)

  • 発売日: 2010/12/01
  • メディア: コミック

9. メイドインアビス

HUNTERxHUNTERやチェンソーマンが好きな人には推せる、容赦のないファンタジー

ファンタジー世界の設定が細かくて好き。その一方で、主人公の子たちがとってもかわいい。

一瞬で単行本を読破し、メイドインアビス成分が足りずに同人誌も3巻買った。

容赦のない漫画をもっと読みたいと自覚した。

メイドインアビス コミック 1-8巻セット

メイドインアビス コミック 1-8巻セット

  • 発売日: 2019/05/30
  • メディア: コミック

10. 市長 遠山京香

横浜をモデルにした架空の市、華浜市の市長になった元推理小説化の活躍を描く。

人の命を守るために真剣になっている市長が本当に推せる。リーダーはこうあるべきだと思った。

行政に関わる様々な問題が分かりやすく漫画になっていてよかった。

連載の都合で様々な伏線を残したまま終わっているのが残念。いつか再開したら絶対に読む。

振り返って

はじめは勉強になる漫画を探して読んでいたのだけど、これだけ読むと自分の好みが分かってくる。

お金と時間の使い方として最高だったと思うので、来年も懲りずに好きなジャンルを開拓したいなと思いました。

毎度忘れる IntelliJ Idea で Pipenv の環境構築をする手順

TL;DR

  1. ディレクトリを作る
  2. pipenv --python 3.9 などで pipenv の環境を構築
  3. そのディレクトリで Intellij を起動し、 Command + ; でプロジェクトの設定
  4. SDKsからAdd Python SDK
  5. pipenv environment で OK
  6. Project SDK を選択
  7. 統合シェルを起動して指定したPythonのバージョンならOK

※ 多分 InteliJ自身にPipenvの環境構築してもらったほうがスマートなのだが、いつも pipenv --python 3.9 してから気づく。

スクリーンショット

f:id:hiroga_cc:20201224150439p:plain
Add SDKs

f:id:hiroga_cc:20201224150543p:plain
pipenv environment

ターミナルで base64 エンコードが失敗すると思ったら echo が改行を吐いてた

タイトルで言い切りました。

TL;DR

good

echo -n Aladdin:OpenSesame | /usr/bin/base64
QWxhZGRpbjpPcGVuU2VzYW1l

bad

echo Aladdin:OpenSesame | /usr/bin/base64
QWxhZGRpbjpPcGVuU2VzYW1lCg==

Basic認証・Authorizationヘッダー・文字コードについて

なぜか開発環境のWebサイトへの外形監視が失敗するので困ったのがことの始まりです。

一番初めに疑ったのは文字コードでした。Basic認証が必要なWebサイトでは、レスポンス時にBasic認証に用いる文字コードを指定できます。

WWW-Authenticate: Basic realm="User Visible Realm", charset="UTF-8"

でもBasic認証で使う範囲の文字って ASCII だろうが UTF-8 だろうがバイト表現は同じになりません?

console.log(Buffer.from("Aladdin:OpenSesame", "ascii"))
// <Buffer 41 6c 61 64 64 69 6e 3a 4f 70 65 6e 53 65 73 61 6d 65>

console.log(Buffer.from("Aladdin:OpenSesame", "utf-8"))
// <Buffer 41 6c 61 64 64 69 6e 3a 4f 70 65 6e 53 65 73 61 6d 65>

なりますね。

そこで base64decodeしたら改行が見つかって問題解決しました。

unzip コマンドで warning: stripped absolute path spec from / と表示されたら zipファイルの中身を unzip -l で確認する

結論から言うと、Dropboxが自動生成したZipファイルはルートディレクトリのパスが含まれるらしい。

stackoverflow.com

unzip -l で中身を確認しよう。( zip -sf でもいいが、 unzip だとファイルサイズも確認できて嬉しい)

f:id:hiroga_cc:20201124060846p:plain
unzip -l

詳細

具体的には以下のエラーが出た。

$ unzip resources/worldometers.zip
Archive:  resources/worldometers.zip
warning:  stripped absolute path spec from /
mapname:  conversion of  failed
replace worldometers.zip? [y]es, [n]o, [A]ll, [N]one, [r]ename: 

$ unzip -l resources/worldometers.zip
Archive:  resources/worldometers.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
        0  09-17-2019 10:27   /
   119574  09-17-2019 10:26   worldometers.zip
---------                     -------
   119574                     2 files

mapname: conversion of failed については、Zipファイルの中に同名のZipファイルが含まれていることで解答に失敗しているエラー。 -d オプションで解凍先を指定すればOK。