yarn global addしても自動でパス通してくれないっぽいバグがあるようで

$ yarn global add create-react-app
$ create-react-app
zsh: command not found: create-react-app

ってなったので~/.zshrcに以下を追加しました。

export PATH="$PATH:`yarn global bin`"

もう一回やってみるといけます。

$ create-react-app
Usage: create-react-app <project-directory> [--verbose]

yarn globalには結構バグがあるっぽいので早く安定してほしいですね。

  • eval: それぞれのモジュールはevalとして実行され//@ sourceURLが付けられます
  • source-map: SourceMapを完全に別ファイルとして生成します。output.sourceMapFilenameで設定が可能です
  • hidden-source-map: source-mapと同様SourceMapを別ファイルとして生成しますがバンドルに参照コメントを含みません
  • inline-source-map: SourceMapはDataUrlとしてバンドルされます
  • eval-source-map: それぞれのモジュールはevalとして実行され、SourceMapはDataUrlとしてevalに追加されます
  • cheap-source-map: SourceMapは列を無視して生成されます。loaderで読み込まれたSourceMapは無視されます。
  • cheap-module-source-map: SourceMapは列を無視して生成されます。ロードされたソースマップを1行に1つのマッピングに単純化されます。
devtool build rebuild production quality
eval +++ +++ no generated code
cheap-eval-source-map + ++ no transformed code (lines only)
cheap-source-map + o yes transformed code (lines only)
cheap-module-eval-source-map o ++ no original source (lines only)
cheap-module-source-map o - yes original source (lines only)
eval-source-map + no original source
source-map yes original source

他にもこれらを組み合わせて設定することができるようです。

最近GoをAPI Gateway(Aggregator)としている環境で開発を行なっているのですが、呼び出し先のServiceの実装が終わっていなくてもClientでとりあえずJSONのresponseが欲しいという状況がありました。

JSONのUnmarshalについてはgolangはゆるふわにJSONを扱えまぁす!という記事が有ったのですが、ゆるふわMarshalについては情報がありませんでした。

ですが考えてみればjson.Marshal()すると[]byte型になるのでそれを初めから作ってあげればよかったです。
まあもちろんこれではGoの良いところを捨てているようなものですが、開発中のとりあえずのレスポンスには手軽で良いと思いました。

package main
import (
"fmt"
"net/http"
)
func jsonResponse(rw http.ResponseWriter, req *http.Request) {
response := []byte(`
{
"status": "success",
"user":
{
"id": "2d7b8fe1-1e63-4c3b-83b9-46274554e822",
"name": "t-hiroyoshi",
"birthday": "1993-09-06T11:22:33.496Z"
}
}
`)
defer func() {
rw.Header().Set("Content-Type", "application/json")
fmt.Fprint(rw, string(response))
}()
}
func main() {
http.HandleFunc("/json", jsonResponse)
http.ListenAndServe(":8080", nil)
}

Yarnとは

Yarnとはつい先日公開された、Facebook, Exponent, Google, Tildeによって開発されたオープンソースの新しいJavaScriptパッケージマネージャです。

現在JavaScriptのパッケージマネージャとしてすでにnpmが存在していますが、Facebookほどの規模感になるとパフォーマンスやセキュリティに影響が出てきたので一から新しくYarnを作ったようです。
新しいといってもnpmと互換性を持つpackage.jsonでパッケージ管理を行い、npm registry上のパッケージをインストールするので使う側としては早くて固いnpmぐらいに思った方が良いかもしれないです。

中の人をみてみるとBabelLernaを作ったSebastianさんがコアっぽくてこの人やっぱりすごいなって思いました。

特徴をざっくりまとめるとこんな感じです

  • Ultra Fast: ダウンロードされたパッケージは全てローカルにキャッシュされて並列インストールされる
  • Mega Secure: インストールされたパッケージは実行される前にチェックサムされる
  • Super Reliable: lockfileを使っていて他のシステムでも全く同じものがインストールされることが保証されている
  • More emojis: 🐈

試す

本当はcreate-react-appを動かしたかったのですがまだ対応していなかったのでreact-tutorialでやります。

何はともあれYarn本体をインストールします。
macOSやunixは以下のスクリプトでインストールできます。

curl -o- -L https://yarnpkg.com/install.sh | bash

もしくはnpmを置き換えるものをnpmで入れるのは気持ち悪いですがnpmでも簡単に入れることができます。
yarnは現在バグがあるので今の所はyarnpkgの方を推奨します

npm install --global yarnpkg
# or
npm install --global yarn

react-tutorialをcloneしてきてdependenciesをインストールします。

git clone git@github.com:reactjs/react-tutorial.git
cd react-tutorial
yarn install
# or just "yarn"

この時点で感じたかもしれませんがめっちゃインストール早いです。
軽く計測してみたところnpmだと2.07s、Yarnだと0.66sと3倍ぐらいYarnの方が早かったです。

さらにyarn.lockが生成されてバージョンが固定されていることが確認できます。

npm-scriptsと同じ機能がYarnにもあってyarn run <script>で実行できます。
これを使ってreact-tutorialを起動してみます。

yarn run start
# or
yarn start

ブラウザでhttp://localhost:3000/を開くときちんと動いていることが確認できると思います。

まとめ

npmよりかなり高速化していることが分かりました、CLIのコマンドもnpmよりシンプルで好きなのでこれから積極的に使いたいです。JavaScript界のOSS開発速度はものすごいのでオープンになったこれから加速度的に色々改善されていくと思います。
現在npm上のyarnが現在バグっていることなどからまだ若干時期尚早かなという気がしますがいざという時はnpm使えば良いのでありかなというのが個人的な感想です。
Babel6の時みたいな大きな変更が入って苦しむことが起きないように願います。

こんにちは、t-hiroyoshiです。

先日Akka 2.4.9-RC1がリリースされました。
今回のリリースはAkka HTTPのパフォーマンス改善に焦点を絞ったアップデートでAkka HTTPのパフォーマンスがSprayと同等かそれ以上になったと書かれています。

Akka HTTP revenge

以前Akka HTTPとSpray-canのベンチマークを取った時はSprayに軍配が上がりましたが、今回のアップデートはどれほどのものなのか軽く調べるために再度Akka HTTPのみベンチマークを取りました(Sprayはもう更新されていません)。

コードやベンチマーク環境は前回と同じ状態でAkkaのバージョンのみ上げています。

Result

This is ApacheBench, Version 2.3 <$Revision: 1706008 $>
Server Software: akka-http/2.4.9-RC1
Server Hostname: localhost
Server Port: 8080
Document Path: /
Document Length: 12 bytes
Concurrency Level: 10
Time taken for tests: 0.336 seconds
Complete requests: 10000
Failed requests: 0
Keep-Alive requests: 10000
Total transferred: 1820000 bytes
HTML transferred: 120000 bytes
Requests per second: 29805.82 [#/sec] (mean)
Time per request: 0.336 [ms] (mean)
Time per request: 0.034 [ms] (mean, across all concurrent requests)
Transfer rate: 5297.52 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.0 0 0
Processing: 0 0 0.4 0 17
Waiting: 0 0 0.4 0 17
Total: 0 0 0.4 0 17
Percentage of the requests served within a certain time (ms)
50% 0
66% 0
75% 0
80% 0
90% 0
95% 1
98% 1
99% 2
100% 17 (longest request)

前回のベンチマークではSpray-canが23230.85 req/secでSpray-canの方がパフォーマンスが良かったですが、今回Akka HTTPは29805.82 req/secというSpray-canを越す数値を叩き出しました。
前回のベンチマークから4ヶ月ぐらいしか経っていないのにこんなに速くなるとは驚きです。

Next steps for Akka HTTP

今後のAkka HTTPのことについては、Sprayの終末とAkka HTTPへの置き換えを推奨していて近いうちにexperimentalが外れるようです。
HTTP/2についても今後やっていくようでここから追えます。
期待しながら待ちたいと思います。