覚えたら書く

IT関係のデベロッパとして日々覚えたことを書き残したいです。twitter: @yyoshikaw

「ドラゴンクエストXを支える技術」

読書の秋なので、ということではないですが「ドラゴンクエストXを支える技術」を読んでみました。

ドラゴンクエストXを支える技術 ── 大規模オンラインRPGの舞台裏 (WEB+DB PRESSプラスシリーズ)

ドラゴンクエストXを支える技術 ── 大規模オンラインRPGの舞台裏 (WEB+DB PRESSプラスシリーズ)


これ、たぶん読む人によっては面白くないと感じる人も少なくないかもしれないです。

私にとっては十分に面白かったです。


この本に書かれている内容は色んな点で結構広く浅くという感じではあるので、
例えば、ゲームエンジンそのものを深く知りたいという人なんかは以下の本とか読んだ方がいいと思います。

ゲームエンジン・アーキテクチャ 第2版

ゲームエンジン・アーキテクチャ 第2版


先にも書きましたが、「ドラゴンクエストXを支える技術」の内容は広く浅くなので具体的な各技術の話を極端に深く掘り下げたりはしてないです。

Arxanで難読化したり、監視の一部にZabbix を使ってたりとか、技術ワードは出てきますが、それについて深く知りたい人向けではないです。

ドラゴンクエストXといえばOracle Exadataを使っていることで有名ですが、 Oracle Exadataについての深い知見をこの本から得ることもできません。


それでも私が面白いと感じたのは、
売り切り型のこれまでのゲームとは違う、継続的な改善や開発が必要となるオンラインゲーム(サービス)を運営・運用する部分の苦労を語ってくれている点です。
自社サービスをサービスインさせるまで、そして運用開始してから、どういうことが起こるのかを、
失敗談や運用フローの地味とも思える点まで含めて書いてくれていて、私自身は参考になりました。
(ドラクエXという巨大なオンラインゲームサービスに対してこういうった内容を知る機会は普通はなかなか無いと思います)

成功話は、コンテキストに応じて応用が効かないケースが少なくない気がしますが、
失敗談からは学べることが多くあると思います。そういう意味で、この本には価値があると思います。

ドラクエXは、他の企業向けサービスよりも遥かに真摯な態度でお客様に対して運営・運用をされているように感じられました。
(サービスは運用を開始してからがスタートという感覚を改めて思い起こさせてくれた気がします。)

自社サービスを開発、運用されている(エンジニアの)方なら読んでみていいんじゃないかと思います。


それにしても、ドラゴンクエストXは1日で発生するサーバログが100億行って、びっくりでした。


関連エントリ

Node.js で Hello, World

Node.js をインストールしましたので、とりあえずは Hello World やっておきましょう。


REPLでHello World

Node.js は REPL を備えていますので、REPL使ってとりあえずやってみます。

ターミナルで node を実行すると Node.js の REPLが起動します

$ node
> 


REPLで以下を実行してます

> console.log('Hello, World')
Hello, World
undefined

無事に、Hello World できました。


これだけだと寂しいでの ホスト名も出力してみました

> os.hostname()
'yukinoMBP'


REPLを終了させるには Control + C を2回実行するか、 .exit と入力します

> .exit
$ 


プログラム書いてHello World

hello.js というファイルを用意して以下を記述して保存します。

console.log('Hello, World')

var os = require('os')
console.log(os.hostname())


ターミナルで以下を実行します

$ node hello.js 

実行結果

$ node hello.js 
Hello, World
yukinoMBP


Web サーバでHello World

次は簡易的なWebサーバ起動して、Hello World してみます。


hello-server.js というファイルを用意して以下を記述して保存します。

var http = require('http')
var os = require('os')

http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/plain'})
    const host = os.hostname()
    res.end(`Hello World ${host} \n`)
}).listen(8989)


ターミナルで以下を実行します

$ node hello-server.js 


Webブラウザで http:127.0.0.1:8989 にアクセスします

f:id:nini_y:20181114220019p:plain

”Hello, World yukinoMBP” と表示されていることがわかります。


まとめ

とりあえず、Hello, World やってみましたが、どれでやるにしても簡単にできますね。良いことです。



関連エントリ

macOS に入れてたNode.js(npm)をアップデートする

以前なにかの作業の時にnodebrewを使って、Node.jsをmacOS(npm)にインストールしました。

現在インストールしているものより、新しい安定板がリリースされているのでアップデートすることにします。

正直手探りでやってる感があるので、このやり方が正当なやり方なのかイマイチよくわかってません。


nodebrewをアップデートする

nodebrew でインストール済みの Node.js のバージョンのリストを確認し、現状のバージョンを確認してみました。


うちの環境では以下の感じでした

$ nodebrew ls
v10.6.0

current: v10.6.0


その後、nodebrew 自体を最新版にアップデートするコマンド nodebrew selfupdate を実行します

$ nodebrew selfupdate
Fetching nodebrew...
Updated successfully


Node.js(npm)の最新安定板のインストール

最新安定板をインストールするために nodebrew install stable を実行します

$ nodebrew install stable
Fetching: https://nodejs.org/dist/v10.13.0/node-v10.13.0-darwin-x64.tar.gz
######################################################################## 100.0%
Installed successfully


最新安定板(このタイミングでは、10.13.0)がインストールされていることを nodebrew ls で確認します

$ nodebrew ls
v10.6.0
v10.13.0

current: v10.6.0

ただし、このタイミングでは利用されているのは 10.6.0 です。


利用するバージョンの切り替え

nodebrew use stable を実行して最新安定板のバージョンを利用するようにします。

$ nodebrew use stable
use v10.13.0


その後に、node -vnpm -v の結果を確認します

$ node -v
v10.13.0
$ npm -v
6.4.1

最新安定板が利用されるようになっています。


というわけで無事にNode.jsのアップデートができました。



関連エントリ

Node.js (npm) をWindowsにインストールする

最終的に、Electron でのアプリ開発がしたいわけなんですが、
その開発環境構築のためにも何はさておき Node.js (npm) をインストール必要があるので、インストールしました。

正直誰でもできるレベルのものですが、念のために手順をメモしておきました。


(今回のタイミングでは、Node.js 10.13.0 (同梱 npm 6.4.1) をインストールすることになりました)


インストーラのダウンロード

Node.jsのサイト(以下URL)にアクセスします。

https://nodejs.org/ja/

アクセスしたページ内の LTS の方をクリックします

f:id:nini_y:20181111110617p:plain


クリックすると、インストーラのダウンロードが始まります。


インストール

インストーラのダウンロードが完了すると以下のようなファイルが存在しているのでダブルクリックします

f:id:nini_y:20181111110819p:plain


「Next」ボタンをクリックします

f:id:nini_y:20181111110835p:plain


承諾のチェックを入れて、「Next」ボタンをクリックします

f:id:nini_y:20181111110927p:plain


「Next」ボタンをクリックします

f:id:nini_y:20181111111008p:plain


「Next」ボタンをクリックします

f:id:nini_y:20181111111136p:plain


「Next」ボタンをクリックします

f:id:nini_y:20181111111145p:plain


「Install」ボタンをクリックします。これでインストール処理が開始されます。

f:id:nini_y:20181111111225p:plain


インストール処理が開始されるので、終わるのをしばし待ちます。

f:id:nini_y:20181111111250p:plain


「Finish」ボタンをクリックします。これでインストール完了です

f:id:nini_y:20181111111307p:plain


インストール後の確認

今回のインストール手順であれば、Node.jsもnpmもPathが通った状態になっています。

コマンドプロンプトを開いて以下を実行してバージョンを確認しています。


Node.jsのバージョン確認

node -v

npmのバージョン確認

npm -v


今回のタイミングでは node -v の結果が "v10.13.0"、 npm -v の結果が "6.4.1" となりました

f:id:nini_y:20181111111320p:plain


これで、Node.js (npm) のインストールは完了です

Go言語 - システム情報を取得する

Golangで、システム情報というかOSのuptime(稼働時間)が取得したかったんですが、
Go sigarを利用すると楽そうだったのでお世話になります。


とりあえず、ライブラリのダウンロードを行います

go get github.com/cloudfoundry/gosigar


uptimeとか取得してみる

そして早速サンプルコードですが、uptimeだけ取得しても寂しかったので、ロードベレージやメモリの使用率なども取得してみました。


■サンプルコード

package main

import (
    "fmt"

    "github.com/cloudfoundry/gosigar"
)

func main() {
    uptime := sigar.Uptime{}
    uptime.Get()

    // uptime
    fmt.Printf("Uptime: %s \n", uptime.Format())

    avg := sigar.LoadAverage{}
    avg.Get()

    // ロードアベレージ(1分、5分、15分)
    fmt.Printf("Load average: %.2f, %.2f, %.2f\n", avg.One, avg.Five, avg.Fifteen)

    mem := sigar.Mem{}
    mem.Get()

    // メモリ使用量
    fmt.Printf("Mem(MB): total=%d, used=%d, free=%d\n", formatMB(mem.Total), formatMB(mem.Used), formatMB(mem.Free))
}

func formatMB(val uint64) uint64 {
    return val / 1024 / 1014
}


■実行結果

Uptime: 46 days, 11:56
Load average: 1.52, 1.58, 1.82
Mem(MB): total=16545, used=9082, free=7463


まとめ

簡単にuptime等、一部のシステム情報を無事に取得することができました。



関連エントリ