Rhythm & Biology

Engineering, Science, et al.

gulp-sass-variablesで環境ごとの変数の値を変える

環境によってCSSの中身を切り替えたいということがある。
たとえば、background画像のURLを、開発環境ではローカル、本番環境ではCDNのものにするといった場合である。

gulp-sassを使っている場合は、gulp-sass-variablesを利用するとこれが実現できる。

www.npmjs.com

まず関連パッケージのインストー

$ npm install gulp gulp-sass gulp-sass-variables yargs --save-dev

次にgulpfile.jsを用意。
sassVariablesの部分が今回の重要ポイント。

var gulp = require('gulp'),
    sass = require('gulp-sass')
    sassVariables = require('gulp-sass-variables'),
    argv = require('yargs').argv;

var env = argv.production ? 'production' : 'development';

gulp.task('css', function() {
  gulp.src('src/*.scss')
    .pipe(sassVariables({ $env: env }))
    .pipe(sass())
    .pipe(gulp.dest('dist/'));
});

小さなscssファイルを書いてみる。

$env: 'development' !default;

$color: 'blue' !default;

@if $env == 'production' {
  $color: 'red';
}

h1 {
  background: $color;
}

cssコンパイルして中身を確認する。
blueとredで値が変化していることが分かる。

$ gulp css
$ cat dist/main.css
h1 {
  background: "blue"; }

$ gulp css --production
$ cat dist/main.css
h1 {
  background: "red"; }

変数定義のためのscssファイルを一つ用意して、それを各scssファイルにimportさせるようにすれば便利そう。

DNAストレージの容量

digital universe(地球上で生成されるデータ全体)は、2017年に16ゼタバイトと予測されている。
一方で、保存可能なキャパシティはすでに生成されるデータに間に合わなくなっている。

http://www.idc.com/downloads/where_is_storage_infographic_243338.pdf

このような背景により、廉価に大容量を保存可能なコールドストレージ(磁気テープとか)が注目されているが、その1技術として研究が進んでいるのがDNAストレージである。

www.technologyreview.jp

newswitch.jp

出回ってる記事の中には「1gあたり1ゼタバイト保存可能」と書かれているものがあるが、どういう計算でこの数字が出てくるか。

1塩基の平均質量は325Da。これをg(グラム)にすると以下の通り。

 { \displaystyle
325 \times (1.66054 \times 10^{-24}) = 5.396755 \times 10^{-22}
}

塩基は4種類(A,T,G,C)あり、2bit/塩基(= 0.25byte/塩基)と考える(あとで書くがこの考えは誤り)。

1gあたりのデータ量を計算すると、約0.46ZBとなる。「1gあたり1ゼタバイト保存可能」は言い過ぎと分かる。

 { \displaystyle
1.0 \div (5.396755 \times 10^{-22}) \times 0.25 \approx 0.4632 \times 10^{21}
}

で、実はこの計算は誤りで、「塩基対」という形で存在するため実際は2bit/塩基"対"。要するに、この半分のデータ量となる。

さらに、実際のDNAは複製時にエラーが発生したりするため、誤り訂正符号を含めたり冗長化して保存したりする。 したがって、実際の情報密度はさらに低くなる。

今年3月にScienceに出たコロンビア大学とニューヨーク・ゲノム・センターによる論文では、DNA Fountainという新しい手法で高密度化を達成したとされるが、この手法で実現可能な情報密度は1gあたり215PBとされている。

DNA Fountain enables a robust and efficient storage architecture | Science

理論値との乖離はまだまだ大きいが、今後が楽しみな技術なので追っていきたいと思う。

loader.ioを試す

loader.ioはWebサイトの負荷テストをしてくれるサービス。
制限つきだが、無料で使えるので試してみる。

f:id:aka_mythosil:20170714225541p:plain:w200

https://loader.io/pricing

ユーザ登録してログインすると、まずこのような画面になっている。

f:id:aka_mythosil:20170715022212p:plain:w400

New Hostで先に進むと次はこのような画面。ここにテスト対象のホスト名を入力する。
今回はこれ用に立ち上げたEC2インスタンスのPublicIPを指定。

f:id:aka_mythosil:20170715022306p:plain:w400

すると今度は「そのホストが本当にあなたのものか確認させてくれ」とくる。
やることは単純で、loader.ioがアクセス可能な場所に指定のファイルを置くこと。
指定された通りのファイル名で、ファイルの内容も指定の通りにして配置しておく。

f:id:aka_mythosil:20170715022426p:plain:w400

確認がとれるとこのような画面になる。

f:id:aka_mythosil:20170715022633p:plain:w400

テスト内容の設定をする。
今回は19秒で100リクエストとした。アクセス先はルート。

f:id:aka_mythosil:20170715023019p:plain:w400

この状態で実行すると、すぐ停止してしまった。
理由は単純で、用意したばかりのサーバだったためindex.htmlさえ置いていなかったから。エラー率が閾値を超えて停止した。

f:id:aka_mythosil:20170715023306p:plain:w400

index.htmlをちゃんと配置して改めて実行すると最後まで実行完了。

f:id:aka_mythosil:20170715023401p:plain:w400

所感としては、やっぱり圧倒的に楽。 とはいえ、無料プランでできる範囲が小さいので、それだったら適当なサーバ1台にjmeterなどのツールを入れてやるほうがいいとも言える。