覚えたら書く

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

Yarnを使ってみる

最近になって今更感かなりありますが、electronNode.js を触り始めました。
パッケージを環境に導入するには、npmコマンドを利用するのが当然だと思ってたんですが、
Yarnというツールも存在している様ですね。いやー、この界隈全然詳しくないです。

Yarnの方が高速だとかという話もあるので、Yarn使っていこうかと思います。


インストール

Macへのイントールならhomebrew使えば簡単ですね。以下実行!

brew install yarn


実行結果は以下の通りです。

$ brew install yarn
Updating Homebrew...
==> Auto-updated Homebrew!
Updated 2 taps (ethereum/ethereum and homebrew/core).
==> New Formulae
azure-storage-cpp   gitmoji             i386-elf-gcc        mesa                ruby@2.4            um
fluxctl             healpix             kubespy             node@10             shellz
fx                  i386-elf-binutils   maven@3.5           resin-cli           sourcedocs
==> Updated Formulae

・・・(中略)・・・

==> Renamed Formulae
mat -> mat2
==> Deleted Formulae
corebird    heroku      kibana@4.4  maven@3.0   maven@3.1   nethack4    pxz         ruby@2.2    taylor      tcptrack

==> Installing dependencies for yarn: icu4c and node
==> Installing yarn dependency: icu4c
==> Downloading https://homebrew.bintray.com/bottles/icu4c-62.1.sierra.bottle.tar.gz
######################################################################## 100.0%
==> Pouring icu4c-62.1.sierra.bottle.tar.gz
==> Caveats
icu4c is keg-only, which means it was not symlinked into /usr/local,
because macOS provides libicucore.dylib (but nothing else).

If you need to have icu4c first in your PATH run:
  echo 'export PATH="/usr/local/opt/icu4c/bin:$PATH"' >> ~/.bash_profile
  echo 'export PATH="/usr/local/opt/icu4c/sbin:$PATH"' >> ~/.bash_profile

For compilers to find icu4c you may need to set:
  export LDFLAGS="-L/usr/local/opt/icu4c/lib"
  export CPPFLAGS="-I/usr/local/opt/icu4c/include"

==> Summary
🍺  /usr/local/Cellar/icu4c/62.1: 250 files, 67.3MB
==> Installing yarn dependency: node
==> Downloading https://homebrew.bintray.com/bottles/node-11.2.0.sierra.bottle.tar.gz
######################################################################## 100.0%
==> Pouring node-11.2.0.sierra.bottle.tar.gz
==> Caveats
Bash completion has been installed to:
  /usr/local/etc/bash_completion.d
==> Summary
🍺  /usr/local/Cellar/node/11.2.0: 3,936 files, 50.1MB
==> Installing yarn
==> Downloading https://yarnpkg.com/downloads/1.12.3/yarn-v1.12.3.tar.gz
==> Downloading from https://github-production-release-asset-2e65be.s3.amazonaws.com/49970642/a4875000-e25c-11e8-88b4-45
######################################################################## 100.0%
🍺  /usr/local/Cellar/yarn/1.12.3: 14 files, 4.7MB, built in 9 seconds
==> Caveats
==> icu4c
icu4c is keg-only, which means it was not symlinked into /usr/local,
because macOS provides libicucore.dylib (but nothing else).

If you need to have icu4c first in your PATH run:
  echo 'export PATH="/usr/local/opt/icu4c/bin:$PATH"' >> ~/.bash_profile
  echo 'export PATH="/usr/local/opt/icu4c/sbin:$PATH"' >> ~/.bash_profile

For compilers to find icu4c you may need to set:
  export LDFLAGS="-L/usr/local/opt/icu4c/lib"
  export CPPFLAGS="-I/usr/local/opt/icu4c/include"

==> node
Bash completion has been installed to:
  /usr/local/etc/bash_completion.d


Windowsの場合は、Windows用のインストーラをダウンロードして実行してください。


インストール後は、一応バージョン確認を実施

$ yarn -v
1.12.3


Yarnの操作

Yarnnpmで実行できる操作は、基本的にできるようです。


例えばプロジェクトの初期化をするなら

yarn init

詳細情報の入力を省略するなら以下です

yarn init -y

これでpackage.json.jsonが作成されます。

$ cat package.json 
{
  "name": "develop",
  "version": "1.0.0",
  "main": "index.js",
  "license": "MIT"
}


開発環境に必要なパッケージをローカルインストールする(devDependenciesに追加したい時)には以下を実行します

yarn add [package] --dev

electronを対象にするなら以下の通りです

$ yarn add electron --dev
yarn add v1.12.3
info No lockfile found.
[1/4] 🔍  Resolving packages...
warning electron > electron-download > nugget > progress-stream > through2 > xtend > object-keys@0.4.0: 
[2/4] 🚚  Fetching packages...
[3/4] 🔗  Linking dependencies...
[4/4] 📃  Building fresh packages...
success Saved lockfile.
success Saved 124 new dependencies.
info Direct dependencies
└─ electron@3.0.10
info All dependencies
├─ @types/node@8.10.38
├─ ajv@6.5.5
├─ ansi-regex@2.1.1
├─ array-find-index@1.0.2
├─ asn1@0.2.4
├─ asynckit@0.4.0

・・・(中略)・・・

├─ xtend@2.1.2
└─ yauzl@2.4.1
✨  Done in 54.26s.


実行環境に必要なパッケージをローカルインストールする(dependenciesに追加したい時)には以下を実行します

yarn add [package]

electron-logを対象にするなら以下の通りです

$ yarn add electron-log
yarn add v1.12.3
[1/4] 🔍  Resolving packages...
[2/4] 🚚  Fetching packages...
[3/4] 🔗  Linking dependencies...
[4/4] 📃  Building fresh packages...
success Saved lockfile.
success Saved 1 new dependency.
info Direct dependencies
└─ electron-log@2.2.17
info All dependencies
└─ electron-log@2.2.17
✨  Done in 0.74s.


これらを実行した後のpackage.jsonは以下の様になっています。

{
  "name": "develop",
  "version": "1.0.0",
  "main": "index.js",
  "license": "MIT",
  "devDependencies": {
    "electron": "^3.0.10"
  },
  "dependencies": {
    "electron-log": "^2.2.17"
  }
}

ディレクトリ構成は以下の通りです。

ls -l
total 88
drwxr-xr-x  138 yuki  staff   4692 11 23 21:19 node_modules
-rw-r--r--    1 yuki  staff    197 11 23 21:19 package.json
-rw-r--r--    1 yuki  staff  37898 11 23 21:19 yarn.lock


まとめ

だいぶ単純な操作しかしてませんが、yarnnpm の代わり(+それ以上の操作)ができる様です。
これからはYarnを利用していこうと思います。

「ドラゴンクエスト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) のインストールは完了です