『WEB+DB PRESS Vol.94』を読んだ

WEB+DB PRESS Vol.94 を読んだので、感想をメモしておく。

特集1 実践スケーラブル AWS

仮想マシンやロードバランサを使った VPC 構成のサービスを作ることになりそうなので、 サービスをスケールさせる際に何を監視して判断基準にすればいいか勉強になった。

というか、Microsoft Azure でこういった特集は無いのかな?

特集2 はじめての Kotlin

Kotlin を最初見たとき Swift っぽいなという印象だった。 本書を読んで、その印象はさほど変わっていない。 まぁ、ところどころ Swift とは違う点があって、Swift の方が良いなと思うことはあった。 fun よりは func だな。あとプロパティの getter と setter を書くところも、好みと違う。

Kotlin は公式の開発言語じゃないので、Android アプリ開発は Java でいいかなと思っていた。 Java8 の機能も一部使えるようになったみたいだし。 ところが Kotlin 1.1 で async/await が導入されると知って、Kotlin に気持ちが傾いてきた。 非同期は Rx より async/await で書きたいからね。

特集3 作って学ぶ Electron

Electron の用途は Web サービスのクライアント開発が多そう。 本特集で作った Twitter クライアントと同じような進め方で、 他のサービスのクライアントも作れそうだ。

Web テクノロジでネイティブアプリを作るためのプロダクトは群雄割拠。 その中でも Electron がウケた理由は、 モバイルに比べてリソースが豊富なデスクトップアプリケーションが対象だったから、 というのはある気がする。

継続は力なり【第2回】プロダクトアンチパターン

「それ設定で」ていうのは悲しいことに結構遭遇する。 動きが変わるとマズイ(それが改善であっても)ので、 デフォルトは既存のままにしておいて、 設定で有効にするってね。 その結果、ソースコードがどんどんスパゲッティになっていく。 結局は信念という精神論になっちゃうんで、なかなか無くならないんだろうな。

「進化」を先取る現場から【第2回】ソニックガーデン倉貫義人

「一人前」の人の下に「見習い」の人をつけるのではなく、 「見習い」の人たちは「見習い」どうしで切磋琢磨させる、 というのがプロスポーツ的で面白かった。 ただ、顧問エンジニア的なビジネスをやっているソニックガーデンだからこそ可能、 という印象は拭えないな。 人月ビジネスにぜひ風穴を空け続けていただきたい。 いいぞもっとやれ。

大規模インフラ運用最前線【第3回】データベースのバックアップとリストア

RDS や Azure SQL Database といった、マネージドサービスで済ませることができればいいんだけど。 ハイスペックの仮想マシンSQL ServerPostgreSQL を動かすことも今後ありそうなんだよなぁ。 そのときはメルカリみたいに、バックアップ専用のスレーブを立てて、 オンラインバックアップを取る構成を採用することになるだろうな。 使うデータベース製品は違えど、方針は参考にできそう。

Emerging Web Technology 研究室【第20回】OSS によるデータ分析基盤の構築

Re:dash 良さげ。 最近、自分もデータ分析基盤を構築したけど、 そのときは Elasticsearch と Kibana を使った。 知っていれば Re:dash 試したのにな。 開発者向けの基盤だったので、Elasticsearch のクエリよりは、SQL の方が使いこなしてもらえそう。 Windows 限定だったので、SQL Server + Reporting Service(または Excel) でも良かっただろうな。

Rubyの現場の最新技術【第2回】Puma を使ってみよう!

Rails 最近使っていないから、RubyRails の情報は本連載頼み。 Puma は Heroku にデプロイするために使ったことがある。 素直に実装した Rails アプリケーションだったので、 Unicorn から Puma へ移行しても特にトラブルは無かったと記憶している。 そうか、Rails 5 からはデフォルトのサーバーになったのか。 まずライブラリ開発者が嵌ることが多そうだ。

WEB+DB PRESS Vol.94

WEB+DB PRESS Vol.94

パティスリー リンク

地下鉄七隈線野芥駅近くにある『パティスリー リンク』に行ってみた。 この店は福岡の情報番組で紹介された『土鍋プリン』が話題みたいなんだけど、 プリンよりもケーキでしょ。 ってわけでお店の名前がついた『リンク』と『苺ショートケーキ』を買って帰った。

『苺ショートケーキ』は生クリームが非常にあっさりしていた。 1ホールいけそうなくらいに。 これほどのあっさり生クリームは経験無いかもしれない。 ただ、苺がちょっと酸っぱかったかな。

『リンク』はビターで大人向けの味かもしれない。 生地に間の生クリームはこちらも非常にあっさりしていて、 ビターな生地がいっそう引き立っていた。

デパートに出店していてもおかしくない味とお値段だった。 土鍋プリンがショーケースの場所を取っていて、ケーキの種類が少なかったのが玉に瑕かな。

関連ランキング:ケーキ | 野芥駅梅林駅賀茂駅

Browserify から Webpack に移行した

ES2015 + React の開発環境を Browserify で構築していたけど、 近いうち CSS もバンドルすることになりそうなので、 Webpack に移行することにした。

ブログに手順をメモしておく。 新規にプロジェクトを作成するときも同じ手順でいけるはず。

npm で必要なパッケージをインストール。

# 実際は 1 行
$ npm install --save-dev webpack \
  webpack-dev-server \
  babel-core \
  babel-loader \
  babel-preset-es2015 \
  babel-preset-react \
  file-loader

Webpack の設定ファイル webpack.config.js はこんな感じで書いてみた。

module.exports = {
  entry: {
    javascript: __dirname + "/src/index.jsx",
    html: __dirname + "/src/index.html"
  },

  output: {
    path: __dirname + "/dist",
    filename: "bundle.js"
  },

  module: {
    loaders: [
      {
        test: /\.js[x]?$/,
        exclude: /node_modules/,
        loader: "babel",
        query: {
          presets: ["react", "es2015", "stage-1"]
        }
      },
      {
        test: /\.html$/,
        loader: "file?name=[name].[ext]"
      }
    ]
  },

  devtool: "source-map",

  resolve: {
    extensions: ["", ".js", ".jsx"]
  }
};

あわせて package.jsonscripts も修正しておく。

{
  "scripts": {
    "start": "webpack-dev-server",
    "build": "webpack"
  }
}

これで npm run build でビルドが、`npm start' で開発サーバーが起動できるようになった。 webpack-dev-server 便利。

Elasticsearch でバルクインサート

Elasticsearch の Python クライアントを使って、 CloudWatch からダウンロードしたメトリクスの データポイントを 1 件ずつ登録していたけど、さすがに遅い。 遅すぎる。

我慢して使えるレベルではなかったので、 Elasticsearch のバルクインサートを使って高速化を試みた。

# -*- coding: utf-8 -*-
import os
import sys
import json
from elasticsearch import Elasticsearch, helpers

ELASTICSEARCH_URL = "localhost:9200"
METRICS_ROOT_DIR = "/var/log/perform/my-app-name"
INSTANCES = [
    "rds",
]
METRICS = [
    "CPUUtilization",
    "DatabaseConnections",
    "DiskQueueDepth",
    "FreeableMemory",
    "FreeStorageSpace",
    "ReadIOPS",
    "WriteIOPS",
    "ReadLatency",
    "WriteLatency",
    "NetworkReceiveThroughput",
    "NetworkTransmitThroughput",
]


es = Elasticsearch(ELASTICSEARCH_URL)


def post_instance_metrics(dir_path, instance):
    for metric in METRICS:
        file_path = os.path.join(dir_path, metric + ".json")
        with open(file_path) as f:
            data = json.load(f)

            # バルクインサートするデータを作成
            actions = []
            for datapoint in data["Datapoints"]:
                actions.append({
                  "_index": instance,
                  "_type": metric,
                  "_id": datapoint["Timestamp"],
                  "_source": datapoint
                })

            # バルクインサート!!!!!
            helpers.bulk(es, actions)


for instance in INSTANCES:
    metrics_dir = os.path.join(METRICS_ROOT_DIR, instance)
    post_instance_metrics(metrics_dir, instance)

バルクインサートに変えることで、 30 分くらいかかっていたのが 1 分くらいに短縮した。 30 倍速い。 赤い彗星もビックリだ。

ASP.NET Core アプリケーションの Docker コンテナを Heroku で動かしてみた

はじめに

ASP.NET Core アプリケーションを Docker で動かすことができた。

tnakamura.hatenablog.com

そういえば、Heroku で任意の Docker コンテナを動かすことができるようになっていたな。 まだベータ版な上、制限もあるみたいだけど。

もしかしたら ASP.NET Core アプリケーションの Docker イメージを Heroku にデプロイして動かせるかも? やってみた。

いきなり結論

結論として Empty Web Application は動かすことができた。 Hello World を HTTP レスポンスのボディに書き込むだけのやつ。 ASP.NET Core MVC は動かせなかった。

なので、以下では Empty Web Application を動かした手順を書いていく。

Docker をインストール

Docker は正式版になったばかりの Docker for Mac を使う。

docs.docker.com

Empty Web Application を作成

yo でプロジェクトを新規作成する。

$ yo aspnet

     _-----_     ╭──────────────────────────╮
    |       |    │      Welcome to the      │
    |--(o)--|    │  marvellous ASP.NET Core │
   `---------´   │        generator!        │
    ( _´U`_ )    ╰──────────────────────────╯
    /___A___\   /
     |  ~  |
   __'.___.'__
 ´   `  |° ´ Y `

? What type of application do you want to create? Empty Web Application
? What's the name of your ASP.NET application? HelloAspNetCore
   create HelloAspNetCore/.gitignore
   create HelloAspNetCore/Program.cs
   create HelloAspNetCore/Startup.cs
   create HelloAspNetCore/project.json
   create HelloAspNetCore/web.config
   create HelloAspNetCore/Dockerfile
   create HelloAspNetCore/Properties/launchSettings.json
   create HelloAspNetCore/README.md


Your project is now created, you can use the following commands to get going
    cd "HelloAspNetCore"
    dotnet restore
    dotnet build (optional, build will also happen when it's run)
    dotnet run

生成された Dockerfile を修正

Heroku の Docker 対応はまだ制限があって、Dockerfile には CMD が必須。 また、ポートは Heroku が割り当てるやつを使わないといけない。

yo で生成したプロジェクトの Dockerfile を次のように修正した。

FROM microsoft/dotnet:latest

COPY . /app

WORKDIR /app

RUN dotnet restore

RUN dotnet build

#EXPOSE 5000/tcp

CMD dotnet run --server.urls http://0.0.0.0:$PORT

Heroku プラグインをインストール

heroku toolbelt をインストールしていなければ、インストールしておく。

toolbelt.heroku.com

heroku-container-registry プラグインを使う。

$ heroku plugins:install heroku-container-registry

Heroku にデプロイ

<app_name> には Heroku 上で作成したアプリケーション名を指定する。 自分はテスト用に作ったアプリケーションを使いまわすことが多いのもので。

$ heroku container:login
$ heroku container:push web --app <app_name>

を実行すると、Dockerfile をもとに Docker イメージが作成され、 それが Heroku の Docker レジストリにプッシュされているように見える。

$ heroku open --app <app_name>

でブラウザを起動すると、Hello world が表示された。

f:id:griefworker:20160824001313p:plain

ちなみに ASP.NET Core MVC

yo で ASP.NET Core MVC のプロジェクトを生成して、 同じように Dockerfile を修正してデプロイしてみたが、 アプリケーションの起動に失敗していた。

heroku logs でログを見たところ、NuGet パッケージのリストアで失敗していた模様。 パッケージを resolve できてないみたいだった。

Empty Web Application から1つずつパッケージを増やしていって、 どのパッケージが原因か特定しようとしたけど、 さすがに数が多くて時間切れ。

そもそも、なんでリストアが実行されたんだろう? NuGet パッケージダウンロード済みの Docker イメージをデプロイしたんじゃないのか? Docker の勉強が足りてないんで、自分のやり方が悪かった可能性も十分ある。

時間が空いたときに再挑戦、するかもしれない。

エルボラーチョ

大名にあるメキシコ料理店『エルボラーチョ』は、 夜のみの営業な上に、小さい子供連れで行くようなところじゃない。 行きたい店だったけど当分縁が無さそうだなと思っていたら、 PARCO 新館にも出店してるじゃありませんか。 こちらはランチもやっていたので、会社の昼休みに行ってみた。

なにぶんメキシコ料理初めてなもので、何を食べるべきなのか皆目見当が付かなかった。 ここは無難に一番人気の『鶏モモ肉のメキシカンソテー』を注文。

鶏肉は表面がパリッと焼いてあって香ばしかった。 そのまま食べても美味いし、サルサソースをつけてトルティーヤで巻いて食べても美味い。 トルティーヤって意外と厚みあるんだな。もっとペラペラなのかと思っていた。 サルサソースは程よいスパイシーさ。

これにサラダとスープも付いていた。予想以上のボリュームでお腹はもうパンパン。 メキシコ料理初めて食べたけど、結構口に合うもんだね。

関連ランキング:バル・バール | 天神駅西鉄福岡駅(天神)天神南駅

きわみやごはん

行きたい店のストックがだいぶ無くなってきたので、 ジュンク堂でグルメ本をパラパラめくっていたら、 たまたま目に入った『きわみやごはん』の『和牛肉とろ飯』の写真に心奪われてしまった。

『きわみやごはん』は PARCO 新館にある、『極みや』の系列店。 夜なら並ぶことは無さそうだし、昼と夜で値段変わらないみたいなので行ってみた。 お目当てはもちろん『和牛肉とろ飯』。

肉は生ではなくて、低温調理されたローストビーフらしい。 つまりローストビーフ丼みたいなものか。 ご飯の上に肉を敷いて、中央に卵を載せたら完成。

肉とろは、まさにトロのような口溶け。 マグロのトロは何度か食べたことあるけど、まさしくあんな感じ。 肉とろだけ食べても美味いし、ご飯と一緒に頬張っても美味い。 そして卵の黄身を潰してまぜたら、濃厚な卵かけご飯の完成。 これまた絶品だった。 卵の主張が結構強いので、黄身を潰す前に十分肉とろを味わっておいたほうがいい。

関連ランキング:和食(その他) | 天神駅西鉄福岡駅(天神)天神南駅