WordPressの重大な脆弱性の検証

標準

2017年2月17日、Wordpressに重大なREST APIに関する脆弱が存在することが公表されました。

WordPress の脆弱性対策について – IPA

あまりにも重大すぎて、パッチが配布されるまで脆弱の存在の公表を遅らせるほどでした。この脆弱はREST APIの不具合を利用することで、ユーザー認証を必要とせずにWordpressに投稿されている記事を簡単に書き換えることが出来てしまいます。今回はこの脆弱をWindowsで実際にWordpressを仮想環境で構築して検証していきます。また、この脆弱を利用して他人のサイトを不正に書き換えることは国内法に抵触しますので、真似は自分の中だけで終わらせてください。

WindowsにDocker環境を整備する

簡単にWordpressの仮想環境を構築するために今回はDockerを使っていきます。(WordPressの仮想環境を作る方法は色々とありますので、ここらへんは個人の好みで。) また、この方法はWindows10 proでないと出来ない工程もありますので、ご注意ください。

まずはDockerのインストーラーを公式サイトからダウンロードします。適当にstable版などをご利用ください。

インストールが完了すると、Dockerが起動します。しっかりと起動するまでに少し時間がかかるので、気長にお待ち下さい。

しっかりと起動しましたら、DockerのServerが稼働していることをPowerShellで確認します。

> docker version
Client:
 Version:      17.06.0-ce
 API version:  1.30
 Go version:   go1.8.3
 Git commit:   02c1d87
 Built:        Fri Jun 23 21:30:30 2017
 OS/Arch:      windows/amd64

Server:
 Version:      17.06.0-ce
 API version:  1.30 (minimum version 1.12)
 Go version:   go1.8.3
 Git commit:   02c1d87
 Built:        Fri Jun 23 21:51:55 2017
 OS/Arch:      linux/amd64
 Experimental: true

Serverの部分が確認されずエラーが発生している場合は、Dockerが起動しきっていないかHyper-Vを有効にする必要があります。 コントロールパネル→プログラムと機能→Windowsの機能の有効下または無効化 からHyper-Vを有効にしてからもう一度試してみてください。

次にDockerの構成情報をまとめていきます。適当なディレクトリを作成し、その中に docker-compose.yml を作成し、以下のようにします。

version: '2'
services:
  db:
    image: mysql:5.7
    volumes:
      - db_data:/var/lib/mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: wordpress
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress

  wordpress:
    depends_on:
      - db
    image: wordpress:4.7.0
    ports:
      - "8000:80"
    restart: always
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_PASSWORD: wordpress

volumes:
  db_data:

ファイルを作成し終えたらPowerShellのカレントディレクトリをdocker-compose.ymlが存在するディレクトリに変更して

> docker-compose pull
> docker-compose build
> docker-compose up -d

これでイメージをビルドして起動するまでがおしまいです。しっかりと起動しているか確認するために

> docker ps

でしっかりとwordpressがport:8000で起動しているかを見ます。

正常な起動を確認できましたら、ブラウザで http://127.0.0.1:8000/ にアクセスします。もし正常なレスポンスがなければまだWordpressが起動しきってないかもしれないので、1分くらい待ってみてください。
この辺りの作業はMastodonで何回もやったので慣れたもんですね。

WordPressの初期設定を一通り終えると以下のようにサイトが表示されます。

これでWordpressの仮想環境の構築はおしまいです。こんな簡単にWindowsで出来るとは。

早速攻撃してみる

今回はChromeアプリのAdvanced REST clientを使っていきます。指定したURLにリクエスト出来るのであれば利用するツールの種類は問いません。

一番最初の投稿の記事IDが1なので、以下のURLにtitleとcontentをPOSTしてみます。

http://127.0.0.1:8000/wp-json/wp/v2/posts/1?id=1

このように、普通のURLでは 401 – Unauthorized が返ってきて、記事を書き換えることなんて出来ません。しかし、

http://127.0.0.1:8000/wp-json/wp/v2/posts/1?id=1abc

上記のURLに対して同様にtitleとcontentをPOSTしてみます。すると、

なんと、処理が完了して 200 – OK が返ってきてしまいました。実際に投稿の方を見てみますと、

確かに、記事が書き換えられていることが確認できます。

原因は何か

この脆弱はPHPの厄介な仕様で起こってしまう脆弱です。詳しくは Content Injection Vulnerability in WordPress を見ていただければ全てが分かると思いますが、端折って説明しますと、

$request = array("id"=>"1abc");
$id = (int)$request['id'];
var_dump($id);

// int(1)

このようにして不正にIDがキャストされてしまい、しっかりとした判断ができなくなってしまうのです。困った!

まとめ

こうしてWordpressの脆弱を検証することが出来ました。自分の手で作業をしてみると、まさかこんなに簡単な手順でページが改ざん出来るとは… 私自身もWordpressやMastodonを運営していますので、こういったセキュリティホールなどに関する情報には常に敏感になってないといけないですね。

Mastodonの色々なインスタンス情報の統計

標準

暇つぶしに色々なインスタンスのユーザー数だとかトゥート数だとかを統計するっていうことをしてみました。一応記録として書き記しておきます。

インスタンス情報をcsvでかき集める

TacosTea / versionbattle
上記のリポジトリを活用させていただきました。これを使うことでシェルを叩くだけでinstances.social (jsonとしてはこちら) に登録されている全てのインスタンスの遅延(ms)、バージョン、ユーザー数、トゥート数、接続数をcsvとして出力させることが出来ます。凄い!

jsonを取得し直す場合、jsonからキーを抜き出すjqコマンドっていうのがあるんですけど、一部環境(私の場合はそうでした)ではインストールされていないこともあるので yum install -y jq などでさっとインストールしてしまってください。

最終的に2つのファイルに分けてcsvが出力されるので、これをExcelとかに専用の機能を使って貼り付けて色々とノイズを除去したりソートしたりすると以下のようになります。最終的に調査数は1,336になりました。

散布図にまとめてみる

今回のデータは少人数のような1桁の数からmstdn.jpやpawoo.netのような8桁の数までを扱わなければならないので、いずれの軸も対数目盛にしてみました。しかし、これに伴ってお一人様インスタンスなどのデータを示す際、大変なことになってしまうので、これまたいずれの軸も原点を10に設定しました。

というわけで散布図にまとめてみると以下のようになりました。

なんとなくないい感じに比例になりました。良かったです。(これ以上の成果は無い)
今回は以上です。これからもちょくちょくどうでもいい小ネタを投稿していくので、よろしくお願いいたします。

Mastodon軽量化に係る犠牲一覧

標準

ここ1週間くらい、Mastodonが異常に重くなって常にRAMの使用量は90%近く達し続け、iowaitがCPUを80%以上食い続けた結果、投稿やTLを取得するにも一苦労するくらいに不便していました。しかしながら、スケールアップするほど財政的にも余裕があるわけでは無いので、やむを得ずドメインブロック、つまり部分的鎖国をすることで以前の軽さを再獲得しました。以下にその犠牲となったドメインを示します。選考条件は購読ユーザー数が1であるインスタンスであるかどうかです。また、このリストにあるインスタンスの中で国交正常化をご希望の方は、インスタンスのご所属に関わらずコメント等で知らせていただければ即刻ブロックを解除致します。(こちらも好きでブロックしているわけではなく、なるべく多くのインスタンスと繋がりたいので^^;)対象となってしまったインスタンス、ユーザーの方々、申し訳ないです。

更新(2017/08/13):最新の情報に差し替えました。

ドメイン
admins.mstdn.social mdn.hinaloe.net
animalliberation.social mellified.men
anti.energy memetastic.space
august-don.site metal.odon.space
babymetal.party mevo.xyz
bcn-users.degica.com minami.shinshyu.life
betterletter.io msdn.yourrhythm.jp
blackice.online msdnaart.net
blessedgeeks.jp mstdn.791127.net
bonn.social mstdn.binfish.jp
bookdon.jp mstdn.boxertwin.info
bookwitty.social mstdn.b-shock.org
boys.computer mstdn.co33k.org
catdon.jp mstdn.creatorsnight.com
chitose.moe mstdn.dasoran.net
claristdon.net mstdn.ernix.jp
cmpwn.com mstdn.fetus.jp
co-mastdn.ga mstdn.gifu.jp
dhtls.net mstdn.haoyayoi.net
don.archae.me mstdn.ho-chi-minh.info
ecodigital.social mstdn.ht164.jp
ekimemo.info mstdn.i-red.info
elephant.bluecore.net mstdn.it-infra.jp
emojidon.global mstdn.itmedia.co.jp
equestria.social mstdn.klamath.jp
fern.surgeplay.com mstdn.kwmr.info
fnya.ggtea.org mstdn.kwmr.me
foodon.jp mstdn.mini4wd-engineer.com
forumanalogue.fr mstdn.mk39.xyz
f-rabbit.com mstdn.mochiwasa.xyz
from.komic.eu mstdn.morendo.daemon.asia
gam.m.to mstdn.niigata.jp
gbtdn.tokyo mstdn.plus
gl.phil-ia.net mstdn.poyo.me
gnusocial.no mstdn.ropo.jp
golfdn.com mstdn.serv-ops.com
grimoire.kanzakiranko.jp mstdn.soysoftware.net
gundam.masto.host mstdn.techdrive.top
gunmastodon.com mstdn-d.info
gyudn.com mstdn-scc.jp
hackers.town mstdnsrv.moe.hm
hatabowyou.club mstdn-tech.jp
herds.eu mustodon.xyz
hfukuchi.masto.host nfg.zone
hige.alterna-cloud.com niigata.minnna.xyz
home.aqraf.tokyo nikki.m.to
hydroxyquinol.net nomlishdon.racing-lagoon.info
ika.moe o.kagucho.net
ika.queloud.net obitsudon.midyuki.net
inari.opencocon.org omochi.xyz
infosec.exchange open2.ch
iomstdn.tokyo ostatus.ikeji.ma
k0ta.net ostatus.shnoulle.net
kaisendon.asmodeus.red ostatus.taiyolab.com
kakudon.com otajodon.com
kirapower.ichigo-hoshimiya.com p2px.me
kiwaitsu.hostdon.jp pao.moe
koyuston.tk photog.social
kurage.cc pleasehug.me
kurosawa-ruby.xyz pouet.april.org
linuxinthenight.com pouet.couchet.org
linuxjobs.social psodon.com
linuxrocks.online queer.party
lou.lt queer.town
m.loovto.net quitter.cat
m.moriya.faith quitter.es
m.pref.yokohama quitter.im
m.sl-network.fr rainyman.jp
m.uncate.org rich.gop
m6n.jp ro-mastodon.puyo.jp
malfunctioning.technology sandbox.skoji.jp
mammouth.inframed.net scuba.masdon.life
mammut.fsck.jp sdfn-01.ninjawedding.org
manx.social sealion.club
mastd.racing shelter.moe
mastdn.lovesaemi.daemon.asia shimaidon.net
mastdon.amazedkoumei.com shkval.net
mastdon.jp sitedethib.com
masto.cloud sns.gdgd.jp.net
masto.raildecake.fr social.48bin.net
masto.themimitoof.fr social.atypique.net
mastodon.ar.al social.ballpointcarrot.net
mastodon.burnworks.com social.cloudfrancois.fr
mastodon.cgx.me social.devloprog.org
mastodon.crazynewworld.net social.diskseven.com
mastodon.eliotberriot.com social.freedombone.net
mastodon.gracie-tech.tokyo social.guimik.fr
mastodon.hekki.info social.heldscal.la
mastodon.huma-num.fr social.hyuki.net
mastodon.indie.host social.imirhil.fr
mastodon.infra.de social.logilab.org
mastodon.jtwp470.net social.mecanis.me
mastodon.kirimi.net social.nah.re
mastodon.lertsenem.com social.nasqueron.org
mastodon.matcha-soft.com social.newspeak.house
mastodon.matrix.org social.sakamoto.gq
mastodon.mit.edu social.taker.fr
mastodon.ohgro.net status.fsf.org
mastodon.org.uk status.pointless.one
mastodon.p2pquake.net sunshinegardens.org
mastodon.papey.fr taruntarun.net
mastodon.partecipa.digital tgp.jp
mastodon.partipirate.org the.resize.club
mastodon.potager.org tk2-234-26965.vs.sakura.ne.jp
mastodon.potproject.net toot.matereal.eu
mastodon.robotstart.info toot.mst-dn.me
mastodon.sdf.org toot.oekaki.st
mastodon.snowandtweet.jp toot.place
mastodon.sportsfans.social toot.redmine.jp
mastodon.survival-machines.fr toot.yukimochi.jp
mastodon.swordlogic.com toot-lab.reclaim.technology
mastodon.wakin.site tulip.blue
mastodon.ynu.zone tusk.social
mastodon.zombocloud.com vapedon.club
mastodon.zunda.ninja vastodon.com
mastodonar.club waraiotoko.net
mastodon-omoshiro.com www.blueblueblue.blue
mastodonte.me www.mofgao.space
mastodonti.co www.techdon.info
mastodonturkiye.club xn--zck4azd638n.com
mastonon.net xserver.mstdn.hosting
mastoton.fi xserver.work
masutabedon.com yaskey.tokyo
mayodon.club youthdon.com
md.ggtea.org yso.pet
md.regastream.com 以上 251ドメイン

Mastodonクライアントのまとめ(iOS版)

標準

Mastodonが日本で流行り始めてから早いもので3ヶ月が経とうとしています。この3ヶ月弱でスマートフォン向けのクライアントが多いに増えました。特にiOS版の最初はAmaroqの一つだけでしたね。しかし、今は十数のクライアントがAppStoreに登録されています。ので、それに伴って「どれが便利なんだろう」「わざわざインストールして試すのが面倒」といった声が散見されるようになったので、それぞれのアプリの長所や短所、特徴などを簡単にまとめていきます。クライアント乗り換えの際の一助となれば幸いです。ちなみに、私の中では内蔵ブラウザで表示させているだけのアプリはクライアントとは認めていませんのでご承知おきください。紹介順序は使いやすさの順序ではないですよ。あと、私のiOSは英語に設定してあるので、スクショでは英語でも実際は日本語で使えるものもあります。つまり、スクショは参考までに

最終更新:2017/07/04

評価基準

  • LTL … ローカルタイムラインを見れるか
  • FTL … 連合タイムラインを見れるか
  • 通知 … 通知がちゃんとリアルタイムで通知されるか
  • 安定動作 … いきなりクラッシュしたりしないか、良くわからないエラーを吐かないか
  • デザイン … 見やすさ
  • 複数アカウント … 複数のアカウントでログインできるか
  • iPad … iPad版がAppStoreで配信されているか

Amaroq

ダウンロード
Mastodonクライアントとしては老舗っていう感じなくらい、初期から存在するアプリです。安定動作はしますが、機能の豊富さとしては少し劣る点を感じます。是もなく非もなくと言った感じですが、ローカルタイムラインが見れないっていうのは個人的には大きいですねローカルタイムライン見れました。しかしながら、はじめの一歩としてのアプリならとても使い勝手が良いと思います。

LTL FTL 通知 安定動作 デザイン 使いやすさ 複数アカウント iPad
×


Tootdon

ダウンロード
個人的に一番気に入っているアプリです。デザイン、動作が共に良くて通知もリアルタイムで届いてくれるので便利です。

LTL FTL 通知 安定動作 デザイン 使いやすさ 複数アカウント iPad


Mustor

ダウンロード
長らくお世話になったアプリです。機能やデザインに特に不満はありませんが、通知が時々届かなかったり、いきなりアプリが終了してしまったり、内部的なバグがまだまだあるのかなと思う感じです。リリース当初から見守っているので、今後の展望も楽しみです。

LTL FTL 通知 安定動作 デザイン 使いやすさ 複数アカウント iPad


Pawoo

ダウンロード
Pixivが運営しているアプリです。大企業が運営、開発しているため、安定性、使いやすさはピカイチだと思います。pawoo.net以外のインスタンスで利用すると、不便はしない程度の機能制限がかかるらしいです。

LTL FTL 通知 安定動作 デザイン 使いやすさ 複数アカウント iPad
△?


GON

ダウンロード
触った感じ他のアプリに比べて軽いような気がしますが、安定性に欠ける点があります。リロードする度にフォントサイズが変わったり。ただ、最低限までUIを絞っているわりには他のアプリと同程度の機能を有しているので、その点では捨てられません。

LTL FTL 通知 安定動作 デザイン 使いやすさ 複数アカウント iPad


Friends.nico

ダウンロード
ニコニコ動画を運営しているドワンゴが開発しているクライアントです。Pawooに比べると若干マイナーな感じはしますが、それでも使用感はPawooに劣らない感じです。さすが大企業の力…けど若干カクつく感じはします。

LTL FTL 通知 安定動作 デザイン 使いやすさ 複数アカウント iPad
△? ×


Tootle

ダウンロード
最近リリースされた遅生まれのクライアントです。タイムラインにフィルターをかけられたりなどの独自の機能が見られますが、安定性ではまだ欠ける点がありそうです。今後の展望に期待。

LTL FTL 通知 安定動作 デザイン 使いやすさ 複数アカウント iPad


Mameleon

ダウンロード
遅生まれのアプリです。しかしながらサッパリとしたUIを基調としており、とても使いやすくなるように考えられています。しかし、時々謎のエラーを吐いたりと不安定な部分も見られます。開発者さんには今後も頑張っていただきたい。

LTL FTL 通知 安定動作 デザイン 使いやすさ 複数アカウント iPad
△? ×


11t

ダウンロード
こちらも遅生まれのアプリです。他のアプリに比べると機能が少なかったりなど不便な点が多く見受けられます。あとちょっと動作もレスポンスが無かったりと改良すべき点も多いです。

LTL FTL 通知 安定動作 デザイン 使いやすさ 複数アカウント iPad
× × × × ×


Mastodonをメンテナンス状態に切り替える方法

標準

Mastodonのインスタンスをメンテナンス状態に切り替えずに停止していたりすると、404(Not Found)だとか502(Bad Gateway)だとかが周りのインスタンスに返してしまうことになり、結果としてPuSH購読を切られてしまう事になります。そうすると一時的にでも(PuSHの更新が7日周期なので最長7日)連合タイムラインが寂しいことになったりと、インスタンス利用者にも迷惑をかけてしまう事になりかねません。

というわけで今後の為にもしっかりと503(Service Unavailable)を返すように設定しながら、メンテナンスが安心して出来るようにNGINXを設定しましょう。

NGINXの設定ファイル

NGINXの設定ファイル(*.conf)は基本的に /etc/nginx/conf.d に全部入っています。この中に拡張子.confのファイルを入れていくことで色々と設定できます。ココらへんの詳しい仕様は適当にググってみるとよく分かると思います。

私のインスタンスでは、公式ドキュメントにもある設定例を基本的に引用してNGINXの設定をしました。今回は、この公式ドキュメント通りの設定でNGINXを動かしていることを前提に説明していきます。

以下のようにMastodonの設定ファイルを書き換えます。

map $http_upgrade $connection_upgrade {
  default upgrade;
  ''      close;
}

server {
  listen 80;
  listen [::]:80;
  server_name haruhi-mstdn.club; #ドメイン名
  # Useful for Let's Encrypt
  location /.well-known/acme-challenge/ { allow all; }
  location / { return 301 https://$host$request_uri; }
}

server {
  listen 443 ssl http2;
  listen [::]:443 ssl http2;
  server_name haruhi-mstdn.club; #ドメイン名

  ssl_protocols TLSv1.2;
  ssl_ciphers HIGH:!MEDIUM:!LOW:!aNULL:!NULL:!SHA;
  ssl_prefer_server_ciphers on;
  ssl_session_cache shared:SSL:10m;

  #必要なファイルが存在するパスを指定
  ssl_certificate     /etc/letsencrypt/live/haruhi-mstdn.club/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/haruhi-mstdn.club/privkey.pem;
  ssl_dhparam         /etc/ssl/certs/dhparam.pem;

  keepalive_timeout    70;
  sendfile             on;
  client_max_body_size 0;

  #パスを指定
  root /root/mastodon/public;

  gzip on;
  gzip_disable "msie6";
  gzip_vary on;
  gzip_proxied any;
  gzip_comp_level 6;
  gzip_buffers 16 8k;
  gzip_http_version 1.1;
  gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

  add_header Strict-Transport-Security "max-age=31536000";

  location / {
    try_files $uri @proxy;
  }

  location ~ ^/(assets|system/media_attachments/files|system/accounts/avatars) {
    add_header Cache-Control "public, max-age=31536000, immutable";
  }

  location @proxy {
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto https;
    proxy_set_header Proxy "";
    proxy_pass_header Server;

    proxy_pass http://127.0.0.1:3000;
    proxy_buffering off;
    proxy_redirect off;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;
    proxy_intercept_errors on;

    tcp_nodelay on;
  }

  location /api/v1/streaming {
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto https;
    proxy_set_header Proxy "";

    proxy_pass http://localhost:4000;
    proxy_buffering off;
    proxy_redirect off;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;

    tcp_nodelay on;
  }

  error_page 500 501 502 504 /50x.html; #500,501,502,504はそのまま
  error_page 503 @maintenance; #503は新たに定義する
  location @maintenance {
    root /var/www/error_pages; #表示させたいhtmlファイルが存在するパスを指定
    rewrite ^(.*)$ /custom_503.html break; #表示させたいhtmlファイルにリダイレクト
    internal; #表面上はリダイレクトしたように見せない
  }

  #ここからメンテナンス状態するかどうかの判定
  set $maintenance false;

  #/var/tmp/503というファイルが存在すればメンテナンスモードに切り替え
  if (-e /var/tmp/503) {
    set $maintenance true;
  }

  #自分はいつも通りにアクセスできるように
  if ($remote_addr = "***.***.***.***") {
  set $maintenance false;
  }

  #メンテナンスモードになっているなら503を返す
  if ($maintenance = true) {
    return 503;
  }
  #ここまで判定
}

一部カスタムが必要な部分がありますが、基本的にはこの通りに書けばちゃんと動くと思います。書き換えた後には nginx -t を実行し、反映させる時は systemctl restart nginx をお忘れなきよう。

表示させるHTMLファイル

デフォルトの503ページでも機能を果たしていれば別に問題は無いのですが、やはりアクセスしてくれた利用者には「いつまで続くのか」「何をしているのか」を明示したいものです。というわけで、専用の503ページを作っていきます。

<!DOCTYPE html>
<html lang="ja">
  <head>
    <title>メンテナンス中</title>
    <meta charset="UTF-8" />
    <style>
      article#main {
      width:80%;
      margin:0 auto;
    }
    </style>
  </head>
  <body>
    <article id="main">
      <h1>メンテナンス中</h1>
      <h2>503 - Service Unavailable</h2>
      現在、Mastodonのアップデートに伴う臨時メンテナンスを行っております。ご不便をおかけしますが、ご理解とご協力の程をよろしくお願いいたします。
      <ul>
        <li>期間:XX時XX分~XX時XX分(予定)</li>
        <li>内容:Mastodon 1.x.x -> 1.x.xへのアップデート</li>
      </ul>
    </article>
  </body>
</html>

これを先程のNGINXで設定したディレクトリに入れます。ファイル自身やディレクトリに対してchmodを使ってパーミッションを変更することを絶対に忘れないで下さいね。そうしないと、せっかくファイルを作っても外部からアクセスすることが出来ません。

メンテナンスモードに切り替え

いよいよ実際にメンテナンスモードに切り替えていきます。今回の設定では /var/tmp/503 が存在するか否かで判定をしていますので、touch /var/tmp/503 を実行するだけで切り替えられます。超便利!逆にメンテナンスモードを解除する時は rm -f /var/tmp/503 を実行するだけです。


tor(外部IP)で確認してみると、しっかりと専用503ページが表示されていることが分かります。しかもURLもそのまま。

この切替さえ忘れなければPuSH購読を切られること無く安心してメンテナンスを行うことが出来るので、是非活用してみてください。

何か不具合などが有りましたらお気軽にコメント下さい。よろしくお願いします。

モンテカルロ法を用いた円周率の近似値算出

標準

今日は先日暇つぶしでやってみた、モンテカルロ法を用いた円周率の近似値を求めるプログラムについて書いていきます。

モンテカルロ法とは

モンテカルロ法とは何かしらの数値計算を乱数を用いて近似値を得る手法の総称です。「モンテカルロ」という名前はカジノで有名な都市の名前からとられたそうです。このモンテカルロ法は円周率を求める以外にも「巡回セールスマン問題」などの数値計算も可能にする、使いによってはとても優れた計算手法です。ではまずはこれを使ってどう円周率の近似値を得るか考えていきます。

どうやって円周率を求めるか

まずは半径r=1、中心角θ=90°の扇形を描きます。この時の扇形の面積Sは、それをちょうど覆う正方形の面積 1×1=1 に対してS=pi/4になります。

上記の図の正方形の左下の頂点を座標平面の原点と定めて、点(x,y) (但し、0≦x≦1, 0≦y≦1をいずれも満たす)を乱数を用いて定めます。そうすると、試行回数Nに対して定めた点が扇形に含まれる回数Xの割合は、正方形に対する扇形の面積の割合に近似して、これを用いるとpiは以下のように近似させることが出来ます。

ちなみに、定めた点が扇形に含まれているかどうかは原点からの距離dが1以下であるか否かで判別することが出来ます。

実際に求める

今回は自分が一番得意なPHPを使って円周率の近似値を得ようと思います。

<?
//変数初期化
$count=0;
$start=1;
$max=100000000;
for($i=$start;$i<=$max;$i++) {
    //点を定める
    $x=(double)(mt_rand(0,1000000000)/1000000000);
    $y=(double)(mt_rand(0,1000000000)/1000000000);

    //距離を三平方の定理を用いて算出
    $d=$x*$x + $y*$y;

    //扇形に含まれる場合
    if($d <= 1.00000000) {
        $count++;
    }

    //結果出力
    print(sprintf("( %.9f , %.9f ) d = %.9f ( %d / %d ) pi = %.9f\n",$x,$y,$d,$count,$i,4.0*($count/$i)));
}
//最終結果出力
$pi=4.0*($count/$max);
print(sprintf("%.9f",$pi));
?>

PHPでは乱数(正確には「疑似乱数」)を生成する関数として、rand()mt_rand()random_int()などありますが、今回はより高速に、より良い(偏らない)乱数を生成出来るという特性をもつメルセンヌ・ツイスターを利用したmt_randを用いてみました。

早速これで1億回試行してみると以下のような値を取得することが出来ました。

pi = 3.141529200

(たまたま)小数点以下4桁まで正確に算出することが出来ました。この算出結果は、1億回の試行でも大きく外れてしまうこともありますし、精度良く求めることもあるという揺らめきの中での算出とはなりますが、いかにして精度良く算出できるか、極める価値がありそうですよね。

今回はこれで以上です。

Mastodonのカスタム方法

標準

Mastodonのインスタンスを構築する方法は検索すれば山ほどヒットするので、その分資料が少ないインスタンスのカスタム方法について今日は説明します。インスタンスの構築する方法についての記事はや「Mastodon(マストドン)のインスタンスをCentOS7で立ててみる」、「CentOS7でmastodonを建てる」辺りを見れば完璧ではないかなと思います。

追記:以下のサイトもとても参考になります。

ちなみに私が運営するmastodonのインスタンスは haruhi-mstdn.club ですので、よろしくお願いします。

表示される言葉のカスタム

config/locales に入っている大量の言語ファイルをカスタムしていくことで新たな言語(語録集)や表示される文言を簡単に変えることが出来ます。

---
ja:
  about:
    about_mastodon: Mastodon は&lt;em&gt;自由でオープンソース&lt;/em&gt;なソーシャルネットワークです。商用プラットフォームの代替となる&lt;em&gt;分散型&lt;/em&gt;を採用し、あなたのやりとりが一つの会社によって独占されるのを防ぎます。信頼できるインスタンスを選択してください &amp;mdash; どのインスタンスを選んでも、誰とでもやりとりすることができます。 だれでも自分の Mastodon インスタンスを作ることができ、シームレスに&lt;em&gt;ソーシャルネットワーク&lt;/em&gt;に参加できます。
    about_this: ご利用前にお読みください
    apps: アプリ
    business_email: 'メールアドレス:'
    closed_registrations: 現在このインスタンスでの新規登録は受け付けていません。
    contact: 連絡先
    description_headline: "%{domain} とは?"
    domain_count_after: 個のインスタンス
    domain_count_before: 接続中
    features:
      api: アプリやその他サービスにAPIを公開
      blocks: 豊富なブロックやミュート機能
      characters: 1つの投稿は500文字まで利用可能
      chronology: 時系列順のタイムライン
      ethics: 広告もトラッキングもありません
      gifv: GIFVや短い動画にも対応
      privacy: 投稿ごとに公開範囲を細かく設定可能
      public: 公開タイムライン
    features_headline: Mastodon の特徴
    get_started: 参加する
    links: リンク
    other_instances: 他のインスタンス
    source_code: ソースコード
    status_count_after: トゥート
    status_count_before: トゥート数
    terms: プライバシーポリシー
    user_count_after: 人
    user_count_before: ユーザー数
(以下略)

画像のカスタム

うちのインスタンスはアニメ愛好家向けだからゾウさんなんか表示しないで自分の推しキャラを出したい!という方におすすめです。Mastodonで使われる画像は app/assets/images app/javascript/images に格納されています。ここに代わりの画像を置いてあげることで任意の画像を背景やトップページのゾウさんの代わりに表示させることが出来ます。最終的には以下のような感じになれば正解です。

CSSとJavaScriptのカスタム

これも同じように app/assets/stylesheets app/javascript/stylesapp/assets/javascripts app/javascript/mastodon に格納されている.scssファイルと.jsファイルをを編集することで変更することが出来ます。私の場合、背景が左揃いになっているのが気に食わなかったので、中央揃い(background-position:50% 50%;)にするなどのカスタムをしました。

最後に反映させよう

画像、CSS、JavaScriptファイルは動的なサイトにするため(?)に圧縮されています。この圧縮過程を飛ばしてしまうと反映はいつまで経ってもされないので忘れないようにします。
まずは実際にMastodonで使えるようにメディアファイル集assetsを作成します。コマンドラインに以下のように打ち込みます。

//assetsフォルダを全消去したい場合。全てをやり直したい人向け。
# docker-compose run --rm web rails assets:clobber

//assetsフォルダにある昔のものを消去したい場合。普段はこっちで十分かな。
# docker-compose run --rm web rails assets:clean

//上の2つのコマンドのうちどちらかを実行したら、メディアファイル群を事前コンパイルする。
# docker-compose run --rm web rails assets:precompile

//mastodon全体を再ビルド
# docker-compose build

//mastodonを再起動
# docker-compose restart

追記(2017/07/06):Mastodonをスタートアップスクリプトで立ち上げた場合はdockerを使わないのでこちらのご指摘の通りやってみてください。

これで色々とカスタムの幅が広がったので、自分だけのインスタンスを発展させていってください。それでは。

追記(2017/04/28):当ブログの記事を見て、「出来なかった!」「困った!」といった問題があればコメントをお願いします。

追記(2017/06/18):Mastodon 1.4.1からディレクトリ構造に色々と変更が加わった、という旨のご報告をいただきましたので最新の情報に更新しました。ご報告ありがとうございました。

Mastodonをはじめよう

標準

1週間ほど前から日本国内でアツくなり始めたMastodon(マストドン)。このページでは始め方や仕組み、各プラットフォーム(iOS, Android, Windows, Linux, MacOS…)でのクライアントなどを紹介、説明していきます。

Mastodonとは?

Mastodonは他のSNSでは見られない「分散型」という仕組みを採用しています。個人でも企業でも誰でも簡単にそれぞれの拠点となる「インスタンス」を立ち上げることが出来て、それぞれのインスタンスがそれぞれのサービスとして機能します。それぞれが独立して機能していますので、それぞれのインスタンスが各管理者の意向で動きます。意向というのは例えば運営方針や、メンテナンスのタイミング、話題などです。

と言っても、各インスタンスが独立しているからと言ってそれぞれのインスタンス同士でコミュニケーションがとれないというわけではありません。多くのインスタンスは数百ものインスタンスと「連合」を組んでおり、その連合を組んでいるインスタンス同士であれば普段からフォローをしていなくても「トゥート」をお互いに見ることも可能ですし、連合を組んでいないインスタンス同士でも、「リモートフォロー」をすることで新たにそのインスタンス同士で連合を組むことが出来ます。

このようにオープンソースであることを最大限まで活用して運営されているMastodon。これからも目が離せない新サービスになりそうです。

インスタンスを選ぶ

次は自分が登録するインスタンスを選びましょう。単純にSNSとしてのMastodonを楽しみたいのであれば日本人の多いインスタンスの方がきっと楽しいでしょうし、専門の分野について話したいのであればそれに適したインスタンスを選ぶと良いでしょう。そんな感じにインスタンスを決めるためにインスタンス一覧がいくつか用意されています。ぜひ活用してください。

日本だけでも結構ジャンル別のインスタンスに別れてるんですね。私は「mstdn.jp」と「x0r.be」と「pawoo.net」の3つのインスタンスに登録しています。なお、現段階ではアカウント削除については対応していないので、くれぐれも注意してください。また、無名の海外のインスタンスに登録したりすると凄くアウェー感あふれることになるかもしれない点も注意が必要です。

クライアントを使おう

いざMastodonを頻繁に使おうとしても、いちいちブラウザからインスタンスにアクセスしているようでは通信容量も多くなりますし、なにより面倒です。そこで使うのが専用クライアント。これを使うことでより一層便利にMastodonを使うことが出来ますので、ぜひ利用してみては。

対応 クライアント名 備考
Android Tusky Androidでは見た感じ最もポピュラーなクライアント。
11t
TootyFruity リリース前なので不安定。
iOS Amaroq 現在はこれしかiOSはありません。
Windows Capella 開発途上なので私の環境では結構不安定でした。
Mastodon UWP app UWP版です。他に比べるとまだほとんど機能はありません。
Windows/Linux/Mac Web-based Desktop Client デスクトップで単独アプリとして楽しめます。結構安定しています。

ブラウザ拡張でより賢く

この章はChromeユーザー対象の文になってしまいますが、ご容赦ください。Chromeには拡張機能が用意されていて、それを使うことでMastodonをより便利に、賢く使うことが出来ます。

とりあえずTooterです。この拡張機能は普段Twitterを使っている方は簡単にTwitterとMastodonの両方に同じ内容を投稿することが出来ます。いちいち画面を切り替えて投稿していて、煩わしい思いをしている方には嬉しい機能です。公式ページ(twitter.comの一部)でのツイート、tweetdeckの両方で使うことが出来ます。



最後に

Mastodonの成長は1週間でmstdn.jpのユーザー数が7万人を超えるほど、めまぐるしい成長を遂げました。これからも暫くはその成長は衰えることは無いでしょう。初期の方はあまりの急成長さで新規会員の登録を中止したり、サーバーを急遽補強したり色々と大変でした。今では7万人を越すユーザー数を獲得している過去にも、途中で全ユーザーのデータが吹っ飛んで0からのスタートを2回していますが、これだけユーザー数が集まるってのは相当ですよね。それだけの魅力があるのだから、これから先もサービスも含めて更に成長していくことを心から願っています。

WordPressを軽量化する

標準

はじめに

ウェブページのロード時間が訪問者のその後の行動に大きく影響を与えることは広く知られていますし、日々のネットサーフィンを思い返してみてもそれは自明です。こちらのマーケティングなどの解析をテーマにしているブログでは

  • 47%の利用者が2秒以内のロード時間を望んでいる
  • 40%の利用者が3秒以上のロード時間では閲覧を諦める

と記述されている程です。

当サイトの実情

P3 (Plugin Performance Profiler)というロードに必要な時間などを計測する専用のプラグインで計測してみたところ、以下のような結果が出ました。


計測結果によるとロード完了までに3.42秒かかっています。これでは遅すぎます。せめて2秒台に収めたいですね。ということで対策を講じていきます。

具体的な対策

今回はWP Super Cacheというプラグインを利用していきます。画像の方の対策はあまりロード時間には一般的には影響を及ぼさなさそうなのでしません。

基本的には設定画面にあるものを推奨に持っていくだけで大丈夫です。これだけでも凄く効果があります。

効果はいかほど?

これらの設定を施した後に再びロード時間を計測してみます。

効果は絶大ですね!なんとロード時間は1.50秒まで短縮されました。これでロード時間の長さによる直帰率は大分下げられたはず・・・閲覧数が増えると良いな。

最後に

慣れていれば5分位で軽量化出来るので世の中はとても便利ですね。ロード時間の長さで悩んでいるサイト管理者の方はぜひ試してみてください。

Nevermindを購入しました

標準

少し前の話になりますが、Nevermindという精神恐怖系のホラゲーを購入しました。購入動機は友人の家に遊びに行ったりする時に何かゲームが欲しいので目についた短編物がNevermindだったという訳です。Steamから1980円で購入することが出来ます。(2017年2月12日現在)

Nevermind
Nevermind
Developer: Flying Mollusk
Price: 19,99 €

コンセプト

このゲームのコンセプトは、精神科医が患者の脳内に潜入して患者の持つ過去のトラウマを探し当て、治療するというものです。トラウマに見ていて心地よいものなんて存在する訳無いですから、当然プレーしているうちに精神が蝕まれていきます…。他のホラーゲームに比べては驚かす系のイベントは少ない方ですが、少ない分違う面でプレーヤーを恐怖に陥れてくれます。

ゲームの流れ

ゲームはまず患者の脳内に入るところから始めます。タイムマシンのようなカプセルに入れられて間もなくすると、患者の脳内に入ることが出来ます。トラウマは患者自身も思い出したくはないものなので、基本的に記憶の奥底にあるため、そこまで潜入していく必要があります。ところどころ問題を解かねば進めないチェックポイントや、少し頭を使わないと進めないところなどもあり、一筋縄ではいかないのが面白いです。また、道端にところどころ挿絵のようなものが落ちていて、それを最終的に10枚集めるのがゲーム進行部分の目標です。その後、その集めた10枚の中から本当にトラウマに関与する5枚を選び実際のストーリー通りに並び替えるまでがゲームの流れです。また、全編で日本語の字幕が付いているので、英語が分からない!という方でも安心してプレーすることが出来ます。

バイオフィードバック

このゲームではバイオフィードバックという独自のシステムを導入しています。どういうものなのかというと、プレーヤー自身の心拍数・顔の表情の変化をゲームが監視することで、常にゲーム内の恐怖度が変化するというのです。プレーヤーが恐怖や焦りなどを感じれば感じるほどゲームは恐怖の強い方向へ進んでいきます。いかに精神科医として冷静に進められるか試されるわけです。このバイオフィードバックを利用するためには、対応している心拍センサー(Apple Watchなど)や対応した3Dウェブカメラなどが必要で敷居は高いですが、もし揃っているならとてもゲームを面白くしてくれるでしょう。もしこれらの機器が無かったとしても、ゲーム内の恐怖レベルは常に最高になってくれるらしいので安心です。←

総括

精神恐怖系のタグがつけられるのがよく分かるくらいにプレーしていて精神が削られます。しかしながら、プレーしても損することはないし、一人でプレーするのに勇気が必要なほどでも無いのである意味気軽にプレーできるのでおすすめです。割引の時は結構安くなるので、この機会に是非。(最安値396円)