人生のロケハン #経験してきたあれこれ

「これってなに?これってどうやるの?」の参考になるようなブログを目指します

Heroku + RubyでSlackのBotを制御 ~PostgreSQLに接続~

Herokuで動かしているアプリケーションをDBに接続してみる

SlackのBotを動かしてみる記事の続きです。前回は環境開発準備からHerokuにデプロイをしてBotに話しかけて返事をさせるところまでやりました。今回はアプリケーションをDB (PostgreSQL)に接続してみます。

PostgreSQLをインストール

この開発ではHerokuを利用していて、HerokuにはPostgreSQLと呼ばれるDBがアドオンとして用意されているので、それを使っていきます。
ちなみにPostgreSQLポスグレって呼ばれることが多いみたいですね。

では、早速PostgreSQLをインストール (Heroku Add-ons)していきます。
インストールボタンを押すと以下のような画面が出てくるので、インストールしたいアプリケーションを選びます。

f:id:tshidax:20170811120410p:plain

すると、料金プランを選ぶ画面が出てくるので、Hobby Dev - Freeを選びます。

f:id:tshidax:20170811120607p:plain

これでインストールは完了です。

テーブルを作成

インストールができたので、PostgreSQLにテーブルを追加してきますが、とりあえず、Userというテーブルを作成してみます。 PostgreSQLにアクセスするには、terminalで

heroku pg:psql

テーブルを作成するには

CREATE TABLE テーブル名 (カラム名, カラムの型, ….)

今回はUserのテーブルを作成するので

CREATE TABLE users (id text, name text, PRIMARY KEY(id));

アプリケーションとの接続

PostgreSQLをインストールするとDashboardのOverviewにHeroku Postgresという項目が追加されるので、それをクリックします。

f:id:tshidax:20170811180212p:plain

クリックするとPostgreSQLのコンフィグ画面に飛ぶので、View Credentials..をクリックしてDB情報を確認します。 アプリケーションとDBを繋ぐのに必要なのはURIなので、メモしておきます。

f:id:tshidax:20170811180626p:plain

DB情報を環境変数に設定

前回の最後にAPI Tokenを環境変数に設定したのですが、同様にDB情報も環境変数に設定しておきます。 terminalで

heroku config:set DB_Info=PostgreSQLのコンフィグ画面でメモしたURI

.envrc

export DB_Info=‘PostgreSQLのコンフィグ画面でメモしたURI

ActiveRecordを追加

Gemfile

gem ‘activerecord
gem ‘pg’

DB設定ファイルの作成

db_setup.rb

require ‘active_record’

ActiveRecord::Base.establish_connection( ENV[‘DB_Info’] )

Modelファイルの作成

user.rb

require_relative ‘db_setup’

class User < ActiveRecord::Base
validationやrelationなどを書いていく
end

ユーザーを登録する機能を実装

前回実装したBot制御プログラムに以下のようなユーザー登録機能を追加していきます。
ここで言うユーザー登録機能はSlackのユーザー登録ではなくSlackのユーザー情報を用いてコーヒーマシン利用管理システムのユーザーを登録するという意味です。

app.rb

require 'slack-ruby-client'
require_relative 'user'
:
:
client.on :message do |data|
  # SlackのユーザーIDを取得
  id = data[:user]
  case data.text
  :
  :
  when /^sign up$/i
    # client.users[id].name -> Slackのユーザーネームを取得
    sign_up(id, client.users[id].name)
  else
    client.message channel: data.channel, text: "Sorry I don't understand..."
  end
end

# ユーザー登録機能
def sign_up(id, name)
  if user = User.find_by_id(id)
    "既に#{user.name}さんで、登録されています。"
  else
    new_user = User.new(id: id, name: name)
    new_user.save!
    "#{new_user.name}さん、登録完了です。"
  end
end
:
:

こんな感じでユーザー登録ができていればオッケーです。

f:id:tshidax:20170811190022p:plain

データがちゃんと作成されています。
f:id:tshidax:20170811191421p:plain

まとめ

今回はアプリケーションとDBの接続についてまとめました。これで、自分が必要なテーブルを追加していって、キーワードに対してのBotのリアクションを書いていけば、どんどんいろんなことができます。
かなりうろ覚えで書いたので、まとまりのない内容になっていたら申し訳ありません。長いことHerokuにアクセスしていなかったらアカウントが消された?のかわかりませんが、アクセスできなくなっていました。なので、基本的なところの開発までということで、Botの話はこれで一旦ストップします。また、モチベーションが上がったら書くかもしれません。

Heroku + RubyでSlackのBotを制御

SlackのBotRubyで制御して、それをHeroku上で動かしたい

社内にはコーヒーマシンが置いてあり、以前は紙媒体のチケットを購入して利用していたのですが、これをチケットレスで管理したいということになり、社内コミュニケーションツールとして使っていたSlackのBotで管理しようということになりました。その時の開発メモになります。

 

開発環境

MAC OS X 10.10.5

Rubyruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-darwin14]

SlackでBotを作成

Manage AppsからAppsの管理画面を開き、ページ上部の検索フォームにBotsと入力し、Add Configurationボタンを押下します。

画面の指示に従いBotの名前を入力して進めていくとBotが作成されます。作成された際の、この画面のAPI Tokenをメモしておきます。

f:id:tshidax:20170808113250p:plain

次に任意のディレクトリを作成し、コードを書いていきます。

Gemの追加

以下のリンク先を参考にGemfileにgemを追加します。

GitHub - slack-ruby/slack-ruby-client: A Ruby and command-line client for the Slack Web and Real Time Messaging APIs.

f:id:tshidax:20170808114056p:plain

Gemfile

gem ‘slack-ruby-client’

gem ‘eventmachine’

gem ‘faye-websocket’

terminalで

bundle install

Gemfileはbundle initで作成できます。

Botを制御するプログラム 

app.rb(ファイル名は任意)にbotを動かすファイルを作成します。

require 'slack-ruby-client'

client = Slack::RealTime::Client.new(token: 'メモしておいたAPI Token')

# 接続が成功した時にterminalに`connected!`と表示される
client.on :hello do
  puts 'connected!'
end

# Botがいるチャネルに何かメッセージを投げた際に動く
client.on :message do |data|
  case data.text
  when 'bot hello' then
    client.message channel: data.channel, text: "Hello <@#{data.user}>!"
  when /^bot/ then
    client.message channel: data.channel, text: "Hello <@#{data.user}>, what do you want?"
  else
    client.message channel: data.channel, text: "Sorry I don't understand..."
  end
end

client.start!

ローカルで動作確認

terminalで、ruby app.rbで動作確認

正常にプログラムが動けばtermianlにconnected!と表示され、SlackのBotが入っているチャネルでメッセージを投げるとこのように反応してくれます。

f:id:tshidax:20170808121807p:plain

Herokuにデプロイ

ローカルで動作確認ができたのでHerokuにデプロイします。

Herokuのアカウント作成

まずはHerokuのアカウントを作成します。

Cloud Application Platform | Heroku

アカウントを作成したら、Herokuをterminalで動かせるようにToolbeltをインストールします。

Heroku CLI | Heroku Dev Center

terminalで

brew install heroku

試しにheroku loginと打ち、ログインできるか確認してみてください。

Herokuのアプリを作成

先ほど作成したプログラムをHeroku上で動かすためにHerokuのアプリケーションを作成します。

terminalで

heroku create 任意のアプリケーションの名前

Procfileを作成

Herokuにデプロイする前にProcfileを作成します。

Procfile

app: bundle exec ruby app.rb

Procfileを作成したらHerokuにデプロイします。

terminalで

git add .  

git commit -m ‘init commit’

git push heroku master

もし、commitに含めたくないファイルがあれば.gitignoreを作成して、含めないようにしましょう。

気付いたら.gitignoreはgiboで自動生成する時代になっていた - Qiita

terminalで

gibo vim Ruby >> .gitignore

Herokuで動作確認

HerokuのアプリケーションのDashboardからDynosを立ち上げてSlackで動作確認します。 f:id:tshidax:20170808125016p:plain f:id:tshidax:20170808125021p:plain

ローカルで動作確認した時のようにBotが反応してくれればOKです。

terminalで立ち上げたい場合は

heroku ps:scale app=1 –app app_name

立ち下げは

heroku ps:scale app=0 –app app_name

API Tokenを環境変数に設定する

さて、先ほどはapp.rbに直接API Tokenを書いていましたが、外から見られる可能性があり、悪用されるかもしれないので、環境変数に設定します。

herokuに環境変数を設定

terminalで

heroku config:set API_Token=BotAPI Token

ローカルで動作確認する時にはdirenvを用いて環境変数を設定

terminalで

brew install direnv

Shellにhookを追加します。

export EDITOR=vim

eval “$(direnv hook bash)”

.envrcを作成 terminalで

direnv edit .

.envrcに環境変数を設定

export bot_api_token=‘BotAPI_Token’

まとめ

今回は開発環境を整えて、簡単なBotの制御までをまとめました。コーヒーマシン利用をBotに管理させるまでには、まだ色々とあるのですが、今回はここまでにします。実装自体も去年の年末ぐらいだったので、忘れている部分も多く、思い出しながら記事にしていけたらなと思っています。(その時に、まとめておかなかったことに後悔)

ベトナムではどれくらいアパートの契約に時間かかるの?

f:id:tshidax:20170806201142j:plain

ベトナムではアパートは3日あれば契約、入居できる

今回はベトナム(ホーチミン)でのアパート契約について実際に自分が踏んだ手順に沿って書いていきます。

 日本での準備と現地での手続き

日本での準備

まず日本での準備ですが、まず現地の日系不動産屋さんに連絡を取りました。ホーチミンには、アオザイハウジングドラゴンハウジングベトナムハウスなどの不動産屋さんがあります。私が問い合わせたのはドラゴンハウジングでした。

日本人のスタッフが対応してくれるので細かい希望なども事前に伝えられて安心です。以下のような条件を伝えて、希望に沿うような物件をピックアップしてもらい現地に着いてから内見をさせてもらうという流れです。いつ現地に到着するのかを伝え、事前に内見のスケジュールを組んでおきましょう。不動産屋さんの都合などもあるので、早めに伝えた方が融通が効くかもしれません。

また、内見当日に「どこどこに泊まっているので集合場所をそこにして迎えに来てほしい」と伝えると迎えに来てくれます。着いてすぐでは土地勘もなく移動が大変なので、迎えに来てもらうように頼んでおくと安心です。私はホテルまで迎えに来てもらいました。

契約に必要な書類として日本から持っていくものなどはありません。

探している物件の条件例

  • 契約開始時期:
  • 契約者:個人か法人か
  • 予算:
  • 間取り:
  • エリア:
  •  住宅タイプ:
  • その他設備などについての希望など

現地での手続き

まずは内見

現地に着いたら事前に組んでいた内見のスケジュールで内見させてもらいます。不動産屋さんや条件、時期によって差はあるでしょうが今回は8件ほどピックアップしてもらい内見させてもらいました。

内見しながら物件の賃貸条件や部屋の設備、管理体制などを質問しながら説明してもらいます。私が気にしたのは、以下のようなものでした。

  • 管理人が近くに住んでいて、何か問題があった時にすぐに対応してくれるか
  • 管理人の印象
  • 管理人が英語を話せるか(簡単な文章ぐらいなら理解できるか)
  • シャワーの出具合
  • 部屋の清潔感と明るさ
  • ルーターが部屋に置いてあるか共有か、再起動は自分でできるような設置位置か
  • コンセントの数と位置

だいたい皆さんが部屋を探しているときに気になるような点かと思うのですが、ルーターに関しては不具合がある場合再起動すれば直るときもあります。しかし、ルーターを再起動することができないような場所に設置されているといちいち管理人に連絡を取ってルーターの動作を確認してもらわないといけないので、この点は気になりました。

また、コンセントの数を気にする方はいるかもしれませんが、位置も大事だと思います。例えばベッドの上でケータイをいじっていて充電したいなと思ってもベッドから離れた場所にしかコンセントがないとか、洗面所にコンセントがなくて鏡を見ながら髪を乾かせないとか、コンセントはあるけど使い勝手が悪い位置にあると結構ストレスです。なので、この点も気にして見ました。

契約、入居

内見を終えて不動産屋さんにどの物件に決めたかを伝えると契約に移ります。まず初期費用の見積もりと契約書が送られてきます。内容を確認して問題なければ、名前、生年月日などの個人情報をドキュメントに打ち込むかメールで担当者に伝えます。そのあとは入居日が決まり、いざ入居です。サインをするのは入居日当日に物件に着いてからで、部屋の中で契約書を再確認してサインという流れでした。

私は内見に1日を使い、その日のうちに不動産屋さんに物件を決めたことを連絡して、契約書が送られてきました。次の日に内容を確認して、再度入居日時の調整などの連絡をして、3日目には入居できました。

ちなみにベトナムのアパートはベッド、テーブル、カーテン、ソファーなど家具がほとんど揃っているので、すぐに入居しても生活を始めることができます。日本でいうレオパレスみたいな感じです。

日本に比べると内見->契約->入居までのスピードがかなり早い印象です。審査とかないですからね。

まとめ

ベトナムでのアパート契約の流れを紹介しました。不動産屋さんによっては契約書作成や入居日の調整に時間がかかる場合もあるかもしれませんが、今回は3日で入居できました。駐在員になって自分で物件を探さないといけないという時はこの記事を参考にアパート内見から入居までの日程を調整してみてください。

意外に簡単 ベトナムのビジネスビザをアライバルビザで取得

ベトナムのビジネス(就労)ビザってどうやって取ればいいの?アライバルビザってなに?

今回、仕事でベトナムに行くことになり、ビジネスビザをアライバルビザで取得したので、就労ビザの取得に焦点を当てて、その手順を紹介します。

ベトナムのビジネスビザ

15日以上の滞在をする場合や、お仕事をする場合はビジネスビザの取得が必要になります。ビザの期間は1ヶ月、3ヶ月、6ヶ月、1年のものがあり、シングルタイプとマルチタイプがあります。シングルタイプは1度ベトナムに入国し出国するとビザが失効になるもので、マルチタイプは入ったり出たりできるものです。

 

日本のパスポートで通常の観光で15日以内であればビザは不要です。しかし、30日以内に再入国するにはビザが必要になります。出入国を繰り返せば観光ビザが更新されるからビザ取らなくても大丈夫!」と考えていると引っかかりますので気をつけてください。

 

少々話がそれましたが、ビジネスビザを取得する主な方法は

  1. ベトナム大使館に行って自分で取得
  2. ビザ取得代行業者に依頼して、国内にいる間に取得
  3. アライバルビザで取得

 の3つです。私は今回アライバルビザで取得しました。

アライバルビザってなに?取得するにはどうすればいいの?

 アライバルとは

ビザと言えば出国する前に取得するものだと思うかもしれませんが(私もそう思ってました。)、目的地の国に入国する前に空港で取得することもできます。これがアライバルビザです。

 

取得するにはどうすればいいの?

取得するには

  1. インビテーションレター(招聘状)
  2. ビザ申請書類(現地にも置いてあります)
  3. 顔写真1枚(4cm×6cm・背景白)
  4. パスポート
  5. 空港での申請費用(ビザの種類によって異なります。今回はビジネスビザの6ヶ月マルチだったので$95)※USD現金払い

が必要になります。インビテーションレターは現地の滞在先の人とかに頼んで書いてもらうこともできるようですが、今回は業者に依頼しました。(業者依頼が一般的?)

日本にいる間にすること

日本にいる間にすることは

  1. 代行業者にインビテーションレター作成を依頼
  2. 業者から送られてきたインビテーションレターを印刷
  3. パスポートがなければ取得
  4. 顔写真用意(ちゃんとした証明写真でなくてもデジカメの写真でも規定に合っていれば大丈夫です。大丈夫でした。)
  5. 事前に準備するのであればビザ申請書類に記入し、顔写真を貼る
  6. 申請費用のUSDを用意

です。パスポートも写真も手元にあれば、USD用意して申請書に記入するだけで、簡単です。何より、大使館に行かなくていいので楽です。

申請書に顔写真を貼ろうとした時に「この用紙だと4×6cmの写真なんてはみ出し過ぎて貼れないよ。」と思うかもしれませんが、枠を無視して左上ぎりぎりから貼れば大丈夫です。それでもちゃんと通ります。

あと、インビテーションレターは印刷して提出しないといけないので印刷し忘れに気をつけてください。

空港に着いてからすること

空港に着いたらLANDING VISA カウンターに行きます。行くと左手に申請書が置いてあり、その場で書けるのですが、事前に用意していればすぐにカウンターに行きましょう。

カウンターで用意していた書類(インビテーションレター・パスポート・顔写真貼り付け済みの申請書)を出します。申請費用はあとで払います。問題がなければカウンターの人が「座って待ってて。」と言ってくるので、待ちます。

行く前に「ベトナム人が優先され外国人が後回しにされる」という記事を読んで時間がかかることを覚悟していましたが、そんなことはなく10分程度で呼ばれて、申請費用を払ってビザ取得です。

まとめ

ベトナムのビジネスビザとアライバルビザについてわかっていただけたでしょうか?出国前にビザを持っていないという不安は多少ありますが、平日にわざわざ大使館に出向いて申請する必要がないので、お仕事をされている方にとっては便利な方法ではないかと思います。

もし、ベトナムにお仕事に行くことがあり、ビジネスビザの取得方法がわからなくて困っているのであれば、参考にしていただけると幸いです。

海外に移り住んだので、ブログはじめました

はじめまして、tshidaxです。

ベトナムでのオフショア開発をすすめるためにベトナムに移り住んだのを機会にブログを始めました。

ベトナムに移り住むまでの手続きや会社立ち上げまでのこと、日々の生活などをつらつらと書いていきたいなと思ってます。

よろしくおねがいします。