2016年9月28日水曜日

Tomcatとクラウドサービスを組み合わせる場合のメモ

従来、ネットワークやミドルウェアで設定していた分野のクラウドサービスの充実に伴って、アプリサーバの構築方法も変わってきました。

AWSのapi-gateway+lambdaのような組み合わせでサーバレスにすることも可能です。

Tomcatなどもまだまだ現役ですので、今回は、Tomcatとクラウドサービスを組み合わせて作る場合のメモです。

方針

  • インフラ部分は、AWSなどクラウド基盤のサービスをできるだけ使う
  • 基本的に、サーバはアプリのみを使い、できるだけシンプルにする

tomcatの設定

Context

  • 基本、コンテキストパスは一個にする。
  • server.xmlで直指定。コンテキストxmlは、複数のコンテキストを複雑に使う場合。

    <Server ...>
    ...
      <Context path="/"
    docBase="/opt/tomcat/html/ROOT" />
      <Context path="/v1"
    docBase="/opt/tomcat/html/v1" />
    ...
    </Server>

web.xml

  • 上記のWEB-INFに直接設置
  • servlet-mappingでurlパターンとマッチさせる
  • 対応するHTTPメソッドを設定する

HTTPサーバとの連携

この辺りは、できるだけクラウドインフラで行う。

  • ロードバランサ
  • SSL
  • ディレクトリ単位のアクセス制限
  • IP制限

nginx

プロキシ設定

 server {
 ...
   location / {
     proxy_pass http://127.0.0.1:8080;
   }
 }

リバースプロキシを設定するには、SELinuxの設定変更が必要. nginx リバースプロキシ設定時の502 Bad Gatewayエラーを解消する方法

setsebool -P httpd_can_network_relay=1

他にも、ドキュメントルートの変更などSELinuxを変更する必要がある。

その他

この辺りは、httpサーバでしておいた方が安心です。

存在しないパス

  • 200で独自のエラーコードを持ったJSONを返す。
  • 404エラーを返す

Method Not Allowed

  • 許可メソッドを指定する。
  • 200で独自のエラーコードを持ったJSONを返す。
  • 405エラーを返す
  • nginxの444を使う。

死活監視

  • 死活監視用のページを表示させる.
  • example.com/check.html

Elixir/Phoenixを何度もインストールする時に

少し前にインストールした、Elixir/Phoenixを再利用しようとしたら、動かないところがあったので、記事にします。

対応としては、mixphoenixをリインストールします。ただし、以前構築したphoenixは動かなくなることがあります。

mix archive.install https://github.com/phoenixframework/archives/raw/master/phoenix_new.ez

以下は詳細です。

phoenix_ecto, phoenix_htmlのエラー

mixでプロジェクトを作成して、mix phoenix.serverしたところエラーが出ました。

mix phoenix.new prj --database mysql
cd prj
mix phoenix.server

依存性エラーが出ます。

== Compilation error on file lib/phoenix_ecto/html.ex ==
** (CompileError) lib/phoenix_ecto/html.ex:7: unknown key :model for struct Phoenix.HTML.Form
    (elixir) src/elixir_map.erl:185: :elixir_map."-assert_struct_keys/5-lc$^0/1-0-"/5
    (elixir) src/elixir_map.erl:62: :elixir_map.translate_struct/4

could not compile dependency :phoenix_ecto, "mix compile" failed. You can recompile this dependency with "mix deps.compile phoenix_ecto", update it with "mix deps.update phoenix_ecto" or clean it with "mix deps.clean phoenix_ecto"

mix.exsを以下のように変更したら依存性はOKになる。

{:phoenix_ecto, "~> 3.0"},
{:mariaex, ">= 0.0.0"},
{:phoenix_html, "~> 2.6"},

phoenixをリインストールしてOKならば、上記のようにリインストールする。 ただ、リインストールすると、当然古いphoenixプロジェクトは動かなくなることがある。

dev.exsの設定

つい忘れがちなconfig設定も行います。 localhostで動かないときは、netstat -an | grep 3306などで解放ホストとポートを確認すると良いです。 今回は、外部IPで開いていて、localhostでは通りませんでした。 mysqlクライアントからは、localhostで入れてもectoからはいけない時があります。

config :word_prj, WordPrj.Repo,
  adapter: Ecto.Adapters.MySQL,
  username: "XXX",
  password: "XXX",
  database: "XXXDB",
  hostname: "XXX.XXX.XXX.XXX",
  pool_size: 10

あとは、migrateして

MIX_ENV=dev mix ecto.migrate

起動します。

mix phoenix.server

ページを追加

ページ追加については同じコマンドで動きました。

# テンプレート作成
phoenix.gen.html Repos table col1:string col2:string
# DBにマイグレート
MIX_ENV=dev mix echo.migrate
# router追加
vi web/router.ex

 scope "/", Prj do
   pipe_through :browser # Use the default browser stack

   get "/", PageController, :index
   resources "/card", CardsController
 end
# サーバー起動
mix phoenix.server

今時、一つのサーバに複数のWEBアプリを入れることは稀なケースかと思いますが、一つのサーバに複数世代のphoenixを混在させる場合は注意が必要です。

2016年9月27日火曜日

SOFT SKILLS ソフトウェア開発者の人生マニュアル を読んでいます

SOFT SKILLS ソフトウェア開発者の人生マニュアル

ざっくりというと、「20代でやっておきたいこと」のエンジニア版です。

実践的なエンジニア向けのキャリア指南書で、ここまでまとまっているのはなかなかないので、20代や新人のエンジニアの方、キャリアに悩んでいる方にぜひおすすめです。

おすすめのポイント

この本は、エンジニアの特殊事情を踏まえて、人生の全方向的についてカバーしています。

例えば、テクノロジーに対するスタンスや、エンジニアにとってクリティカルなスキルと言える、学習についてもしっかりと書いてあります。

記述は全体的に簡潔で具体的ですぐに活用できる形に落ちています。

各項目の最後に、最初のワンステップ(これだけはやってみよう)というアクションプランが付いていて実践的です。

今ブログを書いているので、ブログについての箇所は特に気になりました。

アウトプットする第一歩としてブログはおすすめです。

エンジニアの方は、読んで損はないと思います。

2016年9月24日土曜日

GCPでProjectのQuota追加をしました

Google Cloud Platform にはQuota(割り当て)という制限があります。

このQuota以上に使用することはできず、それ以上に使う場合は、 随時、Quota追加申請をする必要があります。

今回は、ProjectのQuota(割り当て)追加申請をしました。

実際にやったところ簡単でした。あっさり数日で増えました。

Projectについてはほぼ情報がなかったため、簡単に記事にしました。

ProjectのQuotaについて

ProjectのQuotaは、課金対象のプロジェクト数の制限です。

初期設定は、3でお試しレベル以上になったら、明らかに足りません。

Projectは、システム別、環境別などで分けたくなると思いますが、Quotaが足りなくなるので、追加を申請します。

実施手順について

課金設定をしようとすると、Quota申請ページへのリンクが出るので、そこから申請します。

Company、Websiteを登録する箇所があります。

個人で契約していたので、ブログを登録しましたが問題ありませんでした。

数日(基本2営業日内とのこと)でメールが来るので、そのメールに必要事項を書いて返信します。

さらに数日で、追加完了の通知メールがきます。

あとは、コンソールから設定すれば、課金設定できるようになっています!

GCPUGの初心者部屋で聞きました。

Quotaの対応や、Projectの使い方感などちょっと気になったので、Slackで質問させてもらいました。

かなり基本的な話でしたが、即答していただいたので非常に助かりました。

ありがとうございました!

すぐやる! 「行動力」を高める“科学的な”方法 を読みました

すぐやる! 「行動力」を高める“科学的な”方法

脳の動きに沿って、行動をコントロールする方法についての本です。

特に、「やめたほうがいいと思いつつついやってしまう」「やるべきことは明確なのにサボってしまう」など人間らしいといえば人間らしいですが、困った行動を対象にしています。

ざっくり言うと、

  • 脳の動きは、意志、思考の力以上に、自動的に動く部分が多い。
  • そこをうまくコントロールすることで行動を変えることができる。

また、重要な観点として、

  • (思考などの意識的に脳を使った時以外にも)無意識の脳の活動により、疲労が蓄積する。
  • 脳の疲労が蓄積すると、判断力やる気が低下する。

というものがあり、できるだけ無駄な負担がかからないようにすることが重要ということです。

かなり実践的な内容になっていて、すぐに取り組める話が多いのでオススメです。 また、それぞれの章の導入には、4コマ漫画や身近なエピソードがあるので、理解しやすい作りになっています。

以下では、気になったところ、実際にやってみて良かったものを記事にします。

睡眠について

睡眠時間は脳の活動に重要というのはよく言われますが、特に具体的にどうするかの基準が明確になっています。

  • 起床から4時間後が脳のピーク。この時に目が冴えているか? => 目が冴えてないなら、睡眠不足
  • 起床から6時間後に一度「目を閉じて」休む。
  • 起床から11時間後は体を動かして暖める。そうすると、よく眠れる。

やらなくていいものを見せない

視覚は強烈に脳の活動に影響を与えます。

  • 目に入ったものは自然と手に取ろうとする。
  • それを前頭葉が防ぐ(他人のものだしとか)。

そのせめぎ合いを無意識下で常に行っているとのことです。

そもそも、人間の脳が意識的に行う活動は、シングルコアCPUをマルチタスクOSで動かしているようなもので、一度に一つのことしかできないとのことです。

なので、以下の方針が立ちます。

  • 何かやる時は、整理整頓して、気を散らすものを視界から除去する。
  • TODOリストも机に広げず、やることを一度メモしたら、カバンにしまう。
  • (一つのことが終わったら、次のリストを取り出して行う)
  • やりたくないことのトリガーになっているものは、自然に視界に入る場所に置かない。必要な時に取りに行くようにする。

このトリガー(テレビのリモコンなど)を定位置に置くというのは、視覚効果の他にも、あえてそこに行かないとできないようにすることで、思いとどまるタイミングが生まれるのでその意味でも効果的ということです。

ちょっとだけ手をつける

ここでも視覚がキーになっています。

視覚イメージがつかないものは、脳はどうすべきかわからないとのことです。

ここでいう視覚イメージは作業の完成像や、作業イメージのようなものではなくて、具体的に作業に着手したところを見せることだそうです。

勉強する必要があれば、ノートに日付を書くことレベルで良いとのこと。

またそのタイミングとしては、作業の区切りのすぐ後が良いそうです。

そうすると、次に何をすれば良いのかが脳に伝わるので、なんとなくテレビを見続けるのと同じ原理で、その作業をやるように脳が動くとのことです。

また、作業の区切りを明確にするという意味で、日常から、きっちりとドアを閉めたり、カバンを閉めたりということを習慣にすると良いそうです。

脳は、作業が終わったと考えられ、終わったのか?次いって良いのか?と迷わなくなるからだそうです。

上記をまとめるた行動例としては、勉強をしたい時は、

  1. 帰宅したら、カバンを置いたら、そのまま勉強道具を出して、きっちりカバンを閉める。
  2. その場でノートを開いて、1行目に日付を書く

というようにすると良いそうです。

これは実際に試してみましたが、確かに、このタイミングでとりあえず手をつけると、他のことをやってもなんとなく気になって続きをやりたくなる感じがして、結局やることが多くなりました。

頑張る必要もないので、これはオススメです。

経験的な言葉を使う

視覚の他にも、言葉でも差が出るそうです。

感情的な言葉に、自分なりの感じたことを表す「経験的な言葉」がコントロールする上では重要とのことです。

  • 「何々のように感じた」
  • 「何々のようだ」

リハビリの際のエピソードですが、「腕が鎧を着ているようで動かない」というように感じていれば、「鎧を着たままうごかすことはできそうですか?」というようにすると、腕を動かすことができる場合があるそうです。

他のアプローチも

他にも、

  • 「やってはいけないもの」を繰り返しやってしまう時の脳で起こっている心理学的な側面
  • 能動的な触覚はOKだが、受動的な触覚は嫌

など様々なアプローチが載っているので、「すぐやる」ようにしたい場合はオススメです。

Slack out-going Slash Commands を AWS に設定する(日本語対応済み)

Slackには、Postをトリガーとして、外部へのPush通信を行うことができます。 具体的には、特定の投稿があった場合に、任意のURLに対し、HTTP POSTをします。

ChannelがPublicな場合は、Outgoing WebhookとSlash Commandが使えますが、Privateな場合は、Slash Commandしか使えません。

今回は、Slash CommandをAWSに設定してみました。

参考

Slash Command

  • private channelでもOK
  • internetからアクセスできるSSL(公的)サーバが必要
  • 3秒でレスポンスする必要がある
  • それ以上かかるものは、非同期処理を行う必要がある
  • 返信は、Slash Commandのほか、incoming webhookも使える。

  • Slash Commands Style Guide
  • Set a reminder

AWS上で実装する

今回は、API Gatewayを使ってサーバーレスで構築しました。

API Gatewayを使えば、Slash Commandの要件をそのまま満たすことができるのでオススメです。

処理の流れは以下です。

  • Slack -> API Gateway -> Lambda -> SNS/SQS/Lambda呼び出し等 -> Lambda * N -> Slack

構築方法はこちらが詳しいです。

追加でやったこと

BluePrintが更新されたのか、一部画面が違っていました。

設定順序が変わったレベルだったので、注意して見ながらやれば、問題ないと思います。

IAMロールの設定変更箇所は、直接ポリシーを編集する手順が載っていますが、 ポリシーの追加で簡単に設定することが可能です。

細かいことですが、日本語を使う場合は、Pythonコードの最初に追加します。

# -*- coding: utf-8 -*- 

日本語文字化けの解消

Slash Commandsは、複数行のPostもそのまま引数として渡してくれます。

そのままだと日本語が文字化けします。

最終的に、このような関数を作ってゴリゴリと変換するようにしましたが、よりスマートなやり方がありそうです。

def utf8_in_unicode_to_str(uni):
    chars = list(map(hex, map(ord, uni)))
    res = ''
    for i in chars:
        res += chr(int(i, 16))
    return res

以下調べた内容です。

まず、日本語文字化けの対応として、API Gateway上で設定する例がありました。

ただ、特殊文字(改行など)がエラーになります。

日本語と特殊文字が混在した状態だと、APIgateway上では解決できず、当方、JavaScriptにそれほど詳しくないので、Python側で対応することにしました。

Lambda上で文字列の中身を認するには、[]で囲んでログやレスポンスで渡すのが手軽です。

>>> str = u'あ'
>>> [str]
[u'\u3042']
>>> str = 'あ'
>>> [str]
['\xe3\x81\x82']

Pythonでは、parse_qsした結果をとっていたのですが、そこで、utf-8のバイナリコードがそのままunicodeに入っていました。

#「あ」を渡すと以下のように、unicodeとして入ってしまう。
[u'\xe3\x81\x82']

parse_qsにはencode指定がなかったので、urldecodeから自分でするか、一旦parse_qsでパースしたものに対して、上記関数で、変換することにしました。

サブコマンドを実装

簡単にサブコマンドのパースを実装しました。

import re

# ```は、コードエリアのため、これも区切り文字とする
has_sub = re.search('\s|```', command_text.strip())
if has_sub is None:
    sub_command = ''
    args = command_text.split(' ')
else:
    sub_command = command_text.strip()[0: has_sub.start()]
    args = command_text.strip()[has_sub.start():].split(' ')

pythonで正規表現を使ってみる

2016年9月23日金曜日

わかりやすかったモナド/モナドトランスファーの入門記事

Haskellを学ぶ上で一つの山場と言えるのがモナドではないでしょうか。 モナドを学んだ時に実際にわかりやすかった記事をまとめました。

モナドについて

「すごいHaskell楽しく学ぼう」が説明が丁寧で、イメージも掴みやすくおすすめです。

こちらのsiquare氏の記事は、ポイントを押さえていて実用的です。 Haskellで競技プログラミング IO編

Functor -> Applicative -> Monad

この流れを理解するには、すごいHaskell本の説明がわかりやすいです。

山本氏のこちらの記事は、QA式なので一緒に読むと理解がしやすいと思います。

QAで学ぶMonad

xxxM系の関数を学ぶ

  • mapMなど、Mが付いているものは、Monadを返します。
  • monad内部で、リストを扱うことができ、do記法でmap処理ができます。
  • コードイメージ

    do
      list <- runGetFromWeb
      idList <- mapM (x -> runDB . insert $ x) list 
      return idList

    本での紹介は少ないですが、実際にはかなり使いますし、これらの関数を使うことでモナドに慣れてきます。

Monad を組み合わせる MonadT(モナドトランスファー)

概念的には、難しいものではないです。(contextのようなイメージ) ただ、しっかりと理解して使わないとはまります。

以下では、MonadTの学習に役立つ記事をあげます。

関数プログラミング入門

  • 第10章モナド(特に10.4 モナドの複合 10ページ弱)
  • 説明が正確で丁寧なので、まず目を通してみるといいと思います。
  • また、他のチュートリアルなどをやって、慣れてきたけどいまいち理解がという時にもう一度読むと理解が深まります。

Monad Transformers Step By Step

モナドトランスフォーマー・ステップ・バイ・ステップ(Monad Transformers Step By Step)

Martin Grabmüller氏著作、id:bicycle1885氏翻訳の秀逸なチュートリアルです。

  • シンプルな例から始まり、複雑なものに発展していくので、とにかくわかりやすい
  • コードがそのまま全て動く
  • インタラクティブに試すのが前提になっていて確認しやすい

と、最初は実際の動作イメージがつかみにくいMonadTの使い方がよくわかります。 また、組み合わせて使う方法もよくわかるようになります。

Interfacing with RESTful JSON APIs

Interfacing with RESTful JSON APIs

FPCompleteに掲載されいるBJ Terry氏の記事です。

RESTful JSON APIをラップするライブラリを作るという内容です。

かなり実践的な内容で、最終的に、Yesodフレームワークにそのまま組み込めるMonadTを作ります。 その過程で、それらのフレームワークでどのようにMonadTが動作しているかを理解していきます。

  • APIインターフェースの設計
  • 後半が、MonadT化になっています
  • MonadTがフレームワークの中でどう機能するかわかるようになる
  • MonadTを作れるようになる

いかがだったでしょうか?入門記事は他にもたくさんあるので、合うものがあると思います。では、よいHaskellライフを!

2016年9月22日木曜日

プログラミングElixir 日本語版 オススメです

8/22に待望のプログラミングElixirの日本語版が出ました。

事前予約して、発売日に入手、すぐに一通り読みました。

すでに紹介記事は幾つかありますが、Elixirに興味のある方には是非読んで欲しいので、記事を書きました。

概要

最も良いと感じたところは、リファレンスではなく、Elixirを使うための実践的なガイドになっているところです。

しかも、ただのサンプルコードを集めたものではなく、Elixirの攻略のポイントとなる点をちゃんと押さえています。

Elixirで書く際の「コンセプトを伝える」という視点のため、やはり日本語で読めるのは助かります。コードサンプルはごく基本的なものなので、原書のサンプルをざっと当たるような読み方だと少しもったないので、原書を持っている方もおすすめです。

Elixir入門に最適の1冊

他の本でいうと、「入門 Elixir」というレベルからカバーしていて、初めてElixirを触る人向けの内容になっています。

それぞれのトピックについては、深入りしていませんが、Elixirを学ぶ上でポイントとなる、以下をしっかりと押さえています。

  • 関数型プログラミング
  • 並行プログラミング
  • Elixirプロジェクトの作り方・動かし方

特にトピックである、並行プログラミングについては、OTPフレームワーク、スーパーバイザーによる監視、、、など一通り紹介されていて、Elixirでできることの全体像がつかめます。

また、ノードを使った分散処理についての章もあります。

この本をとっかかりに、気になった部分を深掘りして勉強していくのがいいと思います。

mixを使ったプロジェクト周りが詳しい

また、便利なのが、Elixirプロジェクトの作り方と動かし方の部分です。

そのあたりの説明は、実際に、mixを使ってプログラムを作っていく構成になっているため、この本を読んだ後は、すぐにコードを書き始められます。

例えば、Elixirでは、ライブラリも基本的にプロセスとして起動して、使う必要があるため、mix.exsで起動指定するのですが、そのあたりもどこに設定を記述するのか、なぜそれが必要なのか?をしっかりと記載しているため、非常に役立ちます。

この辺りの情報は、Elixirのように実際のプロジェクトコードや記事の絶対量が少ない言語については、とても助かります。

Elixirはその性能もさることながら、シンプルで使いやすい言語です。日本語本が出て、環境も整ってきてますので、興味があればぜひお試しください!

SMARTCUTS 時間をかけずに成功する人、コツコツやっても伸びない人 を読みました

時間をかけずに成功する人 コツコツやっても伸びない人 SMARTCUTS

いかに無駄を省いて、成果をあげるか?をテーマにしたビジネス本です。

エピソードが多く、カジュアルに読めてしまいます。

どこかで聞いた話や、身近なエピソードに加え、最新の研究が盛り込まれているので、「おっ」と思うエピソードが見つかると思います。

個人的に、ささったエピソードを紹介します。

メンターの効果

メンターの有効性は、誰しも認めるところと思います。メンターを制度として取り入れている企業も多いですね。

また、メンター制度とはいわずとも、実際の職場のOJTでは先輩社員が育成担当となって、実質的にメンター制度として機能していることがあります。

この本で紹介している最新の研究によると、

  1. 自然発生的なメンター関係は有効
  2. 強制されたメンター関係は効果がある場合、ない場合がある

ということです。

最終的に、仕事上の付き合いだけでなく、交友関係などまで発展するレベルでないと効果が薄いとのことです。

企業でメンターを活用する場合は、メンターを指名するのではなく、メンターを見つけやすいような環境づくりをする方が効果的なようですね。

この本では、個人間のメンターだけでなく、フェラーリのF1ピットクルーチームが、医療チームのメンターとなるという、組織間のメンター関係の話があります。こちらは、チームの改善活動の話としても興味深いです。

初等教育で計算機を使うのはOK!

フィンランドの教育改革のエピソードからです。

初等教育において、九九を覚えるべきか、計算機を使ってOKとするか?というのは、教育学的には結論が出ているそうです。

結論は、「計算機を使ってOK」です。

「計算機を使ってOK」として、計算手順を覚えることに時間を割かず、その時間をどうやって応用するかしっかり考える方が、数学の能力が高まるとのこと。

計算機の使用だけでなく、広範囲かつ抜本的な取り組みの結果ですが、最終的に、授業時間は従来の半分に減少し、数学の成績が向上するとかなり効果を上げています。(応用力だけでなく、計算などの基礎能力も好成績とのこと)

フィンランドの教育改革には、他にも見るべきところが多くお勧めです。

プログラミング教育に当てはめると、伝統的なhello worldから一つ一つやるよりも、Ruby on railsなどでとにかく動くものを作る方が、Webシステムの全体像がわかり、結局プログラミングもできるようになるという感じでしょうか。

馬車をスピードアップするには?

クリステンセン氏の継続的イノベーションと、破壊的イノベーションの差を鮮やかに描き出すエピソードです。

自動車が出る前、馬車はかなり成熟していました。

馬車時代の最後期に、盛んだった研究はなんだったでしょうか?

実は、馬の品種改良でした。

イメージもつきやすいですし、そのどうやっても自動車に到達しない感じが伝わります。

このような興味深くて、ためになるエピソードがたくさんあるので、一度読んでみてはいかがでしょうか?

GCPUG(Google Cloud Platform ユーザーグループ )の情報

GCPを使う上で強い味方となってくれるのが、GCPUG(GCPのユーザグループ)です。 日本語でGCPの情報交換や、質問ができる貴重な場所です。

GCPUG

Google Groups

  • GCPUG参加の窓口です。
  • GCPUG Groups
  • Slackの案内があります。

Slack

  • チャンネル豊富
  • 特に初心者向けの質問部屋もあります。

おすすめチャンネル

使っているサービスや活動拠点によってチャンネルが使えます。

  • g-cloudで始まるチャンネルは、機能別。
  • x-で始まるチャンネルは、各地方のgcpug。

他には、こちらがおすすめです。

  • 初心者向けQA question_ja
  • 障害情報 hell-inferno_ja

twitter

  • #gcpug
  • 公式チャンネルはないようです。

イベント

  • 各地のGCPUGで定期的に開催しています。
2016年9月20日火曜日

Hadoop クラスタ管理ツール ambari を試す

ambariを使ったhadoopクラスタ構築は、1からHadoopクラスタを構築するよりもかなり楽ですが、実際には色々とハマリどころがあります。ネット上に情報も少ないので、意外と手間取ります。

Hadoopクラスタ管理ツールのAmbariをGCPで試す場合、最もおすすめの方法は、bdutilです。

HORTONWORKSとGCP謹製のambari構築用エクステンションが用意されています。

GCPを日常的に使っている方ならば、ごく簡単にambariを試すことができます。

bdutil HDP

手順

基本は、上記の通りですが、いろいろと説明が含まれてるので、手順をまとめます。

  1. projectIdをセットする

    gcloud config set project ${projectId}
  2. Storageでバケットを作る

    gsutil mb -p ${projectId} gs://${bucketName}
  3. bdutilをクローンする

    git clone https://github.com/GoogleCloudPlatform/bdutil
    cd bdutil
  4. バケットを以下のように設定します

    grep BUCKET= bdutil_env.sh
    CONFIGBUCKET=${bucketName}
    
  5. ambari.confを確認する
    ambari.conf

    # チェックすべき箇所は、ワーカー数(+1マスターが立ち上がる)と、マシンタイプです。
    デフォルトで起動すると、月間110ドル程度のインスタンスが5個立ち上がります。
    NUM_WORKERS=4 
    GCE_MACHINE_TYPE='n1-standard-4'
  6. deployする

    # bdutil以下で。
    ./bdutil -e ambari deploy
  7. SSHトンネルを設定する

    gcloud compute config-ssh
    ssh -L 8080:127.0.0.1:8080 hadoop-m
  8. 管理画面にアクセスする

    open http://localhost:8080/
  9. インスタンスにアクセスする

    gcloud compute ssh hadoop-m
    # ここでHadoopクラスタを使うことができます
  10. deleteする

    # bdutil以下で。
    ./bdutil -e ambari delete

公式ambari をDebian 8に入れる時に

ambari 2.2.2 install ambari 2.2.2 は、Debian7のリポジトリしか載っていませんが、Debian8でもそのままインストールできます。

BigQueryや、トレジャーデータなど、フルマネージドのサービスでは、ニーズに合わないということで、自前のクラスタを立ち上げる場合に、このような管理ツールはかなり役立ちます。

2016年9月11日日曜日

Phoenix framework をDebianで試す

ElixirのRails風フレームワークPhoenix frameworkをDebianで試したときの手順です。

Nodejsのセットアップなど幾つか必要な手順があります。

こちらはDebianで試しましたが、apt-getが使えるubuntuでも基本動くと思います。

環境

Debian 8 jessie

参考記事

  • Phoenix 公式インストール手順
    http://www.phoenixframework.org/docs/installation
  • nodejs 公式インストール手順
    https://nodejs.org/en/download/
  • 日本語記事 Install elixir & phoenix framework
    http://qiita.com/oikyn/items/738fcad11549593111b9 Phoenix入門1 - Hello Phoenix
    http://ruby-rails.hatenadiary.com/entry/20151011/1444560106#phoenix-tutorial-1-insatall-phonix

nodejsのインストール

nodejsを使っているので事前にインストールしておきます。v5.0以上です。 公式のインストール手順を参考に、バイナリ設置でインストールしました。 パッケージ管理を使ってインストールもできます。

wget https://nodejs.org/dist/v5.10.1/node-v5.10.1-linux-x64.tar.xz
tar xvf node-v5.10.1-linux-x64.tar.xz
cd node-v5.10.1-linux-x64
sudo cp -p bin/* /usr/bin
sudo cp -p lib/* /usr/lib
sudo cp -p share/* /usr/share
which nodejs
which npm

inotify-toolsのインストール

サーバーを立ち上げた時にエラーが出る場合があります。

sudo apt-get install inotify-tools

Elixir/Phoenixのインストール

準備ができたのでElixir/Phoenixをインストールします。

Elixir

wget https://packages.erlang-solutions.com/erlang-solutions_1.0_all.deb && sudo dpkg -i erlang-solutions_1.0_all.deb
sudo apt-get update
sudo apt-get install esl-erlang
sudo apt-get install elixir

Hex

mix local.hex

Phoenix

mix archive.install https://github.com/phoenixframework/archives/raw/master/phoenix_new.ez

Phoenixの起動

プロジェクト作成

mysqlを使用する場合は、--database mysqlが必要です。

また、事前にapt-get install mysql-serverでmysqlをインストールしておきます。

mix phoenix.new <prj> --database mysql

npmでセットアップ

cd <prj>
npm install

Phoenix起動

mix phoenix.server

[info] Running PhTest.Endpoint with Cowboy using http on port 4000
2016年9月10日土曜日

Elixirでクラスタリングするときの入門

Elixirでのクラスタリングについてまとめたスライドをアップしました。

Elixirでクラスタリング

スライドでは、概要と、Hello worldだけですので、参考になる情報をまとめました。

全体的な話

プログラミングElixirの15章「ノード - 分散システムの要」(183ページ~)に概要が載っているので最初に読んでおくといいと思います。

プログラミングElixir

こちらは、実際のコードも多く、参考になります。

[翻訳]Elixirのノードを理解する

こちらの「3. 耐障害性と分散プログラミング」に、Map-Reduceを分散実行する例があります。 [翻訳] Elixirを始めるべき5つの理由

公式GETTING STARTED

クラスタ分散を理解するための基本になるプロセスの記事。

Processes

key-valueストアアプリでルーティングノードを介してクラスタリングしたデータノードに分散して入れる例。

Distributed tasks and configuration

リファレンス

クラスタリング系のライブラリはNodeに入ってます。

Node

ノードに対して、まとめて処理をする場合に、よく使うEnumです。

Enum

tomcat7 を CentOS7 に入れる時のメモ

今更ながら、CentOS7tomcat7をインストールして確認するメモです。

Tomcat7のインストール

yumでそのまま入る。

yum update
yum install tomcat*
tomcat version
systemd start tomcat
systemd status tomcat
curl -v localhost:8080

起動しない場合は、JAVA_OPTSを設定する。

vi /etc/tomcat/tomcat.conf
# 以下を追加
JAVA_OPTS="-Xmx512m -XX:MaxPermSize=256m"

Javaのインストール(Tomcat7は、6以上ならOK)

JRE1.8は自動で入る。そのため、1.8でコンパイルしたものは、そのまま動く。

使いたいバージョンのJDKがある場合は指定して入れる。

yum install java-1.6.0-openjdk-devel
java -version
javac -version
# 必要に応じてalternativesで設定
systemd restart tomcat
curl -v localhost:8080

servletの動作確認

cat > HelloServlet.java << EOF
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class HelloServlet extends HttpServlet {
    public void service(HttpServletRequest req,
        HttpServletResponse res)
        throws ServletException, IOException {

        PrintWriter out = res.getWriter();
        out.println("Hello World!");
        
    }
}
EOF

javac -classpath '/usr/share/tomcat/lib/*' HelloServlet.java 
mkdir -p /usr/share/tomcat/webapps/ROOT/WEB-INF/classes
cp HelloServlet.class /usr/share/tomcat/webapps/ROOT/WEB-INF/classes/.
cat > /usr/share/tomcat/webapps/ROOT/WEB-INF/web.xml <<EOF
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>
    <servlet>
        <servlet-name>HelloServlet</servlet-name>
        <servlet-class>HelloServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>HelloServlet</servlet-name>
        <url-pattern>/HelloServlet</url-pattern>
    </servlet-mapping>
</web-app>
EOF
systemctl restart tomcat
curl -v localhost:8080/HelloServlet

Contextの設定と確認

cat > /etc/tomcat/Catalina/localhost/mycontext.xml <<EOF
<Context path="/mycontext" docBase="/tmp/mycontext" workDir="/tmp/mycontext/work" />
EOF

mkdir -p /tmp/mycontext/WEB-INF/classes
cp HelloServlet.class /tmp/mycontext/WEB-INF/classes/.
cp /usr/share/tomcat/webapps/ROOT/WEB-INF/web.xml /tmp/mycontext/WEB-INF/.
curl -v localhost:8080/mycontext/HelloServlet

firewallの設定をする

  • クラウドならば、Security Groupなどを設定
  • インスタンスのfirewallを開く(CentOS7はfirewalld)
  • 外部からアクセスできるようにする場合は注意

トラブルシューティング

500系エラー

  • ログを見て対処。
  • ClassNotFound系は、classファイルの設置場所が正しいか確認。

400系エラー

  • web.xmlの指定が正しいか確認。
  • web.xmlの設定が壊れている場合は、どこをたたいても400系エラーが出る。
2016年9月4日日曜日

Pandas で BigQuery を使うときのメモ

PandasからGoogle BigQueryを使うのは、かなり便利です。 そのときのメモをまとめました。

日付処理

  • BigQueryはUTCです。
  • Pandasのto_datetimeにTimeZone情報を入れる必要がある。
  • 現在の時刻を取る場合

    pd.to_datetime('now').tz_localize('UTC').tz_convert('Asia/Tokyo').to_datetime64()
  • 日本時間を読み取って入れる場合

    pd.to_datetime(datestr, format='%Y年%m月%d日 %H時%M分').tz_localize('Asia/Tokyo').to_datetime64()
  • 扱う方針を決める。
  • UTCに変換する
  • JSTの値をそのまま入れて、タイムゾーンを完全にユーザが管理する

Insert(to_gbq)

  • カラム定義、カラム順など揃える必要がある。
  • 既存のテーブルにto_gbqで、入れるのは調整が手間。
  • 可能なら、最初からto_gbqでテーブルを作った方が良い。
  • 定期的に追加するなら、if_existsを使う。
df.colomns
['gcol2','no_append','gcol1']
# 必要なカラムだけ指定
gdf = df[['gcol1', 'gcol2']]
gdf.to_gbq(table, projectid, private_key, if_exists='append')

pandas からgenerate_bq_schema は使わない

  • スキーマ作成だけ行うgenerate_bq_schemaですが、Duplicateになっています。
  • Creating BigQuery Tables
  • 代わりに上記to_gbqで行います。
  • もしくはbq loadで行います。
  • bq quickstart

import gcpとは

検索すると出てくる

import gcp.bigquery ad bq

これはDataLabの組み込みライブラリです。DataLabから使用します。