技術的な事を話すweb上の場の派生で、GitHubを使ってSNS作れないかなぁ、と考えて見たがうまく行かなかったので、メモの残骸を残しておく。
よりオープンでバックエンドはGitHubのみの、SNSのような物を作れないか考えてみる。
最初のレポジトリがあって、それを皆はforkするなりtemplateとして使う事で、 参加者の一覧を知る事が出来る。
メッセージと日付とアカウントでハッシュ値を求めて、メッセージはそのハッシュ値で判定する。 メッセージはテキストファイルとしてコミットしていく。
フォローとフォロワーという概念がある。
GitHub Actionで他のレポジトリの情報を引っ張ってきて統合するが、 その時にいちいち全forkを見たくないので、 ネットワーク的に隣接したのだけ更新する、みたいな感じで、一度の更新では部分的にしか更新されず、 それが伝播してeventually consistentな感じにする。
フォロワー関係の構築はグローバルな更新を必要とするが、 これも人のレポジトリを確認した時はその情報が何人かはキャッシュされて、 第三者が自身を見た時に一定時間内ならそのキャッシュ情報を使う事で確認しなきゃいけないレポジトリの数を限定する。 (数ホップで全ネットワークが見れるように作るのはグラフ理論的に出来るだろう)。
そもそもフォロワー関係はいるか?フォローしている人だけ見えればいいかもしれない。
メッセージは日付とアカウント名を含めてハッシュした値で一意のidが振られ、そのidのディレクトリに保存される。 このidについてリプライしたりする。 フォローをしている人のリプライがその人には連なって表示される。 フォローをしてない人のリプライはポストバックのようにリンクが小さく表示されるのみ。
更新には最近更新された、という情報は要る気がする。これはgitのコミットを辿るでいいかなぁ。 フォローしている人に関する情報は自分のレポジトリには割と早めに更新される。 フォローしてない人の情報は一日とか2〜3日とかでeventually consistentな感じで更新されればいいか。
フォローしてない人の反応はそんなには気にならない感じにしたい。 反応はすぐには分からず、基本はスルーするようなUIになっていて欲しい。
やがて削除しないとまずいillegalな投稿とかが来ると困った事になる。消すcommitをするのは簡単だが、過去のコミットをどう消すかは難しいよなぁ。やはり他人の投稿を自身にsyncするのはこの辺いまいちだよなぁ。
投稿などをsyncするのはクライアント側だけでいいかも? でもフォローしている相手が100人いたとして、更新確認のために毎回100回リクエスト飛ばすのは駄目だなぁ。
他人の投稿を自分のレポジトリに取り込むのはリスクがあるが、そうしないとリクエストの数が発散するのは避けられない気もする。うーん。駄目か?
Redditのサブレとか5chのスレのように、なんかの話題について話すみたいなのはそこで見れるようになるといい気がする。 ハッシュタグとかそういうので。 これはフォローしてない人も見れるとかあればいいだろうか。
うーん、なんかいまいちだな。グローバルに辿るのをもうちょっといい感じに出来れば良い気がするが。 むしろ掲示板的なものとSNS的なものは別物にすべきか?
分けて考えてみよう。一つのレポジトリからforkする、eventually consistentな形になるように分散的に更新していく、というのは良いだろう。
特定のトピックについてハッシュ値が作られて、そこに投稿のファイルが書かれていく。 そのトピックをフォローしているアカウントの一覧がsyncされていく。 新しくフォローしたアカウントがこのリストにかかれてsyncされると、syncされたアカウントにこの新しい人の投稿が見えるようになる。
更新は一定程度各レポジトリにキャッシュされて、辿らないといけない数が限定されるようにしたい。
少し違うが、一人で使うタイムライン的な何かが欲しいの結果、てきすとTLというのを作った。これはこのページで考えた事の派生形ではある気がする(SNSでは無いが)。