分散型ミニブログの水平分業—素朴ディジタル画像インフラストラクチャーの設計と応用

2017年にマストドンが大流行すると、分散型ミニブログというアイディアにも注目が集まるようになった。分散型ミニブログは、複数の運営者がそれぞれサーバーを運用し、それらがリモートフォローによって接続されることでSNSを構成するものである。

本稿では、分散型ミニブログの機能を、ソーシャルグラフ層、テキスト層、マルチメディア層の3層に分類する。そして、従来の分散型ミニブログを垂直統合型としたうえで、水平分業型の分散型ミニブログを提案する。具体例として Yayaka19 を取り上げる。Yayaka19 の本体はソーシャルグラフ層とテキスト層を担当し、マルチメディア層は 素朴ディジタル画像インフラストラクチャー という独立したウェブサイトが担当している。

分散型ミニブログの階層モデル

本稿では、分散型ミニブログの機能を、ソーシャルグラフ層、テキスト層、マルチメディア層の3層に分類することを提案する。

ソーシャルグラフ層は、ユーザーのフォロー・被フォロー関係を保存する層である。この層は最も高度な故障耐性が求められる。ユーザーにとって、自分がフォローしているユーザーのリストや、自分の発言を聞いてくれるフォロワーを失うことは、多大な損失である。そのため、データの喪失には万全の対策が必要である。また、ソーシャルグラフ層が停止すると他の層も機能しなくなるため、一時的な停止も最小限にすべきである。

テキスト層は、あるユーザーが投稿した文字列を、フォロワーに届ける層である。分散型ミニブログにおいて、タイムラインは常に流れていくものであるため、データの喪失はそれほど問題にならない。とはいえ、データの喪失やサービスの停止は、あくまでユーザーが不便に感じない程度にとどめるべきである。また、テキスト層は、マルチメディア層のための識別子 (画像のURLなど) を配信する役割を持つ。

マルチメディア層は、画像、音声、動画などのさまざまなデータを配信する層である。マルチメディア層にとって重要なことは、テキスト層と比較して、データのサイズが大きくなることである。

また、マルチメディア層は、法的問題にさらされやすいという特徴がある。テキスト層においても、ヘイトスピーチや犯行予告など、違法もしくは邪悪な投稿が可能である。マルチメディア層では、それに加えて、著作権法違反や児童ポルノの公衆送信など、よりカジュアルに違法または邪悪な情報の共有が起こり得る。

分散型ミニブログの垂直統合モデル

GNU Socialやマストドンなど、いま主流の分散型ミニブログは、垂直統合モデルである。すなわち、1台のインスタンスが、ソーシャルグラフ層、テキスト層、マルチメディア層のすべての機能を提供している。そのうえで、複数のインスタンスが連合を形成するアーキテクチャーとなっている。

この方式にはいくつかの欠点がある。第1に、インスタンスに必要とされる計算機パワーが大きいことである。分散型ミニブログでは、個人、団体、企業など、さまざまな主体がインスタンスを運営することができる。しかしながら、計算機パワーの問題により、個人が運用するインスタンスでは、処理が遅くなったり、レンタルサーバーの高価なプランに移行する必要が生じるなどの限界があった。

第2に、データの長期的な永続化が必要になるソーシャルグラフ層と、それほど永続化が必要とされないテキスト層およびマルチメディア層が混在していることにより、データベースの管理が不便になっていることがある。もし両者が分離されていれば、ソーシャルグラフ層のデータベースのみを厳重に管理し、他のデータベースは状況に応じて破棄するという運用も可能である。

画像アップローダーの分離

そこで、Yayaka19 では、本体はソーシャルグラフ層とテキスト層のみを担当し、マルチメディア層は 素朴ディジタル画像インフラストラクチャー に委託するというアーキテクチャーを採用した。

Yayaka19での変更はクライアントサイドのみであり、サーバーサイドおよびプロトコルの変更を必要としない。Yayaka19のクライアントは、投稿された文字列に画像のURLが含まれていれば、それを画像のインライン表示 (<img src=”URL“> タグ) に置換する。

ここで、画像のインライン表示を、信頼できる発信源に限定することが必要である。そうでないURLは、インライン表示ではなく、ハイパーリンクにする。なぜなら、インライン表示された画像の提供元は、ユーザーの行動を追跡することができるからである。画像の提供元は、ユーザーのIPアドレスと時刻を記録することができる。これは、単に画像を読み出したことを意味しているだけでなく、その画像が埋め込まれた投稿を読んだことを意味する。もしこれを画像の提供元が悪用すれば、深刻なプライバシーの侵害となり得る。

素朴ディジタル画像インフラストラクチャーの設計

素朴ディジタル画像インフラストラクチャー は、水平分業されたウェブアプリケーションのマルチメディア層として使われることに特化した画像アップローダーである。水平分業に特化するため、以下のような仕様を採用した。

  • 画像のURLを得ることが容易である。
  • 画像一覧の画面を持たない。
  • UIの視覚的な魅力に乏しい。

素朴ディジタル画像インフラストラクチャーは画像のランディングページを持たない。画像を投稿すると、その画像をブラウザで直接表示している状態に遷移する。このときブラウザが開いているURLは、画像そのもののURLであるので、テキスト層にそのままコピーすることができる。

素朴ディジタル画像インフラストラクチャーは画像一覧の画面を持たない。これは、画像を紹介する機能を、他のウェブアプリケーションのテキスト層に依存しているためである。素朴ディジタル画像インフラストラクチャーで画像を表示するには、画像のURLに直接アクセスする必要がある。

また、素朴ディジタル画像インフラストラクチャーは、ソーシャルグラフ層およびテキスト層を持つウェブアプリケーションからの紹介で利用されるため、UIの視覚的な魅力を追求していない。「素朴ディジタル画像インフラストラクチャー」という名前も、意図的に冗長かつ時代遅れに聞こえるように選定されている。

素朴ディジタル画像インフラストラクチャーのソースコードは非常に単純で、以下の3個のファイルで構成されている。

  • index.html (8行)
  • mdii.js (43行)
  • mdii-post.cgi (15行)

これだけ単純なので、動作環境にあわせて改変することも容易である。これまでに SiteMixの無料プランさくらのレンタルサーバーのライトプラン でデプロイされた。

素朴ディジタル画像インフラストラクチャーは、もともとは、2017年にもなって画像アップローダーなどというコモディティを自分で開発したくない、という動機から開発された。そのため、仕様はよく言えば軽量、悪く言えば粗雑である。セキュリティもあまり上等とは言えない。例えば、DoS攻撃に対する耐性がまったく考慮されていないことは特筆に値する。

水平分業型ミニブログにおいては、マルチメディア層に技術的または法的な問題が発生した場合には、マルチメディア層を夜逃げさせて、ソーシャルグラフ層とテキスト層のみを防衛するという運用を想定している。ソーシャルグラフ層とテキスト層は、マルチメディア層が夜逃げする場合にそなえて、あらかじめ複数のウェブサイトをマルチメディア層として利用できるようにしておくなどのリスク管理が必要である。

また、素朴ディジタル画像インフラストラクチャーは、分業型ミニブログであるYayaka19の他に、不買運動ウェブ という情報共有サイトからも利用されている。画像アップローダーというコモディティを自分で開発したくないという動機からすれば、このように複数の異質なウェブアプリケーションから利用されることは、自然な使用法である。

議論

分散型ミニブログの水平分業は、さまざまな信念や政治的主張を持つ個人または団体にとって、計算機資源および人的資源を提供する動機になり得る。例えば、言論の自由を重視する団体はソーシャルグラフ層とテキスト層を、ポルノや二次創作を擁護する団体はマルチメディア層を運営する、といった応用が期待される。

歴史的には、2ちゃんねるが画像アップローダーをともなって運用されていた気がする。画像アップローダーはしょっちゅう夜逃げしてた。

広告

Yayaka19に画像付きミステリーポストを投稿する方法

2017年5月15日から、Yayaka19に画像付きミステリーポストを投稿することができるようになった。本稿では、その操作方法を説明する。

まず yayaka.net または 19.fubaiundo.org にログインする。そして、ミステリーポスト作成画面を開く。この方法はインスタンスによって異なる。

  • yayaka.net では、右上のメニューから「New Mystery Post」を選択する。
  • 19.fubaiundo.org では、ツールバーの爆弾ボタンを押す。

ミステリーポスト作成画面では、タイトルと本文を入力する。タイトルは、通常のミステリーポストと同じように入力すればよい。

ここで、唐突だが、素朴ディジタル画像インフラストラクチャー という別のサイトを開く。そして、「ファイルを選択」ボタンを押して、投稿したい画像を選ぶ。スマートフォンであればカメラで撮影することもできる。続いて「送信」ボタンを押す。すると、画像そのものを表示する画面に遷移するので、画像のURLをコピーする。画像のURLは、例えば https://mdii.sakura.ne.jp/32245.png のような形式になる。

そして、ミステリーポスト作成画面に戻り、本文に画像のURLを貼り付ける。本文には、画像のURLとその他の文章を混在させることもできるし、複数の画像のURLを貼り付けることもできる。

すると、このミステリーポストを開いた人は、先ほどの画像を目にすることになる。

最後に、2017年5月29日の時点で、できることとできないことをまとめる。

分散型ミニブログYayaka19のボットをC++で作る

本稿では分散型ミニブログ Yayaka19 のボットをC++で作る方法を解説する。Yayaka19が何であるかを知るには以下を読んでくれ。

実物は以下の場所にある。

あと、作ったボットの実物は以下。

ボットを作るということは、APIを叩くということだ。APIを叩くには、まずユーザーシークレットを取得する必要がある。ユーザーシークレットは、Yayaka19をブラウザで開き、メニューの「View my SECRET」を選ぶと表示される。表示されないときは「Update secret」を押す。以下、ユーザーシークレットを XXXXXX とする。実際にはもっと長い。

APIを叩く方法を学ぶため、まず curl コマンドで試す。なぜ wget でないかというと、wget は PUT メソッドを叩けないからだ。以下、サーバーは https://19.fubaiundo.org で、ユーザー名は hakabahitoyo とする。

curl \
  -o - \
  -X PUT \
  -d 'secret=XXXXXXXX=' \
  https://19.fubaiundo.org/api/users/hakabahitoyo

すると、以下のようなレスポンスが得られる。

{"user":{"name":"墓場人夜 (19.fubaiundo.org)","id":"hakabahitoyo"},"token":"YYYYYYYY","exp":1497182792}

トークンを YYYYYYYY とする。実際にはもっと長い。このトークンを使って、もう1発リクエストを放つ。

curl \
  -o - \
  -X POST \
  -H 'Authorization: Bearer YYYYYYYY' \
  -d 'text=私で残念でした!' \
  https://19.fubaiundo.org/api/users/hakabahitoyo/post

すると、「私で残念でした!」と投稿される。これはフリップフラッパーズ10話のココミネココナさん (の性欲) である。

あとは、これをC++でやっていく。libcurlpicojson.h を使う。実際にやっていったものが libyayaka にあるので、コードを見てほしい。というか、これからC++でYayaka19のボットを作る人は、libyayaka を結合すれば足りる。

libyayaka を使ってみた実例は yayaka19chu2bot などがある。これは 韜晦する夜の機械 の中身である。注意としては、リンクするとき -lcurl と -lyayaka が必要である。

補足としては、Yayaka19では、1個のアカウントで複数のユーザーを作ることができる。この仕様は、同じ作者の別のSNSである agoraful と同じである。ユーザーシークレットはアカウントごどではなくユーザーごとに作られる。ボットを作るときは、あらかじめ新しくユーザーを作るとよい。

Twitterを超える拡散力を目指して—分散型ミニブログYayaka19の紹介

分散型ミニブログ Yayaka19 を紹介する。ミニブログとは、ツイッター に代表されるような、短文を投稿することを目的とするSNS (ソーシャル・ネットワーキング・サービス) である。分散型とは、特定のサーバーに依存せず、複数のサーバーが相互に通信することでSNSを構成することを意味する。

ツイッターは、しばしば経営不振がささやかれるうえ、不可解な理由によるアカウントの凍結が問題になってきた。しかし、ツイッターはRT (リツイート) によって絶大な拡散力を持っており、すでに多くのフォロワーを抱える「アルファツイッタラー」が、その拡散力を捨ててまで他のSNSに移行することは現実的でない。

そこで、Yayaka19では、「ミステリーポスト」という仕組みを導入し、ツイッターのRTを超える拡散力を得ることを試みた。ミステリーポストは、タイムラインに流れてくるときはタイトルのみが見えており、本文を読もうとすると同時にRTしたことになるというポスト (投稿) である。これにより、ユーザー数ではツイッターに劣るとしても、拡散力でツイッターに対抗することが期待される。

また、Yayaka19では、特定の運営者による検閲あるいは言論統制を避けるため、分散型ミニブログとしての特徴も有している。すでに OStatusプロトコル による分散型ミニブログとして GNU Social やマストドン (Mastodon) が知られており、これから設計されるSNSは分散型の特徴を持つことが当然とみなされるだろう。

背景

ミニブログとは、ツイッター に代表されるような、短文を投稿することを目的とするSNS (ソーシャル・ネットワーキング・サービス) である。ツイッターでは、1回の投稿 (ツイート) が140字に制限されている。そのため、ツイートを気軽に発信することができ、また、大量のツイートを読むことも容易である。ツイッターでは画像をツイートすることもできる。この場合は、140字のテキストと均衡するように、見やすい大きさに縮小して表示される。

ツイッターのユーザーは、好きなユーザー (複数) をフォローすることができる。すると、フォローしているユーザーのツイートが、自分のタイムラインに表示される。

ツイッターの特徴はRT (リツイート) である。あるツイートをRTすると、そのツイートは自分のフォロワーのタイムラインに表示される。それを見たフォロワーがさらにRTすることで、ツイートが指数関数的に拡散することが頻繁に発生する。

現状の課題

しかしながら、ツイッター社はしばしば経営不振を指摘されている。その原因の一つは、ツイッターがいじめやフェイクニュースの温床になっており、それによりイメージの低下を招いていることである。これはリツイートの拡散力と表裏一体である。邪悪な、もしくは判断力の劣るユーザーが拡散力を手にすれば、いじめやフェイクニュースの拡散に加担することになりかねない。

このような悪評を払拭するため、ツイッター社は邪悪なユーザーの追放に血道を上げている。しかし、これは別の問題を発生させている。ツイッターのユーザーは、邪悪であると思われるユーザーを「報告」することができる。ツイッター社は、ある程度の数の報告が集まった場合には、ツイートを削除したり、アカウントを凍結したりといった対策を取る。ここで問題なのは、複数のユーザーが一斉に「通報」することで、特定のアカウントを凍結に追い込むことができることである。

日本では、非実在児童ポルノが広く愛好されていることが知られている。これらは性欲を満たすためだけでなく、「絵師」たちの創作意欲を刺激し、文化的にも価値のあるものである。しかし、ある種の反ポルノ主義者たちは、ツイッターで非実在児童ポルノを公開している絵師を集団で通報し、そのアカウントを凍結に追い込むという運動を行った。ツイッター社は非実在児童ポルノの文化的価値について無理解であり、反ポルノ主義者たちに追随して、絵師の凍結に加担した。これは、非実在児童ポルノを愛好する絵師の立場からすれば、表現の自由の侵害であり、検閲であり、言論弾圧である。

とはいえ、ツイッターのユーザー数の多さとリツイートの拡散力は、アカウント凍結の危険を補ってありあまるほど魅力的である。多くの絵師は、アカウントを凍結されたとしても、より自由な他のSNSに移行するのではなく、ツイッターのアカウントを「転生」することを選んできた。

自由なSNSとしては、OStatusプロトコル を利用した分散型ミニブログである、GNU Socialやマストドン (Mastodon) が知られている。分散型ミニブログは、複数のサーバーが互いに通信することでSNSを構成する。そのため、特定の運営者によって恣意的な運用や言論弾圧が行われることを阻止しやすい。なぜならば、あるサーバーが自由を侵害したならば、ユーザーが別のサーバーに移動することが容易だからである。

特に、pixiv が開設したマストドンインスタンスである Pawoo は、イラストを公開するサイトを母体としているため、絵師たちの楽園となっている。非実在児童ポルノを愛好する絵師たちのうち、ツイッターアカウントの理不尽な凍結を経験した者は、この新しいSNSを熱狂的に迎え入れた。

しかしながら、マストドンの熱狂的なブームを経た今でも、多くのアルファツイッタラーやユーザーはツイッターにとどまっており、自由なSNSの勢力がツイッターを凌駕したとは言い難い。これまで述べてきたツイッターの問題点、特に通報の濫用と恣意的な凍結を解決するには、自由で、なおかつツイッターに比肩する拡散力を持つSNSが必要である。

提案手法

ここで、私たちは、ツイッターのRTの仕組みをさらに改良することで、より強い拡散力を持つSNSを構築することを提案する。私たちは、その仕組みを「ミステリーポスト」と命名した。

ミステリーポストを投稿するには、タイトルと本文を記述する必要がある。ミステリーポストがタイムラインを流れるときは、タイトルのみが表示される。本文を読むためには、明示的にミステリーポストを「開く」操作が必要である。このとき、本文を表示すると同時に、ミステリーポストをRTしたことになる。すなわち、ミステリーポストを開いたユーザーのフォロワーに、ミステリーポストが拡散される。

ユーザーがミステリーポストの本文を読むためには、ミステリーポストの拡散に協力することが必要であるため、従来のRTよりも拡散されやすいことが期待できる。

実験

私たちは、ミステリーポスト機能を用いて、強い拡散力を持つ独自のSNSを構築することを試みた。ryo33 氏による Yayaka19 というSNSを母体に、ミステリーポスト機能を追加することで、拡散力の強化を企図した。

さらに、ryo33氏はYayaka19を分散型ミニブログとする改良を行った。これにより、サーバーの所有者が恣意的な運用や言論弾圧を行うことが困難になった。オリジナルの yayaka.net に加え、第2のサーバーである 19.fubaiundo.org が建設された。これらのサーバー群は、リモートフォローにより、一体のSNSを構成している。

議論

当初、私が提案したのは、タイムラインのツイートがモザイクで隠された状態で表示され、内容を表示した瞬間にリツイートしたことになる、という案である。当時、この機能は「モザイク」と呼ばれていた。ryo33氏はこの案を改良し、タイトルと本文を持つスタイルを提案した。また、機能の名称は「ミステリーポスト」となった。モザイクが自動的な画像処理により生成されるのに対して、タイトルを付ける行為はユーザーが主体的に行うものである。そのため、より多様で遊戯性のある文化が創造されることが期待できる。

ミステリーポストの拡散力は、SPAMなどの邪悪な目的にも利用できる。しかし、タイトルやユーザー名などから、何らかの「怪しさ」を感じ取ることは可能であると思われる。ミステリーポストの仕組みを持つSNSのユーザーは、ミステリーポストを不用意に開かないよう注意すべきである。それは自分自身のためだけでなく、フォロワーを失望させないためにも必要である。

ミステリーポストは、また、拡散に協力したユーザーの法的責任を軽減することが期待できる。ユーザーがミステリーポストを拡散した時点では、ユーザーはまだミステリーポストの本文を読んでいない。そのため、もしミステリーポストの本文に違法な情報が書かれていたとしても、その拡散に協力したことは故意犯ではない。(ただし、ミステリーポストのタイトルは、違法な情報の存在を示唆するものではないと仮定する。) これは、P2Pファイル共有ソフトウェアであるWinnyにおいて、キャッシュに違法なファイルが置かれていたとしても、Winnyの利用者が意図して置いたものではないという特徴に似ている。この場合、キャッシュの提供を通して拡散に加担したとしても、Winnyのユーザーは故意犯にはあたらない。なお、ミステリーポストは、拡散に協力したユーザーの法的責任を軽減する可能性があるものの、最初にミステリーポストを投稿したユーザーや、ミステリーポストの流通に使われたサーバーの運営者の責任を軽減するものではない。

結論

ツイッターに比肩する拡散力を有するSNSを構築するため、リツイートの仕組みをさらに改良した「ミステリーポスト」を提案した。さらに、分散型ミニブログとすることで、サーバー所有者による恣意的な運用を困難にした。オリジナルの yayaka.net に加え、第2のサーバーである 19.fubaiundo.org を運用し、実用に供した。

将来の課題

非常に残念なことに、Yayaka19は画像の投稿を実装していない。もし画像の投稿が実現すれば、非実在児童ポルノを愛好する絵師たちのために、自由で、かつ強力な拡散力を持つSNSを提供することができるだろう。実装した。Yayaka19に画像付きミステリーポストを投稿する方法

別の方法として、既存の分散型ミニブログにミステリーポストの機能を追加することも考えられる。主要な実装 (GNU Social、マストドンなど) に機能を追加する、OStatus Community Group の標準に追加するなどの展開が期待される。

参考文献

  1. マストドンに対抗して分散SNSを作った – ありえんHip-Hop
  2. 本の虫: ここらでもう一度マストドンについて語っておくか
  3. 高木浩光@自宅の日記 – P2Pの価値とは何なのだろうか

LGBTPZNの支持者の多様性

ちゃんとした文章を書くのは疲れるので箇条書き。画像はサーバルちゃんフォント

  • ポーランドのLGBTPZNはLGBTを中傷するための造語であったらしい。ポーランド語は読めないので詳しい経緯は不明。
  • 日本のLGBTPZNは、Go_8yo氏が2016年4月ごろに突如として思いついた。このとき、ポーランドにおけるLGBTPANの用法は日本では知られていなかった。
  • 2016年9月26日にLGBTPZNが大流行した。このとき、ポーランドにおけるLGBTPZNの用法について指摘があった。また、PZNは「解放運動」を表す頭文字であり、LGBTPZNは単にLGBT解放運動を意味するという指摘もあった。
  • この時期のLGBTPZN支持者は迂遠な言語表現を用いる傾向にあり、LGBTPZNが実際にどのように受容されていたか知ることは難しい。いま思えば、LGBTPZNのうちPに限って言えば、子供の性の自己決定権を侵害しない限りP当事者の権利を満足できないことへの絶望感が、LGBTPZNという語の使用に込められていたように思う。しかし、当時そのことを明言していた者はいないので、あくまでも推測である。
  • 2016年9月27日にLGBTPZN.org (現在のLGBTPZNポータル) がオープンした。LGBTPZNポータルはLGBTPZN支持者のなかでも特に楽観主義ないし理想主義の立場をとっている。「LGBTPZNはアクロニムではなく、多様な性を象徴するシンボルであると考えられています」や「8番目のアルファベットは、あなたです」といった、包摂と寛容を重視したスローガンを用いている。LGBTPZNポータル運営者の楽観主義は、例えば2016年11月10日のツイートに現れている。
  • nexaは、バニラとLGBTの分断、あるいはLGBTとPZNの分断を、「ヘゲモニー」や「二等市民」といった強烈な表現で非難している。そして、LGBTを称揚しPZNを否定する者が、同じ原理でバニラとLGBTを分断していることを明らかにした。
  • 自然法被害者の会は、LGBTPZNの「錯乱」あるいは「異常」という側面を肯定的に評価している。
  • 2016年11月23日ごろインターネットバトルが発生したが、特に目立った変化がないまま収束した。
  • 2017年4月11日ごろLGBTPZNが再び流行した。

まとめ

  • LGBTPZNは統一した組織を持たず、個人がばらばらにインターネットに発信しているうえ、迂遠な言語表現を好む傾向があり、運動の当事者であってもよく分かっていないことが多い。

GNU Social のボットを C++ で作る

プログラミング界隈の姫になるためにはツイッターのボットをPHPで作ることが有効であることが知られています。しかし、ツイッターは2018年を迎えられないかもしれないので、かわりにGNU Socialのボットを作ります。あと、2017年にもなってPHPを学ぶのもダサいので、C++でやります。

GNU Socialは自由なソフトウェアとして実装されたツイッタークローンです。外見はツイッターを丸パクリしている (補足: Qvitterというプラグインを入れるとツイッターそっくりな外見になります。オリジナルのUIはダサいです。) ので、簡単に移行できます。ツイッターにはない特徴として、複数のサーバーの連合であることが挙げられます。すなわち、有志がそれぞれサーバーを建てて、それらが互いに情報を共有することでGNU Socialの全体が成り立っています。ユーザーは所属したいサーバーを選んでユーザー登録します。他のサーバーのユーザーをフォローすることもできる (ただし操作のクリック数がちょっと多い) し、検索とハッシュタグはすべてのサーバーで共有されます。地味に不便なところとしては、他のサーバーから流れてくる画像は、埋め込みではなくリンクになります。これは不便ですが必要な仕様で、悪意のあるサーバーがユーザーの閲覧履歴を勝手に取るのを防ぐためだと思います。

FAQとしては、スマートフォンアプリなどという軟弱なものはありません。がんばってウェブUIを使ってください。

あと、用語の説明ですが、ツイッターの「ツイート」に相当するものはGNU Socialでは「クイップ」と呼びます。

GNU Socialは複数のサーバーの連合なので、好きなサーバーを選べばいいのですが、日本では FreezePeach を選ぶ人が多いです。これは Kawana Kiyoshi が誘致したのがきっかけのようです。特にこだわりがなければFreezePeachを選べばよいのですが、注意が必要なのは、女児の水着姿をクイップするとWe have 1 simple ruleされるということです。

GNU SocialのAPIは AtomPub 形式と Twitter互換 形式があります。AtomPubのほうが仕様がきれいなのですが、誰も使ってないみたいなので、Twitter互換のやつにします。

例として、サーバーは freezepeach.xyz、ユーザー名は vaginaplant、パスワードは XXXXX で、LGBTPZN という文字列をクイップしたいとします。とりあえず wget コマンドで試します。

wget -O - \
    --http-user=vaginaplant \
    --http-passwd=XXXXXX \
    --post-data='status=LGBTPZN' \
    https://freezepeach.xyz/api/statuses/update.json

あとはこれをC++でやります。定番のcURLです。パスワードは /etc/fubai-gnusocial-password というファイルに書いてあると思ってください。なお、このファイルを他人に読まれるとセキュリティが終了します。

#include <curl/curl.h>
#include <string>
#include <fstream>

using namespace std;

static int writer
    (char * data, size_t size, size_t nmemb,
    std::string * writerData)
{
	if (writerData == nullptr) {
		return 0;
	}
	writerData->append (data, size * nmemb);
	return size * nmemb;
}

void quip (string message)
{
    CURL *curl;
    CURLcode res;
    curl_global_init (CURL_GLOBAL_ALL);
    curl = curl_easy_init ();
    if (! curl) {
        return;
    }

    curl_easy_setopt (curl, CURLOPT_URL,
        "https://freezepeach.xyz/api/statuses/update.json");

    string user_name {"vaginaplant"};
    string password;
    ifstream secret_file {"/etc/fubai-gnusocial-password"};
    secret_file >> password;
    string userpwd = user_name + string {":"} + password;
    curl_easy_setopt (curl, CURLOPT_USERPWD, userpwd.c_str ());

    curl_easy_setopt (curl, CURLOPT_POST, 1);

    string arguments = string {"status="} + message;
    curl_easy_setopt (curl, CURLOPT_POSTFIELDS, arguments.c_str ());

    string reply;
    curl_easy_setopt (curl, CURLOPT_WRITEFUNCTION, writer);
    curl_easy_setopt (curl, CURLOPT_WRITEDATA, & reply);

    res = curl_easy_perform (curl);

    if (res != CURLE_OK) {
        return;
    }
    curl_easy_cleanup (curl);
    curl_global_cleanup ();
}

quip 関数の message 引数に適当な文字列を入れてください。リンクとハッシュタグは自動的に解釈されます。

読者の知識をどのくらいに想定すればいいのかわからないのですが、リンクするとき -lcurl を指定すべきであることを申し添えます。

フリップフラッパーズ イロドリ先輩メインSS (改訂)

(13話を視聴したので設定を合わせました。改訂前。)

美術準備室には先輩がいた。先輩の指先にマニキュアが光る。

「先輩、私、先輩の絵が好きです! だから、もう、絵が邪魔だなんて、言わないでください。」

「ああ、あれね。ごめんね、ちゃんと説明してなくて。でも安心して。絵が嫌いになったわけじゃない。ここは狭いし、それに、いまは新しい絵をたくさん描きたいんだ。」

テーブルには、このまえ見たのとは違う、花柄のティーカップが3個。でも、紅茶が注がれるのは、私たち二人分だけ。

先輩が絵を捨てたのは、たぶん、三人でこの部屋にいても狭くないようにするためだったと思う。

アモルファスの力が失われて、ヤヤカたちもピュアイリュージョンには行けなくなった。お母さんとパピカは、ピュアイリュージョンに閉じ込められている。

でも、先輩となら、もう一度、ピュアイリュージョンに行ける気がする。先輩の変身アイテムは、マニキュアのびん。

二人で手をつないで考える。イロちゃんのこと、おばちゃんのこと、お母さんのこと。

そして、パピカのこと。

先輩も、きっと、パピカのことを思ってる。

待ってて、パピカ! いま迎えに行くから!