Mastodonへの投稿を X (Twitter) にも自動でポストする

最近はもっぱら Mastodon に滞在しているが、MastodonTwitter の投稿を連携したいと思うことがある。 そんな中偶然以下の記事で、Bluesky と Twitter を連携する方法が紹介されているのを見つけたので、この Mastodon 版を作ってみた。

zenn.dev

なお、実装には Google Apps Script を使っているがここでは説明しないので適当にググって調べてほしい。

また、スクリプトで投稿すると bot 判定されて凍結される恐れもあるので、試す人は自己責任でお願いしたい。

変更箇所

記事では連携を

  1. Bluesky の投稿をスプレッドシートに記録する
  2. スプレッドシートに記録された新規の投稿を Twitter へポストする

の二段階で実装しているので、一段目を Mastodon で置き換えれば良い。

元記事の Bluesky 部分のスクリプトを以下で置き換えることでうまくいった

function ListUpMastodonPosts() {
  const userId = "<Mastodon のユーザーID>"
  const accessToken = "<Mastodonのアクセストークン>";
  
  const sheetId = '<利用しているSpreadsheetのID部分>';
  const sheetName = 'List'; // シートの名前

  const sheet = SpreadsheetApp.openById(sheetId).getSheetByName(sheetName);
  const lastRow = sheet.getLastRow();
  const rowNum = lastRow === 1 ? lastRow : lastRow - 1;
  const postIdRange = sheet.getRange(2, 1, rowNum);
  const postIdValues = postIdRange.getValues().flat();

  const responseJSON = getPosts(userId, accessToken);

  responseJSON.forEach((post) => {
    const postId = post.id;
    const text = stripHtml(post.content);
    const isReply = post.in_reply_to_id !== null;
    const isIncludeEmbed = post.media_attachments.length != 0;

    if (postIdValues.includes(postId)) {
      return;
    }

    sheet.appendRow([postId, text, isReply, isIncludeEmbed, false, false]);
  });
}

function getPosts(userId, accessToken) {
  // fedibird.com は所属インスタンスに応じて変える
  let url = "https://fedibird.com/api/v1/accounts/" + userId + "/statuses"

  const options = {
    "method": "get",
    "contentType": "application/json",
    "headers": {
      "Authorization": `Bearer ${accessToken}`
    }
  };

  let response = UrlFetchApp.fetch(url, options);
  let responseJSON = JSON.parse(response.getContentText());

  return responseJSON;
}

function stripHtml(html) {
  return html.replace(/<\/?[^>]+(>|$)/g, "");
}

Twitter 部分は特に変更しておらず、他の箇所は元記事の通りにやればよい。

以下 Mastodon 特有の注意点を紹介する。

MastodonのユーザIDの取得方法

マストドンのアカウントにはユーザーIDが割り振られており、ブラウザに https://<INSTANCE>/api/v1/accounts/lookup?acct=<USERNAME> と打ち込み、表示された jsonid 要素で確認できる。

dev.to

ここで <INSTANCE> は所属インスタンス名、<USERNAME> はアカウント名。例えば、自分の場合は、https://fedibird.com/api/v1/accounts/lookup?acct=mewon となる。

Mastodon のアクセストークンの取得方法

以下の記事等を参考にしてほしい

www.mizdra.net

長期休暇

先々週くらいに現職の最終出勤日だった。まる3年勤めて有給がそこそこ溜まっていたので、3月の最後の三週間は有給消化にあてた。自分がすでに三年も働いたのだと思うとびっくりだ。

この休暇は休息に使うと決めていて、基本的に本を読んだりして昼過ぎから新宿に出て映画を見て、適当なビールバーでクラフトビールを1,2杯飲み、日が沈みきらないうちに帰宅するという生活を送っている。今日いつも行く美容室のお兄さん(お兄さんというには少々年を食っているかもしれない)に、村上春樹的ですねといわれたがそうかもしれない。ある種の病気なので、やることがないと最近の論文を読んだりして最新の業界事情にキャッチアップしていかないといけないという気持ちにもなるが、それをなんとか抑えて、本を読み映画を見てビールを飲んでいる。

いつも行く美容室にはなぜか自分と同じ大学出身の人が何人か長いこと通っているらしく(全く知らない人だが)、官僚をしていたり、企業で期待されるポジションにいたりしてプレッシャーがひどく、半分くらいは心を病んでいるという話を聞く。それに比べると君は悠々自適に暮らしているねとも言われた。そんなにのんきに暮らしているつもりはないのだが、相対的にはそう見えるのかもしれない。

退職をすると、社内のスラックにアクセスできなくなり、人間関係が急に途絶える。何人かとはSNSで繋がってはいるのだが、仕事という共通の基盤なくして長期的に付き合っていくことは難しいだろう。そもそも自分は人見知りで、だれかと始終コミュニケーションを取っていたいというような欲望はまったくないので、自分から気軽に声をかけたりはしない。そういうことを考えるくらいなら本でも読むかという気持ちになってしまう。自分が60だか65で定年になったら一気に人間関係が希薄になってしまうんだろうと思う。仕事とかそういう共通のファクターなしで付き合い続けられる友人は、自分が思っているより10倍くらいは貴重なのだろう。このことに今のうちに気づくことができてよかった。

休みに入って最初に読んだのは、村上春樹の初期三部作『風の歌を聴け』『1973年のピンボール』『羊をめぐる冒険』。今まで何回か読んできた本だが、改めてネットの他の人の感想とも合わせて読み直すと色々と発見があった。特に『風の歌を聴け』は自分は好きな割には全然読めていなくて、この辺のブログでだいぶ頭が整理された。

necojara.com

この作品には物語的な仕掛けが色々ある。例えばジョン・F・ケネディの話が示唆する人間関係や、鼠とラジオDJの相似など。しかしこの小説を真に魅力的にしているのは、そういう細かい謎とか伏線のようなものではなくて、むしろ全体を通底しているリズムと、時代の空気を言葉として落とし込んだ文体だと思う。これらが細かい事はわからずとも読者を惹きつける歌のように機能しているのだと思った。

それから読み終わったのはサマセット・モームの『人間の絆』。

人生で読んだ小説の中で、TOP 5に入る傑作だった。主人公のフィリップは内向的で鬱屈した性質で、若く純粋だった彼が愛の苦悩と金銭的な痛手を経験して彷徨し、ついに人生についての答えを得るという筋書き。フィリップが他者との比較やフィクション的な憧れからついに解放されるラストは清々しい。モームはフィクションにエンタメ性を求める作家なので、結構長い小説だったが、退屈せず読める。特に、縁が切れたと思った悪女と結局何回も出会っては別れてを繰り返すのは俗的だが思わず感情移入してしまう。

この二週間で見た映画の中では、『BLUE GIANT』が一番良かった。

bluegiant-movie.jp

才能と努力を全て注ぎ込んでひたむきに道を進む若者の話。純粋に物語が面白い。機会に恵まれなくても、トップにいなくても音楽を楽しみ続けることはできる。そういうことに救いがあると思った(あまり本筋ではないが)。

休みはのこり一週間くらいなので、そろそろちょっと新宿よりも外に遠出をしても良いかなと思う。

SNS

Twitter が色々大変なことになっており、何かあった時の移行先を探している。とりあえず Mastodon と Misskey にアカウントを作ってみている。Mastodon は分散型SNSの代表的存在で、Misskey はそれに比べると有名ではないものの日本のユーザーが多く、機能面ではより使いやすいように感じる。どちらも ActivityPub を採用していて相互にフォローできるので、ホームタイムライン(HTL)しか見ないのであればどっちでも良い。とはいえこれらのSNSではローカルタイムライン(LTL)が活発に利用されていることも多く、所属サーバーによって個性が出るので、色々渡り歩いて好みのものを探すのが良さそう。

自分はとりあえず Mastodonmastodon-japan.net に、Misskey は misskey.io に参加している(Mastodon では初め、mstdn.jp に入っていたのだけど、LTLの雰囲気があまり好みではなかったので引っ越した)。アカウントはそれぞれ @mew_on@mastodon-japan.net@mew_on@misskey.io

まあ正直最近はSNSへの投稿はかなり減っているし、時間を無駄に溶かさないようにアクセスを制限しているので、これらのアカウントでもガンガン呟くことはない気がする。それでも Twitter のような企業広告や過激なトピックのレコメンドとは無縁になるので気持ちとしては新鮮。適当な投稿をするとLTL経由で反応が返ってくる感じは昔の Twitter の雰囲気を思い出さないこともない。10年前の Twitter の記憶はほぼないので幻想かもしれないが。

これらの分散型SNSは基本的に規模が小さいので、Twitter のような大量ユーザーが高い負荷をかけるような状況ではうまく機能しないかもしれない。実際 Mastodon も Misskey も急な人の流入によってサーバーが耐えられず新規参入を制限しているものがある。でも個人的にはこれで良いような気もしていて、小さいサーバーが大量にある状況なら、広告は機能しないだろうし、レコメンドをする意味も薄れる。ここ10年くらいでわかってきたのは、世界中の人々が一つの空間で語り合うことによって世界はより良くなるという考えは幻想だったということだと思う。

健康診断を受け、プログラムを書く

健康診断

週の半ばに健康診断に行ってきた。会場は日本橋方面の大きなビルの中にある診療所。平日の昼間だったからか自分以外に受けにきている人がおらず、一瞬で終わった。健康診断はこれまで何箇所かで受けてきたが、それぞれ微妙に流儀があって面白い。今回受けたクリニックは、検査着になるのは上半身だけで、下は履いてきたままで良いということで、初めての体験だった。まあ検査で着脱するのは上だけなので、合理的ではある。

健康診断をすると毎回「右脚ブロック」という心電図の異常で引っかかる。数年前に一応エコーで検査してもらって、生まれつきのものだろうし大丈夫と言われたが、健康診断結果で心電図にBやCみたいなアルファベットが書いてあると心臓に悪い。

せっかくこの辺りまで来たのだからと思い、皇居ランをしたのだが、健康診断で絶食をしていて血も抜かれていたのですぐにバテてしまった。また今度リベンジしたい。

情報の速度

週末は、RSSフィードの更新をEメールに送信するというちょっとしたアプリケーションを作っていた。普段仕事に関する情報収集には企業のテックブログや、ニュースレターを使っている。それらRSSとメールの更新を一箇所に集めたいと思っていたのだが、既存のアプリを調べると無料でそのようなことができるものはなさそうで(matter というアプリでできたのだが、最近は有料プランに移行してしまった)、仮にあったとしても企業の pricing のポリシー変更で右往左往するのは嫌だなぁとも思い、なら自作しようとなった。

そうなると仕組みはできるだけシンプルにしておきたいので、RSS の更新を毎日Eメールで受け取ることにした。フィードのパースもメールの送信も Python でできるので、あとはそれを適当な場所に置いて定期実行するだけで良い。今回はAWS Lambdaを使った。

最近はEメールやRSSみたいな枯れた技術が一番良い気がしている。チェックするのも1日一回とかで良い。別に SNS のタイムラインについていく必要はないし、情報を摂取する速度を意図的に抑えていきたい。

ChatGPT

上の実装をする時にどうせならと思って、ChatGPTに書かせてみた。かなりそれっぽいコードを出してきて、こちらの追加の要望に応じて修正もしてくれるので凄いと思っていたのだけど、実際に実行してみると動かなかった。コードのデザイン面も含めて結局ほぼ全部書き換える必要があった。

巷で言われているように、一見それらしく見える回答を作成する能力は高いけど、専門知は全然持っていないみたいだ。それでも自分の不慣れな分野であれば「これを直せば良い」という、実装のきっかけを作ってくれるのでそこそこありがたいかもしれない。

部屋・本・AI

部屋

唐突に作業用デスクの片付けをした。今まで様々な技術書や雑誌・小説が平積みになっていたのだが、本立てを用意して必要なものだけを縦に並べ直した。さらに、デスクの上を無造作に這っていたキーボードなどのコード類も、整理してできるだけ背後に回るようにテープ留めをした。たったこれだけのことで、見栄えが劇的に良くなって、読書欲が湧いてくるようになった。この部屋に住んで2年近く経つが、なぜこんな簡単なことをずっとやってこなかったのだろう。腐敗というのはひっそりと忍び寄ってきて、気づいた時には自分の生活と同化してしまうものなのだ。

ちょっと前に、クオンツの友人に勧められて読んだ『物価とは何か』という本は結構面白かった。

インフレもデフレも人々の気持ち次第みたいな気がしてくる。デフレマインドみたいな言葉はただの標語じゃなくて、実際の経済に影響を与えるのだろう。経済学の面白いところは、単なる過去の事実だけでなく、それを使った未来予測の情報が現在の値を決めるという部分だと思った。もちろん未来から過去へ情報が流れるわけではないが、可能性としてある未来が現在に影響を与え、その結果本当の未来が作られていくという部分に単なる物理系とは異なる相互作用がある。

小説は、サマセット・モームの『雨・赤毛』を読んだ。

厳格な宣教師が売春婦にしてやられたり、若い男女の情熱的な愛が風化する様は、僕のような平凡で俗な市民のワイドショー的好奇心を刺激する部分があり、とても楽しんで読める。モームは、小説はエンタメでなければならず、結末のはっきりしない純文学然とした作品は良くないと思っているようで、そこが自分には合う。

AI

最近の機械学習技術の進歩は本当に驚くものばかりで、Stable diffusion だったり、ChatGPT だったりあと10年はかかるだろうと(自分が勝手に)思っていたものがどんどん出てきている。数年前は、AIという言葉がブームになったものの、SF映画で出てくるような人工知能にはまだ程遠く、画像中の犬や猫を見分けられるようになったくらいで騒いでいたように思う。しかし今では文章や画像の生成という、人間だからこそできると思われていたようなことが可能になってしまった。

このスピード感を見せつけられると、人間の創造性というのは実はそんなに大したものではなかったという気がしてくる。ちょっと何かの真似をして絵や文章を作るというのは、実は超大量のデータと、それを効率よく処理するソフトウェア・ハードウェアがあればできてしまうようなものだったのだろう。さんざん各所で語り尽くされていることではあると思うが、こういう創造的なAI技術に比べると、事務的な処理を間違いなく正確にやるタイプの技術はまだまだ遅れている。もはや群雄割拠となってしまった生成系AI界隈に比べると、商機はそっちの方にある気がする。

また、こういうAIの研究開発の進展を見ると、インターネット広告について考えてしまう。僕はインターネット広告が本当に嫌いで絶対クリックしたくないし、可能な限りアプリやアドオンでブロックしているのだが、一方であれが Google や Meta の資金源になり、AI分野のイノベーションを加速させたのは事実だろう。一エンドユーザーにとって広告はただの邪魔者でしかない(時々広告をポジティブに思う特異な人もいるが)、しかし全体で見ると良い行いになっている。こういうことを考えると、もう若い人は広告の有無なんて気にしていなくて、自分のような人間はただの老害なのかもしれないと思うこともある。しかし好き嫌いは個人の自由だし、お前が歳をとっただけだといわれたら、それはちょっと全体主義的なんじゃないかなぁとは言いたい。

2022年の振り返り

仕事

今年は就職して三年目。三年目というと、大学院でいえば修士をとって博士一年目というわけで、狭い範囲では自分が一番詳しいというようなことができてくる時期だと思う。僕も今の仕事でやっている領域については、やりたいことを着実に実現できるくらいの知識や技術が身についてきた。社内でもある程度専門性を認められて動けるようになってきて、総じて楽に働けるようになってきたなぁと思う。

しかし、大局的には、自分の興味の方向性と部署のミスマッチがあったり、そもそももっと広い世界を知りたいという気持ちもあって、転職について考えた一年でもあった。実際いくつか面接を受けたりもした。僕は研究開発よりはビジネス応用に興味があって、そういう方向性で働けそうな会社からオファーをもらえたので、順調にいけば春からは新しい職場で働くことになりそう。

Money Talk

就職して三年目になり、ある程度収入も増えてきた。弊社は新卒の給与水準が低いというのもあるが、入社時と比べて額面給与は倍くらいになっている(倍は言い過ぎかもしれない)。学生の時は学振の年収240万円から学費や税金・保険料を払わなくてはいけずとても厳しかった。それを払って、友人と新宿で夜中まで酒を飲む週末を繰り返すと、ほぼ手元にお金は残らなかった。

さすがにその頃とはお金に対する感覚が違ってきていて、払う価値があるものにはしっかりお金を払おうという意識になっている。これは日頃の衣食住などもそうだが、例えば自分は The Economist というニュース雑誌や、obsidian, freedom と言ったアプリケーションにも年会費を払っている。

特にお金のかかる趣味もないので、基本的に収支はプラスになっているが、僕はあまり資産形成それ自体には興味が持てないようで、投資は S&P500 に突っ込むというような passive な動きしかできない。来年は iDeCo をするのかどうかを検討していきたい。

年齢

今年ついに30歳になった。学生時代バイトしていた店の人に、30代になったら一気に健康がガタガタになるからなと言われたのをずっと覚えている。大きな病気をしなかったのは良かったが、魚の目ができたり左耳が聞こえづらくなったり、急に異常な肌荒れが起きたりと、年齢のせいにしたくなるような不調が発生した年だった。

仕事のための技術書などを読む時間が多く、そんなに小説を読めていない一年だったが、その中ではミステリーを読む機会が多かったと思う。アンソニーホロヴィッツのような正統派のミステリーが好み。

ミステリーというのは謎があり、そしてそれは必ず読者にとって明快な形で解決されるので、自分の感性や知性を強く働かせなくてもよく、楽なのである(そしてもちろん面白い)。仕事で疲れているとそういう方が良いんだろう。

2022 ベストバイ

最近SONYノイズキャンセリング・ヘッドホンを買った。そもそも今までは、何年も前に Amazon で適当に買った安いヘッドホンしかなかったので、音質が抜群に良くなって音楽を聴くのが楽しくなった。ノイズキャンセリング機能も強力で、これをつけて仕事をしていると、妻が帰宅したのに気づかなかったりする。

2023

来年は、攻めではなく、守りの一年にしたい。勝負にはもちろん勝ちたいが、その上で内容的には(サッカーで例えると)3-2 ではなく、1-0 のようなスコアで勝てるようにしていきたい。

今週の雑多な日記

クリーニング

勤め先がハウスクリーニング業者のクーポンをくれたので、エアコンのクリーニングに使ってみた。自分が在宅勤務している横でおじさんがせっせと掃除をしてくれ、なにやら写真もパシャパシャと撮っているようであった。1時間半くらいしてクリーニングが終わり、内部のビフォーアフターを見せてもらったが、ビフォーは非常に悍ましい光景だった。カビと埃が溜まっていたらしい。こんなのを吸っていたのかと思うと恐ろしいが、別に健康被害は出ていなかったので、これくらいは大丈夫なのかも知れず、単にクリーニング効果の広告としての役割なのかも知れない。

しかし、おじさんが一生懸命掃除をしている横で、自分が(他に居場所がなかったので)ベッドにPCを持ち込んで仕事をしているというのが果たして世界の正しい姿なのだろうか。

エアコン本体と室外機の掃除で2万円少しかかり、そこからクーポンで割り引かれて負担は約一万円。お得だった。

人違い

時々会う高校の友人たちと忘年会のようなものをした。一人で入店したら店の入り口で案内待ちをしていた男性に「久しぶり!」と声をかけられ、ぱっと見で友人の一人と背格好が似ていたのであいさつを返してしまった。しかしよく見ると記憶の中の友人より全然髪が短く、髪を切ったとして果たしてこうなるだろうかと1分くらいチラ見しながら想像していたが、どう考えても別人だった。相手もこちらをチラチラ見ていたが人違いに気づいたのか言葉を発しなくなり、お互い気まずい時間を過ごすことになった。ついにあちらはそろりと店から出ていってしまった。

会議

最近自分のチームでミーティングを減らそうという動きが出て、無駄な会議がかなり減った。自分としては深い集中が必要な実装をしやすくなったし、ランチや休憩のタイミングの自由度が上がったので良い動きだと思っている。そもそも自分は裁量労働制なので、いつ働いても良いのだが、ミーティングが日中にあると結局普通の9時5時みたいな働き方になってしまうのが不満だった。やる気があるときに集中力を要する仕事をするのが一番効率が良い。

その反動として、リモートワークなこともあって相対的に人と話す機会が減ってしまい、コミュニケーションが下手になった感覚はある。たまにミーティングをすると、対話のボールをあらぬ方向に投げたり、相手のボールをグローブにうまく収められなかったりすることが増えた。いや、これは生来のもので、人と話す機会が減った分下手さを意識するようになっただけなのかも知れない。

老い

MONKEY という雑誌を購読している。翻訳家の柴田元幸さんが作っている雑誌で季節に一冊のペースで刊行されている。テーマはその時々で、日本の作家の文章や海外作家の翻訳が色々読める。僕はポール・オースターの翻訳をいつもしているということで柴田さんを知り、この雑誌も手にとるようになった。出るペースがゆっくりなので暇な時に少しずつ読めるのも良い。

今月のテーマは老い。最近は他人事ではいられないし、老いについて考えてしまうこと自体が老いの兆候なのだろう。

クリスマス

クリスマスは妻と過ごした。インターネットではあまりプライベートを書いてこなかったが、先日結婚して一年になったのでこのブログくらいには書いておこうと思う。クリスマスプレゼントにはランニングシューズを買ってもらった。