5.1さらうどん

@giginetの技術ブログ。ゲーム開発、iOS開発、その他いろいろ

さくらインターネット石狩データセンター見学ツアーに参加してきた

参加してきた!!!

最新鋭データセンターに萌える「第2回 さくら石狩DC見学ツアー」 東京発に加え大阪発&札幌集合プランも - はてなブックマークニュース

去る11月23日、はてな社とさくらインターネット主催の、さくら石狩データセンターを見学するツアーに参加してきました!

普段は立ち入ることのできない最新鋭のデータセンターに入れるというのは元より、本州の人にとっては格安で北海道に来れるツアーだけあって応募が殺到したらしいです。 参加者は抽選なのか、日頃の活動が評価されたのかはわかりませんが、とにかく運が良かったみたい。

60名近い参加者のうち、札幌からの参加者は僕含め3名だけでした。寂しい。

f:id:gigi-net:20131125190739j:plain

気分は遠足。

石狩某所

データセンターの場所はヒミツと言うことなので入り口の写真だけ。

日本最大のデータセンターがわりとすぐ近くにあるのは、道民としても嬉しいですね。

f:id:gigi-net:20131123140321j:plain

入り口でJKにお出迎えして頂きました。かわいい。

見てきた

すごかった(小並感)

サーバールームはもちろん、発電室や変電室、熱源室、監視センターなどの設備も見せて頂きました。

詳しくはどこまで書いて良いのかわからないのですが、北海道の気候や地勢に最適化された細かな工夫があらゆる所に取り入れられていたのが印象的でした。

関東のデータセンターでは常識的に採用されている技術であっても、北海道ではこっちの方がパフォーマンスが良いという事例は多いようです。

全くノウハウがない状態から始め、トライ&エラーを繰り返し、少しでも労働環境やコストパフォーマンス、生産性の向上を図っていく企業努力には頭が上がりません。

また、サーバー運営はミッションクリティカルであるため、何十にもバックアップ体制がしかれていたのも特筆すべき点です。

電気が数日一切供給されなくても大丈夫、大雪が降っても、地震が起こっても、止まらずサービスを運営しつづけられる基盤が整えられていました。

自信を持って自社のサービスの安全性を知らしめられる仕事はカッコイイ。

社長様が凄い

運良く、僕らのグループは、さくらインターネット社の社長様が直々に案内してくださいました。

普段は東京にいらっしゃるようだし、大企業の社長でありながらも、石狩データセンターの隅々まで把握しており、知識面や話の上手さにも圧倒されました。

懇親会では名刺交換を申し込んで頂き恐縮。直接お話しすれば良かったなあ。

特に書けることがない

データセンターの場所や内部の写真、運営の裏事情はNDAが多かったので詳細には書けないです。

当たり前だけど、写真撮影も禁止されていたので、写真はブログ用に用意して頂いたモノを使っておりますが、天井の写真ぐらいしか貼れるものがありません。

また、東京や関西からの参加者と違って、僕は札幌からの参加なので、旅行紀的な内容もなく・・・・・・。

さくらインターネット最高!!!

最高のユーザー体験だった。

さくらインターネット最高だからみんな使いましょう!!!

さくらインターネット | 公式サイトTOP

サクラっぽい

僕の考えた最強のゲームフレームワーク『MonoGame』を試す

前々からMonoGameというゲームフレームワークが気になっていたのでMacで動かすところまでやってみました。ググっても全然情報が出てこなかったので、日本語で読める記事としてはかなり詳しいのではないでしょうか。

mono/MonoGame

MonoGame - Write Once, Play Everywhere - Home

Monoとは

Monoは、Windowsが提供している.NETの資産をクロスプラットフォームで動かそうというオープンソースプロジェクトです。

C#はものすごく良い言語だと聞いているのですが、主にWindows環境でしか動作しなかったので、Macユーザーには嬉しいですね。

一昔前は微妙な感じだったんですが、最近ではUnityがMonoを採用しているなど、今後流行り出しそうな雰囲気があります。

MonoGameとは

MonoGameはMono上で実装されているゲームフレームワークです。マイクロソフトが開発したゲームエンジンXNAを高い移植度で再現しています。

MonoGameの特徴として以下の点が挙げられ、これらを聞くだけだと「ぼくのかんがえたさいきょうのゲームフレームワーク」に聞こえます。

高い移植性

非常に高い移植性を誇っており、様々なプラットフォームで動きます。

公式のREADMEによると

で動きます。他にもXbox360でも問題なく動作するほか、WiiUへの対応が任天堂から発表されています。

Nintendo bringing MonoGame Framework to Wii U | Polygon

XNAとの互換性

MonoはXNA4.0との互換性を維持していて、XNA向けに書いたコードがそのまま走ります。後述しますが、過去にXNAで開発したゲームがほぼそのままクロスプラットフォーム化できました。XNA自体がかなり優れたプラットフォームなので、記述性の面でも非常に優秀です。

多くの採用実績

日本だと全く情報を聞かないのですが、海外だと徐々に名作が生まれています。

例えば、数々の賞を受賞したXBLAの『Fez』や、『Bastion』なんかはMonoGame製だそうです。

Fez』は日本語版が出たあとにクリアしたんですが、なかなかおもしろい作品でした。

最近PS3で発売した『テラリア』もMonoGame上に移植なんかがされていたりします。

環境構築

はじめに

この手順は2013/10/29時点の情報です。
現状、大変残念な事になっていますが、将来的にもっと手軽に変更される可能性があります。

一応、Githubに公式のインストールガイドがあるのですが、はっきりってほぼ役に立ちません。

Tutorials · mono/MonoGame Wiki

今回は下記の記事がなかなか良い線行っていたので、この記事に沿って説明します。

Setting up a MonoGame Mac Application with Xamarin Studio | Jamie Ly

また、環境はこんな感じです。

Xamarin Studioのインストール

Xamarin StudioはMono環境向けのIDE。以前はMono Developという名称だったが、Version4.xからXamarin Studioになったみたい

ちなみに「ザマリン」とかって読みます。

Download - MonoDevelop

Mono SDK for Macのインストール

Download - Mono

こちらから。Mono MRE, Mono MDKいずれでも大丈夫だと思う。今回はMono MRE installerを選択

MonoMacのインストール

Xamarinにはパッケージマネージャーが組み込まれているので、そこからMonoMacを導入します。

Xamarin Studioを起動して、メニューバーからXamarin Studio > Add-in Manager > Galleryを選択。

Mac Developmentカテゴリ以下にあるMonoMacをインストール。完了したらXamarin Studioを再起動する

(もしかしたら環境によってはやらなくてもいいのかも?)

MonoGameのテンプレートをインストール

MonoGame - Write Once, Play Everywhere - Download: MonoGame 3.0.1

こちらからMonoGame for Xamarin Studioをダウンロードする。XamarinStudio.MonoGame_3.0.1.mpackみたいなファイルが入手できればOK

上記同様にAdd-in Managerを開き、左下のInstall From Fileから今入手したファイルを使ってMonoGame向けのテンプレートをインストールする。インストール後、再びXamarin Studioを再起動

MonoGameプロジェクトを作成する

File > New > Solution > MonoGameからMonoGame Mac Applicationを選択。適当に名前を付けると良い。

f:id:gigi-net:20131029114703j:plain

参照を変更1

この工程は説明のために書いていますが、結論から書くと正常に動作しません。
とりあえず動かしたい人は「参照を変更2」を参照してください

これでビルドは通るが、おそらく正常に起動しない。

参照したページによると、MonoGame.Frameworkをテンプレートに含まれている物から変更してあげる必要がある。

左側のナビゲーションペインから、Referencesを選択し、右クリック。Edit Refereces…を選択する。

その後、.NET Assenblyタブを開き、

~/Library/Application Support/XamarinStudio-4.0/LocalInstall/Addins/MonoDevelop.MonoGame.3.0.1/assemblies/MacOS/下にあるMonoGame.Framework.dllを選択してあげる。

また、右側に表示されている、元々追加してあるMonoGame.Framework.dllは削除する。

下記スクリーンショットのようになればOK

f:id:gigi-net:20131029114642j:plain

テクスチャが読めなくて死ぬ

ビルドする。今度は正常に一瞬だけWindowがでるが、下記のようなエラーで死ぬ

f:id:gigi-net:20131029114611j:plain

Method not found: 'MonoMac.AppKit.NSImage.AsCGImage'.

このようになぜかテクスチャが読み込めない。

結論から言うと、修正されたPull RequestがまだStableに取り込まれていないらしく、この方法では動かない。CIサーバーからunstable版を取得するか、自分でMonoMacとMonoGameFrameworkをビルドし直してあげると解決する。

Xamarin MonoMac DLL and MonoGame issue - xamarin

これに気付くのに数時間ハマった。最悪だった。

今回は簡単のため前者の方法を採る。

参照を変更する2

develop-mac [Jenkins]

MonoGameのCIサーバーから最新版のビルドを取得する。develop-macジョブのLast Successful ArtifactsからMonoGame.Framework.dllMonoMac.dllをダウンロード

「参照を変更する1」の方法と同様に、今取得してきたdllを参照してあげる。古い参照は消してください。

正直あんまり良い解決策ではないので、今後修正されると思います。

Hello MonoGame!

動いた!!!!

f:id:gigi-net:20131029114540j:plain

MonoMacを自分でビルドしたい(Optional)

CIサーバーから持ってくれば良いんですが、自分で心を込めてビルドしたいという方は下記の通りしてください

git clone https://github.com/mono/monomac
cd monomac
git submodule update
make

これでsrc以下にMonoMac.dllがビルドされます。よかったですね。

ゲームを作ろう!

これでやっとゲームが実装できるようになったのでひたすらがんばるだけです。

サンプルが下記に用意されているので、見ながらがんばってください。

基本的にXNAそのままみたいなので、XNAが使える方は取っつきやすいのではないでしょうか?(僕はほぼ使ったことがないのでこれから覚えます)

MonoGameでいろいろ

XNA製のゲームをクロスプラットフォーム化する

僕の運営している札幌ゲーム製作者コミュニティKawaz製のゲームにはXNAの資産で作られた物が多数ありますが、僕はWindowsでは開発しないので遊べないことが多かったです。

どれほどの互換性があるものなのか、試しに移植してみました。

Kawaz - ぼくはキミの盾 (ぷちげープロジェクト)

上記の動画のように、割と高い移植性を誇っていることがわかりました。

諸事情で動画は削除させて頂きます。ごめんなさい

コードについても、ほぼ直す必要がなくてここまで30分ぐらい。 一部未実装のAPIがあるのと、パスの指定方法がWindowsと若干異なるなどの変更作業が必要ですが、ここまで再現度が高いのは驚きでした。

iOS, Androidで動かす

iOS/Android向けにビルドするにはXamarinが提供しているMonoTouchのライセンスを購入する必要があるようです。

Xamarin - Xamarin.iOS - Create amazing iOS apps with C# and .NET

$299買い切り。1年ごとの更新だったみたいです。ご指摘ありがとうございます。

一応試すだけならFree版があるんですが、32KBまでしかバイナリが出力できないという制限があって、ほぼ実用できない気がします。今度試します。

PS Vitaで動かす

やってみたいので今度試します。余談ですが、Vita向けの開発環境を最近構築したので、これ関係の記事も書きたいですね。

まとめ

日本人で使ってる人をほぼ見かけなかったので書いてみました。

動くまでは環境構築の項にあるとおりめちゃくちゃ面倒でした。これは流行らない。

特にMonoMacの敷居が高すぎて、辛い感じがしました。 どうやらCocoaをMonoでBindingしてC#で記述し、Objective-Cにコンバートしているという黒魔術らしい。 Macでビルドしてdllが生成される世界観がヤバかったです。

上記の点から、途中までは大したことないと思ったのですが、実際に動いてみると高い移植性と、記述の容易さに驚かされました。 想像以上に良さそうなので今後に期待ですね。

海外のインディーズゲーム界隈では最初に紹介したように、数々の名作がMonoGameで実装されているので、今後爆発的に普及するかも・・・・・・。

IFTTTを使って、Githubでスターを付けたリポジトリをはてブする

IFTTT、楽しいですよね!

IFTTT / Dashboard

特に使い道がなくても、眺めてあれこれと使い方を考えてしまいます。良いサービス。

大昔に流行った、Yahoo!Pipesなんかを思い出します。

何か使えないかと考えてみた結果、GithubのStarを付けたリポジトリは参照性が悪いので、はてブでまとめて管理したいという欲求がありました。

しかし、IFTTTにははてなブックマークGithubもチャンネルとして提供されていないので、一見、不可能に見えますが、ちょっとトリッキーな方法を使うことで実現することができます。

Githubのスターをはてブ

  1. ThisにRSSを指定
  2. TriggerにNew feed item matchesを選択
  3. Keywordに[USERNAME] starredを指定
  4. Feed URLにhttps://github.com/[USERNAME].atomを指定
  5. ThatにGmailを指定
  6. ActionにSend an Emailを選択
  7. 送信先アドレスとして、はてなブックマークのメール投稿用アドレスを指定する。
  8. 本文をEntry URLと付けたいタグ、コメントに設定する

できた!!!

f:id:gigi-net:20131022062544j:plain

メールではてブする機能とか、滅多に使われていないので存在を完全に忘れていましたね。自分のメールアドレスはブックマークの設定ページから確認できます。

メールではてなブックマークに追加できる機能をリリースしました - はてなブックマーク日記 - 機能変更、お知らせなど

はてブとIFTTTを軸にして、Feedly・Pocketから効率よく情報発信する方法 | アプリオ

便利ですね。

Qiitaのストックもはてブ

QiitaのストックはRSSを吐いていないのですが、以下の方法を参考にすれば同様に実現可能。

Qiitaのストック一覧をRSS化する方法 - Qiita [キータ]

まとめ

IFTTTの問題点の一つは、国産のサービスはことごとくチャンネルにないことで、いろいろ困りますね。国産サービス以外でも、GithubSlideShare, Pinterestチャンネルは欲しいところ

プログラマならこれぐらいはコードで書いてしまった方が早かったりもするんですけど、ブラウザ上でポチポチするだけで実現可能なのが嬉しいです。

オマケ:Pushoverが良い

IFTTTのチャンネルを眺めていたら、Pushoverという見かけないサービスを発見しました。

Pushover: Home

Pushover Notifications

Pushover Notifications

  • Pushover, LLC
  • ユーティリティ
  • 無料

これはBoxcarのようなPush Notificationサービスなんですが、Boxcarに比べ

  • デザインが良い(むしろBoxcarがひどい)
  • 遅延が少ない
  • APIが充実していて、通知が簡単

という利点があります。特にAPIなんですが、Applicationを登録するだけで誰でも簡単にiPhone/AndroidにPush Notificationが送れてしまう。

例えば、PushoverでiPhoneに通知するコードをPython(2.x)で書くとこんなに簡単

# -*- coding: utf-8 -*-
import urllib
ENDPOINT = r'https://api.pushover.net/1/messages.json'

data = urllib.urlencode({
    'token' : APPLICATION_KEY,
    'user' : USER_KEY,
    'title' : u'テスト'.encode('utf-8'),
    'message' : u'こんにちは!'.encode('utf-8'),
})
urllib.urlopen(ENDPOINT, data)

APIから登録してる端末の一部だけに送ったり、通知音を変えたりと、その辺もBoxcarより優秀。

IFTTTからも使えるし、プログラマはいろいろと使えそうですね。CIの結果をPush通知するとか・・・・・・。