hotoolong's blog

プログラムのことやエンジニアリングに関することを記事にしています。

Re:dashをAWSに構築してみた

最近まであまりRe:dashのことを認識してなかったけど、結構使われてるのですね。 会社で入れてみたら?という話になり、構築してみました。
Qiitaなどの過去記事が散乱してるので、、
古いAMIから作ってしまったりしてしまったけど、 結局はhelpから探して最新版を入れるのがいいみたい。

構築

https://redash.io/help-onpremise/setup/setting-up-redash-instance.html

私が作ったときのが東京リージョンの以下を選択
ami-34cfe853
ただこれが Re:dashのバージョンが1.01になっている。
最新版ではないので後でバージョンアップする。

EC2のインスタンスは t2.micro で構築してたが、
後で面倒なことになるので small 以上で構築することをおすすめします。

インスタンスが立ち上がったら

アップグレードしておく

cd /opt/redash/current
sudo bin/upgrade

Ubuntuでつくっているからなのか再起動時に/etc/init.d配下に起動スクリプトがないと怒られてしまった。
最後の再起動ができてないだけのようなので、手動で再起動してしまう。

sudo supervisorctl restart redash_server

バージョン確認する。

readlink -f /opt/redash/current

最新になっていることを確認

Google認証でログイン

特定のドメインだけで Google認証でログインさせたかったので

cd /opt/redash/current
sudo -u redash bin/run ./manage.py org set_google_apps_domains {{domains}}

{{domains}}の箇所は適宜設定してくだされ。

このときに外部からcvsをインポートしようとするのかImportErrorとかRedisに書き込めないとかエラーになってしまった。
redash の プロセスを落としてから実行させたらエラーは出なくはなったがそもそもメモリ足りてないっぽいので インスタンスをsmall以上にしておいたほうがいい。
以下エラー内容。

Traceback (most recent call last):
File "/opt/redash/redash.1.0.1.b2833/manage.py", line 6, in <module>
from redash.cli import manager
File "/opt/redash/redash.1.0.1.b2833/redash/__init__.py", line 66, in <module>
import_query_runners(settings.QUERY_RUNNERS)
File "/opt/redash/redash.1.0.1.b2833/redash/query_runner/__init__.py", line 171, in import_query_runners
__import__(runner_import)
File "/opt/redash/redash.1.0.1.b2833/redash/query_runner/big_query.py", line 13, in <module>
from redash.utils import JSONEncoder
File "/opt/redash/redash.1.0.1.b2833/redash/utils/__init__.py", line 2, in <module>
import csv
File "/usr/lib/python2.7/csv.py", line 8, in <module>
from _csv import Error, __version__, writer, reader, register_dialect, \
ImportError: /usr/lib/python2.7/lib-dynload/_csv.x86_64-linux-gnu.so: failed to map segment from shared object
Traceback (most recent call last):
File "/opt/redash/redash.1.0.1.b2833/manage.py", line 6, in <module>
from redash.cli import manager
File "/opt/redash/redash.1.0.1.b2833/redash/__init__.py", line 70, in <module>
reset_new_version_status()
File "/opt/redash/redash.1.0.1.b2833/redash/version_check.py", line 36, in reset_new_version_status
_compare_and_update(latest_version)
File "/opt/redash/redash.1.0.1.b2833/redash/version_check.py", line 49, in _compare_and_update
redis_connection.set(REDIS_KEY, latest_version)
File "/usr/local/lib/python2.7/dist-packages/redis/client.py", line 1072, in set
return self.execute_command('SET', *pieces)
File "/usr/local/lib/python2.7/dist-packages/redis/client.py", line 573, in execute_command
return self.parse_response(connection, command_name, **options)
File "/usr/local/lib/python2.7/dist-packages/redis/client.py", line 585, in parse_response
response = connection.read_response()
File "/usr/local/lib/python2.7/dist-packages/redis/connection.py", line 582, in read_response
raise response
redis.exceptions.ResponseError: MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled. Please check Redis logs for details about the error.

データソースの登録

最近のバージョンではデータソースの登録はすべて画面からできるようなので、
再起動できたらアクセスしてみて DatasourceにRDSを追加しておくと、SQLを使って簡単にグラフ化できたりする。

以上、色々データを使ってエンジニア以外の人にもデータを見てもらうには結構便利そう。

fishシェルでnvmをインストールするときにはomfで

あっと言う間に4月ですね。 ブログに書いてなかったのですが、転職しまして4月からスタートアップ企業で働くことになりました。 最近すこし怠けてるので、新しい会社で少し不安です。

それはさておき、 fishシェルにして初めてnvm をインストールして少しハマったので備忘録に brew で インストールできるので インストールしたのですが、 brew install nvmすると

You should create NVM's working directory if it doesn't exist:

  mkdir ~/.nvm

Add the following to ~/.config/fish/config.fish or your desired shell
configuration file:

  export NVM_DIR="$HOME/.nvm"
  . "/usr/local/opt/nvm/nvm.sh"

You can set $NVM_DIR to any location, but leaving it unchanged from
/usr/local/opt/nvm will destroy any nvm-installed Node installations
upon upgrade/reinstall.

Type `nvm help` for further information.

と情報が出ますね。これはbrew info nvm と同じなのですが、 そのまま設定すると nvm.shの読み込みでコケてしまいます。 まぁfishなので当たり前ですね。

そこで omf install nvm してあげると

nvm をラップしたfishを作ってくれます。 omfインストール時に foreign-env が入っているのですが この子がfenv コマンドになっていて、shを変換してくれるようです。 便利ですね。

内部で

fenv source $nvm_prefix/nvm.sh\; nvm $argv

と呼び出しています。

無事読み込まれるとnvmがうまく動きました。 いいですね。

rails server の 引数備忘録

気づけばもう3月ひな祭りですね。

デバックのため、ステージングのサーバを手で上げたくなったときに引数がわからなくなったので ほぼドキュメントなのですが、備忘録として残しておきます。

rbenv exec bundle exec rails s -e staging -p 8080

みたいにして起動することがたまにあるので、
起動スクリプトでポート確認したりして、置き換えて起動、デバッグなどで重宝しますね。

オプション 説明
-p ポート番号
-b バインドするIPアドレス
-c rackupファイルを指定
-d デーモン起動
-u デバックモード
-e 環境(test/development/production)を指定
-P PIDファイルパス
-h ヘルプを表示

railsコマンド(rails) - - Railsドキュメント

多段sshで踏み台サーバのドメインが同一の場合のssh confの書き方

本題通りですが、 特定のドメインへのsshを踏み台サーバ経由が必要になった場合 毎回踏み台サーバにsshするのは嫌気が差すのでsshconfigにまとめて記載する方法になります。 以下のように 踏み台サーバをHostに別名をつけてあげて踏み台の先のサーバのドメインをまとめて記載できるのでサーバが増えたときにも楽にsshすることができるようになります。

Host proxy
  HostName proxy001.hogehoge.com

Host *.hogehoge.com
  ProxyCommand ssh proxy -W %h:%p

GoogleスプレットシートにGoogleアナリティクスのリアルタイムアクティブユーザー数を日別シートに書き出す

最近までちゃんとスプレットシートを活用してなかったのですが 、APIで呼び出しできるとアプリ同士で連携すると結構色々できて便利ですね。

まずはリアルタイムアクティブユーザーを取得するためのスプレットシートを作成します。  

メニューから ツール > スクリプトエディタ を選択
スクリプトエディタを立ち上げます。

メニューのリソース > Googleの拡張サービス を選択します。

以下のようにAnalyticsをONにしてその下のGoogleディベロッパーコンソールのリンクからAPIを有効にしておきます。
f:id:hotoolong:20170208013736p:plain

設定が完了したら空のスクリプト myFunctionがありますが、 以下のようにスクリプトを作成してみます。

view_idにはアナリティクスから取得します。
アナリティクスの管理 > ビュー設定にある ビューIDを設定します。

var view_id = 'xxxxxxxxx';

// 日付シートを取得なければ作る
function getSheet() {
  if (getSheet.cache) { return getSheet.cache; }
  var today = Utilities.formatDate(new Date(), "JST", "yyyy-MM-dd");
  getSheet.cache = SpreadsheetApp.getActive().getSheetByName(today);
  if (!getSheet.cache) {
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    ss.insertSheet(today, 0);
    getSheet.cache = ss.getSheetByName(today);
  }
  return getSheet.cache;
}

function myFunction() {
  var activeUserCount = Analytics.Data.Realtime.get('ga:' + view_id, 'rt:activeUsers').getRows() || 0;
  var yyyymmddhhmmss = Utilities.formatDate(new Date(), "JST", " yyyy/MM/dd HH:mm:ss ");
  var sheet = getSheet();
  var last = sheet.getLastRow();
  // 最後の行の次に出力
  sheet.getRange(last + 1, 1).setValue(yyyymmddhhmmss);
  sheet.getRange(last + 1, 2).setValue(activeUserCount);
}

次に関数を選択でmyFunctionを選択して▶ の実行ボタンを押します。
スプレットシートに戻って、日付、アクティブユーザー数が表示されていればOKです。
最後にトリガーの設定です。スクリプトエディタに戻ってもらって時計のマークの 現在のプロジェクトのトリガーからトリガーを設定します。
myFunctionを1分ごと実行するには以下のように設定すればOKです。 f:id:hotoolong:20170208015110p:plain

これで1分ごとのアクティブユーザー数を取得できます。
今回のスクリプトは1日ごとにシートを作る用になっているので日別の管理はやりやすいかと思います。
スクリプト自体はjsでできているのでファイル名を日から月などに変更することでいろいろ使いやすく加工することもできるので便利ですね。

「⌘英かな」でキー設定をカスタマイズ

USキーボードを使っていると
英数、ひらがなの変換がキー配置になくて少し苦労しますね。
Ctr-Spaceでも切り替えることができるのですが、 少しタイムラグがあって作業が中断してしまいます。

Karabiner というソフトがあったのですがmacOS Sierra になってサポートが外れてしまい開発中となっています。
Karabiner - OS X用のソフトウェア

そこで
⌘英かな
です。

⌘英かな

現在のバージョンが2.2.0で 左右のcommandキーにキーバインドするだけでなく他に変更したいキーがあれば設定できる状態です。

KeyRmapの設定画面で 右下の+ で設定したい項目を追加できます。

私の場合はHHKBも使っていてノートMacとdeleteのキー配置が違うので
「delete」と「\」を入れ替えておきたいなと思って設定していたのですが
しばらく「\」を連打しているとcommandキーで英かなの変換ができなくなってしまい 何度か試してるのですが、おかしくなってしまうようです。
何かバグを踏んでいそうです。
バージョンが上がったらまた試してみたいです。

あとfnはinputに設定できるのですが、outputに登録できないないので
どこかで設定できるようになったら快適なキーボードライフを送れそうです。 バージョンアップを期待してます。