読者です 読者をやめる 読者になる 読者になる

Rails(Ruby)で書かれていると噂のMastodonをいじってみた

どーも。@UltraBirdTechです。

GWですね。大型連休ですね。 人によっては、9連休のようですが皆様いかがお過ごしでしょうか?

私はGW中は埼玉の実家に帰って、実家からほぼ一歩も出ないような、ヒキニート生活を送っております。 まぁ親孝行ということで、親に顔を見せに来たと思えば良いか。

ヒキニート生活中は、Rubyダラダラと勉強しています。 そんな中連休に入る直前に、会社の先輩から「MastodonというSNSRails(Ruby)で書かれている」という情報を貰っていたので、Rubyの勉強がてらいじってみました。

そもそもMastodonって?

MastodonオープンソースSNSです。 f:id:UltraBirdTech:20170504154353p:plain

自身が運営しているサーバーにMastodonを立ち上げることで、Mastodonを提供することができます。 この一つ一つの単位をインスタンスと言います。

サービス利用者は、利用したいインスタンスにアカウントを作成して、トゥートという形で自分の意見、言いたいことを世の中に発信できます。

既に日本国内でも趣味や用途(婚活、投資家など)によってインスタンスが作成されています。 Mastodonは、自分が興味のあるインスタンスにアカウントを作るのが理想のようです。

僕なら「特撮」とか「プログラマ」、「環境活動を行なっている若者」などのインスタンスのどれかにアカウントを作るのが正しいのですかねー。

Mastodonは、日本では2017年4月の中旬くらいからジワジワと話題になって来たSNSという認識。 サービスリリース自体は2016年10月頃にしていたらしいです。

やってみたこと

アカウントを作ってみる

インスタンスは、色々と記事にもなっていましたが、mstdn.jpでアカウント作成させていただきました。 f:id:UltraBirdTech:20170504155033p:plain

アカウントの作成は楽でした。 メールアドレスを入力して、「参加する」ボタンをクリックすると、メールが届きます。

メールの文面

ようこそ[メールアドレス]さん
mstdn.jpにアカウントが作成されました。
以下のリンクをクリックしてMastodonアカウントのメールアドレスを確認してください。
メールアドレスの確認
また、インスタンスの利用規約についてもご確認ください。
mstdn.jp チーム

[メールアドレスの確認]にリンクが貼られているので、そのリンクを押下したらログイン画面が出るので、ログインしたらMastodonに参加できます。 f:id:UltraBirdTech:20170504154906p:plain

国内最大級のインスタンスということなので、TLに流れてくるトゥートの内容も様々ですねー。 これが、特撮などのインスタンスだと、それに特化するTLになってくるんだと思います。

localhost(足元環境)で立ち上げてみる

GitHub にソースがコミットされているとのことなので、ソースを見てみようとGitHubを開いてみました。

そしたら、何やらVagrantfileがあるじゃないですか。

mastodon/Vagrantfile at master · tootsuite/mastodon · GitHub

DB定義とかも全部設定ファイルとしてコミットされていたんですよ。 なんか、git clone して vagrant up したら立ち上がりそうだったのでやってみました。

git clone

$ git clone https://github.com/tootsuite/mastodon.git
Cloning into 'mastodon'...
remote: Counting objects: 30283, done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 30283 (delta 0), reused 0 (delta 0), pack-reused 30280
Receiving objects: 100% (30283/30283), 35.62 MiB | 3.50 MiB/s, done.
Resolving deltas: 100% (18514/18514), done.
Checking out files: 100% (4814/4814), done.

cd dir

$ cd mastodon/

vagrant up

$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Checking if box 'ubuntu/trusty64' is up to date...
==> default: A newer version of the box 'ubuntu/trusty64' is available! You currently
==> default: have version '20161214.0.0'. The latest is version '20170422.0.0'. Run
==> default: `vagrant box update` to update.
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
・
・
・
==> default: => Booting Puma
==> default: => Rails 5.0.2 application starting in development on http://0.0.0.0:3000
==> default: => Run `rails server -h` for more startup options
==> default: **************************************************
==> default: ⛔️ WARNING: Sidekiq testing API enabled, but this is not the test environment.  Your jobs will not go to Redis.
==> default: **************************************************

立ち上がった・・・・

印象としては、vagrant up が長かったなーというくらい。 ちょこちょこwarningなどは出ましたが、特に問題なく立ち上がってくれました。

localhost:3000でアクセスしてみると、Mastodonの初期画面が!! f:id:UltraBirdTech:20170504155117p:plain

初期管理者のユーザは下記でログインできます。

初期管理者:admin@mastodon.dev

パスワード:mastodonadmin

f:id:UltraBirdTech:20170504155048p:plain

さー、足元環境でログイン完了だ! f:id:UltraBirdTech:20170504155140p:plain

これでMastodonの開発もできる!(するとは言ってない)

なお、Dockerでも立ち上げることができるそうです。 インスタンス作成している人の記事を見ると、Dockerの方が多いですね。 Dockerも勉強してみたいが、とりあえず今ではないので保留。

ただ、こういうvagrant up するだけで開発環境が立ち上がる環境自体が本当に魅力的です。 もちろん、Dockerもそうなのですが、勉強素材として良いものを手に入れました。

あと、railsで書かれているので、rails コンソールでDBに入っているデータが見れるのもポイント高い! 実際に動いているサービスにどのようなデータが入るか見れるのたのしー!!

status(トゥートの内容)をrails コンソールで引っ張って見たところ

> Status.all
  Status Load (0.9ms)  SELECT "statuses".* FROM "statuses" ORDER BY id desc
=> [#<Status:0x00000006ee7018
  id: 2,
  uri: nil,
  account_id: 1,
  text: "statusに追加されていますか?",
  created_at: Tue, 02 May 2017 07:51:12 UTC +00:00,
  updated_at: Tue, 02 May 2017 07:51:12 UTC +00:00,
  in_reply_to_id: nil,
  reblog_of_id: nil,
  url: nil,
  sensitive: false,
  visibility: "public",
  in_reply_to_account_id: nil,
  application_id: 1,
  spoiler_text: "",
  reply: false,
  favourites_count: 0,
  reblogs_count: 0,
  language: "es">,
 #<Status:0x00000006ee6ed8
  id: 1,
  uri: nil,
  account_id: 1,
  text: "test",
  created_at: Mon, 01 May 2017 03:03:08 UTC +00:00,
  updated_at: Mon, 01 May 2017 03:03:08 UTC +00:00,
  in_reply_to_id: nil,
  reblog_of_id: nil,
  url: nil,
  sensitive: false,
  visibility: "public",
  in_reply_to_account_id: nil,
  application_id: 1,
  spoiler_text: "",
  reply: false,
  favourites_count: 0,
  reblogs_count: 0,
  language: "sv">]

Mastodonソースコードを読む

ちょっと読んでみました。 オブジェクト指向設計の本を読んでいたので勉強の参考ソースとしてもちょうどよかったです。

オブジェクト指向で書かれているようだったので、modelから触って見ました。 accountやuserというモデルが存在していて、各々が自身のステータスを変更するメソッド(振る舞い)を持っていました。

特にお気に入りは、follow_request.rb。

mastodon/follow_request.rb at master · tootsuite/mastodon · GitHub

メソッド数も少なく、一番わかりやすかったです。 フォローリクエストは、アカウントを非公開にしているアカウントに対してユーザが「あなたをフォローしたいです!許可してください!」と送るリクエストのことですかね。

このファイルを見ただけで、以下のことが容易に想像できる。

  • フォローリクエストしたら、このデータがDB上にが作成される
  • authorize!メソッド呼べばフォローを許可(メソッドの最後に ! が付いているのでおそらく元のオブジェクトの状態を変更する)
  • reject!されたら、フォローを許可しない

※挙動は未確認。

あとモデルを読み進めて、意外だったのはトゥートを管理しているモデル名(おそらくDB名)がstatusだったということ。 個人的には、tootのようなものを想像していたので、ちょっとびっくりしてしまいました。 でも、これってTwitterをインスパイアしているようです。 Twitterのつぶやきもstatusでした。 (・・・という情報も会社の先輩から教えてもらいました。ありがとうございますー☆)

なるほどー。 Twitterをイメージしながらソースコード潜ると、もっとソースを解読できそうですね!

まとめ

Mastodonは、インスタンスごとに特質を持たせることができるのが特徴のSNS。 みなさんも、好みのインスタンスを見つけて、ぜひトゥートしてみてください。

私はツイ廃Twitterをよく利用しているので、Twitterに似ているMastodonは非常に注目しております。

技術的な面で言うと、ソースコードは見やすいし、オブジェクト指向に則った書きっぷりしているし、開発環境を構築する勉強という面でもとても良い例だと思っています。 残りのGWも暇なので、引き続きソースコード読んでいこうと思います。